update 8723bu wifi driver
authorxxh <xxh@rock-chips.com>
Wed, 25 Mar 2015 04:19:16 +0000 (12:19 +0800)
committerxxh <xxh@rock-chip.com>
Wed, 25 Mar 2015 04:19:16 +0000 (12:19 +0800)
1.Improve_P2P_compatibility for Android L
2.Fix_HiddenAP_handle
3.P2P ScanSparse For Miracas

164 files changed:
drivers/net/wireless/rockchip_wlan/rtl8723bu/Kconfig
drivers/net/wireless/rockchip_wlan/rtl8723bu/Makefile
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ap.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_beamforming.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_br_ext.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_bt_mp.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_btcoex.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_cmd.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_debug.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_ieee80211.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_iol.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mlme.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mlme_ext.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mp.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_mp_ioctl.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_odm.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_p2p.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_pwrctrl.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_recv.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_sreset.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_sta_mgt.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_wlan_util.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/core/rtw_xmit.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/HalPwrSeqCmd.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723a1Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC-BTCoexist/HalBtcOutSrc.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/HalPhyRf.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/Mp_Precomp.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/PhyDM_Adaptivity.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/PhyDM_Adaptivity.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_ACS.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_ACS.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDect.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDect.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDiv.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDiv.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_CfoTracking.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_CfoTracking.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DIG.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DIG.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicBBPowerSaving.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicBBPowerSaving.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicTxPower.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicTxPower.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_EdcaTurboCheck.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_EdcaTurboCheck.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_HWConfig.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_HWConfig.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_NoiseMonitor.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_NoiseMonitor.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PathDiv.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PathDiv.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PowerTracking.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PowerTracking.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RXHP.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RXHP.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RaInfo.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RaInfo.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RegDefine11AC.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RegDefine11N.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_debug.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_debug.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_interface.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_interface.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_precomp.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_reg.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_types.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_FW.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_MP.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/HalPhyRf_8723B.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/Mp_Precomp.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/phydm_RTL8723B.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/phydm_RTL8723B.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/phydm_RegConfig8723B.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/phydm_RegConfig8723B.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_btcoex.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_com.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_com_phycfg.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_dm.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_dm.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_hci/hal_usb.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_intf.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/led/hal_usb_led.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_cmd.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_dm.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_hal_init.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_phycfg.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/rtl8723b_rxdesc.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/rtl8723bu_recv.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/rtl8723bu_xmit.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/usb_halinit.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/rtl8723b/usb/usb_ops.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/autoconf.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/drv_conf.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/drv_types.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_btcoex.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com_h2c.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_com_reg.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_data.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_intf.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/hal_pg.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/ieee80211.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/linux/wireless.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_intf.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/osdep_service.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_hal.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_recv.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_spec.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtl8723b_xmit.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_android.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_ap.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_btcoex.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_debug.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_ht.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_mlme.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_mlme_ext.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_mp.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_odm.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_pwrctrl.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_recv.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_version.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_wifi_regd.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/rtw_xmit.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/usb_ops_linux.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/include/xmit_osdep.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_cfg80211.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_cfg80211.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_linux.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/mlme_linux.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/os_intfs.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/recv_linux.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_android.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_cfgvendor.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_cfgvendor.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_proc.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_proc.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/usb_intf.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/usb_ops_linux.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/wifi_regd.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/wifi_version.h
drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/xmit_linux.c
drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/osdep_service.c

index a84ff814ee6975fa7ca4cd185acfc8ec126e904f..4d065ff94f1a294b9919f2080fefe2c14c3d2633 100755 (executable)
@@ -1,5 +1,10 @@
 config RTL8723BU
        tristate "Realtek 8723BU USB WiFi"
        depends on USB
+        select WIRELESS_EXT
+        select WEXT_PRIV
+        select IEEE80211
+        select BT_RTKBTUSB
+        select UHID
        ---help---
          Help message of RTL8723BU
index 8f38c324b57f764ce622af453de882cedb89eaaf..fd344535a3b55e981aabe40861ab5146560266b7 100755 (executable)
@@ -1,5 +1,5 @@
 EXTRA_CFLAGS += $(USER_EXTRA_CFLAGS)
-EXTRA_CFLAGS += -O1 -Wframe-larger-than=1200
+EXTRA_CFLAGS += -O1
 #EXTRA_CFLAGS += -O3
 #EXTRA_CFLAGS += -Wall
 #EXTRA_CFLAGS += -Wextra
@@ -53,20 +53,26 @@ CONFIG_TRAFFIC_PROTECT = y
 CONFIG_LOAD_PHY_PARA_FROM_FILE = y
 CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY = n
 CONFIG_CALIBRATE_TX_POWER_TO_MAX = n
-CONFIG_RTW_ADAPTIVITY_EN = auto
+CONFIG_RTW_ADAPTIVITY_EN = disable
 CONFIG_RTW_ADAPTIVITY_MODE = normal
 CONFIG_SKIP_SIGNAL_SCALE_MAPPING = n
+CONFIG_80211W = n
+CONFIG_REDUCE_TX_CPU_LOADING = n
+CONFIG_BR_EXT = y
+CONFIG_ANTENNA_DIVERSITY = n
 ######################## Wake On Lan ##########################
 CONFIG_WOWLAN = n
 CONFIG_GPIO_WAKEUP = n
+CONFIG_WAKEUP_GPIO_IDX = default
 CONFIG_PNO_SUPPORT = n
 CONFIG_PNO_SET_DEBUG = n
 CONFIG_AP_WOWLAN = n
 ######### Notify SDIO Host Keep Power During Syspend ##########
 CONFIG_RTW_SDIO_PM_KEEP_POWER = y
 ###################### Platform Related #######################
-CONFIG_PLATFORM_I386_PC = n
+CONFIG_PLATFORM_I386_PC = y
 CONFIG_PLATFORM_ANDROID_X86 = n
+CONFIG_PLATFORM_ANDROID_INTEL_X86 = n
 CONFIG_PLATFORM_JB_X86 = n
 CONFIG_PLATFORM_ARM_S3C2K4 = n
 CONFIG_PLATFORM_ARM_PXA2XX = n
@@ -108,6 +114,7 @@ CONFIG_PLATFORM_ARM_SPREADTRUM_8810 = n
 CONFIG_PLATFORM_ARM_WMT = n
 CONFIG_PLATFORM_TI_DM365 = n
 CONFIG_PLATFORM_MOZART = n
+CONFIG_PLATFORM_RTK119X = n
 ###############################################################
 
 CONFIG_DRVEXT_MODULE = n
@@ -141,6 +148,7 @@ _OS_INTFS_FILES :=  os_dep/osdep_service.o \
                        os_dep/linux/mlme_linux.o \
                        os_dep/linux/recv_linux.o \
                        os_dep/linux/ioctl_cfg80211.o \
+                       os_dep/linux/rtw_cfgvendor.o \
                        os_dep/linux/wifi_regd.o \
                        os_dep/linux/rtw_android.o \
                        os_dep/linux/rtw_proc.o
@@ -160,25 +168,29 @@ _HAL_INTFS_FILES :=       hal/hal_intf.o \
                        hal/hal_com.o \
                        hal/hal_com_phycfg.o \
                        hal/hal_phy.o \
+                       hal/hal_dm.o \
                        hal/hal_btcoex.o \
                        hal/hal_hci/hal_$(HCI_NAME).o \
                        hal/led/hal_$(HCI_NAME)_led.o
-                       
-_OUTSRC_FILES := hal/OUTSRC/odm_debug.o        \
-               hal/OUTSRC/odm_AntDiv.o\
-               hal/OUTSRC/odm_interface.o\
-               hal/OUTSRC/odm_HWConfig.o\
-               hal/OUTSRC/odm.o\
+
+_OUTSRC_FILES := hal/OUTSRC/phydm_debug.o      \
+               hal/OUTSRC/phydm_AntDiv.o\
+               hal/OUTSRC/phydm_interface.o\
+               hal/OUTSRC/phydm_HWConfig.o\
+               hal/OUTSRC/phydm.o\
                hal/OUTSRC/HalPhyRf.o\
-               hal/OUTSRC/odm_EdcaTurboCheck.o\
-               hal/OUTSRC/odm_DIG.o\
-               hal/OUTSRC/odm_PathDiv.o\
-               hal/OUTSRC/odm_RaInfo.o\
-               hal/OUTSRC/odm_DynamicBBPowerSaving.o\
-               hal/OUTSRC/odm_DynamicTxPower.o\
-               hal/OUTSRC/odm_CfoTracking.o\
-               hal/OUTSRC/odm_NoiseMonitor.o
-               
+               hal/OUTSRC/phydm_EdcaTurboCheck.o\
+               hal/OUTSRC/phydm_DIG.o\
+               hal/OUTSRC/phydm_PathDiv.o\
+               hal/OUTSRC/phydm_RaInfo.o\
+               hal/OUTSRC/phydm_DynamicBBPowerSaving.o\
+               hal/OUTSRC/phydm_PowerTracking.o\
+               hal/OUTSRC/phydm_DynamicTxPower.o\
+               hal/OUTSRC/PhyDM_Adaptivity.o\
+               hal/OUTSRC/phydm_CfoTracking.o\
+               hal/OUTSRC/phydm_NoiseMonitor.o\
+               hal/OUTSRC/phydm_ACS.o
+
 EXTRA_CFLAGS += -I$(src)/platform
 _PLATFORM_FILES := platform/platform_ops.o
 
@@ -198,8 +210,8 @@ _OUTSRC_FILES += hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.o \
                                hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.o \
                                hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.o
 endif
-               
-########### HAL_RTL8192C #################################                                                                             
+
+########### HAL_RTL8192C #################################
 
 ifeq ($(CONFIG_RTL8192C), y)
 RTL871X = rtl8192c
@@ -224,7 +236,7 @@ _HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \
                        hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \
                        hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_led.o \
                        hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_xmit.o \
-                       hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_recv.o     
+                       hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_recv.o
 
 _HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o
 
@@ -233,7 +245,7 @@ ifeq ($(CONFIG_MP_INCLUDED), y)
 _HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_mp.o
 endif
 
-_OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/odm_RTL8192C.o\
+_OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/phydm_RTL8192C.o\
                                                                hal/OUTSRC/$(RTL871X)/HalDMOutSrc8192C_CE.o
 
 ifeq ($(CONFIG_USB_HCI), y)
@@ -281,10 +293,10 @@ ifeq ($(CONFIG_MP_INCLUDED), y)
 _HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_mp.o
 endif
 
-_OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/odm_RTL8192D.o\
+_OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/phydm_RTL8192D.o\
                                                                hal/OUTSRC/$(RTL871X)/HalDMOutSrc8192D_CE.o
 
-                                                               
+
 ifeq ($(CONFIG_USB_HCI), y)
 _OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/Hal8192DUFWImg_CE.o \
                                                                hal/OUTSRC/$(RTL871X)/Hal8192DUPHYImg_CE.o \
@@ -321,7 +333,7 @@ _HAL_INTFS_FILES += hal/HalPwrSeqCmd.o \
                                hal/$(RTL871X)/Hal8723PwrSeq.o\
                                hal/$(RTL871X)/$(RTL871X)_xmit.o \
                                hal/$(RTL871X)/$(RTL871X)_sreset.o
-                               
+
 _HAL_INTFS_FILES +=    hal/$(RTL871X)/$(RTL871X)_hal_init.o \
                        hal/$(RTL871X)/$(RTL871X)_phycfg.o \
                        hal/$(RTL871X)/$(RTL871X)_rf6052.o \
@@ -332,7 +344,7 @@ _HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \
                        hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_led.o \
                        hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_xmit.o \
                        hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_recv.o
-                       
+
 ifeq ($(CONFIG_SDIO_HCI), y)
 _HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o
 else
@@ -367,7 +379,7 @@ endif
 _OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/HalHWImg8723A_BB.o\
                                                                hal/OUTSRC/$(RTL871X)/HalHWImg8723A_MAC.o\
                                                                hal/OUTSRC/$(RTL871X)/HalHWImg8723A_RF.o\
-                                                               hal/OUTSRC/$(RTL871X)/odm_RegConfig8723A.o
+                                                               hal/OUTSRC/$(RTL871X)/phydm_RegConfig8723A.o
 
 _OUTSRC_FILES += hal/OUTSRC/rtl8192c/HalDMOutSrc8192C_CE.o
 
@@ -424,7 +436,7 @@ endif
 
 ifeq ($(CONFIG_MP_INCLUDED), y)
 _HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_mp.o
-endif                  
+endif
 
 #hal/OUTSRC/$(RTL871X)/Hal8188EFWImg_CE.o
 _OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/HalHWImg8188E_MAC.o\
@@ -432,9 +444,9 @@ _OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/HalHWImg8188E_MAC.o\
                hal/OUTSRC/$(RTL871X)/HalHWImg8188E_RF.o\
                hal/OUTSRC/$(RTL871X)/HalHWImg8188E_FW.o\
                hal/OUTSRC/$(RTL871X)/HalPhyRf_8188e.o\
-               hal/OUTSRC/$(RTL871X)/odm_RegConfig8188E.o\
+               hal/OUTSRC/$(RTL871X)/phydm_RegConfig8188E.o\
                hal/OUTSRC/$(RTL871X)/Hal8188ERateAdaptive.o\
-               hal/OUTSRC/$(RTL871X)/odm_RTL8188E.o
+               hal/OUTSRC/$(RTL871X)/phydm_RTL8188E.o
 
 endif
 
@@ -490,8 +502,8 @@ _OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/HalHWImg8192E_MAC.o\
                hal/OUTSRC/$(RTL871X)/HalHWImg8192E_RF.o\
                hal/OUTSRC/$(RTL871X)/HalHWImg8192E_FW.o\
                hal/OUTSRC/$(RTL871X)/HalPhyRf_8192e.o\
-               hal/OUTSRC/$(RTL871X)/odm_RegConfig8192E.o\
-               hal/OUTSRC/$(RTL871X)/odm_RTL8192E.o
+               hal/OUTSRC/$(RTL871X)/phydm_RegConfig8192E.o\
+               hal/OUTSRC/$(RTL871X)/phydm_RTL8192E.o
 
 endif
 
@@ -548,8 +560,8 @@ _OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/HalHWImg8812A_FW.o\
                hal/OUTSRC/$(RTL871X)/HalHWImg8812A_BB.o\
                hal/OUTSRC/$(RTL871X)/HalHWImg8812A_RF.o\
                hal/OUTSRC/$(RTL871X)/HalPhyRf_8812A.o\
-               hal/OUTSRC/$(RTL871X)/odm_RegConfig8812A.o\
-               hal/OUTSRC/$(RTL871X)/odm_RTL8812A.o
+               hal/OUTSRC/$(RTL871X)/phydm_RegConfig8812A.o\
+               hal/OUTSRC/$(RTL871X)/phydm_RTL8812A.o
 endif
 
 ifeq ($(CONFIG_RTL8821A), y)
@@ -576,9 +588,10 @@ _OUTSRC_FILES += hal/OUTSRC/rtl8821a/HalHWImg8821A_FW.o\
                hal/OUTSRC/rtl8821a/HalHWImg8821A_RF.o\
                hal/OUTSRC/rtl8812a/HalPhyRf_8812A.o\
                hal/OUTSRC/rtl8821a/HalPhyRf_8821A.o\
-               hal/OUTSRC/rtl8821a/odm_RegConfig8821A.o\
-               hal/OUTSRC/rtl8821a/odm_RTL8821A.o
-endif  
+               hal/OUTSRC/rtl8821a/phydm_RegConfig8821A.o\
+               hal/OUTSRC/rtl8821a/phydm_RTL8821A.o\
+               hal/OUTSRC/rtl8821a/PhyDM_IQK_8821A.o
+endif
 
 
 endif
@@ -609,7 +622,7 @@ _HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_hal_init.o \
                        hal/$(RTL871X)/$(RTL871X)_dm.o \
                        hal/$(RTL871X)/$(RTL871X)_rxdesc.o \
                        hal/$(RTL871X)/$(RTL871X)_cmd.o \
-                       
+
 
 _HAL_INTFS_FILES +=    \
                        hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \
@@ -632,20 +645,20 @@ _OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/HalHWImg8723B_BB.o\
                                                                hal/OUTSRC/$(RTL871X)/HalHWImg8723B_RF.o\
                                                                hal/OUTSRC/$(RTL871X)/HalHWImg8723B_FW.o\
                                                                hal/OUTSRC/$(RTL871X)/HalHWImg8723B_MP.o\
-                                                               hal/OUTSRC/$(RTL871X)/odm_RegConfig8723B.o\
+                                                               hal/OUTSRC/$(RTL871X)/phydm_RegConfig8723B.o\
                                                                hal/OUTSRC/$(RTL871X)/HalPhyRf_8723B.o\
-                                                               hal/OUTSRC/$(RTL871X)/odm_RTL8723B.o
+                                                               hal/OUTSRC/$(RTL871X)/phydm_RTL8723B.o
 
 endif
 
-########### AUTO_CFG  #################################        
-               
+########### AUTO_CFG  #################################
+
 ifeq ($(CONFIG_AUTOCFG_CP), y)
 
-ifeq ($(CONFIG_MULTIDRV), y)   
+ifeq ($(CONFIG_MULTIDRV), y)
 $(shell cp $(TopDIR)/autoconf_multidrv_$(HCI_NAME)_linux.h $(TopDIR)/include/autoconf.h)
 else
-ifeq ($(CONFIG_RTL8188E)$(CONFIG_SDIO_HCI),yy) 
+ifeq ($(CONFIG_RTL8188E)$(CONFIG_SDIO_HCI),yy)
 $(shell cp $(TopDIR)/autoconf_rtl8189e_$(HCI_NAME)_linux.h $(TopDIR)/include/autoconf.h)
 else
 $(shell cp $(TopDIR)/autoconf_$(RTL871X)_$(HCI_NAME)_linux.h $(TopDIR)/include/autoconf.h)
@@ -701,6 +714,8 @@ ifeq ($(CONFIG_EFUSE_CONFIG_FILE), y)
 EXTRA_CFLAGS += -DCONFIG_EFUSE_CONFIG_FILE
 ifeq ($(MODULE_NAME), 8189es)
 EXTRA_CFLAGS += -DEFUSE_MAP_PATH=\"/system/etc/wifi/wifi_efuse_8189e.map\"
+else ifeq ($(MODULE_NAME), 8723bs)
+EXTRA_CFLAGS += -DEFUSE_MAP_PATH=\"/system/etc/wifi/wifi_efuse_8723bs.map\"
 else
 EXTRA_CFLAGS += -DEFUSE_MAP_PATH=\"/system/etc/wifi/wifi_efuse_$(MODULE_NAME).map\"
 endif
@@ -717,6 +732,8 @@ endif
 
 ifeq ($(CONFIG_LOAD_PHY_PARA_FROM_FILE), y)
 EXTRA_CFLAGS += -DCONFIG_LOAD_PHY_PARA_FROM_FILE
+#EXTRA_CFLAGS += -DREALTEK_CONFIG_PATH=\"/lib/firmware/\"
+EXTRA_CFLAGS += -DREALTEK_CONFIG_PATH=\"\"
 endif
 
 ifeq ($(CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY), y)
@@ -731,8 +748,6 @@ ifeq ($(CONFIG_RTW_ADAPTIVITY_EN), disable)
 EXTRA_CFLAGS += -DCONFIG_RTW_ADAPTIVITY_EN=0
 else ifeq ($(CONFIG_RTW_ADAPTIVITY_EN), enable)
 EXTRA_CFLAGS += -DCONFIG_RTW_ADAPTIVITY_EN=1
-else ifeq ($(CONFIG_RTW_ADAPTIVITY_EN), auto)
-EXTRA_CFLAGS += -DCONFIG_RTW_ADAPTIVITY_EN=2
 endif
 
 ifeq ($(CONFIG_RTW_ADAPTIVITY_MODE), normal)
@@ -745,6 +760,10 @@ ifeq ($(CONFIG_SKIP_SIGNAL_SCALE_MAPPING), y)
 EXTRA_CFLAGS += -DCONFIG_SKIP_SIGNAL_SCALE_MAPPING
 endif
 
+ifeq ($(CONFIG_80211W), y)
+EXTRA_CFLAGS += -DCONFIG_IEEE80211W
+endif
+
 ifeq ($(CONFIG_WOWLAN), y)
 EXTRA_CFLAGS += -DCONFIG_WOWLAN
 ifeq ($(CONFIG_SDIO_HCI), y)
@@ -770,17 +789,35 @@ ifeq ($(CONFIG_GPIO_WAKEUP), y)
 EXTRA_CFLAGS += -DCONFIG_GPIO_WAKEUP
 endif
 
+ifneq ($(CONFIG_WAKEUP_GPIO_IDX), default)
+EXTRA_CFLAGS += -DWAKEUP_GPIO_IDX=$(CONFIG_WAKEUP_GPIO_IDX)
+endif
+
 ifeq ($(CONFIG_RTW_SDIO_PM_KEEP_POWER), y)
 ifeq ($(CONFIG_SDIO_HCI), y)
 EXTRA_CFLAGS += -DCONFIG_RTW_SDIO_PM_KEEP_POWER
 endif
 endif
 
+ifeq ($(CONFIG_REDUCE_TX_CPU_LOADING), y)
+EXTRA_CFLAGS += -DCONFIG_REDUCE_TX_CPU_LOADING
+endif
+
+ifeq ($(CONFIG_BR_EXT), y)
+BR_NAME = br0
+EXTRA_CFLAGS += -DCONFIG_BR_EXT
+EXTRA_CFLAGS += '-DCONFIG_BR_EXT_BRNAME="'$(BR_NAME)'"'
+endif
+
+ifeq ($(CONFIG_ANTENNA_DIVERSITY), y)
+EXTRA_CFLAGS += -DCONFIG_ANTENNA_DIVERSITY
+endif
+
+
 ifeq ($(CONFIG_PLATFORM_I386_PC), y)
 EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
-EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211
-EXTRA_CFLAGS += -DRTW_USE_CFG80211_STA_EVENT # only enable when kernel >= 3.2
+EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
 EXTRA_CFLAGS += -DCONFIG_P2P_IPS
 SUBARCH := $(shell uname -m | sed -e s/i.86/i386/)
 ARCH ?= $(SUBARCH)
@@ -835,6 +872,19 @@ KSRC := /media/DATA-2/android-x86/ics-x86_20120130/out/target/product/generic_x8
 MODULE_NAME :=wlan
 endif
 
+ifeq ($(CONFIG_PLATFORM_ANDROID_INTEL_X86), y)
+EXTRA_CFLAGS += -DCONFIG_PLATFORM_ANDROID_INTEL_X86
+EXTRA_CFLAGS += -DCONFIG_PLATFORM_INTEL_BYT
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID
+EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
+EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
+EXTRA_CFLAGS += -DCONFIG_P2P_IPS
+EXTRA_CFLAGS += -DCONFIG_SKIP_SIGNAL_SCALE_MAPPING
+ifeq ($(CONFIG_SDIO_HCI), y)
+EXTRA_CFLAGS += -DCONFIG_RESUME_IN_WORKQUEUE
+endif
+endif
+
 ifeq ($(CONFIG_PLATFORM_JB_X86), y)
 EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
@@ -947,7 +997,7 @@ KSRC ?= /lib/modules/2.6.31-770-g0e46b52/source
 endif
 
 ifeq ($(CONFIG_PLATFORM_FS_MX61), y)
-EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN 
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
 ARCH := arm
 CROSS_COMPILE := /home/share/CusEnv/FreeScale/arm-eabi-4.4.3/bin/arm-eabi-
 KSRC ?= /home/share/CusEnv/FreeScale/FS_kernel_env
@@ -966,6 +1016,7 @@ endif
 ifeq ($(CONFIG_PLATFORM_TI_DM365), y)
 EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_TI_DM365
 EXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_RX
+EXTRA_CFLAGS += -DCONFIG_SINGLE_XMIT_BUF -DCONFIG_SINGLE_RECV_BUF
 ARCH := arm
 #CROSS_COMPILE := /home/cnsd4/Appro/mv_pro_5.0/montavista/pro/devkit/arm/v5t_le/bin/arm_v5t_le-
 #KSRC := /home/cnsd4/Appro/mv_pro_5.0/montavista/pro/devkit/lsp/ti-davinci/linux-dm365
@@ -1041,9 +1092,9 @@ endif
 ifeq ($(CONFIG_PLATFORM_ARM_RK2818), y)
 EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS
 ARCH := arm
-CROSS_COMPILE := /usr/src/release_fae_version/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
-KSRC := /usr/src/release_fae_version/kernel25_A7_281x
-MODULE_NAME := wlan
+#CROSS_COMPILE := /usr/src/release_fae_version/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
+#KSRC := /usr/src/release_fae_version/kernel25_A7_281x
+MODULE_NAME := 8723bu
 endif
 
 ifeq ($(CONFIG_PLATFORM_ARM_RK3188), y)
@@ -1051,14 +1102,11 @@ EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFO
 # default setting for Android 4.1, 4.2, 4.3, 4.4
 EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
-# default setting for Power control
-EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC
-EXTRA_CFLAGS += -DRTW_SUPPORT_PLATFORM_SHUTDOWN
 # default setting for Special function
 EXTRA_CFLAGS += -DCONFIG_P2P_IPS
 ARCH := arm
-CROSS_COMPILE := /home/android_sdk/Rockchip/Rk3188/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-
-KSRC := /home/android_sdk/Rockchip/Rk3188/kernel
+#CROSS_COMPILE := /home/android_sdk/Rockchip/Rk3188/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-
+#KSRC := /home/android_sdk/Rockchip/Rk3188/kernel
 MODULE_NAME := 8723bu
 endif
 
@@ -1108,7 +1156,7 @@ endif
 ifeq ($(CONFIG_PLATFORM_SZEBOOK), y)
 EXTRA_CFLAGS += -DCONFIG_BIG_ENDIAN
 ARCH:=arm
-CROSS_COMPILE:=/opt/crosstool2/bin/armeb-unknown-linux-gnueabi- 
+CROSS_COMPILE:=/opt/crosstool2/bin/armeb-unknown-linux-gnueabi-
 KVER:= 2.6.31.6
 KSRC:= ../code/linux-2.6.31.6-2020/
 endif
@@ -1242,6 +1290,7 @@ endif
 
 ifeq ($(CONFIG_PLATFORM_ACTIONS_ATV5201), y)
 EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ACTIONS_ATV5201
+EXTRA_CFLAGS += -DCONFIG_SDIO_DISABLE_RXFIFO_POLLING_LOOP
 ARCH := mips
 CROSS_COMPILE := mipsel-linux-gnu-
 KVER  := $(KERNEL_VER)
@@ -1301,7 +1350,39 @@ KSRC := /home/android_sdk/WonderMedia/wm8880-android4.4/kernel4.4/
 MODULE_NAME :=8189es_kk
 endif
 
-ifeq ($(CONFIG_MULTIDRV), y)   
+ifeq ($(CONFIG_PLATFORM_RTK119X), y)
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
+#EXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN7I
+EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT
+# default setting for Android 4.1, 4.2
+EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
+EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
+#EXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_QOS_OPTIMIZATION
+EXTRA_CFLAGS += -DCONFIG_QOS_OPTIMIZATION
+
+#EXTRA_CFLAGS += -DCONFIG_#PLATFORM_OPS
+ifeq ($(CONFIG_USB_HCI), y)
+EXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_TX
+#_PLATFORM_FILES += platform/platform_ARM_SUNxI_usb.o
+endif
+ifeq ($(CONFIG_SDIO_HCI), y)
+_PLATFORM_FILES += platform/platform_ARM_SUNnI_sdio.o
+endif
+
+ARCH := arm
+
+# ==== Cross compile setting for Android 4.4 SDK =====
+#CROSS_COMPILE := arm-linux-gnueabihf-
+KVER  := 3.10.24
+#KSRC :=/home/android_sdk/Allwinner/a20/android-kitkat44/lichee/linux-3.4
+CROSS_COMPILE := /home/realtek/software_phoenix/phoenix/toolchain/usr/local/arm-2013.11/bin/arm-linux-gnueabihf-
+KSRC := /home/realtek/software_phoenix/linux-kernel
+MODULE_NAME := 8192eu
+
+endif
+
+
+ifeq ($(CONFIG_MULTIDRV), y)
 
 ifeq ($(CONFIG_SDIO_HCI), y)
 MODULE_NAME := rtw_sdio
@@ -1318,6 +1399,7 @@ endif
 
 endif
 
+USER_MODULE_NAME ?=
 ifneq ($(USER_MODULE_NAME),)
 MODULE_NAME := $(USER_MODULE_NAME)
 endif
@@ -1357,7 +1439,7 @@ $(MODULE_NAME)-$(CONFIG_INTEL_WIDI) += core/rtw_intel_widi.o
 
 $(MODULE_NAME)-$(CONFIG_WAPI_SUPPORT) += core/rtw_wapi.o       \
                                        core/rtw_wapi_sms4.o
-                                       
+
 $(MODULE_NAME)-y += $(_OS_INTFS_FILES)
 $(MODULE_NAME)-y += $(_HAL_INTFS_FILES)
 $(MODULE_NAME)-y += $(_OUTSRC_FILES)
@@ -1407,7 +1489,7 @@ config_r:
 
 clean:
        cd hal/OUTSRC/ ; rm -fr */*.mod.c */*.mod */*.o */.*.cmd */*.ko
-       cd hal/OUTSRC/ ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko 
+       cd hal/OUTSRC/ ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko
        cd hal/led ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko
        cd hal ; rm -fr */*/*.mod.c */*/*.mod */*/*.o */*/.*.cmd */*/*.ko
        cd hal ; rm -fr */*.mod.c */*.mod */*.o */.*.cmd */*.ko
index 8362f94e834a0e305091da5c0d4c6a9b6a2438c4..ca634367f4fe5d6984f5017a67a301a0cd065b56 100755 (executable)
@@ -71,9 +71,9 @@ void free_mlme_ap_info(_adapter *padapter)
 \r
        //free bc/mc sta_info\r
        psta = rtw_get_bcmc_stainfo(padapter);  \r
-       _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);          \r
+       //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);                \r
        rtw_free_stainfo(padapter, psta);\r
-       _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
+       //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
        \r
 \r
        _rtw_spinlock_free(&pmlmepriv->bcn_update_lock);\r
@@ -405,9 +405,9 @@ void        expire_timeout_chk(_adapter *padapter)
                                \r
                                _exit_critical_bh(&pstapriv->auth_list_lock, &irqL);\r
                                \r
-                               _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);  \r
+                               //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);        \r
                                rtw_free_stainfo(padapter, psta);\r
-                               _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);   \r
+                               //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); \r
                                \r
                                _enter_critical_bh(&pstapriv->auth_list_lock, &irqL);\r
                        }       \r
@@ -877,8 +877,6 @@ void update_bmc_sta(_adapter *padapter)
        if(psta)\r
        {\r
                psta->aid = 0;//default set to 0\r
-               //psta->mac_id = psta->aid+4;   \r
-               psta->mac_id = psta->aid + 1;//mac_id=1 for bc/mc stainfo\r
 \r
                pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta;\r
 \r
@@ -1031,7 +1029,7 @@ void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta)
 \r
                // B0 Config LDPC Coding Capability\r
                if (TEST_FLAG(phtpriv_ap->ldpc_cap, LDPC_HT_ENABLE_TX) && \r
-                       GET_HT_CAPABILITY_ELE_LDPC_CAP((u8 *)(&phtpriv_sta->ht_cap)))\r
+                       GET_HT_CAP_ELE_LDPC_CAP((u8 *)(&phtpriv_sta->ht_cap)))\r
                {\r
                        SET_FLAG(cur_ldpc_cap, (LDPC_HT_ENABLE_TX | LDPC_HT_CAP_TX));\r
                        DBG_871X("Enable HT Tx LDPC for STA(%d)\n",psta->aid);\r
@@ -1039,7 +1037,7 @@ void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta)
 \r
                // B7 B8 B9 Config STBC setting\r
                if (TEST_FLAG(phtpriv_ap->stbc_cap, STBC_HT_ENABLE_TX) &&\r
-                       GET_HT_CAPABILITY_ELE_RX_STBC((u8 *)(&phtpriv_sta->ht_cap)))\r
+                       GET_HT_CAP_ELE_RX_STBC((u8 *)(&phtpriv_sta->ht_cap)))\r
                {\r
                        SET_FLAG(cur_stbc_cap, (STBC_HT_ENABLE_TX | STBC_HT_CAP_TX) );\r
                        DBG_871X("Enable HT Tx STBC for STA(%d)\n",psta->aid);\r
@@ -1736,6 +1734,11 @@ int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf,  int len)
                HT_CAP_AMPDU_FACTOR max_rx_ampdu_factor=MAX_AMPDU_FACTOR_64K;\r
                struct rtw_ieee80211_ht_cap *pht_cap = (struct rtw_ieee80211_ht_cap *)(p+2);\r
 \r
+               if (0) {\r
+                       DBG_871X(FUNC_ADPT_FMT" HT_CAP_IE from upper layer:\n", FUNC_ADPT_ARG(padapter));\r
+                       dump_ht_cap_ie_content(RTW_DBGDUMP, p+2, ie_len);\r
+               }\r
+\r
                pHT_caps_ie=p;\r
 \r
                ht_cap = _TRUE;\r
@@ -1743,6 +1746,7 @@ int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf,  int len)
 \r
                rtw_ht_use_default_setting(padapter);\r
 \r
+               /* Update HT Capabilities Info field */\r
                if (pmlmepriv->htpriv.sgi_20m == _FALSE)\r
                        pht_cap->cap_info &= ~(IEEE80211_HT_CAP_SGI_20);\r
 \r
@@ -1764,8 +1768,9 @@ int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf,  int len)
                        pht_cap->cap_info &= ~(IEEE80211_HT_CAP_RX_STBC_3R);\r
                }\r
 \r
+               /* Update A-MPDU Parameters field */\r
                pht_cap->ampdu_params_info &= ~(IEEE80211_HT_CAP_AMPDU_FACTOR|IEEE80211_HT_CAP_AMPDU_DENSITY);\r
-               \r
+\r
                if((psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_CCMP) ||\r
                        (psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_CCMP))\r
                {\r
@@ -1779,11 +1784,25 @@ int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf,  int len)
                rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);\r
                pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_FACTOR & max_rx_ampdu_factor); //set  Max Rx AMPDU size  to 64K\r
 \r
-               rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\r
-               if(rf_type == RF_1T1R)\r
-               {                       \r
-                       pht_cap->supp_mcs_set[0] = 0xff;\r
-                       pht_cap->supp_mcs_set[1] = 0x0;\r
+               /* Update Supported MCS Set field */\r
+               {\r
+                       int i;\r
+\r
+                       rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\r
+\r
+                       /* RX MCS Bitmask */\r
+                       switch(rf_type)\r
+                       {\r
+                               case RF_1T1R:\r
+                               case RF_1T2R: //?\r
+                                       set_mcs_rate_by_mask(HT_CAP_ELE_RX_MCS_MAP(pht_cap), MCS_RATE_1R);\r
+                                       break;\r
+                               case RF_2T2R:\r
+                               default:\r
+                                       set_mcs_rate_by_mask(HT_CAP_ELE_RX_MCS_MAP(pht_cap), MCS_RATE_2R);\r
+                       }\r
+                       for (i = 0; i < 10; i++)\r
+                               *(HT_CAP_ELE_RX_MCS_MAP(pht_cap)+i) &= padapter->mlmeextpriv.default_supported_mcs_set[i];\r
                }\r
 \r
 #ifdef CONFIG_BEAMFORMING\r
@@ -1813,7 +1832,11 @@ int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf,  int len)
 #endif //CONFIG_BEAMFORMING\r
 \r
                _rtw_memcpy(&pmlmepriv->htpriv.ht_cap, p+2, ie_len);\r
-               \r
+\r
+               if (0) {\r
+                       DBG_871X(FUNC_ADPT_FMT" HT_CAP_IE driver masked:\n", FUNC_ADPT_ARG(padapter));\r
+                       dump_ht_cap_ie_content(RTW_DBGDUMP, p+2, ie_len);\r
+               }\r
        }\r
 \r
        //parsing HT_INFO_IE\r
@@ -2376,7 +2399,7 @@ static void update_bcn_vendor_spec_ie(_adapter *padapter, u8*oui)
        \r
 }\r
 \r
-void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx)\r
+void _update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx, const char *tag)\r
 {\r
        _irqL irqL;\r
        struct mlme_priv *pmlmepriv;\r
@@ -2454,6 +2477,8 @@ void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx)
        if(tx)\r
        {\r
                //send_beacon(padapter);//send_beacon must execute on TSR level\r
+               if (0)\r
+                       DBG_871X(FUNC_ADPT_FMT" ie_id:%u - %s\n", FUNC_ADPT_ARG(padapter), ie_id, tag);\r
                set_tx_beacon_cmd(padapter);\r
        }\r
 #else\r
@@ -2929,9 +2954,9 @@ u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reaso
 \r
        beacon_updated = bss_cap_update_on_sta_leave(padapter, psta);\r
 \r
-       _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);                                  \r
+       //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);                                        \r
        rtw_free_stainfo(padapter, psta);\r
-       _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
+       //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
        \r
 \r
        return beacon_updated;\r
@@ -2986,12 +3011,10 @@ int rtw_sta_flush(_adapter *padapter)
        struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
        u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};\r
 \r
-       DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(padapter->pnetdev));\r
-\r
        if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)\r
                return ret;\r
 \r
-\r
+       DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(padapter->pnetdev));\r
        _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\r
        phead = &pstapriv->asoc_list;\r
        plist = get_next(phead);\r
@@ -3192,6 +3215,15 @@ void start_ap_mode(_adapter *padapter)
        for(i=0; i<NUM_STA; i++)\r
                pstapriv->sta_aid[i] = NULL;\r
 \r
+/* to avoid memory leak issue, don't set to NULL directly\r
+       pmlmepriv->wps_beacon_ie = NULL;        \r
+       pmlmepriv->wps_probe_resp_ie = NULL;\r
+       pmlmepriv->wps_assoc_resp_ie = NULL;\r
+       \r
+       pmlmepriv->p2p_beacon_ie = NULL;\r
+       pmlmepriv->p2p_probe_resp_ie = NULL;\r
+*/\r
+       \r
        //for ACL \r
        _rtw_init_listhead(&(pacl_list->acl_node_q.queue));\r
        pacl_list->num = 0;\r
@@ -3218,6 +3250,7 @@ void stop_ap_mode(_adapter *padapter)
 \r
        pmlmepriv->update_bcn = _FALSE;\r
        pmlmeext->bstart_bss = _FALSE;\r
+       padapter->netif_up = _FALSE;\r
        //_rtw_spinlock_free(&pmlmepriv->bcn_update_lock);\r
        \r
        //reset and init security priv , this can refine with rtw_reset_securitypriv\r
@@ -3253,9 +3286,9 @@ void stop_ap_mode(_adapter *padapter)
        rtw_free_all_stainfo(padapter);\r
        \r
        psta = rtw_get_bcmc_stainfo(padapter);\r
-       _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);          \r
+       //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);                \r
        rtw_free_stainfo(padapter, psta);\r
-       _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
+       //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
        \r
        rtw_init_bcmc_stainfo(padapter);        \r
 \r
index a3b44c3f503a26eb0a1f462ea2953644858f07b1..8d8c614e7b82d15b2321ddba8e00230d46934731 100755 (executable)
@@ -330,7 +330,7 @@ BOOLEAN     issue_ht_ndpa_packet(PADAPTER Adapter, u8 *ra, CHANNEL_WIDTH bw, u8 qidx
        update_mgntframe_attrib(Adapter, pattrib);\r
 \r
        if (qidx == BCN_QUEUE_INX)\r
-               pattrib->qsel = 0x10;\r
+               pattrib->qsel = QSLT_BEACON;\r
        pattrib->rate = MGN_MCS8;\r
        pattrib->bwmode = bw;\r
        pattrib->order = 1;\r
@@ -412,7 +412,7 @@ BOOLEAN     issue_vht_ndpa_packet(PADAPTER Adapter, u8 *ra, u16 aid, CHANNEL_WIDTH b
        update_mgntframe_attrib(Adapter, pattrib);\r
 \r
        if (qidx == BCN_QUEUE_INX)\r
-               pattrib->qsel = 0x10;\r
+               pattrib->qsel = QSLT_BEACON;\r
        pattrib->rate = MGN_VHT2SS_MCS0;\r
        pattrib->bwmode = bw;\r
        pattrib->subtype = WIFI_NDPA;\r
index 88a517a68d7d246cfa951595f0b1bae3e136071a..f90f790a31d829c6501eb83b0f4f1e1fa649f415 100755 (executable)
@@ -247,7 +247,7 @@ static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char
                if (len >= 8) {
                        mac = scan_tlv(&data[8], len-8, 1, 1);
                        if (mac) {
-                               _DEBUG_INFO("Router Solicitation, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n",
+                               DBG_871X("Router Solicitation, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n",
                                        mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],                                      
                                        replace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]);
                                memcpy(mac, replace_mac, 6);    
@@ -259,7 +259,7 @@ static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char
                if (len >= 16) {
                        mac = scan_tlv(&data[16], len-16, 1, 1);
                        if (mac) {
-                               _DEBUG_INFO("Router Advertisement, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n",
+                               DBG_871X("Router Advertisement, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n",
                                        mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],                                      
                                        replace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]);
                                memcpy(mac, replace_mac, 6);                    
@@ -271,7 +271,7 @@ static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char
                if (len >= 24) {
                        mac = scan_tlv(&data[24], len-24, 1, 1);
                        if (mac) {              
-                               _DEBUG_INFO("Neighbor Solicitation, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n",
+                               DBG_871X("Neighbor Solicitation, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n",
                                        mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],                                      
                                        replace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]);
                                memcpy(mac, replace_mac, 6);    
@@ -283,7 +283,7 @@ static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char
                if (len >= 24) {
                        mac = scan_tlv(&data[24], len-24, 2, 1);
                        if (mac) {
-                               _DEBUG_INFO("Neighbor Advertisement, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n",
+                               DBG_871X("Neighbor Advertisement, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n",
                                        mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],                                      
                                        replace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]);
                                memcpy(mac, replace_mac, 6);            
@@ -295,7 +295,7 @@ static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char
                if (len >= 40) {
                        mac = scan_tlv(&data[40], len-40, 2, 1);
                        if (mac) {                              
-                               _DEBUG_INFO("Redirect,  replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n",
+                               DBG_871X("Redirect,  replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\n",
                                        mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],                                      
                                        replace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]);
                                memcpy(mac, replace_mac, 6);    
@@ -439,7 +439,7 @@ static int __nat25_db_network_lookup_and_replace(_adapter *priv,
                                atomic_inc(&db->use_count);
 
 #ifdef CL_IPV6_PASS
-                               DEBUG_INFO("NAT25: Lookup M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"    
+                               DBG_871X("NAT25: Lookup M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"      
                                                        "%02x%02x%02x%02x%02x%02x\n",                           
                                        db->macAddr[0],
                                        db->macAddr[1],
@@ -465,7 +465,7 @@ static int __nat25_db_network_lookup_and_replace(_adapter *priv,
                                        db->networkAddr[15],
                                        db->networkAddr[16]);
 #else                          
-                               DEBUG_INFO("NAT25: Lookup M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
+                               DBG_871X("NAT25: Lookup M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
                                        db->macAddr[0],
                                        db->macAddr[1],
                                        db->macAddr[2],
@@ -815,7 +815,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
                                        //in class A, B, C, host address is all zero or all one is illegal
                                        if (iph->saddr == 0)
                                                return 0;
-                                       DEBUG_INFO("NAT25: Insert IP, SA=%08x, DA=%08x\n", iph->saddr, iph->daddr);
+                                       DBG_871X("NAT25: Insert IP, SA=%08x, DA=%08x\n", iph->saddr, iph->daddr);
                                        __nat25_generate_ipv4_network_addr(networkAddr, &iph->saddr);
                                        //record source IP address and , source mac address into db
                                        __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);
@@ -826,7 +826,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
 
                        case NAT25_LOOKUP:
                                {
-                                       DEBUG_INFO("NAT25: Lookup IP, SA=%08x, DA=%08x\n", iph->saddr, iph->daddr);
+                                       DBG_871X("NAT25: Lookup IP, SA=%08x, DA=%08x\n", iph->saddr, iph->daddr);
 #ifdef SUPPORT_TX_MCAST2UNI
                                        if (priv->pshare->rf_ft_var.mc2u_disable ||
                                                        ((((OPMODE & (WIFI_STATION_STATE|WIFI_ASOC_STATE))
@@ -840,12 +840,12 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
                                                if (!__nat25_db_network_lookup_and_replace(priv, skb, networkAddr)) {
                                                        if (*((unsigned char *)&iph->daddr + 3) == 0xff) {
                                                                // L2 is unicast but L3 is broadcast, make L2 bacome broadcast
-                                                               DEBUG_INFO("NAT25: Set DA as boardcast\n");
+                                                               DBG_871X("NAT25: Set DA as boardcast\n");
                                                                memset(skb->data, 0xff, ETH_ALEN);
                                                        }
                                                        else {
                                                                // forward unknow IP packet to upper TCP/IP
-                                                               DEBUG_INFO("NAT25: Replace DA with BR's MAC\n");
+                                                               DBG_871X("NAT25: Replace DA with BR's MAC\n");
                                                                if ( (*(u32 *)priv->br_mac) == 0 && (*(u16 *)(priv->br_mac+4)) == 0 ) {
                                                                        void netdev_br_init(struct net_device *netdev);
                                                                        printk("Re-init netdev_br_init() due to br_mac==0!\n");
@@ -885,7 +885,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
 
                        case NAT25_INSERT:
                                {
-                                       DEBUG_INFO("NAT25: Insert ARP, MAC=%02x%02x%02x%02x%02x%02x\n", arp_ptr[0],
+                                       DBG_871X("NAT25: Insert ARP, MAC=%02x%02x%02x%02x%02x%02x\n", arp_ptr[0],
                                                arp_ptr[1], arp_ptr[2], arp_ptr[3], arp_ptr[4], arp_ptr[5]);
 
                                        // change to ARP sender mac address to wlan STA address
@@ -904,7 +904,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
 
                        case NAT25_LOOKUP:
                                {
-                                       DEBUG_INFO("NAT25: Lookup ARP\n");
+                                       DBG_871X("NAT25: Lookup ARP\n");
 
                                        arp_ptr += arp->ar_hln;
                                        sender = (unsigned int *)arp_ptr;
@@ -930,8 +930,9 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
        /*---------------------------------------------------*/
        /*         Handle IPX and Apple Talk frame           */
        /*---------------------------------------------------*/
-       else if((protocol == __constant_htons(ETH_P_IPX)) ||
-               (protocol <= __constant_htons(ETH_FRAME_LEN)))
+       else if((protocol == __constant_htons(ETH_P_IPX)) || 
+               (protocol == __constant_htons(ETH_P_ATALK)) ||
+               (protocol == __constant_htons(ETH_P_AARP)))
        {
                unsigned char ipx_header[2] = {0xFF, 0xFF};
                struct ipxhdr   *ipx = NULL;
@@ -941,14 +942,14 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
 
                if(protocol == __constant_htons(ETH_P_IPX))
                {
-                       DEBUG_INFO("NAT25: Protocol=IPX (Ethernet II)\n");
+                       DBG_871X("NAT25: Protocol=IPX (Ethernet II)\n");
                        ipx = (struct ipxhdr *)framePtr;
                }
-               else if(protocol <= __constant_htons(ETH_FRAME_LEN))
+               else //if(protocol <= __constant_htons(ETH_FRAME_LEN))
                {
                        if(!memcmp(ipx_header, framePtr, 2))
                        {
-                               DEBUG_INFO("NAT25: Protocol=IPX (Ethernet 802.3)\n");
+                               DBG_871X("NAT25: Protocol=IPX (Ethernet 802.3)\n");
                                ipx = (struct ipxhdr *)framePtr;
                        }
                        else
@@ -968,7 +969,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
                                        {
                                                framePtr += 5;  // eliminate the SNAP header
 
-                                               DEBUG_INFO("NAT25: Protocol=IPX (Ethernet SNAP)\n");
+                                               DBG_871X("NAT25: Protocol=IPX (Ethernet SNAP)\n");
                                                ipx = (struct ipxhdr *)framePtr;
                                        }
                                        else if(!memcmp(aarp_snap_id, framePtr, 5))
@@ -996,18 +997,14 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
 
                                        if(!memcmp(ipx_header, framePtr, 2))
                                        {
-                                               DEBUG_INFO("NAT25: Protocol=IPX (Ethernet 802.2)\n");
+                                               DBG_871X("NAT25: Protocol=IPX (Ethernet 802.2)\n");
                                                ipx = (struct ipxhdr *)framePtr;
                                        }
                                        else
                                                return -1;
                                }
-                               else
-                                       return -1;
                        }
                }
-               else
-                       return -1;
 
                /*   IPX   */
                if(ipx != NULL)
@@ -1017,14 +1014,14 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
                                case NAT25_CHECK:
                                        if(!memcmp(skb->data+ETH_ALEN, ipx->ipx_source.node, ETH_ALEN))
                                        {
-                                               DEBUG_INFO("NAT25: Check IPX skb_copy\n");
+                                               DBG_871X("NAT25: Check IPX skb_copy\n");
                                                return 0;
                                        }
                                        return -1;
 
                                case NAT25_INSERT:
                                        {
-                                               DEBUG_INFO("NAT25: Insert IPX, Dest=%08x,%02x%02x%02x%02x%02x%02x,%04x Source=%08x,%02x%02x%02x%02x%02x%02x,%04x\n",
+                                               DBG_871X("NAT25: Insert IPX, Dest=%08x,%02x%02x%02x%02x%02x%02x,%04x Source=%08x,%02x%02x%02x%02x%02x%02x,%04x\n",
                                                        ipx->ipx_dest.net,
                                                        ipx->ipx_dest.node[0],
                                                        ipx->ipx_dest.node[1],
@@ -1044,7 +1041,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
 
                                                if(!memcmp(skb->data+ETH_ALEN, ipx->ipx_source.node, ETH_ALEN))
                                                {
-                                                       DEBUG_INFO("NAT25: Use IPX Net, and Socket as network addr\n");
+                                                       DBG_871X("NAT25: Use IPX Net, and Socket as network addr\n");
 
                                                        __nat25_generate_ipx_network_addr_with_socket(networkAddr, &ipx->ipx_source.net, &ipx->ipx_source.sock);
 
@@ -1066,7 +1063,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
                                        {
                                                 if(!memcmp(GET_MY_HWADDR(priv), ipx->ipx_dest.node, ETH_ALEN))
                                                {
-                                                       DEBUG_INFO("NAT25: Lookup IPX, Modify Destination IPX Node addr\n");
+                                                       DBG_871X("NAT25: Lookup IPX, Modify Destination IPX Node addr\n");
 
                                                        __nat25_generate_ipx_network_addr_with_socket(networkAddr, &ipx->ipx_dest.net, &ipx->ipx_dest.sock);
 
@@ -1109,7 +1106,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
                                                // change to AARP source mac address to wlan STA address
                                                 memcpy(ea->hw_src, GET_MY_HWADDR(priv), ETH_ALEN);
 
-                                               DEBUG_INFO("NAT25: Insert AARP, Source=%d,%d Destination=%d,%d\n",
+                                               DBG_871X("NAT25: Insert AARP, Source=%d,%d Destination=%d,%d\n",
                                                        ea->pa_src_net,
                                                        ea->pa_src_node,
                                                        ea->pa_dst_net,
@@ -1125,7 +1122,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
 
                                case NAT25_LOOKUP:
                                        {
-                                               DEBUG_INFO("NAT25: Lookup AARP, Source=%d,%d Destination=%d,%d\n",
+                                               DBG_871X("NAT25: Lookup AARP, Source=%d,%d Destination=%d,%d\n",
                                                        ea->pa_src_net,
                                                        ea->pa_src_node,
                                                        ea->pa_dst_net,
@@ -1155,7 +1152,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
 
                                case NAT25_INSERT:
                                        {
-                                               DEBUG_INFO("NAT25: Insert DDP, Source=%d,%d Destination=%d,%d\n",
+                                               DBG_871X("NAT25: Insert DDP, Source=%d,%d Destination=%d,%d\n",
                                                        ddp->deh_snet,
                                                        ddp->deh_snode,
                                                        ddp->deh_dnet,
@@ -1171,7 +1168,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
 
                                case NAT25_LOOKUP:
                                        {
-                                               DEBUG_INFO("NAT25: Lookup DDP, Source=%d,%d Destination=%d,%d\n",
+                                               DBG_871X("NAT25: Lookup DDP, Source=%d,%d Destination=%d,%d\n",
                                                        ddp->deh_snet,
                                                        ddp->deh_snode,
                                                        ddp->deh_dnet,
@@ -1248,7 +1245,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
                                                        if(__nat25_add_pppoe_tag(skb, tag) < 0)
                                                                return -1;
 
-                                                       DEBUG_INFO("NAT25: Insert PPPoE, forward %s packet\n",
+                                                       DBG_871X("NAT25: Insert PPPoE, forward %s packet\n",
                                                                                        (ph->code == PADI_CODE ? "PADI" : "PADR"));
                                                }
                                                else { // not add relay tag
@@ -1269,7 +1266,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
                                }
                                else    // session phase
                                {
-                                               DEBUG_INFO("NAT25: Insert PPPoE, insert session packet to %s\n", skb->dev->name);
+                                               DBG_871X("NAT25: Insert PPPoE, insert session packet to %s\n", skb->dev->name);
 
                                                __nat25_generate_pppoe_network_addr(networkAddr, skb->data, &(ph->sid));
 
@@ -1327,7 +1324,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
                                                if (offset > 0)
                                                        tag->tag_len = htons(tagLen-MAGIC_CODE_LEN-RTL_RELAY_TAG_LEN);
 
-                                               DEBUG_INFO("NAT25: Lookup PPPoE, forward %s Packet from %s\n",
+                                               DBG_871X("NAT25: Lookup PPPoE, forward %s Packet from %s\n",
                                                        (ph->code == PADO_CODE ? "PADO" : "PADS"),      skb->dev->name);
                                        }
                                        else { // not add relay tag
@@ -1342,7 +1339,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
                                else {
                                        if(ph->sid != 0)
                                        {
-                                               DEBUG_INFO("NAT25: Lookup PPPoE, lookup session packet from %s\n", skb->dev->name);
+                                               DBG_871X("NAT25: Lookup PPPoE, lookup session packet from %s\n", skb->dev->name);
                                                __nat25_generate_pppoe_network_addr(networkAddr, skb->data+ETH_ALEN, &(ph->sid));
 
                                                __nat25_db_network_lookup_and_replace(priv, skb, networkAddr);
@@ -1426,7 +1423,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
 
                        case NAT25_INSERT:
                                {
-                                       DEBUG_INFO("NAT25: Insert IP, SA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x,"
+                                       DBG_871X("NAT25: Insert IP, SA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x,"
                                                                        " DA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x\n", 
                                                iph->saddr.s6_addr16[0],iph->saddr.s6_addr16[1],iph->saddr.s6_addr16[2],iph->saddr.s6_addr16[3],
                                                iph->saddr.s6_addr16[4],iph->saddr.s6_addr16[5],iph->saddr.s6_addr16[6],iph->saddr.s6_addr16[7],
@@ -1455,7 +1452,7 @@ int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)
                                return 0;
 
                        case NAT25_LOOKUP:
-                               DEBUG_INFO("NAT25: Lookup IP, SA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x,"
+                               DBG_871X("NAT25: Lookup IP, SA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x,"
                                                                " DA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x\n", 
                                                iph->saddr.s6_addr16[0],iph->saddr.s6_addr16[1],iph->saddr.s6_addr16[2],iph->saddr.s6_addr16[3],
                                                iph->saddr.s6_addr16[4],iph->saddr.s6_addr16[5],iph->saddr.s6_addr16[6],iph->saddr.s6_addr16[7],
@@ -1571,7 +1568,7 @@ void mac_clone(_adapter *priv, unsigned char *addr)
        struct sockaddr sa;
 
        memcpy(sa.sa_data, addr, ETH_ALEN);
-       DEBUG_INFO("MAC Clone: Addr=%02x%02x%02x%02x%02x%02x\n",
+       DBG_871X("MAC Clone: Addr=%02x%02x%02x%02x%02x%02x\n",
                addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
        rtl8192cd_set_hwaddr(priv->dev, &sa);
 }
@@ -1650,7 +1647,7 @@ void dhcp_flag_bcast(_adapter *priv, struct sk_buff *skb)
                                                {
                                                        register int sum = 0;
 
-                                                       DEBUG_INFO("DHCP: change flag of DHCP request to broadcast.\n");
+                                                       DBG_871X("DHCP: change flag of DHCP request to broadcast.\n");
                                                        // or BROADCAST flag
                                                        dhcph->flags |= htons(BROADCAST_FLAG);
                                                        // recalculate checksum
index c9554f75f6cfa4329acd6e90b9b282a5b0db0e47..73f2105becede0352f8b7bc592b1dd088d3ebabd 100755 (executable)
@@ -107,10 +107,6 @@ mptbt_CheckC2hFrame(
        return c2hStatus;\r
 }\r
 \r
-#if defined(CONFIG_RTL8723A)\r
-extern s32 FillH2CCmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);\r
-#endif\r
-\r
 BT_CTRL_STATUS\r
 mptbt_SendH2c(\r
        PADAPTER        Adapter,\r
@@ -140,7 +136,7 @@ mptbt_SendH2c(
                        pMptCtx->MptBtC2hEvent = _FALSE;\r
 \r
 #if defined(CONFIG_RTL8723A)\r
-                       FillH2CCmd(Adapter, 70, h2cCmdLen, (pu1Byte)pH2c);\r
+                       rtw_hal_fill_h2c_cmd(Adapter, 70, h2cCmdLen, (pu1Byte)pH2c);\r
 #elif defined(CONFIG_RTL8723B)\r
                        rtl8723b_set_FwBtMpOper_cmd(Adapter, pH2c->opCode, pH2c->opCodeVer, pH2c->reqNum, pH2c->buf);\r
 #endif\r
index d37f5c817eb4003f3aa8280fc5b92d9c0b44f83f..157b8757066a136bcb40ccb92e60f0d1d45ae189 100755 (executable)
@@ -33,6 +33,11 @@ void rtw_btcoex_PowerOnSetting(PADAPTER padapter)
        hal_btcoex_PowerOnSetting(padapter);
 }
 
+void rtw_btcoex_PreLoadFirmware(PADAPTER padapter)
+{
+       hal_btcoex_PreLoadFirmware(padapter);
+}
+
 void rtw_btcoex_HAL_Initialize(PADAPTER padapter, u8 bWifiOnly)
 {
        hal_btcoex_InitHwConfig(padapter, bWifiOnly);
index 2298e424e8d0f8e76e285682c802e87ee8bd47f8..6ed8f22b49479ec319e012d1943412cfaef3cc42 100755 (executable)
@@ -209,6 +209,9 @@ since only spin_lock is used.
 ISR/Call-Back functions can't call this sub-function.
 
 */
+#ifdef DBG_CMD_QUEUE
+extern u8 dump_cmd_id;
+#endif
 
 sint   _rtw_enqueue_cmd(_queue *queue, struct cmd_obj *obj)
 {
@@ -219,11 +222,52 @@ _func_enter_;
        if (obj == NULL)
                goto exit;
 
+       if(obj->cmdsz > MAX_CMDSZ ){
+               DBG_871X("%s failed due to obj->cmdsz(%d) > MAX_CMDSZ(%d) \n",__FUNCTION__, obj->cmdsz,MAX_CMDSZ);
+               goto exit;
+       }
        //_enter_critical_bh(&queue->lock, &irqL);
        _enter_critical(&queue->lock, &irqL);   
 
        rtw_list_insert_tail(&obj->list, &queue->queue);
 
+       #ifdef DBG_CMD_QUEUE
+       if(dump_cmd_id){
+               printk("%s===> cmdcode:0x%02x\n",__FUNCTION__,obj->cmdcode);
+               if(obj->cmdcode == GEN_CMD_CODE(_Set_MLME_EVT)){
+                       if(obj->parmbuf){
+                               struct C2HEvent_Header *pc2h_evt_hdr = (struct C2HEvent_Header *)(obj->parmbuf);
+                               printk("pc2h_evt_hdr->ID:0x%02x(%d)\n",pc2h_evt_hdr->ID,pc2h_evt_hdr->ID);
+                       }
+               }
+               if(obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)){
+                       if(obj->parmbuf){
+                               struct drvextra_cmd_parm *pdrvextra_cmd_parm =(struct drvextra_cmd_parm*)(obj->parmbuf);
+                               printk("pdrvextra_cmd_parm->ec_id:0x%02x\n",pdrvextra_cmd_parm->ec_id);
+                       }
+               }
+       }       
+       
+       if (queue->queue.prev->next != &queue->queue)
+       {
+               DBG_871X("[%d] head %p, tail %p, tail->prev->next %p[tail], tail->next %p[head]\n", __LINE__,
+            &queue->queue, queue->queue.prev, queue->queue.prev->prev->next, queue->queue.prev->next);
+               
+               DBG_871X("==========%s============\n",__FUNCTION__);
+               DBG_871X("head:%p,obj_addr:%p\n",&queue->queue,obj);
+               DBG_871X("padapter: %p\n",obj->padapter);
+               DBG_871X("cmdcode: 0x%02x\n",obj->cmdcode);
+               DBG_871X("res: %d\n",obj->res);
+               DBG_871X("parmbuf: %p\n",obj->parmbuf);
+               DBG_871X("cmdsz: %d\n",obj->cmdsz);
+               DBG_871X("rsp: %p\n",obj->rsp);
+               DBG_871X("rspsz: %d\n",obj->rspsz);
+               DBG_871X("sctx: %p\n",obj->sctx);
+               DBG_871X("list->next: %p\n",obj->list.next);
+               DBG_871X("list->prev: %p\n",obj->list.prev);
+       }
+       #endif //DBG_CMD_QUEUE
+       
        //_exit_critical_bh(&queue->lock, &irqL);       
        _exit_critical(&queue->lock, &irqL);
 
@@ -243,11 +287,51 @@ _func_enter_;
 
        //_enter_critical_bh(&(queue->lock), &irqL);
        _enter_critical(&queue->lock, &irqL);
-       if (rtw_is_list_empty(&(queue->queue)))
+       
+       #ifdef DBG_CMD_QUEUE
+       if (queue->queue.prev->next != &queue->queue)
+       {
+                DBG_871X("[%d] head %p, tail %p, tail->prev->next %p[tail], tail->next %p[head]\n", __LINE__,
+            &queue->queue, queue->queue.prev, queue->queue.prev->prev->next, queue->queue.prev->next);
+       }
+       #endif //DBG_CMD_QUEUE
+
+
+       if (rtw_is_list_empty(&(queue->queue))){
                obj = NULL;
+       }
        else
        {
                obj = LIST_CONTAINOR(get_next(&(queue->queue)), struct cmd_obj, list);
+
+               #ifdef DBG_CMD_QUEUE
+               if (queue->queue.prev->next != &queue->queue){
+                               DBG_871X("==========%s============\n",__FUNCTION__);
+                          DBG_871X("head:%p,obj_addr:%p\n",&queue->queue,obj);
+                               DBG_871X("padapter: %p\n",obj->padapter);
+                               DBG_871X("cmdcode: 0x%02x\n",obj->cmdcode);
+                               DBG_871X("res: %d\n",obj->res);
+                               DBG_871X("parmbuf: %p\n",obj->parmbuf);
+                               DBG_871X("cmdsz: %d\n",obj->cmdsz);
+                               DBG_871X("rsp: %p\n",obj->rsp);
+                               DBG_871X("rspsz: %d\n",obj->rspsz);
+                               DBG_871X("sctx: %p\n",obj->sctx);                               
+                               DBG_871X("list->next: %p\n",obj->list.next);
+                               DBG_871X("list->prev: %p\n",obj->list.prev);
+               }
+               
+               if(dump_cmd_id){
+                       DBG_871X("%s===> cmdcode:0x%02x\n",__FUNCTION__,obj->cmdcode);
+                       if(obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)){
+                               if(obj->parmbuf){
+                                struct drvextra_cmd_parm *pdrvextra_cmd_parm =(struct drvextra_cmd_parm*)(obj->parmbuf);
+                                printk("pdrvextra_cmd_parm->ec_id:0x%02x\n",pdrvextra_cmd_parm->ec_id);
+                        }
+                       }
+
+               }       
+               #endif //DBG_CMD_QUEUE
+               
                rtw_list_delete(&obj->list);
        }
 
@@ -404,14 +488,16 @@ _func_exit_;
 
 void rtw_free_cmd_obj(struct cmd_obj *pcmd)
 {
+       struct drvextra_cmd_parm *extra_parm = NULL;
 _func_enter_;
 
-       if((pcmd->cmdcode!=_JoinBss_CMD_) &&(pcmd->cmdcode!= _CreateBss_CMD_))
-       {
-               //free parmbuf in cmd_obj
-               rtw_mfree((unsigned char*)pcmd->parmbuf, pcmd->cmdsz);
-       }       
-       
+       if(pcmd->parmbuf != NULL){
+               if((pcmd->cmdcode!=_JoinBss_CMD_) &&(pcmd->cmdcode!= _CreateBss_CMD_))
+               {
+                       //free parmbuf in cmd_obj
+                       rtw_mfree((unsigned char*)pcmd->parmbuf, pcmd->cmdsz);
+               }       
+       }
        if(pcmd->rsp!=NULL)
        {
                if(pcmd->rspsz!= 0)
@@ -452,7 +538,7 @@ thread_return rtw_cmd_thread(thread_context context)
        PADAPTER padapter = (PADAPTER)context;
        struct cmd_priv *pcmdpriv = &(padapter->cmdpriv);
        struct drvextra_cmd_parm *extra_parm = NULL;
-       
+       _irqL irqL;
 _func_enter_;
 
        thread_enter("RTW_CMD_THREAD");
@@ -485,11 +571,14 @@ _func_enter_;
                        break;
                }
                
+               _enter_critical(&pcmdpriv->cmd_queue.lock, &irqL);
                if(rtw_is_list_empty(&(pcmdpriv->cmd_queue.queue)))
                {
                        //DBG_871X("%s: cmd queue is empty!\n", __func__);
+                       _exit_critical(&pcmdpriv->cmd_queue.lock, &irqL);
                        continue;
                }
+               _exit_critical(&pcmdpriv->cmd_queue.lock, &irqL);
 
 #ifdef CONFIG_LPS_LCLK
                if (rtw_register_cmd_alive(padapter) != _SUCCESS)
@@ -520,6 +609,11 @@ _next:
                if( _FAIL == rtw_cmd_filter(pcmdpriv, pcmd) )
                {
                        pcmd->res = H2C_DROPPED;
+                       if (pcmd->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) {
+                               extra_parm = (struct drvextra_cmd_parm *)pcmd->parmbuf;
+                               if (extra_parm && extra_parm->pbuf && extra_parm->size > 0)
+                                       rtw_mfree(extra_parm->pbuf, extra_parm->size);
+                       }
                        goto post_process;
                }
 
@@ -527,6 +621,10 @@ _next:
 
                pcmd->cmdsz = _RND4((pcmd->cmdsz));//_RND4
 
+               if(pcmd->cmdsz > MAX_CMDSZ ){
+                       DBG_871X("%s cmdsz:%d > MAX_CMDSZ:%d\n",__FUNCTION__,pcmd->cmdsz,MAX_CMDSZ);
+               }
+
                _rtw_memcpy(pcmdbuf, pcmd->parmbuf, pcmd->cmdsz);
 
                if(pcmd->cmdcode < (sizeof(wlancmds) /sizeof(struct cmd_hdl)))
@@ -618,7 +716,6 @@ post_process:
 #endif
                        break;
                }
-
                //DBG_871X("%s: leaving... drop cmdcode:%u size:%d\n", __FUNCTION__, pcmd->cmdcode, pcmd->cmdsz);
 
                if (pcmd->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) {
@@ -1345,6 +1442,8 @@ _func_enter_;
                }
        }
 
+       pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pnetwork->network.IEs, pnetwork->network.IELength);
+
        psecnetwork=(WLAN_BSSID_EX *)&psecuritypriv->sec_bss;
        if(psecnetwork==NULL)
        {
@@ -1416,7 +1515,7 @@ _func_enter_;
                {
                        rtw_ht_use_default_setting(padapter);
 
-                       rtw_build_wmm_ie_ht(padapter, &psecnetwork->IEs[12], &psecnetwork->IELength);
+                       rtw_build_wmm_ie_ht(padapter, &psecnetwork->IEs[0], &psecnetwork->IELength);
 
                        //rtw_restructure_ht_ie
                        rtw_restructure_ht_ie(padapter, &pnetwork->network.IEs[12], &psecnetwork->IEs[0], 
@@ -1437,8 +1536,6 @@ _func_enter_;
 
 #endif //CONFIG_80211N_HT
 
-       pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pnetwork->network.IEs, pnetwork->network.IELength);
-
        #if 0
        psecuritypriv->supplicant_ie[0]=(u8)psecnetwork->IELength;
 
@@ -2282,6 +2379,7 @@ static void collect_traffic_statistics(_adapter *padapter)
        pdvobjpriv->traffic_stat.cur_rx_tp = (u32)(pdvobjpriv->traffic_stat.cur_rx_bytes *8/2/1024/1024);
 }
 
+//from_timer == 1 means driver is in LPS
 u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer)
 {
        u8      bEnterPS = _FALSE;
@@ -2372,11 +2470,16 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer)
 #ifdef CONFIG_LPS
                // check traffic for  powersaving.
                if( ((pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod) > 8 ) ||
-                       (pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 2) )
+#ifdef CONFIG_LPS_SLOW_TRANSITION                      
+                       (pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 2) 
+#else //CONFIG_LPS_SLOW_TRANSITION
+                       (pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 4) 
+#endif //CONFIG_LPS_SLOW_TRANSITION
+                       )
                {
                        //DBG_871X("(-)Tx = %d, Rx = %d \n",pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod);
                        bEnterPS= _FALSE;
-
+#ifdef CONFIG_LPS_SLOW_TRANSITION
                        if(bBusyTraffic == _TRUE)
                        {
                                if(pmlmepriv->LinkDetectInfo.TrafficTransitionCount <= 4)
@@ -2391,11 +2494,13 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer)
                                        pmlmepriv->LinkDetectInfo.TrafficTransitionCount = 30;
                                }       
                        }
+#endif //CONFIG_LPS_SLOW_TRANSITION
+       
                }
                else
                {
                        //DBG_871X("(+)Tx = %d, Rx = %d \n",pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod);
-
+#ifdef CONFIG_LPS_SLOW_TRANSITION
                        if(pmlmepriv->LinkDetectInfo.TrafficTransitionCount>=2)
                                pmlmepriv->LinkDetectInfo.TrafficTransitionCount -=2;
                        else
@@ -2403,6 +2508,9 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer)
 
                        if(pmlmepriv->LinkDetectInfo.TrafficTransitionCount == 0)
                                bEnterPS= _TRUE;
+#else //CONFIG_LPS_SLOW_TRANSITION
+                               bEnterPS= _TRUE;
+#endif //CONFIG_LPS_SLOW_TRANSITION
                }
 
 #ifdef CONFIG_DYNAMIC_DTIM
@@ -2519,7 +2627,7 @@ void dynamic_chk_wk_hdl(_adapter *padapter)
 
        //if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING|_FW_UNDER_SURVEY)==_FALSE)
        {
-               linked_status_chk(padapter);    
+               linked_status_chk(padapter, 0); 
                traffic_status_watchdog(padapter, 0);
                dm_DynamicUsbTxAgg(padapter, 0);
        }
@@ -2614,6 +2722,16 @@ _func_enter_;
                        break;
                case LPS_CTRL_TRAFFIC_BUSY:
                        LPS_Leave(padapter, "LPS_CTRL_TRAFFIC_BUSY");
+                       break;
+               case LPS_CTRL_TX_TRAFFIC_LEAVE:
+                       LPS_Leave(padapter, "LPS_CTRL_TX_TRAFFIC_LEAVE");
+                       break;
+               case LPS_CTRL_RX_TRAFFIC_LEAVE:
+                       LPS_Leave(padapter, "LPS_CTRL_RX_TRAFFIC_LEAVE");
+                       break;
+               case LPS_CTRL_ENTER:
+                       LPS_Enter(padapter, "TRAFFIC_IDLE_1");
+                       break;
                default:
                        break;
        }
@@ -3043,8 +3161,6 @@ _func_exit_;
 
 #ifdef CONFIG_AP_MODE
 
-extern u32 g_wait_hiq_empty;
-
 static void rtw_chk_hi_queue_hdl(_adapter *padapter)
 {
        struct sta_info *psta_bmc;
@@ -3058,7 +3174,7 @@ static void rtw_chk_hi_queue_hdl(_adapter *padapter)
 
        rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty);
 
-       while(_FALSE == empty && rtw_get_passing_time_ms(start) < g_wait_hiq_empty)
+       while(_FALSE == empty && rtw_get_passing_time_ms(start) < rtw_get_wait_hiq_empty_ms())
        {
                rtw_msleep_os(100);
                rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty);
@@ -3077,7 +3193,7 @@ static void rtw_chk_hi_queue_hdl(_adapter *padapter)
                        pstapriv->sta_dz_bitmap &= ~BIT(0);
 
                        if (update_tim == _TRUE)
-                               update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
+                               _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "bmc sleepq and HIQ empty");
                }
                else //re check again
                {
@@ -3338,6 +3454,42 @@ exit:
 }
 //#endif //CONFIG_C2H_PACKET_EN
 
+u8 rtw_run_in_thread_cmd(PADAPTER padapter, void (*func)(void*), void* context)
+{
+       struct cmd_priv *pcmdpriv;
+       struct cmd_obj *ph2c;
+       struct RunInThread_param *parm;
+       s32 res = _SUCCESS;
+
+_func_enter_;
+
+       pcmdpriv = &padapter->cmdpriv;
+
+       ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
+       if (NULL == ph2c) {
+               res = _FAIL;
+               goto exit;
+       }
+
+       parm = (struct RunInThread_param*)rtw_zmalloc(sizeof(struct RunInThread_param));
+       if (NULL == parm) {
+               rtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));
+               res = _FAIL;
+               goto exit;
+       }
+
+       parm->func = func;
+       parm->context = context;
+       init_h2fwcmd_w_parm_no_rsp(ph2c, parm, GEN_CMD_CODE(_RunInThreadCMD));
+
+       res = rtw_enqueue_cmd(pcmdpriv, ph2c);
+exit:
+
+_func_exit_;
+
+       return res;
+}
+
 s32 c2h_evt_hdl(_adapter *adapter, u8 *c2h_evt, c2h_id_filter filter)
 {
        s32 ret = _FAIL;
index 936d2e395df1eeada60351c955b258c4cd4636fe..72cad7378d2c9fd850bf7ecbe233c93f6d5d4577 100755 (executable)
@@ -151,6 +151,51 @@ void rf_reg_dump(void *sel, _adapter *adapter)
        }
 }
 
+static u8 fwdl_test_chksum_fail = 0;
+static u8 fwdl_test_wintint_rdy_fail = 0;
+
+bool rtw_fwdl_test_trigger_chksum_fail()
+{
+       if (fwdl_test_chksum_fail) {
+               DBG_871X_LEVEL(_drv_always_, "fwdl test case: trigger chksum_fail\n");
+               fwdl_test_chksum_fail--;
+               return _TRUE;
+       }
+       return _FALSE;
+}
+
+bool rtw_fwdl_test_trigger_wintint_rdy_fail()
+{
+       if (fwdl_test_wintint_rdy_fail) {
+               DBG_871X_LEVEL(_drv_always_, "fwdl test case: trigger wintint_rdy_fail\n");
+               fwdl_test_wintint_rdy_fail--;
+               return _TRUE;
+       }
+       return _FALSE;
+}
+
+static u32 g_wait_hiq_empty_ms = 0;
+
+u32 rtw_get_wait_hiq_empty_ms()
+{
+       return g_wait_hiq_empty_ms;
+}
+
+void rtw_sink_rtp_seq_dbg( _adapter *adapter,_pkt *pkt)
+{
+       struct recv_priv *precvpriv = &(adapter->recvpriv);
+       if( precvpriv->sink_udpport > 0)
+       {
+               if(*((u16*)((pkt->data)+0x24)) == cpu_to_be16(precvpriv->sink_udpport))
+               {
+                       precvpriv->pre_rtp_rxseq= precvpriv->cur_rtp_rxseq;
+                       precvpriv->cur_rtp_rxseq = be16_to_cpu(*((u16*)((pkt->data)+0x2C)));
+                       if( precvpriv->pre_rtp_rxseq+1 != precvpriv->cur_rtp_rxseq)
+                               DBG_871X("%s : RTP Seq num from %d to %d\n",__FUNCTION__,precvpriv->pre_rtp_rxseq,precvpriv->cur_rtp_rxseq);
+               }
+       }
+}
+
 #ifdef CONFIG_PROC_DEBUG
 ssize_t proc_set_write_reg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
 {
@@ -471,8 +516,10 @@ int proc_get_survey_info(struct seq_file *m, void *v)
 
        _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);    
        phead = get_list_head(queue);
+       if(!phead)
+               return 0;
        plist = get_next(phead);
-       if ((!phead) || (!plist))
+       if (!plist)
                return 0;
 
        DBG_871X_SEL_NL(m, "%5s  %-17s  %3s  %-3s  %-4s  %-4s  %5s  %s\n","index", "bssid", "ch", "RSSI", "SdBm", "Noise", "age", "ssid");
@@ -591,6 +638,8 @@ int proc_get_trx_info(struct seq_file *m, void *v)
        struct recv_priv  *precvpriv = &padapter->recvpriv;
        struct hw_xmit *phwxmit;
 
+       dump_os_queue(m, padapter);
+
        DBG_871X_SEL_NL(m, "free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d\n"
                , pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt);
        DBG_871X_SEL_NL(m, "free_ext_xmitbuf_cnt=%d, free_xframe_ext_cnt=%d\n"
@@ -605,21 +654,60 @@ int proc_get_trx_info(struct seq_file *m, void *v)
        }
 
 #ifdef CONFIG_USB_HCI
-       DBG_871X_SEL_NL(m, "rx_urb_pending_cn=%d\n", precvpriv->rx_pending_cnt);
+       DBG_871X_SEL_NL(m, "rx_urb_pending_cn=%d\n", ATOMIC_READ(&(precvpriv->rx_pending_cnt)));
 #endif
 
        return 0;
 }
 
+int proc_get_dis_pwt(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       u8 dis_pwt = 0;
+       rtw_hal_get_def_var(padapter, HAL_DEF_DBG_DIS_PWT, &(dis_pwt));
+       DBG_871X_SEL_NL(m, " Tx Power training mode:%s \n",(dis_pwt==_TRUE)?"Disable":"Enable");
+       return 0;
+}
+ssize_t proc_set_dis_pwt(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
+{
+       struct net_device *dev = data;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       char tmp[4]={0};
+       u8 dis_pwt = 0;
+       
+       if (count < 1)
+               return -EFAULT;
+       if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
+
+               int num = sscanf(tmp, "%hhx", &dis_pwt);
+               DBG_871X("Set Tx Power training mode:%s \n",(dis_pwt==_TRUE)?"Disable":"Enable");
+               
+               if (num >= 1)
+                       rtw_hal_set_def_var(padapter, HAL_DEF_DBG_DIS_PWT, &(dis_pwt));
+       }
+
+       return count;
+       
+}
+
 int proc_get_rate_ctl(struct seq_file *m, void *v)
 {
        struct net_device *dev = m->private;
        int i;
        _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
-
+       u8 data_rate = 0, sgi=0, data_fb = 0;
+               
        if (adapter->fix_rate != 0xff) {
-               DBG_871X_SEL_NL(m, "FIX\n");
-               DBG_871X_SEL_NL(m, "0x%02x(%s)\n", adapter->fix_rate, HDATA_RATE(adapter->fix_rate));
+               data_rate = adapter->fix_rate & 0x7F;
+               sgi = adapter->fix_rate >>7;
+               data_fb = adapter->data_fb?1:0;
+               DBG_871X_SEL_NL(m, "FIXED %s%s%s\n"
+                       , HDATA_RATE(data_rate)
+                       , sgi?" SGI":" LGI"
+                       , data_fb?" FB":""
+               );
+               DBG_871X_SEL_NL(m, "0x%02x %u\n", adapter->fix_rate, adapter->data_fb);
        } else {
                DBG_871X_SEL_NL(m, "RA\n");
        }
@@ -633,24 +721,24 @@ ssize_t proc_set_rate_ctl(struct file *file, const char __user *buffer, size_t c
        _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
        char tmp[32];
        u8 fix_rate;
+       u8 data_fb;
 
        if (count < 1)
                return -EFAULT;
 
        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
 
-               int num = sscanf(tmp, "%hhx", &fix_rate);
+               int num = sscanf(tmp, "%hhx %hhu", &fix_rate, &data_fb);
 
                if (num >= 1)
                        adapter->fix_rate = fix_rate;
+               if (num >= 2)
+                       adapter->data_fb = data_fb?1:0;
        }
 
        return count;
 }
 
-u8 g_fwdl_chksum_fail = 0;
-u8 g_fwdl_wintint_rdy_fail = 0;
-
 ssize_t proc_set_fwdl_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
 {
        struct net_device *dev = data;
@@ -661,14 +749,12 @@ ssize_t proc_set_fwdl_test_case(struct file *file, const char __user *buffer, si
                return -EFAULT;
 
        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
-               int num = sscanf(tmp, "%hhu %hhu", &g_fwdl_chksum_fail, &g_fwdl_wintint_rdy_fail);
+               int num = sscanf(tmp, "%hhu %hhu", &fwdl_test_chksum_fail, &fwdl_test_wintint_rdy_fail);
        }
 
        return count;
 }
 
-u32 g_wait_hiq_empty = 0;
-
 ssize_t proc_set_wait_hiq_empty(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
 {
        struct net_device *dev = data;
@@ -679,7 +765,7 @@ ssize_t proc_set_wait_hiq_empty(struct file *file, const char __user *buffer, si
                return -EFAULT;
 
        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
-               int num = sscanf(tmp, "%u", &g_wait_hiq_empty);
+               int num = sscanf(tmp, "%u", &g_wait_hiq_empty_ms);
        }
 
        return count;
@@ -987,6 +1073,19 @@ int proc_get_int_logs(struct seq_file *m, void *v)
 
 #endif // CONFIG_DBG_COUNTER
 
+int proc_get_hw_status(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct dvobj_priv *dvobj = padapter->dvobj;
+       struct debug_priv *pdbgpriv = &dvobj->drv_dbg;
+
+       DBG_871X_SEL_NL(m, "RX FIFO full count: last_time=%lld, current_time=%lld, differential=%lld\n"
+       , pdbgpriv->dbg_rx_fifo_last_overflow, pdbgpriv->dbg_rx_fifo_curr_overflow, pdbgpriv->dbg_rx_fifo_diff_overflow);
+
+       return 0;
+}
+
 int proc_get_rx_signal(struct seq_file *m, void *v)
 {
        struct net_device *dev = m->private;
@@ -1005,20 +1104,6 @@ int proc_get_rx_signal(struct seq_file *m, void *v)
        return 0;
 }
 
-
-int proc_get_hw_status(struct seq_file *m, void *v)
-{
-       struct net_device *dev = m->private;
-       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
-       struct dvobj_priv *dvobj = padapter->dvobj;
-       struct debug_priv *pdbgpriv = &dvobj->drv_dbg;
-
-       DBG_871X_SEL_NL(m, "RX FIFO full count: last_time=%lld, current_time=%lld, differential=%lld\n"
-       , pdbgpriv->dbg_rx_fifo_last_overflow, pdbgpriv->dbg_rx_fifo_curr_overflow, pdbgpriv->dbg_rx_fifo_diff_overflow);
-
-       return 0;
-}
-
 ssize_t proc_set_rx_signal(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
 {
        struct net_device *dev = data;
@@ -1082,10 +1167,10 @@ ssize_t proc_set_ht_enable(struct file *file, const char __user *buffer, size_t
 
                int num = sscanf(tmp, "%d ", &mode);
 
-               if( pregpriv && mode >= 0 && mode < 2 )
+               if( pregpriv && mode < 2 )
                {
                        pregpriv->ht_enable= mode;
-                       printk("ht_enable=%d\n", pregpriv->ht_enable);
+                       DBG_871X("ht_enable=%d\n", pregpriv->ht_enable);
                }
        }
        
@@ -1205,7 +1290,7 @@ ssize_t proc_set_rx_ampdu(struct file *file, const char __user *buffer, size_t c
 
                int num = sscanf(tmp, "%d ", &mode);
 
-               if( pregpriv && mode >= 0 && mode < 2 )
+               if( pregpriv && mode < 2 )
                {
                        pmlmeinfo->bAcceptAddbaReq = mode;
                        DBG_871X("pmlmeinfo->bAcceptAddbaReq=%d \n",pmlmeinfo->bAcceptAddbaReq);
@@ -1220,7 +1305,135 @@ ssize_t proc_set_rx_ampdu(struct file *file, const char __user *buffer, size_t c
 
        return count;
 }
+int proc_get_rx_ampdu_factor(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+
+
+       if(padapter)
+       {
+               DBG_871X_SEL_NL(m,"rx ampdu factor = %x\n",padapter->driver_rx_ampdu_factor);
+       }
+       
+       return 0;
+}
+
+ssize_t proc_set_rx_ampdu_factor(struct file *file, const char __user *buffer
+                                 , size_t count, loff_t *pos, void *data)
+{
+       struct net_device *dev = data;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       char tmp[32];
+       u32 factor;
+
+       if (count < 1)
+               return -EFAULT;
+
+       if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp)))
+       {
+
+               int num = sscanf(tmp, "%d ", &factor);
+
+               if( padapter && (num == 1) )
+               {
+                       DBG_871X("padapter->driver_rx_ampdu_factor = %x\n", factor);
+
+                       if(factor  > 0x03)
+                               padapter->driver_rx_ampdu_factor = 0xFF;
+                       else
+                               padapter->driver_rx_ampdu_factor = factor;                      
+               }
+       }
+
+       return count;
+}
+
+int proc_get_rx_ampdu_density(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+
+
+       if(padapter)
+       {
+               DBG_871X_SEL_NL(m,"rx ampdu densityg = %x\n",padapter->driver_rx_ampdu_spacing);
+       }
+
+       return 0;
+}
+
+ssize_t proc_set_rx_ampdu_density(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
+{
+       struct net_device *dev = data;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       char tmp[32];
+       u32 density;
+
+       if (count < 1)
+               return -EFAULT;
+
+       if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp)))
+       {
+
+               int num = sscanf(tmp, "%d ", &density);
+
+               if( padapter && (num == 1) )
+               {
+                       DBG_871X("padapter->driver_rx_ampdu_spacing = %x\n", density);
+
+                       if(density > 0x07)
+                               padapter->driver_rx_ampdu_spacing = 0xFF;
+                       else
+                               padapter->driver_rx_ampdu_spacing = density;
+               }
+       }
+
+       return count;
+}
+
+int proc_get_tx_ampdu_density(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+
+
+       if(padapter)
+       {
+               DBG_871X_SEL_NL(m,"tx ampdu density = %x\n",padapter->driver_ampdu_spacing);
+       }
+
+       return 0;
+}
+
+ssize_t proc_set_tx_ampdu_density(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
+{
+       struct net_device *dev = data;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       char tmp[32];
+       u32 density;
 
+       if (count < 1)
+               return -EFAULT;
+
+       if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp)))
+       {
+
+               int num = sscanf(tmp, "%d ", &density);
+
+               if( padapter && (num == 1) )
+               {
+                       DBG_871X("padapter->driver_ampdu_spacing = %x\n", density);
+
+                       if(density > 0x07)
+                               padapter->driver_ampdu_spacing = 0xFF;
+                       else
+                               padapter->driver_ampdu_spacing = density;
+               }
+       }
+
+       return count;
+}
 #endif //CONFIG_80211N_HT
 
 int proc_get_en_fwps(struct seq_file *m, void *v)
@@ -1255,7 +1468,7 @@ ssize_t proc_set_en_fwps(struct file *file, const char __user *buffer, size_t co
 
                int num = sscanf(tmp, "%d ", &mode);
 
-               if( pregpriv && mode >= 0 && mode < 2 )
+               if( pregpriv &&  mode < 2 )
                {
                        pregpriv->check_fw_ps = mode;
                        DBG_871X("pregpriv->check_fw_ps=%d \n",pregpriv->check_fw_ps);
@@ -1319,13 +1532,14 @@ ssize_t proc_set_rx_stbc(struct file *file, const char __user *buffer, size_t co
 }
 #endif //CONFIG_80211N_HT
 
-int proc_get_rssi_disp(struct seq_file *m, void *v)
+/*int proc_get_rssi_disp(struct seq_file *m, void *v)
 {
        struct net_device *dev = m->private;
        return 0;
 }
+*/
 
-ssize_t proc_set_rssi_disp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
+/*ssize_t proc_set_rssi_disp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
 {
        struct net_device *dev = data;
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
@@ -1364,7 +1578,7 @@ ssize_t proc_set_rssi_disp(struct file *file, const char __user *buffer, size_t
        
 }      
 
-               
+*/             
 #ifdef CONFIG_AP_MODE
 
 int proc_get_all_sta_info(struct seq_file *m, void *v)
@@ -1479,7 +1693,7 @@ int proc_get_best_channel(struct seq_file *m, void *v)
                        index_5G = i;
        }       
        
-       for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) {
+       for (i=0; (i < MAX_CHANNEL_NUM) && (pmlmeext->channel_set[i].ChannelNum !=0) ; i++) {
                // 2.4G
                if ( pmlmeext->channel_set[i].ChannelNum == 6 ) {
                        if ( pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_24G].rx_count ) {
@@ -1766,8 +1980,65 @@ int proc_get_tx_ring(struct seq_file *m, void *v)
 
        return 0;
 }
-
 #endif
 
+#ifdef CONFIG_P2P_WOWLAN
+int proc_get_p2p_wowlan_info(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct wifidirect_info  *pwdinfo = &( padapter->wdinfo );
+       struct p2p_wowlan_info   peerinfo = pwdinfo->p2p_wow_info;
+       if(_TRUE == peerinfo.is_trigger)
+       {
+               DBG_871X_SEL_NL(m,"is_trigger: TRUE\n");
+               switch(peerinfo.wowlan_recv_frame_type)
+               {
+                       case P2P_WOWLAN_RECV_NEGO_REQ:
+                               DBG_871X_SEL_NL(m,"Frame Type: Nego Request\n");
+                               break;
+                       case P2P_WOWLAN_RECV_INVITE_REQ:
+                               DBG_871X_SEL_NL(m,"Frame Type: Invitation Request\n");
+                               break;
+                       case P2P_WOWLAN_RECV_PROVISION_REQ:
+                               DBG_871X_SEL_NL(m,"Frame Type: Provision Request\n");
+                               break;
+                       default:
+                               break;
+               }
+               DBG_871X_SEL_NL(m,"Peer Addr: "MAC_FMT"\n", MAC_ARG(peerinfo.wowlan_peer_addr));
+               DBG_871X_SEL_NL(m,"Peer WPS Config: %x\n", peerinfo.wowlan_peer_wpsconfig);
+               DBG_871X_SEL_NL(m,"Persistent Group: %d\n", peerinfo.wowlan_peer_is_persistent);
+               DBG_871X_SEL_NL(m,"Intivation Type: %d\n", peerinfo.wowlan_peer_invitation_type);
+       }
+       else
+       {
+               DBG_871X_SEL_NL(m,"is_trigger: False\n");
+       }
+       return 0;
+}
+#endif /* CONFIG_P2P_WOWLAN */
+
+int proc_get_new_bcn_max(struct seq_file *m, void *v)
+{
+       extern int new_bcn_max;
+
+       DBG_871X_SEL_NL(m, "%d", new_bcn_max);
+       return 0;
+}
+
+ssize_t proc_set_new_bcn_max(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
+{
+       char tmp[32];
+       extern int new_bcn_max;
+
+       if(count < 1)
+               return -EFAULT;
+
+       if(buffer && !copy_from_user(tmp, buffer, sizeof(tmp)))
+               sscanf(tmp, "%d ", &new_bcn_max);
+
+       return count;
+}
 #endif
 
index 036b96bd0cfbf7e52c418edef5a2115a847f4ff1..eabc91f58e161f221efe8ee5d0c9e451de4d4199 100755 (executable)
@@ -19,6 +19,9 @@
  ******************************************************************************/
 #define _IEEE80211_C
 
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+#include <linux/fs.h>
+#endif 
 #include <drv_types.h>
 
 
@@ -150,7 +153,6 @@ u8 *rtw_set_ie
        uint *frlen //frame length
 )
 {
-_func_enter_;
        *pbuf = (u8)index;
 
        *(pbuf + 1) = (u8)len;
@@ -161,7 +163,6 @@ _func_enter_;
        *frlen = *frlen + (len + 2);
        
        return (pbuf + len + 2);
-_func_exit_;   
 }
 
 inline u8 *rtw_set_ie_ch_switch(u8 *buf, u32 *buf_len, u8 ch_switch_mode,
@@ -1112,7 +1113,7 @@ static int rtw_ieee802_11_parse_vendor_specific(u8 *pos, uint elen,
                                elems->wme_tspec_len = elen;
                                break;
                        default:
-                               DBG_871X("unknown WME "
+                               DBG_871X_LEVEL(_drv_warning_, "unknown WME "
                                           "information element ignored "
                                           "(subtype=%d len=%lu)\n",
                                           pos[4], (unsigned long) elen);
@@ -1125,7 +1126,7 @@ static int rtw_ieee802_11_parse_vendor_specific(u8 *pos, uint elen,
                        elems->wps_ie_len = elen;
                        break;
                default:
-                       DBG_871X("Unknown Microsoft "
+                       DBG_871X_LEVEL(_drv_warning_, "Unknown Microsoft "
                                   "information element ignored "
                                   "(type=%d len=%lu)\n",
                                   pos[3], (unsigned long) elen);
@@ -1140,7 +1141,7 @@ static int rtw_ieee802_11_parse_vendor_specific(u8 *pos, uint elen,
                        elems->vendor_ht_cap_len = elen;
                        break;
                default:
-                       DBG_871X("Unknown Broadcom "
+                       DBG_871X_LEVEL(_drv_warning_, "Unknown Broadcom "
                                   "information element ignored "
                                   "(type=%d len=%lu)\n",
                                   pos[3], (unsigned long) elen);
@@ -1149,7 +1150,7 @@ static int rtw_ieee802_11_parse_vendor_specific(u8 *pos, uint elen,
                break;
 
        default:
-               DBG_871X("unknown vendor specific information "
+               DBG_871X_LEVEL(_drv_warning_, "unknown vendor specific information "
                           "element ignored (vendor OUI %02x:%02x:%02x "
                           "len=%lu)\n",
                           pos[0], pos[1], pos[2], (unsigned long) elen);
@@ -1290,9 +1291,10 @@ ParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len,
                        unknown++;
                        if (!show_errors)
                                break;
-                       DBG_871X("IEEE 802.11 element parse "
-                                  "ignored unknown element (id=%d elen=%d)\n",
-                                  id, elen);
+                       DBG_871X_LEVEL(_drv_warning_,
+                               "IEEE 802.11 element parse "
+                               "ignored unknown element (id=%d elen=%d)\n",
+                               id, elen);
                        break;
                }
 
@@ -1347,8 +1349,40 @@ u8 convert_ip_addr(u8 hch, u8 mch, u8 lch)
     return ((key_char2num(hch) * 100) + (key_char2num(mch) * 10 ) + key_char2num(lch));
 }
 
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+#define MAC_ADDRESS_LEN 12
+
+int rtw_get_mac_addr_intel(unsigned char *buf)
+{
+       int ret = 0;
+       int i;
+       struct file *fp = NULL;
+       mm_segment_t oldfs;
+       unsigned char c_mac[MAC_ADDRESS_LEN];
+       char fname[]="/config/wifi/mac.txt";
+       int jj,kk;
+
+       DBG_871X("%s Enter\n", __FUNCTION__);
+
+       ret = rtw_retrive_from_file(fname, c_mac, MAC_ADDRESS_LEN);
+       if(ret < MAC_ADDRESS_LEN)
+       {
+               return -1;
+       }
+
+       for( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 2 )
+       {
+               buf[jj] = key_2char2num(c_mac[kk], c_mac[kk+ 1]);
+       }
+
+       DBG_871X("%s: read from file mac address: "MAC_FMT"\n",
+                __FUNCTION__, MAC_ARG(buf));
+
+       return 0;
+}
+#endif //CONFIG_PLATFORM_INTEL_BYT
+
 extern char* rtw_initmac;
-extern int rockchip_wifi_mac_addr(unsigned char *buf);
 void rtw_macaddr_cfg(u8 *mac_addr)
 {
        u8 mac[ETH_ALEN];
@@ -1364,17 +1398,15 @@ void rtw_macaddr_cfg(u8 *mac_addr)
                }
                _rtw_memcpy(mac_addr, mac, ETH_ALEN);
        }
-       else
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+       else if (0 == rtw_get_mac_addr_intel(mac))
        {
-               printk("Wifi Efuse Mac => %02x:%02x:%02x:%02x:%02x:%02x\n", 
-                                                               mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
-               if (!rockchip_wifi_mac_addr(mac_addr)) {
-                       printk("Use flash MAC = %02x:%02x:%02x:%02x:%02x:%02x\n", 
-                                                                   mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
-               } else {
-                       //  Use the mac address stored in the Efuse
-                       _rtw_memcpy(mac, mac_addr, ETH_ALEN);
-               }
+               _rtw_memcpy(mac_addr, mac, ETH_ALEN);
+       }
+#endif //CONFIG_PLATFORM_INTEL_BYT
+       else
+       {       //      Use the mac address stored in the Efuse
+               _rtw_memcpy(mac, mac_addr, ETH_ALEN);
        }
        
        if (((mac[0]==0xff) &&(mac[1]==0xff) && (mac[2]==0xff) &&
@@ -1396,21 +1428,56 @@ void rtw_macaddr_cfg(u8 *mac_addr)
        DBG_871X("rtw_macaddr_cfg MAC Address  = "MAC_FMT"\n", MAC_ARG(mac_addr));
 }
 
-void dump_ies(u8 *buf, u32 buf_len)
+#ifdef CONFIG_80211N_HT
+void dump_ht_cap_ie_content(void *sel, u8 *buf, u32 buf_len)
+{
+       if (buf_len != 26) {
+               DBG_871X_SEL_NL(sel, "Invalid HT capability IE len:%d != %d\n", buf_len, 26);
+               return;
+       }
+
+       DBG_871X_SEL_NL(sel, "HT Capabilities Info:%02x%02x\n", *(buf), *(buf+1));
+       DBG_871X_SEL_NL(sel, "A-MPDU Parameters:"HT_AMPDU_PARA_FMT"\n"
+               , HT_AMPDU_PARA_ARG(HT_CAP_ELE_AMPDU_PARA(buf)));
+       DBG_871X_SEL_NL(sel, "Supported MCS Set:"HT_SUP_MCS_SET_FMT"\n"
+               , HT_SUP_MCS_SET_ARG(HT_CAP_ELE_SUP_MCS_SET(buf)));
+}
+
+void dump_ht_cap_ie(void *sel, u8 *ie, u32 ie_len)
+{
+       u8* pos = (u8*)ie;
+       u16 id;
+       u16 len;
+
+       u8 *ht_cap_ie;
+       sint ht_cap_ielen;
+
+       ht_cap_ie = rtw_get_ie(ie, _HT_CAPABILITY_IE_, &ht_cap_ielen, ie_len);
+       if(!ie || ht_cap_ie != ie)
+               return;
+
+       dump_ht_cap_ie_content(sel, ht_cap_ie+2, ht_cap_ielen);
+}
+#endif /* CONFIG_80211N_HT */
+
+void dump_ies(void *sel, u8 *buf, u32 buf_len)
 {
        u8* pos = (u8*)buf;
        u8 id, len;
 
-       while(pos-buf<=buf_len){
+       while(pos-buf+1<buf_len){
                id = *pos;
                len = *(pos+1);
 
-               DBG_871X("%s ID:%u, LEN:%u\n", __FUNCTION__, id, len);
-               dump_wps_ie(pos, len);
+               DBG_871X_SEL_NL(sel, "%s ID:%u, LEN:%u\n", __FUNCTION__, id, len);
+               #ifdef CONFIG_80211N_HT
+               dump_ht_cap_ie(sel, pos, len);
+               #endif
+               dump_wps_ie(sel, pos, len);
                #ifdef CONFIG_P2P
-               dump_p2p_ie(pos, len);
+               dump_p2p_ie(sel, pos, len);
                #ifdef CONFIG_WFD
-               dump_wfd_ie(pos, len);
+               dump_wfd_ie(sel, pos, len);
                #endif
                #endif
 
@@ -1418,7 +1485,7 @@ void dump_ies(u8 *buf, u32 buf_len)
        }
 }
 
-void dump_wps_ie(u8 *ie, u32 ie_len)
+void dump_wps_ie(void *sel, u8 *ie, u32 ie_len)
 {
        u8* pos = (u8*)ie;
        u16 id;
@@ -1436,7 +1503,7 @@ void dump_wps_ie(u8 *ie, u32 ie_len)
                id = RTW_GET_BE16(pos);
                len = RTW_GET_BE16(pos + 2);
 
-               DBG_871X("%s ID:0x%04x, LEN:%u\n", __FUNCTION__, id, len);
+               DBG_871X_SEL_NL(sel, "%s ID:0x%04x, LEN:%u\n", __FUNCTION__, id, len);
 
                pos+=(4+len);
        }
@@ -1514,7 +1581,7 @@ int rtw_p2p_merge_ies(u8 *in_ie, u32 in_len, u8 *merge_ie)
        return 0;
 }
 
-void dump_p2p_ie(u8 *ie, u32 ie_len) {
+void dump_p2p_ie(void *sel, u8 *ie, u32 ie_len) {
        u8* pos = (u8*)ie;
        u8 id;
        u16 len;
@@ -1531,7 +1598,7 @@ void dump_p2p_ie(u8 *ie, u32 ie_len) {
                id = *pos;
                len = RTW_GET_LE16(pos+1);
 
-               DBG_871X("%s ID:%u, LEN:%u\n", __FUNCTION__, id, len);
+               DBG_871X_SEL_NL(sel, "%s ID:%u, LEN:%u\n", __FUNCTION__, id, len);
 
                pos+=(3+len);
        }       
@@ -1735,7 +1802,7 @@ static uint rtw_p2p_attr_remove(u8 *ie, uint ielen_ori, u8 attr_id)
                {
                        u8 *next_attr = target_attr+target_attr_len;
                        uint remain_len = ielen-(next_attr-ie);
-                       //dump_ies(ie, ielen);
+                       //dump_ies(RTW_DBGDUMP, ie, ielen);
                        #if 0
                        DBG_871X("[%d] ie:%p, ielen:%u\n"
                                "target_attr:%p, target_attr_len:%u\n"
@@ -1756,7 +1823,7 @@ static uint rtw_p2p_attr_remove(u8 *ie, uint ielen_ori, u8 attr_id)
                else
                {
                        //if(index>0)
-                       //      dump_ies(ie, ielen);
+                       //      dump_ies(RTW_DBGDUMP, ie, ielen);
                        break;
                }
        }
@@ -1772,12 +1839,11 @@ void rtw_WLAN_BSSID_EX_remove_p2p_attr(WLAN_BSSID_EX *bss_ex, u8 attr_id)
        
        if( (p2p_ie=rtw_get_p2p_ie(bss_ex->IEs+_FIXED_IE_LENGTH_, bss_ex->IELength-_FIXED_IE_LENGTH_, NULL, &p2p_ielen_ori)) ) 
        {
-               #if 0
+               if (0)
                if(rtw_get_p2p_attr(p2p_ie, p2p_ielen_ori, attr_id, NULL, NULL)) {
                        DBG_871X("rtw_get_p2p_attr: GOT P2P_ATTR:%u!!!!!!!!\n", attr_id);
-                       dump_ies(bss_ex->IEs+_FIXED_IE_LENGTH_, bss_ex->IELength-_FIXED_IE_LENGTH_);
+                       dump_ies(RTW_DBGDUMP, bss_ex->IEs+_FIXED_IE_LENGTH_, bss_ex->IELength-_FIXED_IE_LENGTH_);
                }
-               #endif
 
                p2p_ielen=rtw_p2p_attr_remove(p2p_ie, p2p_ielen_ori, attr_id);
                if(p2p_ielen != p2p_ielen_ori) {
@@ -1790,10 +1856,10 @@ void rtw_WLAN_BSSID_EX_remove_p2p_attr(WLAN_BSSID_EX *bss_ex, u8 attr_id)
                        _rtw_memset(next_ie+remain_len, 0, p2p_ielen_ori-p2p_ielen);
                        bss_ex->IELength -= p2p_ielen_ori-p2p_ielen;
 
-                       #if 0
-                       DBG_871X("remove P2P_ATTR:%u!\n", attr_id);
-                       dump_ies(bss_ex->IEs+_FIXED_IE_LENGTH_, bss_ex->IELength-_FIXED_IE_LENGTH_);
-                       #endif
+                       if (0) {
+                               DBG_871X("remove P2P_ATTR:%u!\n", attr_id);
+                               dump_ies(RTW_DBGDUMP, bss_ex->IEs+_FIXED_IE_LENGTH_, bss_ex->IELength-_FIXED_IE_LENGTH_);
+                       }
                }
        }
 }
@@ -1801,7 +1867,7 @@ void rtw_WLAN_BSSID_EX_remove_p2p_attr(WLAN_BSSID_EX *bss_ex, u8 attr_id)
 #endif //CONFIG_P2P
 
 #ifdef CONFIG_WFD
-void dump_wfd_ie(u8 *ie, u32 ie_len)
+void dump_wfd_ie(void *sel, u8 *ie, u32 ie_len)
 {
        u8* pos = (u8*)ie;
        u8 id;
@@ -1818,7 +1884,7 @@ void dump_wfd_ie(u8 *ie, u32 ie_len)
                id = *pos;
                len = RTW_GET_BE16(pos+1);
 
-               DBG_871X("%s ID:%u, LEN:%u\n", __FUNCTION__, id, len);
+               DBG_871X_SEL_NL(sel, "%s ID:%u, LEN:%u\n", __FUNCTION__, id, len);
 
                pos+=(3+len);
        }
index 45dc60d0bebea621ddd0ad5419dcda4f5a12f471..3524e1c5a5edb3353452b30d83d0ae00c0b5d27f 100755 (executable)
@@ -50,7 +50,7 @@ struct xmit_frame     *rtw_IOL_accquire_xmit_frame(ADAPTER *adapter)
 
        pattrib = &xmit_frame->attrib;
        update_mgntframe_attrib(adapter, pattrib);
-       pattrib->qsel = 0x10;//Beacon   
+       pattrib->qsel = QSLT_BEACON;//Beacon    
        pattrib->subtype = WIFI_BEACON; 
        pattrib->pktlen = pattrib->last_txcmdsz = 0;
 
@@ -62,7 +62,7 @@ struct xmit_frame     *rtw_IOL_accquire_xmit_frame(ADAPTER *adapter)
        else {
                pattrib = &xmit_frame->attrib;
                update_mgntframe_attrib(adapter, pattrib);
-               pattrib->qsel = 0x10;
+               pattrib->qsel = QSLT_BEACON;
                pattrib->pktlen = pattrib->last_txcmdsz = 0;
        }
 #endif
index df6dfc85ccdcf43a992ceafa551c1218cc33ea14..1047bc0269bed6e8cfa9f5816bc7a82759118ecc 100755 (executable)
@@ -155,7 +155,10 @@ void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv)
 void _rtw_free_mlme_priv (struct mlme_priv *pmlmepriv)
 {
 _func_enter_;
-
+       if (NULL == pmlmepriv){
+               rtw_warn_on(1);
+               goto exit;
+       }
        rtw_free_mlme_priv_ie_data(pmlmepriv);
 
        if(pmlmepriv){
@@ -165,6 +168,7 @@ _func_enter_;
                        rtw_vmfree(pmlmepriv->free_bss_buf, MAX_BSS_CNT * sizeof(struct wlan_network));
                }
        }
+exit:
 _func_exit_;   
 }
 
@@ -863,7 +867,9 @@ void rtw_update_scanned_network(_adapter *adapter, WLAN_BSSID_EX *target)
        ULONG   bssid_ex_sz;
        struct mlme_priv        *pmlmepriv = &(adapter->mlmepriv);
        struct mlme_ext_priv    *pmlmeext = &(adapter->mlmeextpriv);
-       struct wifidirect_info *pwdinfo= &(adapter->wdinfo);    
+#ifdef CONFIG_P2P
+       struct wifidirect_info *pwdinfo= &(adapter->wdinfo);
+#endif // CONFIG_P2P
        _queue  *queue  = &(pmlmepriv->scanned_queue);
        struct wlan_network     *pnetwork = NULL;
        struct wlan_network     *oldest = NULL;
@@ -891,7 +897,7 @@ _func_enter_;
                rtw_bug_check(pnetwork, pnetwork, pnetwork, pnetwork);
 
 #ifdef CONFIG_P2P
-               if (!rtw_p2p_chk_state(&(adapter->wdinfo), P2P_STATE_NONE) &&
+               if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) &&
                        (_rtw_memcmp(pnetwork->network.MacAddress, target->MacAddress, ETH_ALEN) == _TRUE))
                {
                        target_find = 1;
@@ -1489,16 +1495,16 @@ _func_enter_;
                        rtw_tdls_cmd(adapter, myid(&(adapter->eeprompriv)), TDLS_RS_RCR);
                        rtw_reset_tdls_info(adapter);
                        rtw_free_all_stainfo(adapter);
-                       _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
+                       //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
                }
                else
 #endif //CONFIG_TDLS
                {
-                       _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
+                       //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
                        rtw_free_stainfo(adapter,  psta);
                }
 
-               _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
+               //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
                
        }
 
@@ -1509,9 +1515,9 @@ _func_enter_;
                rtw_free_all_stainfo(adapter);
 
                psta = rtw_get_bcmc_stainfo(adapter);
-               _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);          
+               //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);                
                rtw_free_stainfo(adapter, psta);
-               _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);           
+               //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);         
 
                rtw_init_bcmc_stainfo(adapter); 
        }
@@ -1519,36 +1525,19 @@ _func_enter_;
        if(lock_scanned_queue)
                _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
        
-       pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress);
+//     pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress);
+        pwlan = _rtw_find_same_network(&pmlmepriv->scanned_queue, tgt_network);
        if(pwlan)               
        {
                pwlan->fixed = _FALSE;
+
+                DBG_871X("free disconnecting network\n");
+               rtw_free_network_nolock(adapter, pwlan);
 #ifdef CONFIG_P2P
                if(!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE))
                {
-                       u32 p2p_ielen=0;
-                       u8  *p2p_ie;
-                       //u16 capability;
-                       u8 *pcap = NULL;
-                       u32 capability_len=0;
-                       
-                       //DBG_871X("free disconnecting network\n");
-                       //rtw_free_network_nolock(pmlmepriv, pwlan);
-
-                       if((p2p_ie=rtw_get_p2p_ie(pwlan->network.IEs+_FIXED_IE_LENGTH_, pwlan->network.IELength-_FIXED_IE_LENGTH_, NULL, &p2p_ielen)))
-                       {                       
-                               pcap = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, NULL, &capability_len);
-                               if(pcap && capability_len==2)
-                               {
-                                       u16 cap = *(u16*)pcap ;
-                                       *(u16*)pcap = cap&0x00ff;//clear group capability when free this network
-                               }
-
-       }       
-
                        rtw_set_scan_deny(adapter, 2000);
-                       //rtw_clear_scan_deny(adapter);
-                       
+                       //rtw_clear_scan_deny(adapter);                 
                }
 #endif //CONFIG_P2P
        }       
@@ -1644,6 +1633,8 @@ void rtw_indicate_disconnect( _adapter *padapter )
        WLAN_BSSID_EX   *cur_network = &(pmlmeinfo->network);
        struct sta_info *psta;
        struct sta_priv *pstapriv = &padapter->stapriv;
+       u8 *wps_ie=NULL;
+       uint wpsie_len=0;
 
 _func_enter_;  
        
@@ -1651,6 +1642,22 @@ _func_enter_;
 
        _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING|WIFI_UNDER_WPS);
 
+       // force to clear cur_network_scanned's SELECTED REGISTRAR
+       if (pmlmepriv->cur_network_scanned) {
+               WLAN_BSSID_EX   *current_joined_bss = &(pmlmepriv->cur_network_scanned->network);
+               if (current_joined_bss) {
+                       wps_ie=rtw_get_wps_ie(current_joined_bss->IEs +_FIXED_IE_LENGTH_,
+                               current_joined_bss->IELength-_FIXED_IE_LENGTH_, NULL, &wpsie_len);
+                       if (wps_ie && wpsie_len>0) {
+                               u8 *attr = NULL;
+                               u32 attr_len;
+                               attr=rtw_get_wps_attr(wps_ie, wpsie_len, WPS_ATTR_SELECTED_REGISTRAR,
+                                                      NULL, &attr_len);
+                               if (attr)
+                                       *(attr + 4) = 0;
+                       }
+               }
+       }
         //DBG_871X("clear wps when %s\n", __func__);
 
        if(rtw_to_roam(padapter) > 0)
@@ -1724,17 +1731,17 @@ inline void rtw_indicate_scan_done( _adapter *padapter, bool aborted)
 #endif // CONFIG_IPS
 }
 
-void rtw_scan_abort(_adapter *adapter)
+u32 rtw_scan_abort_timeout(_adapter *adapter, u32 timeout_ms)
 {
-       u32 cnt=0;
        u32 start;
-       struct mlme_priv        *pmlmepriv = &(adapter->mlmepriv);
-       struct mlme_ext_priv    *pmlmeext = &(adapter->mlmeextpriv);
+       u32 pass_ms;
+       struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
+       struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);
 
        start = rtw_get_current_time();
        pmlmeext->scan_abort = _TRUE;
        while (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)
-               && rtw_get_passing_time_ms(start) <= 200) {
+               && rtw_get_passing_time_ms(start) <= timeout_ms) {
 
                if (adapter->bDriverStopped || adapter->bSurpriseRemoved)
                        break;
@@ -1749,11 +1756,28 @@ void rtw_scan_abort(_adapter *adapter)
                #ifdef CONFIG_PLATFORM_MSTAR
                //_clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);
                set_survey_timer(pmlmeext, 0);
-               _set_timer(&pmlmepriv->scan_to_timer, 50);
+               mlme_set_scan_to_timer(pmlmepriv, 50);
                #endif
                rtw_indicate_scan_done(adapter, _TRUE);
        }
        pmlmeext->scan_abort = _FALSE;
+       pass_ms = rtw_get_passing_time_ms(start);
+
+       return pass_ms;
+}
+
+void rtw_scan_abort_no_wait(_adapter *adapter)
+{
+       struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
+       struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);
+
+       if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))
+               pmlmeext->scan_abort = _TRUE;
+}
+
+void rtw_scan_abort(_adapter *adapter)
+{
+       rtw_scan_abort_timeout(adapter, 200);
 }
 
 static struct sta_info *rtw_joinbss_update_stainfo(_adapter *padapter, struct wlan_network *pnetwork)
@@ -2039,9 +2063,9 @@ _func_enter_;
 
                                        pcur_sta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress);
                                        if(pcur_sta){
-                                               _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);
+                                               //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);
                                                rtw_free_stainfo(adapter,  pcur_sta);
-                                               _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);
+                                               //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);
                                        }
 
                                        ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress);
@@ -2487,6 +2511,7 @@ _func_enter_;
 
                rtw_free_assoc_resources(adapter, 1);
                rtw_indicate_disconnect(adapter);
+               rtw_free_mlme_priv_ie_data(pmlmepriv);
 
                _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
                // remove the network entry in scanned_queue
@@ -2509,9 +2534,9 @@ _func_enter_;
              check_fwstate(pmlmepriv,WIFI_ADHOC_STATE))
        {
                
-               _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
+               //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
                rtw_free_stainfo(adapter,  psta);
-               _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
+               //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
                
                if(adapter->stapriv.asoc_sta_count== 1) //a sta + bc/mc_stainfo (not Ibss_stainfo)
                { 
@@ -2838,7 +2863,7 @@ void rtw_dynamic_check_timer_handlder(_adapter *adapter)
        {
                u8 bEnterPS;    
                
-               linked_status_chk(adapter);     
+               linked_status_chk(adapter, 1);  
                        
                bEnterPS = traffic_status_watchdog(adapter, 1);
                if(bEnterPS)
@@ -3506,22 +3531,67 @@ static int SecIsInPMKIDList(_adapter *Adapter, u8 *bssid)
 // 13th element in the array is the IE length  
 //
 
-static int rtw_append_pmkid(_adapter *Adapter,int iEntry, u8 *ie, uint ie_len)
+static int rtw_append_pmkid(_adapter *adapter,int iEntry, u8 *ie, uint ie_len)
 {
-       struct security_priv *psecuritypriv=&Adapter->securitypriv;
+       struct security_priv *sec=&adapter->securitypriv;
 
-       if(ie[13]<=20){ 
-               // The RSN IE didn't include the PMK ID, append the PMK information 
-                       ie[ie_len]=1;
-                       ie_len++;
-                       ie[ie_len]=0;   //PMKID count = 0x0100
-                       ie_len++;
-                       _rtw_memcpy(    &ie[ie_len], &psecuritypriv->PMKIDList[iEntry].PMKID, 16);
-               
-                       ie_len+=16;
-                       ie[13]+=18;//PMKID length = 2+16
+       if (ie[13] > 20) {
+               int i;
+               u16 pmkid_cnt = RTW_GET_LE16(ie+14+20);
+               if (pmkid_cnt == 1 && _rtw_memcmp(ie+14+20+2, &sec->PMKIDList[iEntry].PMKID, 16)) {
+                       DBG_871X(FUNC_ADPT_FMT" has carried the same PMKID:"KEY_FMT"\n"
+                               , FUNC_ADPT_ARG(adapter), KEY_ARG(&sec->PMKIDList[iEntry].PMKID));
+                       goto exit;
+               }
+
+               DBG_871X(FUNC_ADPT_FMT" remove original PMKID, count:%u\n"
+                       , FUNC_ADPT_ARG(adapter), pmkid_cnt);
+
+               for (i=0;i<pmkid_cnt;i++)
+                       DBG_871X("    "KEY_FMT"\n", KEY_ARG(ie+14+20+2+i*16));
+
+               ie_len -= 2+pmkid_cnt*16;
+               ie[13] = 20;
+       }
+
+       if (ie[13] <= 20) {     
+               /* The RSN IE didn't include the PMK ID, append the PMK information */
 
+               DBG_871X(FUNC_ADPT_FMT" append PMKID:"KEY_FMT"\n"
+                               , FUNC_ADPT_ARG(adapter), KEY_ARG(&sec->PMKIDList[iEntry].PMKID));
+
+               RTW_PUT_LE16(&ie[ie_len], 1);
+               ie_len += 2;
+
+               _rtw_memcpy(&ie[ie_len], &sec->PMKIDList[iEntry].PMKID, 16);
+               ie_len += 16;
+
+               ie[13] += 18;//PMKID length = 2+16
        }
+
+exit:
+       return (ie_len);
+}
+
+static int rtw_remove_pmkid(_adapter *adapter, u8 *ie, uint ie_len)
+{
+       struct security_priv *sec=&adapter->securitypriv;
+       int i;
+       u16 pmkid_cnt = RTW_GET_LE16(ie+14+20);
+
+       if (ie[13] <= 20)
+               goto exit;
+
+       DBG_871X(FUNC_ADPT_FMT" remove original PMKID, count:%u\n"
+               , FUNC_ADPT_ARG(adapter), pmkid_cnt);
+
+       for (i=0;i<pmkid_cnt;i++)
+               DBG_871X("    "KEY_FMT"\n", KEY_ARG(ie+14+20+2+i*16));
+
+       ie_len -= 2+pmkid_cnt*16;
+       ie[13] = 20;
+
+exit:
        return (ie_len);
 }
 
@@ -3581,14 +3651,13 @@ _func_enter_;
        iEntry = SecIsInPMKIDList(adapter, pmlmepriv->assoc_bssid);
        if(iEntry<0)
        {
-               return ielength;
+               if(authmode == _WPA2_IE_ID_)
+                       ielength = rtw_remove_pmkid(adapter, out_ie, ielength);
        }
        else
        {
                if(authmode == _WPA2_IE_ID_)
-               {
                        ielength=rtw_append_pmkid(adapter, iEntry, out_ie, ielength);
-               }
        }
 
 _func_exit_;
@@ -3712,17 +3781,10 @@ void rtw_joinbss_reset(_adapter *padapter)
 {
        u8      threshold;
        struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
-
-#ifdef CONFIG_80211N_HT        
-       struct ht_priv          *phtpriv = &pmlmepriv->htpriv;
-#endif
-
        //todo: if you want to do something io/reg/hw setting before join_bss, please add code here
        
-
-
-
-#ifdef CONFIG_80211N_HT
+#ifdef CONFIG_80211N_HT        
+       struct ht_priv          *phtpriv = &pmlmepriv->htpriv;  
 
        pmlmepriv->num_FortyMHzIntolerant = 0;
 
@@ -3746,9 +3808,9 @@ void rtw_joinbss_reset(_adapter *padapter)
                threshold = 1;
                rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));
        }
-#endif
+#endif//#if defined( CONFIG_USB_HCI) || defined (CONFIG_SDIO_HCI)
 
-#endif 
+#endif//#ifdef CONFIG_80211N_HT
 
 }
 
@@ -3985,11 +4047,17 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui
        //rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);
        ht_capie.ampdu_params_info = (max_rx_ampdu_factor&0x03);
 
-       if(padapter->securitypriv.dot11PrivacyAlgrthm == _AES_ )
-               ht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&(0x07<<2));
+       if(padapter->driver_rx_ampdu_spacing != 0xFF) 
+       {
+               ht_capie.ampdu_params_info |= (( padapter->driver_rx_ampdu_spacing&0x07) <<2);  
+       }
        else
-               ht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00);
-
+       {
+               if(padapter->securitypriv.dot11PrivacyAlgrthm == _AES_ )
+                       ht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&(0x07<<2));
+               else
+                       ht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00);
+       }
 #ifdef CONFIG_BEAMFORMING
        ht_capie.tx_BF_cap_info = 0;
 
@@ -4484,3 +4552,18 @@ u8 rtw_get_buddy_bBusyTraffic(_adapter *padapter)
 }
 
 #endif //CONFIG_CONCURRENT_MODE
+
+static const char *miracast_mode_str[] = {
+       "DISABLED",
+       "SOURCE",
+       "SINK",
+       "INVALID",
+};
+
+const char *get_miracast_mode_str(int mode)
+{
+       if (mode < MIRACAST_DISABLED || mode >= MIRACAST_INVALID)
+               mode = MIRACAST_INVALID;
+
+       return miracast_mode_str[mode];
+}
index 4f50cb79429595a9b7b51968c930871de4e94778..7cf52d00d1359325a7b2619fabc13fed2bddf701 100755 (executable)
@@ -171,7 +171,7 @@ static RT_CHANNEL_PLAN_5G   RTW_ChannelPlan5G[RT_CHANNEL_DOMAIN_5G_MAX] = {
        {{56,60,64,149,153,157,161,165},8},                                                                                                                     // 0x10, RT_CHANNEL_DOMAIN_5G_NCC2
        {{149,153,157,161,165},5},                                                                                                                                      // 0x11, RT_CHANNEL_DOMAIN_5G_NCC3
        {{36,40,44,48},4},                                                                                                                                                      // 0x12, RT_CHANNEL_DOMAIN_5G_ETSI4
-       {{36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165},20},                                 // 0x13, RT_CHANNEL_DOMAIN_5G_ETSI5
+       {{36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161,165},21},                     // 0x13, RT_CHANNEL_DOMAIN_5G_ETSI5
        {{149,153,157,161},4},                                                                                                                                          // 0x14, RT_CHANNEL_DOMAIN_5G_FCC8
        {{36,40,44,48,52,56,60,64},8},                                                                                                                          // 0x15, RT_CHANNEL_DOMAIN_5G_ETSI6
        {{36,40,44,48,52,56,60,64,149,153,157,161,165},13},                                                                                     // 0x16, RT_CHANNEL_DOMAIN_5G_ETSI7
@@ -181,14 +181,17 @@ static RT_CHANNEL_PLAN_5G RTW_ChannelPlan5G[RT_CHANNEL_DOMAIN_5G_MAX] = {
        {{36,40,44,48,52,56,60,64,132,136,140,149,153,157,161,165},16},                                                                 // 0x1A, RT_CHANNEL_DOMAIN_5G_ETSI11
        {{52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161,165},17},                                                 // 0x1B, RT_CHANNEL_DOMAIN_5G_NCC4
        {{149,153,157,161},4},                                                                                                                                          // 0x1C, RT_CHANNEL_DOMAIN_5G_ETSI12
-       {{36,40,44,48,100,104,108,112,116,132,136,140,149,153,157,161,165},17},                                                 // 0x1D, RT_CHANNEL_DOMAIN_5G_FCC9
-       {{36,40,44,48,100,104,108,112,116,132,136,140},12},                                                                                     // 0x1E, RT_CHANNEL_DOMAIN_5G_ETSI13
-       {{36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161},20},                                 // 0x1F, RT_CHANNEL_DOMAIN_5G_FCC10
-
+       {{36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161,165},21},                     // 0x1D, RT_CHANNEL_DOMAIN_5G_FCC9
+       {{36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140},16},                                                         // 0x1E, RT_CHANNEL_DOMAIN_5G_ETSI13
+       {{36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161},20},                         // 0x1F, RT_CHANNEL_DOMAIN_5G_FCC10
+       {{36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,149,153,157,161},19},                                     // 0x20, RT_CHANNEL_DOMAIN_5G_KCC2
+       {{36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161,165},21},                     // 0x21, RT_CHANNEL_DOMAIN_5G_FCC11
+       {{56,60,64,100,104,108,112,116,132,136,140,149,153,157,161,165},16},                                            // 0x22, RT_CHANNEL_DOMAIN_5G_NCC5
+       {{36,40,44,48},4},                                                                                                                                                      // 0x23, RT_CHANNEL_DOMAIN_5G_MKK4
        //===== Driver self defined for old channel plan Compatible ,Remember to modify if have new channel plan definition =====
-       {{36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161,165},21},                             // 0x20, RT_CHANNEL_DOMAIN_5G_FCC
-       {{36,40,44,48},4},                                                                                                                                                      // 0x21, RT_CHANNEL_DOMAIN_5G_JAPAN_NO_DFS
-       {{36,40,44,48,149,153,157,161},8},                                                                                                                      // 0x22, RT_CHANNEL_DOMAIN_5G_FCC4_NO_DFS
+       {{36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161,165},21},                     // 0x30, RT_CHANNEL_DOMAIN_5G_FCC
+       {{36,40,44,48},4},                                                                                                                                                      // 0x31, RT_CHANNEL_DOMAIN_5G_JAPAN_NO_DFS
+       {{36,40,44,48,149,153,157,161},8},                                                                                                                      // 0x32, RT_CHANNEL_DOMAIN_5G_FCC4_NO_DFS
 };
 
 static RT_CHANNEL_PLAN_MAP     RTW_ChannelPlanMap[RT_CHANNEL_DOMAIN_MAX] = {
@@ -234,7 +237,7 @@ static RT_CHANNEL_PLAN_MAP  RTW_ChannelPlanMap[RT_CHANNEL_DOMAIN_MAX] = {
        {0x02,0x04},    //0x25, RT_CHANNEL_DOMAIN_FCC1_FCC1
        {0x00,0x01},    //0x26, RT_CHANNEL_DOMAIN_WORLD_ETSI1
        {0x03,0x0C},    //0x27, RT_CHANNEL_DOMAIN_MKK1_MKK1
-       {0x00,0x0B},    //0x28, RT_CHANNEL_DOMAIN_WORLD_KCC1
+       {0x00,0x20},    //0x28, RT_CHANNEL_DOMAIN_5G_KCC2
        {0x00,0x05},    //0x29, RT_CHANNEL_DOMAIN_WORLD_FCC2
        {0x00,0x00},    //0x2A,
        {0x00,0x00},    //0x2B,
@@ -246,12 +249,12 @@ static RT_CHANNEL_PLAN_MAP        RTW_ChannelPlanMap[RT_CHANNEL_DOMAIN_MAX] = {
        {0x00,0x07},    //0x31, RT_CHANNEL_DOMAIN_WORLD_FCC4
        {0x00,0x08},    //0x32, RT_CHANNEL_DOMAIN_WORLD_FCC5
        {0x00,0x09},    //0x33, RT_CHANNEL_DOMAIN_WORLD_FCC6
-       {0x02,0x0A},    //0x34, RT_CHANNEL_DOMAIN_FCC1_FCC7
+       {0x02,0x21},    //0x34, RT_CHANNEL_DOMAIN_5G_FCC11
        {0x00,0x02},    //0x35, RT_CHANNEL_DOMAIN_WORLD_ETSI2
        {0x00,0x03},    //0x36, RT_CHANNEL_DOMAIN_WORLD_ETSI3
        {0x03,0x0D},    //0x37, RT_CHANNEL_DOMAIN_MKK1_MKK2
        {0x03,0x0E},    //0x38, RT_CHANNEL_DOMAIN_MKK1_MKK3
-       {0x02,0x0F},    //0x39, RT_CHANNEL_DOMAIN_FCC1_NCC1
+       {0x02,0x22},    //0x39, RT_CHANNEL_DOMAIN_5G_NCC5
        {0x00,0x00},    //0x3A,
        {0x00,0x00},    //0x3B,
        {0x00,0x00},    //0x3C,
@@ -268,6 +271,12 @@ static RT_CHANNEL_PLAN_MAP RTW_ChannelPlanMap[RT_CHANNEL_DOMAIN_MAX] = {
        {0x00,0x15},    //0x47, RT_CHANNEL_DOMAIN_WORLD_ETSI6
        {0x00,0x16},    //0x48, RT_CHANNEL_DOMAIN_WORLD_ETSI7
        {0x00,0x17},    //0x49, RT_CHANNEL_DOMAIN_WORLD_ETSI8
+       {0x00,0x00},    //0x4A,
+       {0x00,0x00},    //0x4B,
+       {0x00,0x00},    //0x4C,
+       {0x00,0x00},    //0x4D,
+       {0x00,0x00},    //0x4E,
+       {0x00,0x00},    //0x4F,
        {0x00,0x18},    //0x50, RT_CHANNEL_DOMAIN_WORLD_ETSI9
        {0x00,0x19},    //0x51, RT_CHANNEL_DOMAIN_WORLD_ETSI10
        {0x00,0x1A},    //0x52, RT_CHANNEL_DOMAIN_WORLD_ETSI11
@@ -276,9 +285,10 @@ static RT_CHANNEL_PLAN_MAP RTW_ChannelPlanMap[RT_CHANNEL_DOMAIN_MAX] = {
        {0x02,0x1D},    //0x55, RT_CHANNEL_DOMAIN_FCC1_FCC9
        {0x00,0x1E},    //0x56, RT_CHANNEL_DOMAIN_WORLD_ETSI13
        {0x02,0x1F},    //0x57, RT_CHANNEL_DOMAIN_FCC1_FCC10
+       {0x01,0x23},    //0x58, RT_CHANNEL_DOMAIN_WORLD_MKK4
 };
 
-static RT_CHANNEL_PLAN_MAP     RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE = {0x03,0x02}; //use the conbination for max channel numbers
+static RT_CHANNEL_PLAN_MAP     RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE = {0x01,0x02}; //use the conbination for max channel numbers
 
 /*
  * Search the @param ch in given @param ch_set
@@ -341,7 +351,7 @@ void init_mlme_default_rate_set(_adapter* padapter)
 
        unsigned char   mixed_datarate[NumRates] = {_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, _6M_RATE_,_9M_RATE_, _12M_RATE_, _18M_RATE_, _24M_RATE_, _36M_RATE_, _48M_RATE_, _54M_RATE_, 0xff};
        unsigned char   mixed_basicrate[NumRates] ={_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, _6M_RATE_, _12M_RATE_, _24M_RATE_, 0xff,};
-       unsigned char   supported_mcs_set[16] = {0xff, 0xff, 0x00, 0x00, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
+       unsigned char   supported_mcs_set[16] = {0xff, 0xff, 0x00, 0x00, 0x00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
 
        _rtw_memcpy(pmlmeext->datarate, mixed_datarate, NumRates);
        _rtw_memcpy(pmlmeext->basicrate, mixed_basicrate, NumRates);
@@ -912,12 +922,13 @@ unsigned int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame)
 
                //      Commented by Kurt 2012/10/16
                //      IOT issue: Google Nexus7 use 1M rate to send p2p_probe_req after GO nego completed and Nexus7 is client
-#ifdef CONFIG_WIFI_TEST
-               if ( pattrib->data_rate <= 3 )
-               {
-                       wifi_test_chk_rate = 0;
-               }
-#endif //CONFIG_WIFI_TEST
+        if (padapter->registrypriv.wifi_spec == 1)
+        {
+            if ( pattrib->data_rate <= 3 )
+            {
+                wifi_test_chk_rate = 0;
+            }
+        }
 
                if( wifi_test_chk_rate == 1 )
                {
@@ -1284,8 +1295,23 @@ unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame)
                        pbss = (WLAN_BSSID_EX*)rtw_malloc(sizeof(WLAN_BSSID_EX));
                        if (pbss) {
                                if (collect_bss_info(padapter, precv_frame, pbss) == _SUCCESS) {
+                                       struct beacon_keys recv_beacon;
+
                                        update_network(&(pmlmepriv->cur_network.network), pbss, padapter, _TRUE);
                                        rtw_get_bcn_info(&(pmlmepriv->cur_network));
+
+                                       // update bcn keys
+                                       if (rtw_get_bcn_keys(padapter, pframe, len, &recv_beacon) == _TRUE) {
+                                               DBG_871X("%s: beacon keys ready\n", __func__);
+                                               _rtw_memcpy(&pmlmepriv->cur_beacon_keys,
+                                                       &recv_beacon, sizeof(recv_beacon));
+                                               pmlmepriv->new_beacon_cnts = 0;
+                                       }
+                                       else {
+                                               DBG_871X_LEVEL(_drv_err_, "%s: get beacon keys failed\n", __func__);
+                                               _rtw_memset(&pmlmepriv->cur_beacon_keys, 0, sizeof(recv_beacon));
+                                               pmlmepriv->new_beacon_cnts = 0;
+                                       }
                                }
                                rtw_mfree((u8*)pbss, sizeof(WLAN_BSSID_EX));
                        }
@@ -6535,14 +6561,14 @@ void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib)
 {
        u8      wireless_mode;
        struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
-
+       struct xmit_priv                *pxmitpriv = &padapter->xmitpriv;
        //_rtw_memset((u8 *)(pattrib), 0, sizeof(struct pkt_attrib));
 
        pattrib->hdrlen = 24;
        pattrib->nr_frags = 1;
        pattrib->priority = 7;
        pattrib->mac_id = 0;
-       pattrib->qsel = 0x12;
+       pattrib->qsel = QSLT_MGNT;
 
        pattrib->pktlen = 0;
 
@@ -6567,6 +6593,7 @@ void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib)
        pattrib->retry_ctrl = _TRUE;
 
        pattrib->mbssid = 0;
+       pattrib->hw_ssn_sel = pxmitpriv->hw_ssn_seq_no;
 
 }
 
@@ -6742,7 +6769,7 @@ void issue_beacon(_adapter *padapter, int timeout_ms)
        //update attribute
        pattrib = &pmgntframe->attrib;
        update_mgntframe_attrib(padapter, pattrib);
-       pattrib->qsel = 0x10;
+       pattrib->qsel = QSLT_BEACON;
        #ifdef CONFIG_CONCURRENT_MODE
        if(padapter->iface_type == IFACE_PORT1) 
                pattrib->mbssid = 1;
@@ -8002,21 +8029,20 @@ void issue_assocreq(_adapter *padapter)
 #endif
 #endif // Check if the AP's supported rates are also supported by STA.
 
-       if (bssrate_len == 0) {
+       if ((bssrate_len == 0) && (pmlmeinfo->network.SupportedRates[0] != 0)) {
                rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
                rtw_free_xmitframe(pxmitpriv, pmgntframe);
                goto exit; //don't connect to AP if no joint supported rate
        }
 
 
-       if (bssrate_len > 8)
-       {
+       if (bssrate_len > 8) {
                pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen));
                pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen));
-       }
-       else
-       {
+       } else if (bssrate_len > 0) {
                pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen));
+       } else {
+               DBG_871X("%s: Connect to AP without 11b and 11g data rate!\n", __FUNCTION__);
        }
 
        //vendor specific IE, such as WPA, WMM, WPS
@@ -8442,7 +8468,7 @@ exit:
  * The null data packet would be sent without power bit,
  * and not guarantee success.
  */
-s32 issue_nulldata_in_interrupt(PADAPTER padapter, u8 *da)
+s32 issue_nulldata_in_interrupt(PADAPTER padapter, u8 *da, unsigned int power_mode)
 {
        int ret;
        struct mlme_ext_priv *pmlmeext;
@@ -8456,7 +8482,7 @@ s32 issue_nulldata_in_interrupt(PADAPTER padapter, u8 *da)
        if (da == NULL)
                da = get_my_bssid(&(pmlmeinfo->network));
 
-       ret = _issue_nulldata(padapter, da, 0, _FALSE);
+       ret = _issue_nulldata(padapter, da, power_mode, _FALSE);
 
        return ret;
 }
@@ -8989,7 +9015,8 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act
                                if (padapter->fix_ba_rxbuf_bz != 0xFF)
                                        ba_rxbuf_sz = padapter->fix_ba_rxbuf_bz;
 
-                               ba_rxbuf_sz &= 0x03ff;
+                               if (ba_rxbuf_sz > 127)
+                                       ba_rxbuf_sz = 127;
 
                                BA_para_set &= ~RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK;
                                BA_para_set |= (ba_rxbuf_sz << 6) & RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK;
@@ -9186,6 +9213,140 @@ static void issue_action_BSSCoexistPacket(_adapter *padapter)
 #endif //CONFIG_80211N_HT
 }
 
+// Spatial Multiplexing Powersave (SMPS) action frame
+int _issue_action_SM_PS(_adapter *padapter ,  unsigned char *raddr , u8 NewMimoPsMode ,  u8 wait_ack)
+{
+
+        int ret=0;
+        unsigned char category = RTW_WLAN_CATEGORY_HT;
+       u8 action = RTW_WLAN_ACTION_HT_SM_PS;   
+       u8 sm_power_control=0;
+       struct xmit_frame                       *pmgntframe;
+       struct pkt_attrib                       *pattrib;
+       unsigned char                                   *pframe;
+       struct rtw_ieee80211_hdr        *pwlanhdr;
+       unsigned short                          *fctrl;
+       struct xmit_priv                        *pxmitpriv = &(padapter->xmitpriv);
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+
+
+       if(NewMimoPsMode==WLAN_HT_CAP_SM_PS_DISABLED)
+       {
+               sm_power_control = sm_power_control  & ~(BIT(0)); // SM Power Save Enable = 0 SM Power Save Disable 
+       }
+        else if(NewMimoPsMode==WLAN_HT_CAP_SM_PS_STATIC)
+        {
+                sm_power_control = sm_power_control | BIT(0);    // SM Power Save Enable = 1 SM Power Save Enable  
+                sm_power_control = sm_power_control & ~(BIT(1)); // SM Mode = 0 Static Mode
+        }
+        else if(NewMimoPsMode==WLAN_HT_CAP_SM_PS_DYNAMIC)
+        {
+                sm_power_control = sm_power_control | BIT(0); // SM Power Save Enable = 1 SM Power Save Enable  
+                sm_power_control = sm_power_control | BIT(1); // SM Mode = 1 Dynamic Mode
+        }
+        else 
+               return ret;
+
+        DBG_871X("%s, sm_power_control=%u, NewMimoPsMode=%u\n", __FUNCTION__ , sm_power_control , NewMimoPsMode );
+    
+       if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
+               return ret;
+
+       //update attribute
+       pattrib = &pmgntframe->attrib;
+       update_mgntframe_attrib(padapter, pattrib);
+
+       _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
+
+       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
+       pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
+
+       fctrl = &(pwlanhdr->frame_ctl);
+       *(fctrl) = 0;
+
+       _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); /* RA */
+       _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); /* TA */
+       _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); /* DA = RA */
+
+       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
+       pmlmeext->mgnt_seq++;
+       SetFrameSubType(pframe, WIFI_ACTION);
+
+       pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
+       pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
+
+       /* category, action */
+       pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
+       pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));
+
+       pframe = rtw_set_fixed_ie(pframe, 1, &(sm_power_control), &(pattrib->pktlen));
+
+       pattrib->last_txcmdsz = pattrib->pktlen;
+
+       if(wait_ack)
+       {
+               ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);
+       }
+       else
+       {
+               dump_mgntframe(padapter, pmgntframe);
+               ret = _SUCCESS;
+       }
+
+        if (ret != _SUCCESS)
+            DBG_8192C("%s, ack to\n", __func__);
+
+       return ret;
+}
+
+int issue_action_SM_PS_wait_ack(_adapter *padapter, unsigned char *raddr, u8 NewMimoPsMode, int try_cnt, int wait_ms)
+{
+       int ret = 0;
+       int i = 0;
+       u32 start = rtw_get_current_time();
+
+       do {
+               ret = _issue_action_SM_PS(padapter, raddr, NewMimoPsMode , wait_ms>0?_TRUE:_FALSE );
+
+               i++;
+
+               if (padapter->bDriverStopped || padapter->bSurpriseRemoved)
+                       break;
+
+               if(i < try_cnt && wait_ms > 0 && ret==_FAIL)
+                       rtw_msleep_os(wait_ms);
+
+       }while((i<try_cnt) && ((ret==_FAIL)||(wait_ms==0)));
+
+       if (ret != _FAIL) {
+               ret = _SUCCESS;
+               #ifndef DBG_XMIT_ACK
+               goto exit;
+               #endif
+       }
+
+       if (try_cnt && wait_ms) {
+               if (raddr)
+                       DBG_871X(FUNC_ADPT_FMT" to "MAC_FMT", %s , %d/%d in %u ms\n",
+                               FUNC_ADPT_ARG(padapter), MAC_ARG(raddr),
+                               ret==_SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start));
+               else
+                       DBG_871X(FUNC_ADPT_FMT", %s , %d/%d in %u ms\n",
+                               FUNC_ADPT_ARG(padapter),
+                               ret==_SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start));
+       }
+exit:
+
+       return ret;
+}
+
+int issue_action_SM_PS(_adapter *padapter ,  unsigned char *raddr , u8 NewMimoPsMode )
+{
+       DBG_871X("%s to "MAC_FMT"\n", __func__, MAC_ARG(raddr));
+       return _issue_action_SM_PS(padapter, raddr, NewMimoPsMode , _FALSE );
+}
+
 unsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr)
 {
        struct sta_priv *pstapriv = &padapter->stapriv;
@@ -9257,13 +9418,16 @@ unsigned int send_beacon(_adapter *padapter)
 //#endif               
 
 #ifdef CONFIG_PCI_HCI
-
        //DBG_871X("%s\n", __FUNCTION__);
 
+       rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL);
+
+       /* 8192EE Port select for Beacon DL */
+       rtw_hal_set_hwreg(padapter, HW_VAR_DL_BCN_SEL, NULL);
+
        issue_beacon(padapter, 0);
 
        return _SUCCESS;
-
 #endif
 
 #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
@@ -9423,18 +9587,26 @@ void site_survey(_adapter *padapter)
                //val8 |= 0x0f;
                //rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8));
 #if defined(CONFIG_STA_MODE_SCAN_UNDER_AP_MODE) || defined(CONFIG_ATMEL_RC_PATCH)
-               if((padapter->pbuddy_adapter->mlmeextpriv.mlmext_info.state&0x03) == WIFI_FW_AP_STATE)
-               {
-                       if( pmlmeinfo->scan_cnt == RTW_SCAN_NUM_OF_CH )
-                       {
-                               pmlmeinfo->scan_cnt = 0;
-                               survey_channel = pbuddy_mlmeext->cur_channel;
-                               stay_buddy_ch = 1;
-                       }
-                       else 
-                       {
-                               if( pmlmeinfo->scan_cnt == 0 )
+               if ((padapter->pbuddy_adapter->mlmeextpriv.mlmext_info.state&0x03) == WIFI_FW_AP_STATE) {
+                       if (pmlmeinfo->scan_cnt == RTW_SCAN_NUM_OF_CH) {
+                               if (pmlmeinfo->backop_cnt == 0)
+                                       stay_buddy_ch = 1;
+                               else if (pmlmeinfo->backop_cnt == RTW_STAY_AP_CH_MILLISECOND)
                                        stay_buddy_ch = 2;
+
+                               if (stay_buddy_ch == 2) {
+                                       pmlmeinfo->scan_cnt = 1;
+                                       pmlmeinfo->backop_cnt = 0;
+                               } else if (stay_buddy_ch == 1) {
+                                       pmlmeinfo->backop_cnt++;
+                                       survey_channel = pbuddy_mlmeext->cur_channel;
+                               } else {
+                                       pmlmeinfo->backop_cnt++;
+                                       set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
+                                       return;
+                               }
+                       } else {
+
                                pmlmeinfo->scan_cnt++;
                        }
                }
@@ -9520,22 +9692,12 @@ void site_survey(_adapter *padapter)
                //      1,2-6-3,4-6-5,6-6-7,8-6-9,10-6-11,12-6-13,14
                //if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)==_TRUE)
 
-               if( stay_buddy_ch == 1 ){
-                       channel_scan_time_ms = pmlmeext->chan_scan_time * RTW_STAY_AP_CH_MILLISECOND;                   
-               }
-               else {
-                       if( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
-                               channel_scan_time_ms = 20;
-                       else
-                               channel_scan_time_ms = 40
-               }
-#elif defined(CONFIG_STA_MODE_SCAN_UNDER_AP_MODE)
-               if( stay_buddy_ch == 1 )
-                       channel_scan_time_ms = pmlmeext->chan_scan_time * RTW_STAY_AP_CH_MILLISECOND ;
-               else            
-                       channel_scan_time_ms = pmlmeext->chan_scan_time;
+               if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
+                       channel_scan_time_ms = 20;
+               else
+                       channel_scan_time_ms = 40;
 #else
-                       channel_scan_time_ms = pmlmeext->chan_scan_time;
+               channel_scan_time_ms = pmlmeext->chan_scan_time;
 #endif
 
                set_survey_timer(pmlmeext, channel_scan_time_ms);
@@ -9609,12 +9771,13 @@ void site_survey(_adapter *padapter)
                        rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_LISTEN);
                        pmlmeext->sitesurvey_res.state = SCAN_DISABLE;
 
-                       initialgain = 0xff; //restore RX GAIN
-                       rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); 
-                       //turn on dynamic functions
+                       //turn on phy-dynamic functions
                        Restore_DM_Func_Flag(padapter);
                        //Switch_DM_Func(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, _TRUE);
                        
+                       initialgain = 0xff; //restore RX GAIN
+                       rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain));         
+                       
                        _set_timer( &pwdinfo->find_phase_timer, ( u32 ) ( ( u32 ) ( pwdinfo->listen_dwell ) * 100 ) );
                }
                else
@@ -9623,6 +9786,7 @@ void site_survey(_adapter *padapter)
 
 #if defined(CONFIG_STA_MODE_SCAN_UNDER_AP_MODE) || defined(CONFIG_ATMEL_RC_PATCH) 
                        pmlmeinfo->scan_cnt = 0;
+                       pmlmeinfo->backop_cnt = 0;
 #endif
 
 #ifdef CONFIG_ANTENNA_DIVERSITY
@@ -9689,11 +9853,13 @@ void site_survey(_adapter *padapter)
                        //config MSR
                        Set_MSR(padapter, (pmlmeinfo->state & 0x3));
 
-                       initialgain = 0xff; //restore RX GAIN
-                       rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); 
-                       //turn on dynamic functions
+                       //turn on phy-dynamic functions
                        Restore_DM_Func_Flag(padapter);
                        //Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, _TRUE);
+                       
+                       initialgain = 0xff; //restore RX GAIN
+                       rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); 
+                       
 
                        if (is_client_associated_to_ap(padapter) == _TRUE)
                        {
@@ -10074,6 +10240,7 @@ void start_clnt_join(_adapter* padapter)
        struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
        WLAN_BSSID_EX           *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));
        int beacon_timeout;
+       u8 ASIX_ID[]= {0x00, 0x0E, 0xC6};
 
        //update wireless mode
        update_wireless_mode(padapter);
@@ -10081,6 +10248,12 @@ void start_clnt_join(_adapter* padapter)
        //udpate capability
        caps = rtw_get_capability((WLAN_BSSID_EX *)pnetwork);
        update_capinfo(padapter, caps);
+       
+       //check if sta is ASIX peer and fix IOT issue if it is.
+       if (_rtw_memcmp(get_my_bssid(&pmlmeinfo->network) ,ASIX_ID ,3)) {
+               u8 iot_flag = _TRUE;
+               rtw_hal_set_hwreg(padapter, HW_VAR_ASIX_IOT, (u8 *)(&iot_flag));
+       }
        if (caps&cap_ESS)
        {
                Set_MSR(padapter, WIFI_FW_STATION_STATE);
@@ -11026,6 +11199,7 @@ static void rtw_mlmeext_disconnect(_adapter *padapter)
        struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
        WLAN_BSSID_EX           *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));
        u8 state_backup = (pmlmeinfo->state&0x03);
+       u8 ASIX_ID[]= {0x00, 0x0E, 0xC6};
 
        //set_opmode_cmd(padapter, infra_client_with_mlme);
 
@@ -11051,6 +11225,11 @@ static void rtw_mlmeext_disconnect(_adapter *padapter)
        //set MSR to no link state -> infra. mode
        Set_MSR(padapter, _HW_STATE_STATION_);
 
+       //check if sta is ASIX peer and fix IOT issue if it is.
+       if (_rtw_memcmp(get_my_bssid(&pmlmeinfo->network) ,ASIX_ID ,3)) {
+               u8 iot_flag = _FALSE;
+               rtw_hal_set_hwreg(padapter, HW_VAR_ASIX_IOT, (u8 *)(&iot_flag));
+       }
        pmlmeinfo->state = WIFI_FW_NULL_STATE;
 
        if(state_backup == WIFI_FW_STATION_STATE)
@@ -11305,10 +11484,10 @@ void _linked_info_dump(_adapter *padapter)
 {
        int i;
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
-      struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-       u8 mac_id;
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
        int UndecoratedSmoothedPWDB;
-       struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
+       struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
+       struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
        
        if(padapter->bLinkInfoDump){
 
@@ -11343,13 +11522,13 @@ void _linked_info_dump(_adapter *padapter)
                        _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);            
                        
                }
-               for(i=0; i<NUM_STA; i++)
+               for(i=0; i<macid_ctl->num; i++)
                {
-                       if(pdvobj->macid[i] == _TRUE)
-                       {
-                               if(i !=1) //skip bc/mc sta
-                                       //============  tx info ============    
-                                       rtw_hal_get_def_var(padapter, HW_DEF_RA_INFO_DUMP, &i);                 
+                       if(rtw_macid_is_used(macid_ctl, i) 
+                               && !rtw_macid_is_bmc(macid_ctl, i) /* skip bc/mc sta */
+                       ) {
+                               //============  tx info ============    
+                               rtw_hal_get_def_var(padapter, HW_DEF_RA_INFO_DUMP, &i);                 
                        }
                }
                rtw_hal_set_def_var(padapter, HAL_DEF_DBG_RX_INFO_DUMP, NULL);
@@ -11513,7 +11692,8 @@ struct candidate_pool{
 }
 #endif //CONFIG_TDLS
 
-void linked_status_chk(_adapter *padapter)
+//from_timer == 1 means driver is in LPS
+void linked_status_chk(_adapter *padapter, u8 from_timer)
 {
        u32     i;
        struct sta_info         *psta;
@@ -11540,10 +11720,20 @@ void linked_status_chk(_adapter *padapter)
                #endif
 #ifdef CONFIG_P2P
                if (!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE))
-                       link_count_limit = 3; // 8 sec
+               {
+                       if(!from_timer)
+                               link_count_limit = 3; // 8 sec
+                       else
+                               link_count_limit = 15; // 32 sec
+               }
                else
 #endif // CONFIG_P2P
-                       link_count_limit = 7; // 16 sec
+               {
+                       if(!from_timer)
+                               link_count_limit = 7; // 16 sec
+                       else
+                               link_count_limit = 29; // 60 sec
+               }               
 
                // Marked by Kurt 20130715
                // For WiDi 3.5 and latered on, they don't ask WiDi sink to do roaming, so we could not check rx limit that strictly.
@@ -11607,9 +11797,9 @@ void linked_status_chk(_adapter *padapter)
 
                                if (tx_chk != _SUCCESS && pmlmeinfo->link_count++ == link_count_limit) {
                                        #ifdef DBG_EXPIRATION_CHK
-                                       DBG_871X("%s issue_nulldata 0\n", __FUNCTION__);
+                                       DBG_871X("%s issue_nulldata(%d)\n", __FUNCTION__, from_timer?1:0);
                                        #endif
-                                       tx_chk = issue_nulldata_in_interrupt(padapter, NULL);
+                                       tx_chk = issue_nulldata_in_interrupt(padapter, NULL, from_timer?1:0);
                                }
                        }
 
@@ -11700,7 +11890,8 @@ void survey_timer_hdl(_adapter *padapter)
                if(pmlmeext->sitesurvey_res.state ==  SCAN_PROCESS)
                {
 #if defined(CONFIG_STA_MODE_SCAN_UNDER_AP_MODE) || defined(CONFIG_ATMEL_RC_PATCH) 
-                       if( padapter->mlmeextpriv.mlmext_info.scan_cnt != RTW_SCAN_NUM_OF_CH )
+                       if (padapter->mlmeextpriv.mlmext_info.scan_cnt != RTW_SCAN_NUM_OF_CH
+                               || padapter->mlmeextpriv.mlmext_info.backop_cnt == RTW_STAY_AP_CH_MILLISECOND)
 #endif
                                pmlmeext->sitesurvey_res.channel_idx++;
                }
@@ -11833,7 +12024,7 @@ void link_timer_hdl(_adapter *padapter)
                        {
                                if (tx_cnt == pxmitpriv->tx_pkts)
                                {
-                                       issue_nulldata_in_interrupt(padapter, NULL);
+                                       issue_nulldata_in_interrupt(padapter, NULL, 0);
                                }
 
                                tx_cnt = pxmitpriv->tx_pkts;
@@ -12124,14 +12315,14 @@ u8 createbss_hdl(_adapter *padapter, u8 *pbuf)
                pmlmeinfo->agg_enable_bitmap = 0;
                pmlmeinfo->candidate_tid_bitmap = 0;
 
-               //disable dynamic functions, such as high power, DIG
-               Save_DM_Func_Flag(padapter);
-               Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE);
-
                //config the initial gain under linking, need to write the BB registers
                //initialgain = 0x1E;
                //rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain));
 
+               //disable dynamic functions, such as high power, DIG
+               Save_DM_Func_Flag(padapter);
+               Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE);
+               
                //cancel link timer 
                _cancel_timer_ex(&pmlmeext->link_timer);
 
@@ -12418,8 +12609,107 @@ u8 disconnect_hdl(_adapter *padapter, unsigned char *pbuf)
        return  H2C_SUCCESS;
 }
 
-int rtw_scan_ch_decision(_adapter *padapter, struct rtw_ieee80211_channel *out,
-       u32 out_num, struct rtw_ieee80211_channel *in, u32 in_num)
+u8 rtw_scan_sparse(_adapter *adapter, struct rtw_ieee80211_channel *ch, u8 ch_num)
+{
+/* interval larger than this is treated as backgroud scan */
+#ifndef RTW_SCAN_SPARSE_BG_INTERVAL_MS
+#define RTW_SCAN_SPARSE_BG_INTERVAL_MS 12000
+#endif
+
+#ifndef RTW_SCAN_SPARSE_CH_NUM_MIRACAST
+#define RTW_SCAN_SPARSE_CH_NUM_MIRACAST 1
+#endif
+#ifndef RTW_SCAN_SPARSE_CH_NUM_BG
+#define RTW_SCAN_SPARSE_CH_NUM_BG 4
+#endif
+
+#define SCAN_SPARSE_CH_NUM_INVALID 255
+
+       static u8 token = 255;
+       u32 interval;
+       bool busy_traffic = _FALSE;
+       bool miracast_enabled = _FALSE;
+       bool bg_scan = _FALSE;
+       u8 max_allow_ch = SCAN_SPARSE_CH_NUM_INVALID;
+       u8 scan_division_num;
+       u8 ret_num = ch_num;
+       struct registry_priv *regsty = dvobj_to_regsty(adapter_to_dvobj(adapter));
+       struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
+
+       if (regsty->wifi_spec)
+               goto exit;
+
+       /* assume ch_num > 6 is normal scan */
+       if (ch_num <= 6)
+               goto exit;
+
+       if (mlmeext->last_scan_time == 0)
+               mlmeext->last_scan_time = rtw_get_current_time();
+
+       interval = rtw_get_passing_time_ms(mlmeext->last_scan_time);
+
+       if (adapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE
+               #ifdef CONFIG_CONCURRENT_MODE
+               || (adapter->pbuddy_adapter && adapter->pbuddy_adapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE)
+               #endif
+       )
+                       busy_traffic = _TRUE;
+
+       #ifdef CONFIG_WFD
+       if (is_miracast_enabled(adapter->wfd_info.stack_wfd_mode)
+               #ifdef CONFIG_CONCURRENT_MODE
+               || (adapter->pbuddy_adapter && is_miracast_enabled(adapter->pbuddy_adapter->wfd_info.stack_wfd_mode))
+               #endif
+       )
+               miracast_enabled = _TRUE;
+       #endif
+
+       if (interval > RTW_SCAN_SPARSE_BG_INTERVAL_MS)
+               bg_scan = _TRUE;
+
+       /* max_allow_ch by conditions*/
+
+       #if RTW_SCAN_SPARSE_MIRACAST
+       if (miracast_enabled == _TRUE && busy_traffic == _TRUE)
+               max_allow_ch = rtw_min(max_allow_ch, RTW_SCAN_SPARSE_CH_NUM_MIRACAST);
+       #endif
+
+       #if RTW_SCAN_SPARSE_BG
+       if (bg_scan == _TRUE)
+               max_allow_ch = rtw_min(max_allow_ch, RTW_SCAN_SPARSE_CH_NUM_BG);
+       #endif
+
+
+       if (max_allow_ch != SCAN_SPARSE_CH_NUM_INVALID) {
+               int i;
+               int k = 0;
+
+               scan_division_num = (ch_num / max_allow_ch) + ((ch_num % max_allow_ch)?1:0);
+               token = (token + 1) % scan_division_num;
+               
+               if (0)
+                       DBG_871X("scan_division_num:%u, token:%u\n", scan_division_num, token);
+               
+               for (i = 0; i < ch_num; i++) {
+                       if (ch[i].hw_value && (i % scan_division_num) == token
+                       ) {
+                               if (i != k)
+                                       _rtw_memcpy(&ch[k], &ch[i], sizeof(struct rtw_ieee80211_channel));
+                               k++;
+                       }
+               }
+
+               _rtw_memset(&ch[k], 0, sizeof(struct rtw_ieee80211_channel));
+
+               ret_num = k;
+               mlmeext->last_scan_time = rtw_get_current_time();
+       }
+
+exit:
+       return ret_num;
+}
+
+static int rtw_scan_ch_decision(_adapter *padapter, struct rtw_ieee80211_channel *out, u32 out_num, struct rtw_ieee80211_channel *in, u32 in_num)
 {
        int i, j;
        int scan_ch_num = 0;
@@ -12483,49 +12773,8 @@ int rtw_scan_ch_decision(_adapter *padapter, struct rtw_ieee80211_channel *out,
                }
        }
 
-#ifdef CONFIG_SCAN_SPARSE //partial scan, ASUS RK3188 use the feature
-       /* assume j>6 is normal scan */
-       if ((j > 6) && (padapter->registrypriv.wifi_spec != 1))
-       {
-               static u8 token = 0;
-               u32 interval;
-
-               if (pmlmeext->last_scan_time == 0)
-                       pmlmeext->last_scan_time = rtw_get_current_time();
-
-               interval = rtw_get_passing_time_ms(pmlmeext->last_scan_time);
-               if ((interval > ALLOW_SCAN_INTERVAL)
-#if 0 // Miracast can't do AP scan
-                       || (padapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE)
-#ifdef CONFIG_CONCURRENT_MODE
-                       || (padapter->pbuddy_adapter
-                               && (padapter->pbuddy_adapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE))
-#endif // CONFIG_CONCURRENT_MODE
-#endif
-                       )
-               {
-                       // modify scan plan
-                       int k = 0;
-                       _rtw_memset(in, 0, sizeof(struct rtw_ieee80211_channel)*in_num);
-                       _rtw_memcpy(in, out, sizeof(struct rtw_ieee80211_channel)*j);
-                       _rtw_memset(out, 0, sizeof(struct rtw_ieee80211_channel)*j);
-
-                       for (i=0;i<j;i++) {
-                               if (in[i].hw_value && (i%SCAN_DIVISION_NUM) == token) {
-                                       _rtw_memcpy(&out[k], &in[i], sizeof(struct rtw_ieee80211_channel));
-                                       k++;
-                               }
-                               if(k>=out_num)
-                                       break;
-                       }
-
-                       j = k;
-                       token  = (token+1)%SCAN_DIVISION_NUM;
-               }
-
-               pmlmeext->last_scan_time = rtw_get_current_time();
-       }
-#endif //CONFIG_SCAN_SPARSE
+       /* scan_sparse */
+       j = rtw_scan_sparse(padapter, out, j);
 
        return j;
 }
@@ -12635,10 +12884,6 @@ u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf)
 #endif
 #endif /* CONFIG_FIND_BEST_CHANNEL */
 
-               //disable dynamic functions, such as high power, DIG
-               Save_DM_Func_Flag(padapter);
-               Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE);
-
                //config the initial gain under scaning, need to write the BB registers
 #ifdef CONFIG_P2P
 #ifdef CONFIG_IOCTL_CFG80211
@@ -12653,6 +12898,10 @@ u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf)
                        initialgain = 0x1e;
 
                rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain));
+
+               //disable dynamic functions, such as high power, DIG
+               Save_DM_Func_Flag(padapter);
+               Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE);
                
                //set MSR to no link state
                Set_MSR(padapter, _HW_STATE_NOLINK_);
@@ -13002,7 +13251,7 @@ u8 chk_bmc_sleepq_hdl(_adapter *padapter, unsigned char *pbuf)
                        pxmitframe->attrib.triggered=1;
 
                        if (xmitframe_hiq_filter(pxmitframe) == _TRUE)
-                               pxmitframe->attrib.qsel = 0x11;//HIQ
+                               pxmitframe->attrib.qsel = QSLT_HIGH;//HIQ
 
                        #if 0
                        _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
@@ -14219,12 +14468,10 @@ u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf)
        pmlmeext->max_chan_nums = init_channel_set(padapter, setChannelPlan_param->channel_plan, pmlmeext->channel_set);
        init_channel_list(padapter, pmlmeext->channel_set, pmlmeext->max_chan_nums, &pmlmeext->channel_list);   
 
+       rtw_hal_set_odm_var(padapter,HAL_ODM_REGULATION,NULL,_TRUE);
+       
 #ifdef CONFIG_IOCTL_CFG80211
-       if ((padapter->rtw_wdev != NULL) && (padapter->rtw_wdev->wiphy)) {
-               struct regulatory_request request;
-               request.initiator = NL80211_REGDOM_SET_BY_DRIVER;
-               rtw_reg_notifier(padapter->rtw_wdev->wiphy, &request);
-       }
+       rtw_reg_notify_by_driver(padapter);
 #endif //CONFIG_IOCTL_CFG80211
 
        return  H2C_SUCCESS;
@@ -14490,3 +14737,18 @@ u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf)
 
 }
 
+u8 run_in_thread_hdl(_adapter *padapter, u8 *pbuf)
+{
+       struct RunInThread_param *p;
+
+
+       if (NULL == pbuf)
+               return H2C_PARAMETERS_ERROR;
+       p = (struct RunInThread_param*)pbuf;
+
+       if (p->func)
+               p->func(p->context);
+
+       return H2C_SUCCESS;
+}
+
index 3db2a2c8bfce4ef4a09cb4ade4c0eb6108d2943f..772633e1111e7e4e8fcadf8c03f0a3d0eca49514 100755 (executable)
@@ -25,7 +25,7 @@
 #include <sys/unistd.h>                /* for RFHIGHPID */
 #endif
 
-#include "../hal/OUTSRC/odm_precomp.h"         
+#include "../hal/OUTSRC/phydm_precomp.h"               
 #if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8821A)
 #include <rtw_bt_mp.h>
 #endif
@@ -292,7 +292,7 @@ s32 init_mp_priv(PADAPTER padapter)
        pmppriv->tx.stop = 1;
        pmppriv->bSetTxPower=0;         //for  manually set tx power
        pmppriv->bTxBufCkFail=_FALSE;
-       pmppriv->pktInterval=1;
+       pmppriv->pktInterval=0;
        
        mp_init_xmit_attrib(&pmppriv->tx, padapter);
 
@@ -423,7 +423,7 @@ void mpt_InitHWConfig(PADAPTER Adapter)
 
 #define PHY_IQCalibrate(_Adapter, b)   \
                IS_HARDWARE_TYPE_8812(_Adapter) ? PHY_IQCalibrate_8812A(_Adapter, b) : \
-               IS_HARDWARE_TYPE_8821(_Adapter) ? PHY_IQCalibrate_8821A(_Adapter, b) : \
+               IS_HARDWARE_TYPE_8821(_Adapter) ? PHY_IQCalibrate_8821A(&(GET_HAL_DATA(_Adapter)->odmpriv), b) : \
                PHY_IQCalibrate_default(_Adapter, b)
 
 #define PHY_LCCalibrate(_Adapter)      \
@@ -449,17 +449,13 @@ static void PHY_IQCalibrate(PADAPTER padapter, u8 bReCovery)
        u8 b2ant;       //false:1ant, true:2-ant
        u8 RF_Path;     //0:S1, 1:S0
 
-
        pHalData = GET_HAL_DATA(padapter);
        b2ant = pHalData->EEPROMBluetoothAntNum==Ant_x2?_TRUE:_FALSE;
-       RF_Path = 0;
-#ifdef CONFIG_USB_HCI
-       RF_Path = 1;
-#endif
 
-       PHY_IQCalibrate_8723B(padapter, bReCovery, _FALSE, b2ant, RF_Path);
+       PHY_IQCalibrate_8723B(padapter, bReCovery, _FALSE, b2ant, pHalData->ant_path);
 }
 
+
 #define PHY_LCCalibrate(a)     PHY_LCCalibrate_8723B(&(GET_HAL_DATA(a)->odmpriv))
 #define PHY_SetRFPathSwitch(a,b)       PHY_SetRFPathSwitch_8723B(a,b)
 #endif
@@ -1269,7 +1265,7 @@ static thread_return mp_xmit_packet_thread(thread_context context)
                                goto exit;
                        }
                        else {
-                               rtw_usleep_os(100);
+                               rtw_usleep_os(10);
                                continue;
                        }
                }
@@ -1469,8 +1465,15 @@ void fill_tx_desc_8192e(PADAPTER padapter)
                
        offset = TXDESC_SIZE + OFFSET_SZ;               
        
+       SET_TX_DESC_OFFSET_92E(pDesc, offset);
+
+       #if defined(CONFIG_PCI_HCI) //8192EE
+       SET_TX_DESC_OFFSET_92E(pDesc, offset+8); //work around
+       SET_TX_DESC_PKT_OFFSET_92E(pDesc, 0); /* 8192EE pkt_offset is 0 */
+       #else //8192EU 8192ES
        SET_TX_DESC_OFFSET_92E(pDesc, offset);
        SET_TX_DESC_PKT_OFFSET_92E(pDesc, 1);
+       #endif
                
        if (bmcast) {
                SET_TX_DESC_BMC_92E(pDesc, 1);
@@ -1484,7 +1487,8 @@ void fill_tx_desc_8192e(PADAPTER padapter)
        //SET_TX_DESC_QUEUE_SEL_8812(pDesc,  QSLT_MGNT);
                
        if (!pattrib->qos_en) {
-               SET_TX_DESC_HWSEQ_SEL_92E(pDesc, 1); // Hw set sequence number
+               SET_TX_DESC_EN_HWSEQ_92E(pDesc, 1);// Hw set sequence number
+               SET_TX_DESC_HWSEQ_SEL_92E(pDesc, pattrib->hw_ssn_sel);
        } else {
                SET_TX_DESC_SEQ_92E(pDesc, pattrib->seqnum);
        }
@@ -1508,7 +1512,6 @@ void fill_tx_desc_8192e(PADAPTER padapter)
 #if defined(CONFIG_RTL8723B)
 void fill_tx_desc_8723b(PADAPTER padapter)
 {
-
        struct mp_priv *pmp_priv = &padapter->mppriv;
        struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
        u8 *ptxdesc = pmp_priv->tx.desc;
@@ -1666,16 +1669,18 @@ void SetPacketTx(PADAPTER padapter)
        if(pmp_priv->TXradomBuffer == NULL)
        {
                DBG_871X("mp create random buffer fail!\n");
+               goto exit;
        }
-       else
-       {
-               for(i=0;i<4096;i++)
-                       pmp_priv->TXradomBuffer[i] = rtw_random32() %0xFF;
-       }
+       
+       
+       for(i=0;i<4096;i++)
+               pmp_priv->TXradomBuffer[i] = rtw_random32() %0xFF;
+       
        //startPlace = (u32)(rtw_random32() % 3450);
        _rtw_memcpy(ptr, pmp_priv->TXradomBuffer,pkt_end - ptr);
        //_rtw_memset(ptr, payload, pkt_end - ptr);
        rtw_mfree(pmp_priv->TXradomBuffer,4096);
+       
        //3 6. start thread
 #ifdef PLATFORM_LINUX
        pmp_priv->tx.PktTxThread = kthread_run(mp_xmit_packet_thread, pmp_priv, "RTW_MP_THREAD");
@@ -1695,7 +1700,8 @@ void SetPacketTx(PADAPTER padapter)
 #endif
 
        Rtw_MPSetMacTxEDCA(padapter);
-
+exit:
+       return;
 }
 
 void SetPacketRx(PADAPTER pAdapter, u8 bStartRx)
@@ -1796,7 +1802,7 @@ static u32 rtw_GetPSDData(PADAPTER pAdapter, u32 point)
 {
        u32 psd_val=0;
        
-#if defined(CONFIG_RTL8812A) //MP PSD for 8812A        
+#if defined(CONFIG_RTL8812A)||defined(CONFIG_RTL8821A) //MP PSD for 8812A      
        u16 psd_reg = 0x910;
        u16 psd_regL= 0xF44;
        
@@ -2196,8 +2202,7 @@ mpt_ProQueryCalTxPower_8188E(
                CurrChannel = 1;
        }       
        
-       if( pMptCtx->MptRateIndex >= MPT_RATE_1M &&
-               pMptCtx->MptRateIndex <= MPT_RATE_11M )
+       if(pMptCtx->MptRateIndex <= MPT_RATE_11M )
        {
                TxPower = pHalData->Index24G_CCK_Base[rf_path][index];  
        }
@@ -2241,8 +2246,7 @@ mpt_ProQueryCalTxPower_8188E(
 #endif
 
        // 2012/11/02 Awk: add power limit mechansim
-       if( pMptCtx->MptRateIndex >= MPT_RATE_1M &&
-               pMptCtx->MptRateIndex <= MPT_RATE_11M )
+       if( pMptCtx->MptRateIndex <= MPT_RATE_11M )
        {
                rate = MGN_1M;
        }
@@ -2273,72 +2277,141 @@ mpt_ProQueryCalTxPower_8188E(
        return TxPower; 
 }
 
-u8 MptToMgntRate(u32   MptRateIdx)
+
+u8 
+MptToMgntRate(
+       IN      ULONG   MptRateIdx
+       )
 {
 // Mapped to MGN_XXX defined in MgntGen.h
        switch (MptRateIdx) 
        {
                /* CCK rate. */
-               case    MPT_RATE_1M:                    return 2;       
-               case    MPT_RATE_2M:                    return 4;       
-               case    MPT_RATE_55M:                   return 11;      
-               case    MPT_RATE_11M:                   return 22;      
-       
-               /* OFDM rate. */
-               case    MPT_RATE_6M:                    return 12;      
-               case    MPT_RATE_9M:                    return 18;      
-               case    MPT_RATE_12M:                   return 24;      
-               case    MPT_RATE_18M:                   return 36;      
-               case    MPT_RATE_24M:                   return 48;              
-               case    MPT_RATE_36M:                   return 72;      
-               case    MPT_RATE_48M:                   return 96;      
-               case    MPT_RATE_54M:                   return 108; 
-       
-               /* HT rate. */
-               case    MPT_RATE_MCS0:                  return 0x80;
-               case    MPT_RATE_MCS1:                  return 0x81;
-               case    MPT_RATE_MCS2:                  return 0x82;
-               case    MPT_RATE_MCS3:                  return 0x83;
-               case    MPT_RATE_MCS4:                  return 0x84;
-               case    MPT_RATE_MCS5:                  return 0x85;
-               case    MPT_RATE_MCS6:                  return 0x86;
-               case    MPT_RATE_MCS7:                  return 0x87;
-               case    MPT_RATE_MCS8:                  return 0x88;
-               case    MPT_RATE_MCS9:                  return 0x89;
-               case    MPT_RATE_MCS10:                 return 0x8A;
-               case    MPT_RATE_MCS11:                 return 0x8B;
-               case    MPT_RATE_MCS12:                 return 0x8C;
-               case    MPT_RATE_MCS13:                 return 0x8D;
-               case    MPT_RATE_MCS14:                 return 0x8E;
-               case    MPT_RATE_MCS15:                 return 0x8F;
-
-               /* VHT rate. */
-               case    MPT_RATE_VHT1SS_MCS0:   return 0x90;
-               case    MPT_RATE_VHT1SS_MCS1:   return 0x91;
-               case    MPT_RATE_VHT1SS_MCS2:   return 0x92;
-               case    MPT_RATE_VHT1SS_MCS3:   return 0x93;
-               case    MPT_RATE_VHT1SS_MCS4:   return 0x94;
-               case    MPT_RATE_VHT1SS_MCS5:   return 0x95;
-               case    MPT_RATE_VHT1SS_MCS6:   return 0x96;
-               case    MPT_RATE_VHT1SS_MCS7:   return 0x97;
-               case    MPT_RATE_VHT1SS_MCS8:   return 0x98;
-               case    MPT_RATE_VHT1SS_MCS9:   return 0x99;
-               case    MPT_RATE_VHT2SS_MCS0:   return 0x9A;
-               case    MPT_RATE_VHT2SS_MCS1:   return 0x9B;
-               case    MPT_RATE_VHT2SS_MCS2:   return 0x9C;
-               case    MPT_RATE_VHT2SS_MCS3:   return 0x9D;
-               case    MPT_RATE_VHT2SS_MCS4:   return 0x9E;
-               case    MPT_RATE_VHT2SS_MCS5:   return 0x9F;
-               case    MPT_RATE_VHT2SS_MCS6:   return 0xA0;
-               case    MPT_RATE_VHT2SS_MCS7:   return 0xA1;
-               case    MPT_RATE_VHT2SS_MCS8:   return 0xA2;
-               case    MPT_RATE_VHT2SS_MCS9:   return 0xA3;
+               case    MPT_RATE_1M:                    return MGN_1M;          
+               case    MPT_RATE_2M:                    return MGN_2M;          
+               case    MPT_RATE_55M:                   return MGN_5_5M;        
+               case    MPT_RATE_11M:                   return MGN_11M;         
+                                                                                          
+               /* OFDM rate. */                                           
+               case    MPT_RATE_6M:                    return MGN_6M; 
+               case    MPT_RATE_9M:                    return MGN_9M; 
+               case    MPT_RATE_12M:                   return MGN_12M;
+               case    MPT_RATE_18M:                   return MGN_18M;
+               case    MPT_RATE_24M:                   return MGN_24M;         
+               case    MPT_RATE_36M:                   return MGN_36M;
+               case    MPT_RATE_48M:                   return MGN_48M;
+               case    MPT_RATE_54M:                   return MGN_54M;
+                                                                                          
+               /* HT rate. */                                             
+               case    MPT_RATE_MCS0:                  return MGN_MCS0; 
+               case    MPT_RATE_MCS1:                  return MGN_MCS1; 
+               case    MPT_RATE_MCS2:                  return MGN_MCS2; 
+               case    MPT_RATE_MCS3:                  return MGN_MCS3; 
+               case    MPT_RATE_MCS4:                  return MGN_MCS4;        
+               case    MPT_RATE_MCS5:                  return MGN_MCS5;        
+               case    MPT_RATE_MCS6:                  return MGN_MCS6;        
+               case    MPT_RATE_MCS7:                  return MGN_MCS7;        
+               case    MPT_RATE_MCS8:                  return MGN_MCS8;        
+               case    MPT_RATE_MCS9:                  return MGN_MCS9;        
+               case    MPT_RATE_MCS10:                 return MGN_MCS10;       
+               case    MPT_RATE_MCS11:                 return MGN_MCS11;       
+               case    MPT_RATE_MCS12:                 return MGN_MCS12;       
+               case    MPT_RATE_MCS13:                 return MGN_MCS13;       
+               case    MPT_RATE_MCS14:                 return MGN_MCS14;       
+               case    MPT_RATE_MCS15:                 return MGN_MCS15;       
+               case    MPT_RATE_MCS16:                 return MGN_MCS16;
+               case    MPT_RATE_MCS17:                 return MGN_MCS17;
+               case    MPT_RATE_MCS18:                 return MGN_MCS18;
+               case    MPT_RATE_MCS19:                 return MGN_MCS19;
+               case    MPT_RATE_MCS20:                 return MGN_MCS20;
+               case    MPT_RATE_MCS21:                 return MGN_MCS21;
+               case    MPT_RATE_MCS22:                 return MGN_MCS22;
+               case    MPT_RATE_MCS23:                 return MGN_MCS23;
+               case    MPT_RATE_MCS24:                 return MGN_MCS24;
+               case    MPT_RATE_MCS25:                 return MGN_MCS25;
+               case    MPT_RATE_MCS26:                 return MGN_MCS26;
+               case    MPT_RATE_MCS27:                 return MGN_MCS27;
+               case    MPT_RATE_MCS28:                 return MGN_MCS28;
+               case    MPT_RATE_MCS29:                 return MGN_MCS29;
+               case    MPT_RATE_MCS30:                 return MGN_MCS30;
+               case    MPT_RATE_MCS31:                 return MGN_MCS31;
+                                                                                          
+               /* VHT rate. */                                            
+               case    MPT_RATE_VHT1SS_MCS0:   return MGN_VHT1SS_MCS0;
+               case    MPT_RATE_VHT1SS_MCS1:   return MGN_VHT1SS_MCS1;
+               case    MPT_RATE_VHT1SS_MCS2:   return MGN_VHT1SS_MCS2;
+               case    MPT_RATE_VHT1SS_MCS3:   return MGN_VHT1SS_MCS3;
+               case    MPT_RATE_VHT1SS_MCS4:   return MGN_VHT1SS_MCS4;
+               case    MPT_RATE_VHT1SS_MCS5:   return MGN_VHT1SS_MCS5;
+               case    MPT_RATE_VHT1SS_MCS6:   return MGN_VHT1SS_MCS6;
+               case    MPT_RATE_VHT1SS_MCS7:   return MGN_VHT1SS_MCS7;
+               case    MPT_RATE_VHT1SS_MCS8:   return MGN_VHT1SS_MCS8;
+               case    MPT_RATE_VHT1SS_MCS9:   return MGN_VHT1SS_MCS9;
+               case    MPT_RATE_VHT2SS_MCS0:   return MGN_VHT2SS_MCS0; 
+               case    MPT_RATE_VHT2SS_MCS1:   return MGN_VHT2SS_MCS1; 
+               case    MPT_RATE_VHT2SS_MCS2:   return MGN_VHT2SS_MCS2; 
+               case    MPT_RATE_VHT2SS_MCS3:   return MGN_VHT2SS_MCS3; 
+               case    MPT_RATE_VHT2SS_MCS4:   return MGN_VHT2SS_MCS4; 
+               case    MPT_RATE_VHT2SS_MCS5:   return MGN_VHT2SS_MCS5; 
+               case    MPT_RATE_VHT2SS_MCS6:   return MGN_VHT2SS_MCS6; 
+               case    MPT_RATE_VHT2SS_MCS7:   return MGN_VHT2SS_MCS7; 
+               case    MPT_RATE_VHT2SS_MCS8:   return MGN_VHT2SS_MCS8; 
+               case    MPT_RATE_VHT2SS_MCS9:   return MGN_VHT2SS_MCS9; 
+               case    MPT_RATE_VHT3SS_MCS0:   return MGN_VHT3SS_MCS0; 
+               case    MPT_RATE_VHT3SS_MCS1:   return MGN_VHT3SS_MCS1; 
+               case    MPT_RATE_VHT3SS_MCS2:   return MGN_VHT3SS_MCS2; 
+               case    MPT_RATE_VHT3SS_MCS3:   return MGN_VHT3SS_MCS3; 
+               case    MPT_RATE_VHT3SS_MCS4:   return MGN_VHT3SS_MCS4; 
+               case    MPT_RATE_VHT3SS_MCS5:   return MGN_VHT3SS_MCS5; 
+               case    MPT_RATE_VHT3SS_MCS6:   return MGN_VHT3SS_MCS6; 
+               case    MPT_RATE_VHT3SS_MCS7:   return MGN_VHT3SS_MCS7; 
+               case    MPT_RATE_VHT3SS_MCS8:   return MGN_VHT3SS_MCS8; 
+               case    MPT_RATE_VHT3SS_MCS9:   return MGN_VHT3SS_MCS9; 
+               case    MPT_RATE_VHT4SS_MCS0:   return MGN_VHT4SS_MCS0; 
+               case    MPT_RATE_VHT4SS_MCS1:   return MGN_VHT4SS_MCS1; 
+               case    MPT_RATE_VHT4SS_MCS2:   return MGN_VHT4SS_MCS2; 
+               case    MPT_RATE_VHT4SS_MCS3:   return MGN_VHT4SS_MCS3; 
+               case    MPT_RATE_VHT4SS_MCS4:   return MGN_VHT4SS_MCS4; 
+               case    MPT_RATE_VHT4SS_MCS5:   return MGN_VHT4SS_MCS5; 
+               case    MPT_RATE_VHT4SS_MCS6:   return MGN_VHT4SS_MCS6; 
+               case    MPT_RATE_VHT4SS_MCS7:   return MGN_VHT4SS_MCS7; 
+               case    MPT_RATE_VHT4SS_MCS8:   return MGN_VHT4SS_MCS8; 
+               case    MPT_RATE_VHT4SS_MCS9:   return MGN_VHT4SS_MCS9; 
                
-               case    MPT_RATE_LAST:// fully automatic
-               default:                
-                       DBG_8192C("<===MptToMgntRate(), Invalid Rate: %d!!\n", MptRateIdx);
-                       return 0x0;
+               case    MPT_RATE_LAST:  // fully automatiMGN_VHT2SS_MCS1;       
+               default:                                          
+                       DBG_871X("<===MptToMgntRate(), Invalid Rate: %d!!\n", MptRateIdx);
+                       return 0x0;                                        
+       }                                                                                  
+}                                                                                         
+
+u8 rtw_mpRateParseFunc(PADAPTER pAdapter, u8 *targetStr)
+{
+       u16 i=0;
+       u8* rateindex_Array[] = { "1M","2M","5.5M","11M","6M","9M","12M","18M","24M","36M","48M","54M",
+                                                               "HTMCS0","HTMCS1","HTMCS2","HTMCS3","HTMCS4","HTMCS5","HTMCS6","HTMCS7",
+                                                               "HTMCS8","HTMCS9","HTMCS10","HTMCS11","HTMCS12","HTMCS13","HTMCS14","HTMCS15",
+                                                               "HTMCS16","HTMCS17","HTMCS18","HTMCS19","HTMCS20","HTMCS21","HTMCS22","HTMCS23",
+                                                               "HTMCS24","HTMCS25","HTMCS26","HTMCS27","HTMCS28","HTMCS29","HTMCS30","HTMCS31",
+                                                               "VHT1MCS0","VHT1MCS1","VHT1MCS2","VHT1MCS3","VHT1MCS4","VHT1MCS5","VHT1MCS6","VHT1MCS7","VHT1MCS8","VHT1MCS9",
+                                                               "VHT2MCS0","VHT2MCS1","VHT2MCS2","VHT2MCS3","VHT2MCS4","VHT2MCS5","VHT2MCS6","VHT2MCS7","VHT2MCS8","VHT2MCS9",
+                                                               "VHT3MCS0","VHT3MCS1","VHT3MCS2","VHT3MCS3","VHT3MCS4","VHT3MCS5","VHT3MCS6","VHT3MCS7","VHT3MCS8","VHT3MCS9",
+                                                               "VHT4MCS0","VHT4MCS1","VHT4MCS2","VHT4MCS3","VHT4MCS4","VHT4MCS5","VHT4MCS6","VHT4MCS7","VHT4MCS8","VHT4MCS9"};
+
+       for(i=0;i<=83;i++){     
+               if(strcmp(targetStr, rateindex_Array[i]) == 0){
+                       DBG_871X("%s , index = %d \n",__func__ ,i);
+                       return i;
+               }
        }
+       
+       printk("%s ,please input a Data RATE String as:",__func__);
+       for(i=0;i<=83;i++){     
+               printk("%s ",rateindex_Array[i]);
+               if(i%10==0)
+                       printk("\n");
+       }       
+       return _FAIL;
 }
 
 ULONG mpt_ProQueryCalTxPower(
index b2c5a28aeb1ca9b5a5dc56046536377d1a5c38c9..2b4c94fbc18f803596bad92de26f9a9e39b12f60 100755 (executable)
@@ -21,7 +21,7 @@
 
 #include <drv_types.h>
 #include <rtw_mp_ioctl.h>
-#include "../hal/OUTSRC/odm_precomp.h"
+#include "../hal/OUTSRC/phydm_precomp.h"
 
 //****************  oid_rtl_seg_81_85   section start ****************
 NDIS_STATUS oid_rt_wireless_mode_hdl(struct oid_par_priv *poid_par_priv)
@@ -1990,9 +1990,9 @@ NDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv)
 
        psta = rtw_get_stainfo(&Adapter->stapriv, macaddr);
        if (psta != NULL) {
-               _enter_critical(&(Adapter->stapriv.sta_hash_lock), &irqL);
+               //_enter_critical(&(Adapter->stapriv.sta_hash_lock), &irqL);
                rtw_free_stainfo(Adapter, psta);
-               _exit_critical(&(Adapter->stapriv.sta_hash_lock), &irqL);
+               //_exit_critical(&(Adapter->stapriv.sta_hash_lock), &irqL);
        }
 
        return status;
index 5a40e543c237e7daabe24f567625e79354cc2815..05063bfdf990fb70f860265c637999f28ec7ce8b 100755 (executable)
@@ -37,13 +37,13 @@ const char *odm_comp_str[] = {
        /* BIT12 */"ODM_COMP_DYNAMIC_PRICCA",
        /* BIT13 */"ODM_COMP_RXHP",
        /* BIT14 */"ODM_COMP_MP",
-       /* BIT15 */"ODM_COMP_DYNAMIC_ATC",
-       /* BIT16 */"ODM_COMP_EDCA_TURBO",
-       /* BIT17 */"ODM_COMP_EARLY_MODE",
+       /* BIT15 */"ODM_COMP_CFO_TRACKING",
+       /* BIT16 */"ODM_COMP_ACS",
+       /* BIT17 */"PHYDM_COMP_ADAPTIVITY",
        /* BIT18 */NULL,
        /* BIT19 */NULL,
-       /* BIT20 */NULL,
-       /* BIT21 */NULL,
+       /* BIT20 */"ODM_COMP_EDCA_TURBO",
+       /* BIT21 */"ODM_COMP_EARLY_MODE",
        /* BIT22 */NULL,
        /* BIT23 */NULL,
        /* BIT24 */"ODM_COMP_TX_PWR_TRACK",
@@ -73,14 +73,14 @@ const char *odm_ability_str[] = {
        /* BIT11 */"ODM_BB_PSD",
        /* BIT12 */"ODM_BB_RXHP",
        /* BIT13 */"ODM_BB_ADAPTIVITY",
-       /* BIT14 */"ODM_BB_DYNAMIC_ATC",
-       /* BIT15 */NULL,
-       /* BIT16 */"ODM_MAC_EDCA_TURBO",
-       /* BIT17 */"ODM_MAC_EARLY_MODE",
+       /* BIT14 */"ODM_BB_CFO_TRACKING",
+       /* BIT15 */"ODM_BB_NHM_CNT",
+       /* BIT16 */"ODM_BB_PRIMARY_CCA",
+       /* BIT17 */NULL,
        /* BIT18 */NULL,
        /* BIT19 */NULL,
-       /* BIT20 */NULL,
-       /* BIT21 */NULL,
+       /* BIT20 */"ODM_MAC_EDCA_TURBO",
+       /* BIT21 */"ODM_MAC_EARLY_MODE",
        /* BIT22 */NULL,
        /* BIT23 */NULL,
        /* BIT24 */"ODM_RF_TX_PWR_TRACK",
@@ -166,6 +166,11 @@ inline void rtw_odm_ability_set(_adapter *adapter, u32 ability)
        rtw_hal_set_hwreg(adapter, HW_VAR_DM_FLAG, (u8*)&ability);
 }
 
+void rtw_odm_adaptivity_ver_msg(void *sel, _adapter *adapter)
+{
+       DBG_871X_SEL_NL(sel, "ADAPTIVITY_VERSION "ADAPTIVITY_VERSION"\n");
+}
+
 #define RTW_ADAPTIVITY_EN_DISABLE 0
 #define RTW_ADAPTIVITY_EN_ENABLE 1
 #define RTW_ADAPTIVITY_EN_AUTO 2
@@ -208,6 +213,25 @@ void rtw_odm_adaptivity_mode_msg(void *sel, _adapter *adapter)
                DBG_871X_SEL(sel, "INVALID\n");
        }
 }
+
+#define RTW_NHM_EN_DISABLE 0
+#define RTW_NHM_EN_ENABLE 1
+
+void rtw_odm_nhm_en_msg(void *sel, _adapter *adapter)
+{
+       struct registry_priv *regsty = &adapter->registrypriv;
+
+       DBG_871X_SEL_NL(sel, "RTW_NHM_EN_");
+
+       if (regsty->nhm_en == RTW_NHM_EN_DISABLE) {
+               DBG_871X_SEL(sel, "DISABLE\n");
+       } else if (regsty->nhm_en == RTW_NHM_EN_ENABLE) {
+               DBG_871X_SEL(sel, "ENABLE\n");
+       } else {
+               DBG_871X_SEL(sel, "INVALID\n");
+       }
+}
+
 bool rtw_odm_adaptivity_needed(_adapter *adapter)
 {
        struct registry_priv *regsty = &adapter->registrypriv;
@@ -219,8 +243,10 @@ bool rtw_odm_adaptivity_needed(_adapter *adapter)
                ret = _TRUE;
 
        if (ret == _TRUE) {
+               rtw_odm_adaptivity_ver_msg(RTW_DBGDUMP, adapter);
                rtw_odm_adaptivity_en_msg(RTW_DBGDUMP, adapter);
                rtw_odm_adaptivity_mode_msg(RTW_DBGDUMP, adapter);
+               rtw_odm_nhm_en_msg(RTW_DBGDUMP, adapter);
        }
 
        return ret;
@@ -231,8 +257,10 @@ void rtw_odm_adaptivity_parm_msg(void *sel, _adapter *adapter)
        HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
        DM_ODM_T *odm = &pHalData->odmpriv;
 
+       rtw_odm_adaptivity_ver_msg(sel, adapter);
        rtw_odm_adaptivity_en_msg(sel, adapter);
        rtw_odm_adaptivity_mode_msg(sel, adapter);
+       rtw_odm_nhm_en_msg(sel, adapter);
 
        DBG_871X_SEL_NL(sel, "%10s %16s %8s %10s %11s %14s\n"
                , "TH_L2H_ini", "TH_EDCCA_HL_diff", "IGI_Base", "ForceEDCCA", "AdapEn_RSSI", "IGI_LowerBound");
@@ -244,6 +272,14 @@ void rtw_odm_adaptivity_parm_msg(void *sel, _adapter *adapter)
                , odm->AdapEn_RSSI
                , odm->IGI_LowerBound
        );
+
+       DBG_871X_SEL_NL(sel, "%8s %9s\n", "EDCCA_ES","Adap_Flag");
+       DBG_871X_SEL_NL(sel, "%-8x %-9x \n"
+               , odm->EDCCA_enable_state
+               , odm->adaptivity_flag
+       );
+       
+       
 }
 
 void rtw_odm_adaptivity_parm_set(_adapter *adapter, s8 TH_L2H_ini, s8 TH_EDCCA_HL_diff,
@@ -267,4 +303,36 @@ void rtw_odm_get_perpkt_rssi(void *sel, _adapter *adapter)
        
        DBG_871X_SEL_NL(sel,"RxRate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\n", 
        HDATA_RATE(odm->RxRate), odm->RSSI_A, odm->RSSI_B);     
-}
\ No newline at end of file
+}
+
+
+void rtw_odm_acquirespinlock(_adapter *adapter,        RT_SPINLOCK_TYPE type)
+{
+       PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(adapter);
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+       _irqL irqL;
+
+       switch(type)
+       {
+               case RT_IQK_SPINLOCK:
+                       _enter_critical_bh(&pdmpriv->IQKSpinLock, &irqL);
+               default:
+                       break;
+       }
+}
+
+void rtw_odm_releasespinlock(_adapter *adapter,        RT_SPINLOCK_TYPE type)
+{
+       PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(adapter);
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+       _irqL irqL;
+
+       switch(type)
+       {
+               case RT_IQK_SPINLOCK:
+                       _exit_critical_bh(&pdmpriv->IQKSpinLock, &irqL);
+               default:
+                       break;
+       }
+}
+
index 92423bb339f0c45a2656be0814991847dde2eb9c..697a69f680339f07a04823e015b35e2eee159f8b 100755 (executable)
@@ -58,6 +58,11 @@ static u32 go_add_group_info_attr(struct wifidirect_info *pwdinfo, u8 *pbuf)
 
        pdata_attr = rtw_zmalloc(MAX_P2P_IE_LEN);
 
+       if(NULL == pdata_attr){
+               DBG_871X("%s pdata_attr malloc failed \n", __FUNCTION__);
+               goto _exit;
+       }
+       
        pstart = pdata_attr;
        pcur = pdata_attr;
 
@@ -139,7 +144,8 @@ static u32 go_add_group_info_attr(struct wifidirect_info *pwdinfo, u8 *pbuf)
        }
 
        rtw_mfree(pdata_attr, MAX_P2P_IE_LEN);
-
+       
+_exit:
        return len;
 
 }
@@ -3455,6 +3461,8 @@ _func_exit_;
 void p2p_concurrent_handler( _adapter* padapter )
 {
        struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);   
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
        //_adapter                              *pbuddy_adapter = padapter->pbuddy_adapter;
        //struct wifidirect_info        *pbuddy_wdinfo = &pbuddy_adapter->wdinfo;
        //struct mlme_priv              *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;
@@ -3495,9 +3503,12 @@ _func_enter_;
                                        }
 
                                        rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);
-                                       val8 = 1;
-                                       rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
-
+                                       if(!check_buddy_mlmeinfo_state(padapter, WIFI_FW_AP_STATE) &&
+                                       !(pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
+                                       {
+                                               val8 = 1;
+                                               rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
+                                       }
                                        //      Todo: To check the value of pwdinfo->ext_listen_period is equal to 0 or not.
                                        _set_timer( &pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_period );
                                }
@@ -3517,8 +3528,11 @@ _func_enter_;
                                if ( pbuddy_mlmeext->cur_channel != pwdinfo->listen_channel )
                                {
                                        set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);
-                                       val8 = 0;
-                                       padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
+                                       if(!check_buddy_mlmeinfo_state(padapter, WIFI_FW_AP_STATE) &&!(pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
+                                       {                                               
+                                               val8 = 0;
+                                               padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
+                                       }
                                        rtw_p2p_set_state(pwdinfo, P2P_STATE_IDLE);
                                        issue_nulldata(pbuddy_adapter, NULL, 0, 3, 500);
                                }
@@ -3612,7 +3626,8 @@ _func_enter_;
        pcfg80211_wdinfo->is_ro_ch = _FALSE;
        pcfg80211_wdinfo->last_ro_ch_time = rtw_get_current_time();
 
-       DBG_871X("cfg80211_remain_on_channel_expired, ch=%d, bw=%d, offset=%d\n", 
+       DBG_871X("cfg80211_remain_on_channel_expired cookie:0x%llx, ch=%d, bw=%d, offset=%d\n",
+               pcfg80211_wdinfo->remain_on_ch_cookie,
                rtw_get_oper_ch(padapter), rtw_get_oper_bw(padapter), rtw_get_oper_choffset(padapter));
 
        rtw_cfg80211_remain_on_channel_expired(padapter, 
index 2076e152be1457be60c351a358edeecee9b23632..0a16ad5c2e3b576846d589561f43630936cb938b 100755 (executable)
@@ -20,7 +20,8 @@
 #define _RTW_PWRCTRL_C_
 
 #include <drv_types.h>
-
+#include <hal_data.h>
+#include <hal_com_h2c.h>
 
 int rtw_fw_ps_state(PADAPTER padapter)
 {
@@ -159,6 +160,9 @@ int ips_leave(_adapter * padapter)
 #endif //DBG_CHECK_FW_PS_STATE
        _exit_pwrlock(&pwrpriv->lock);
 
+       if (_SUCCESS == ret)
+               ODM_DMReset(&GET_HAL_DATA(padapter)->odmpriv);
+
 #ifdef CONFIG_BT_COEXIST
        if (_SUCCESS == ret)
                rtw_btcoex_IpsNotify(padapter, IPS_NONE);
@@ -460,7 +464,7 @@ void        traffic_check_for_leave_lps(PADAPTER padapter, u8 tx, u32 tx_packets)
 #endif
                                        )
                                {
-                                       DBG_871X("leave lps via Tx = %d\n", xmit_cnt);                  
+                                       //DBG_871X("leave lps via Tx = %d\n", xmit_cnt);                        
                                        bLeaveLPS = _TRUE;
                                }
                        }
@@ -481,7 +485,7 @@ void        traffic_check_for_leave_lps(PADAPTER padapter, u8 tx, u32 tx_packets)
 #endif
                                )
                        {       
-                               DBG_871X("leave lps via Rx = %d\n", pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod);  
+                               //DBG_871X("leave lps via Rx = %d\n", pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod);        
                                bLeaveLPS = _TRUE;
                        }
                }       
@@ -491,7 +495,7 @@ void        traffic_check_for_leave_lps(PADAPTER padapter, u8 tx, u32 tx_packets)
        {
                //DBG_871X("leave lps via %s, Tx = %d, Rx = %d \n", tx?"Tx":"Rx", pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod);  
                //rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, 1);
-               rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, tx?0:1);
+               rtw_lps_ctrl_wk_cmd(padapter, tx?LPS_CTRL_TX_TRAFFIC_LEAVE:LPS_CTRL_RX_TRAFFIC_LEAVE, tx?0:1);
        }
 #endif //CONFIG_CHECK_LEAVE_LPS
 }              
@@ -604,7 +608,7 @@ _func_enter_;
 
                // polling cpwm
                do {
-                       rtw_mdelay_os(1);
+                       rtw_msleep_os(1);
                        poll_cnt++;
                        rtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_now);
                        if ((cpwm_orig ^ cpwm_now) & 0x80)
@@ -718,6 +722,141 @@ u8 PS_RDY_CHECK(_adapter * padapter)
        return _TRUE;
 }
 
+#if defined(CONFIG_FWLPS_IN_IPS) && defined(CONFIG_PNO_SUPPORT)
+void rtw_set_fw_in_ips_mode(PADAPTER padapter, u8 enable)
+{
+       struct hal_ops *pHalFunc = &padapter->HalFunc;
+       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
+       int cnt=0;
+       u32 start_time;
+       u8 val8 = 0;
+       u8 cpwm_orig, cpwm_now;
+       u8 parm[H2C_INACTIVE_PS_LEN]={0};
+
+       if (padapter->netif_up == _FALSE) {
+               DBG_871X("%s: ERROR, netif is down\n", __func__);
+               return;
+       }
+
+       if (pHalFunc->fill_h2c_cmd == NULL) {
+               DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
+               return;
+       }
+
+       //u8 cmd_param; //BIT0:enable, BIT1:NoConnect32k
+       if (enable) {
+
+#ifdef CONFIG_BT_COEXIST
+               rtw_btcoex_IpsNotify(padapter, pwrpriv->ips_mode_req);
+#endif
+               //Enter IPS
+               DBG_871X("%s: issue H2C to FW when entering IPS\n", __func__);
+               parm[0] = 0x03;
+               parm[1] = 0x01;
+               parm[2] = 0x01;
+               pHalFunc->fill_h2c_cmd(padapter, //H2C_FWLPS_IN_IPS_,
+                                       H2C_INACTIVE_PS_,
+                                       H2C_INACTIVE_PS_LEN, parm);
+               //poll 0x1cc to make sure H2C command already finished by FW; MAC_0x1cc=0 means H2C done by FW.
+               do{
+                       val8 = rtw_read8(padapter, REG_HMETFR);
+                       cnt++;
+                       DBG_871X("%s  polling REG_HMETFR=0x%x, cnt=%d \n",
+                                       __func__, val8, cnt);
+                       rtw_mdelay_os(10);
+               }while(cnt<100 && (val8!=0));
+
+               //H2C done, enter 32k
+               if (val8 == 0) {
+                       //ser rpwm to enter 32k
+                       val8 = rtw_read8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1);
+                       DBG_871X("%s: read rpwm=%02x\n", __FUNCTION__, val8);
+                       val8 += 0x80;
+                       val8 |= BIT(0);
+                       rtw_write8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1, val8);
+                       DBG_871X("%s: write rpwm=%02x\n", __FUNCTION__, val8);
+                       adapter_to_pwrctl(padapter)->tog = (val8 + 0x80) & 0x80;
+                       cnt = val8 = 0;
+                       do {
+                               val8 = rtw_read8(padapter, REG_CR);
+                               cnt++;
+                               DBG_871X("%s  polling 0x100=0x%x, cnt=%d \n",
+                                               __func__, val8, cnt);
+                               DBG_871X("%s 0x08:%02x, 0x03:%02x\n",
+                                               __func__,
+                                               rtw_read8(padapter, 0x08),
+                                               rtw_read8(padapter, 0x03));
+                               rtw_mdelay_os(10);
+                       } while(cnt<20 && (val8!=0xEA));
+#ifdef DBG_CHECK_FW_PS_STATE
+                       if(val8 != 0xEA) {
+                               DBG_871X("MAC_1B8=0x%08x\n",
+                                               rtw_read32(padapter, 0x1b8));
+                               DBG_871X("MAC_1C0=%08x, MAC_1C4=%08x, MAC_1C8=%08x, MAC_1CC=%08x\n",
+                                               rtw_read32(padapter, 0x1c0),
+                                               rtw_read32(padapter, 0x1c4),
+                                               rtw_read32(padapter, 0x1c8),
+                                               rtw_read32(padapter, 0x1cc));
+#endif //DBG_CHECK_FW_PS_STATE
+                       } else {
+                               DBG_871X("MAC_1C0=%08x, MAC_1C4=%08x, MAC_1C8=%08x, MAC_1CC=%08x\n",
+                                               rtw_read32(padapter, 0x1c0),
+                                               rtw_read32(padapter, 0x1c4),
+                                               rtw_read32(padapter, 0x1c8),
+                                               rtw_read32(padapter, 0x1cc));
+                       }
+               }
+       } else {
+               //Leave IPS
+               DBG_871X("%s: Leaving IPS in FWLPS state\n", __func__);
+
+               //for polling cpwm
+               cpwm_orig = 0;
+               rtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_orig);
+
+               //ser rpwm
+               val8 = rtw_read8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1);
+               val8 &= 0x80;
+               val8 += 0x80;
+               val8 |= BIT(6);
+               rtw_write8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1, val8);
+               DBG_871X("%s: write rpwm=%02x\n", __FUNCTION__, val8);
+               adapter_to_pwrctl(padapter)->tog = (val8 + 0x80) & 0x80;
+
+               //do polling cpwm
+               start_time = rtw_get_current_time();
+               do {
+
+                       rtw_mdelay_os(1);
+
+                       rtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_now);
+                       if ((cpwm_orig ^ cpwm_now) & 0x80) {
+#ifdef DBG_CHECK_FW_PS_STATE                           
+                               DBG_871X("%s: polling cpwm ok when leaving IPS in FWLPS state, cpwm_orig=%02x, cpwm_now=%02x, 0x100=0x%x \n"
+                               , __FUNCTION__, cpwm_orig, cpwm_now, rtw_read8(padapter, REG_CR));
+#endif //DBG_CHECK_FW_PS_STATE
+                               break;
+                       }
+
+                       if (rtw_get_passing_time_ms(start_time) > 100)
+                       {
+                               DBG_871X("%s: polling cpwm timeout when leaving IPS in FWLPS state\n", __FUNCTION__);
+                               break;
+                       }
+               } while (1);
+
+               parm[0] = 0x0;
+               parm[1] = 0x0;
+               parm[2] = 0x0;
+               pHalFunc->fill_h2c_cmd(padapter, H2C_INACTIVE_PS_,
+                                       H2C_INACTIVE_PS_LEN, parm);
+#ifdef CONFIG_BT_COEXIST
+               rtw_btcoex_IpsNotify(padapter, IPS_NONE);
+#endif
+       }
+}
+#endif //CONFIG_PNO_SUPPORT
+
 void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode, const char *msg)
 {
        struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
@@ -809,9 +948,10 @@ _func_enter_;
                        pwrpriv->pwr_mode = ps_mode;
                        rtw_set_rpwm(padapter, PS_STATE_S4);
                        
-#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
+#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) || defined(CONFIG_P2P_WOWLAN)
                        if (pwrpriv->wowlan_mode == _TRUE ||
-                                       pwrpriv->wowlan_ap_mode == _TRUE)
+                                       pwrpriv->wowlan_ap_mode == _TRUE ||
+                                       pwrpriv->wowlan_p2p_mode == _TRUE)
                        {
                                u32 start_time, delay_ms;
                                u8 val8;
@@ -849,6 +989,9 @@ _func_enter_;
                        || ((rtw_btcoex_IsBtControlLps(padapter) == _TRUE)
                                && (rtw_btcoex_IsLpsOn(padapter) == _TRUE))
 #endif
+#ifdef CONFIG_P2P_WOWLAN
+                       ||( _TRUE == pwrpriv->wowlan_p2p_mode)
+#endif //CONFIG_P2P_WOWLAN
                        )
                {
                        u8 pslv;
@@ -1015,6 +1158,13 @@ _func_enter_;
                        return;
        }
 
+#ifdef CONFIG_P2P_PS
+       if(padapter->wdinfo.p2p_ps_mode == P2P_PS_NOA)
+       {
+               return;//supporting p2p client ps NOA via H2C_8723B_P2P_PS_OFFLOAD 
+       }
+#endif //CONFIG_P2P_PS
+
        if (pwrpriv->bLeisurePs)
        {
                // Idle for a while if we connect to AP a while ago.
@@ -2148,6 +2298,7 @@ _func_enter_;
 
        pwrctrlpriv->wowlan_mode = _FALSE;
        pwrctrlpriv->wowlan_ap_mode = _FALSE;
+       pwrctrlpriv->wowlan_p2p_mode = _FALSE;
 
        #ifdef CONFIG_RESUME_IN_WORKQUEUE
        _init_workitem(&pwrctrlpriv->resume_work, resume_workitem_callback, NULL);
@@ -2159,6 +2310,9 @@ _func_enter_;
        rtw_register_early_suspend(pwrctrlpriv);
        #endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER
 
+#ifdef CONFIG_WOWLAN
+       pwrctrlpriv->wowlan_from_cmd = _FALSE;
+#endif
 #ifdef CONFIG_PNO_SUPPORT
        pwrctrlpriv->pno_inited = _FALSE;
        pwrctrlpriv->pnlo_info = NULL;
index bee356f8cc3d0e6eb3b91472d7063bb9391abced..a5e4e2d4a333cdf625c19570a23a2352163d5d6f 100755 (executable)
@@ -75,6 +75,10 @@ _func_enter_;
 
        precvpriv->free_recvframe_cnt = NR_RECVFRAME;
 
+       precvpriv->sink_udpport = 0;
+       precvpriv->pre_rtp_rxseq = 0;
+       precvpriv->cur_rtp_rxseq = 0;
+
        rtw_os_recv_resource_init(precvpriv, padapter);
 
        precvpriv->pallocated_frame_buf = rtw_zvmalloc(NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ);
@@ -109,7 +113,7 @@ _func_enter_;
 
 #ifdef CONFIG_USB_HCI
 
-       precvpriv->rx_pending_cnt=1;
+       ATOMIC_SET(&(precvpriv->rx_pending_cnt), 1);
 
        _rtw_init_sema(&precvpriv->allrxreturnevt, 0);
 
@@ -1580,6 +1584,32 @@ _func_enter_;
                        goto exit;
                }
        }
+       else if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) &&
+                    (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) )
+       {
+               DBG_871X("%s ,in WIFI_MP_STATE \n",__func__);
+
+               _rtw_memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN);
+               _rtw_memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN);
+               _rtw_memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN);
+               _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
+               _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
+
+               //
+               _rtw_memcpy(pattrib->bssid,  mybssid, ETH_ALEN);
+
+
+               *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get sta_info
+               if (*psta == NULL) {
+                       RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("can't get psta under MP_MODE ; drop pkt\n"));
+                       #ifdef DBG_RX_DROP_FRAME
+                       DBG_871X("DBG_RX_DROP_FRAME %s can't get psta under WIFI_MP_STATE ; drop pkt\n", __FUNCTION__);
+                       #endif
+                       ret= _FAIL;
+                       goto exit;
+               }
+
+       }
        else {
                u8 *myhwaddr = myid(&adapter->eeprompriv);
                if (!_rtw_memcmp(pattrib->ra, myhwaddr, ETH_ALEN)) {
@@ -1745,7 +1775,7 @@ sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame)
                                                DBG_871X("no buffered packets to xmit\n");
 
                                                //issue nulldata with More data bit = 0 to indicate we have no buffered packets
-                                               issue_nulldata_in_interrupt(padapter, psta->hwaddr);
+                                               issue_nulldata_in_interrupt(padapter, psta->hwaddr, 0);
                                        }
                                        else
                                        {
@@ -2086,7 +2116,7 @@ static sint validate_80211w_mgmt(_adapter *adapter, union recv_frame *precv_fram
                                DBG_871X("%s mgmt allocate fail  !!!!!!!!!\n", __FUNCTION__);
                                goto validate_80211w_fail;
                        }
-                       /*//dump the packet content before decrypt
+                       /* //dump the packet content before decrypt
                        {
                                int pp;
                                printk("pattrib->pktlen = %d =>", pattrib->pkt_len);
@@ -2103,7 +2133,7 @@ static sint validate_80211w_mgmt(_adapter *adapter, union recv_frame *precv_fram
                        //remove the iv and icv length
                        pattrib->pkt_len = pattrib->pkt_len - pattrib->iv_len - pattrib->icv_len;
                        rtw_mfree(mgmt_DATA, data_len);
-                       /*//print packet content after decryption
+                       /* //print packet content after decryption
                        {
                                int pp;
                                printk("after decryption pattrib->pktlen = %d @@=>", pattrib->pkt_len);
@@ -2130,9 +2160,9 @@ static sint validate_80211w_mgmt(_adapter *adapter, union recv_frame *precv_fram
                        }
                        else if(BIP_ret == RTW_RX_HANDLED)
                        {
-                               //DBG_871X("802.11w recv none protected packet\n");
-                               //issue sa query request
-                               issue_action_SA_Query(adapter, NULL, 0, 0);
+                               DBG_871X("802.11w recv none protected packet\n");
+                               //drop pkt, don't issue sa query request
+                               //issue_action_SA_Query(adapter, NULL, 0, 0);
                                goto validate_80211w_fail;
                        }
                }//802.11w protect
@@ -2153,9 +2183,14 @@ static sint validate_80211w_mgmt(_adapter *adapter, union recv_frame *precv_fram
                        }
                        else if(subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC)
                        {
-                               DBG_871X("802.11w recv none protected packet\n");
-                               //issue sa query request
-                               issue_action_SA_Query(adapter, NULL, 0, 0);
+                               unsigned short  reason;
+                               reason = le16_to_cpu(*(unsigned short *)(ptr + WLAN_HDR_A3_LEN));
+                               DBG_871X("802.11w recv none protected packet, reason=%d\n", reason);
+                               if(reason == 6 || reason == 7)
+                               {
+                                       //issue sa query request
+                                       issue_action_SA_Query(adapter, NULL, 0, 0);
+                               }
                                goto validate_80211w_fail;
                        }
                }
@@ -2486,21 +2521,32 @@ _func_enter_;
                eth_type = 0x8712;
                // append rx status for mp test packets
                ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2)-24);
+               if (!ptr) {
+                       ret = _FAIL;
+                       goto exiting;
+               }
                _rtw_memcpy(ptr, get_rxmem(precvframe), 24);
                ptr+=24;
        }
        else {
                ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+ (bsnaphdr?2:0)));
+               if (!ptr) {
+                       ret = _FAIL;
+                       goto exiting;
+               }
        }
 
-       _rtw_memcpy(ptr, pattrib->dst, ETH_ALEN);
-       _rtw_memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN);
+       if (ptr) {
+               _rtw_memcpy(ptr, pattrib->dst, ETH_ALEN);
+               _rtw_memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN);
 
-       if(!bsnaphdr) {
-               len = htons(len);
-               _rtw_memcpy(ptr+12, &len, 2);
+               if(!bsnaphdr) {
+                       len = htons(len);
+                       _rtw_memcpy(ptr+12, &len, 2);
+               }
        }
 
+exiting:
 _func_exit_;   
        return ret;
 
@@ -3342,7 +3388,15 @@ int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe)
        if(!pattrib->amsdu)
        {
                //s1.
-               wlanhdr_to_ethhdr(prframe);
+                retval = wlanhdr_to_ethhdr(prframe);
+                if (retval != _SUCCESS)
+                {
+                        RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("wlanhdr_to_ethhdr: drop pkt \n"));
+                        #ifdef DBG_RX_DROP_FRAME
+                        DBG_871X("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr error!\n", __FUNCTION__);
+                        #endif
+                        return retval;
+                }
 
                //if ((pattrib->qos!=1) /*|| pattrib->priority!=0 || IS_MCAST(pattrib->ra)*/
                //      || (pattrib->eth_type==0x0806) || (pattrib->ack_policy!=0))
@@ -3643,6 +3697,77 @@ int validate_mp_recv_frame(_adapter *adapter, union recv_frame *precv_frame)
 }
 #endif
 
+static sint MPwlanhdr_to_ethhdr ( union recv_frame *precvframe)
+{
+       sint    rmv_len;
+       u16 eth_type, len;
+       u8      bsnaphdr;
+       u8      *psnap_type;
+       struct ieee80211_snap_hdr       *psnap;
+       
+       sint ret=_SUCCESS;
+       _adapter                        *adapter =precvframe->u.hdr.adapter;
+       struct mlme_priv        *pmlmepriv = &adapter->mlmepriv;
+
+       u8      *ptr = get_recvframe_data(precvframe) ; // point to frame_ctrl field
+       struct rx_pkt_attrib *pattrib = & precvframe->u.hdr.attrib;
+
+_func_enter_;
+
+       if(pattrib->encrypt){
+               recvframe_pull_tail(precvframe, pattrib->icv_len);      
+       }
+
+       psnap=(struct ieee80211_snap_hdr        *)(ptr+pattrib->hdrlen + pattrib->iv_len);
+       psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE;
+       /* convert hdr + possible LLC headers into Ethernet header */
+       //eth_type = (psnap_type[0] << 8) | psnap_type[1];
+       if((_rtw_memcmp(psnap, rtw_rfc1042_header, SNAP_SIZE) &&
+               (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_IPX, 2) == _FALSE) && 
+               (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_AARP, 2)==_FALSE) )||
+               //eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) ||
+                _rtw_memcmp(psnap, rtw_bridge_tunnel_header, SNAP_SIZE)){
+               /* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */
+               bsnaphdr = _TRUE;
+       }
+       else {
+               /* Leave Ethernet header part of hdr and full payload */
+               bsnaphdr = _FALSE;
+       }
+
+       rmv_len = pattrib->hdrlen + pattrib->iv_len +(bsnaphdr?SNAP_SIZE:0);
+       len = precvframe->u.hdr.len - rmv_len;
+
+       RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n===pattrib->hdrlen: %x,  pattrib->iv_len:%x ===\n\n", pattrib->hdrlen,  pattrib->iv_len));
+
+       _rtw_memcpy(&eth_type, ptr+rmv_len, 2);
+       eth_type= ntohs((unsigned short )eth_type); //pattrib->ether_type
+       pattrib->eth_type = eth_type;
+
+       {
+               ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+ (bsnaphdr?2:0)));
+       }
+
+       _rtw_memcpy(ptr, pattrib->dst, ETH_ALEN);
+       _rtw_memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN);
+
+       if(!bsnaphdr) {
+               len = htons(len);
+               _rtw_memcpy(ptr+12, &len, 2);
+       }
+       
+       if (adapter->registrypriv.mp_mode == 1)
+       {
+               len = htons(pattrib->seq_num);
+               //DBG_871X("wlan seq = %d ,seq_num =%x\n",len,pattrib->seq_num);
+               _rtw_memcpy(ptr+12,&len, 2);
+       }
+_func_exit_;   
+       return ret;
+
+}
+
+
 int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe)
 {
        int ret = _SUCCESS;
@@ -3653,13 +3778,17 @@ int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe)
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct mp_priv *pmppriv = &padapter->mppriv;
 #endif //CONFIG_MP_INCLUDED
-
-       DBG_COUNTER(padapter->rx_logs.core_rx_pre);
+       u8 type;
+       u8 *ptr = rframe->u.hdr.rx_data;
+       u8 *psa, *pda, *pbssid;
+       struct sta_info *psta = NULL;
+    DBG_COUNTER(padapter->rx_logs.core_rx_pre);
 
 #ifdef CONFIG_MP_INCLUDED
        if (padapter->registrypriv.mp_mode == 1)
        {
-               if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE))//&&(padapter->mppriv.check_mp_pkt == 0))
+       
+               if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) )//&&(padapter->mppriv.check_mp_pkt == 0))
                {
                        if (pattrib->crc_err == 1){
                                padapter->mppriv.rx_crcerrpktcount++;
@@ -3671,18 +3800,125 @@ int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe)
                                        padapter->mppriv.rx_pktcount_filter_out++;
                                
                        }
-
+                       
                        if(pmppriv->rx_bindicatePkt == _FALSE)
                        {
-                               if (check_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE) == _FALSE) {
+                               //if (check_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE) == _FALSE) {
                                        //RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("MP - Not in loopback mode , drop pkt \n"));
                                        ret = _FAIL;
                                        rtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame
                                        goto exit;
-                               }
+                               
                        }
-       }
-       }
+                       else {                  
+                       
+                       type =  GetFrameType(ptr);
+                       pattrib->to_fr_ds = get_tofr_ds(ptr);
+                       pattrib->frag_num = GetFragNum(ptr);
+                       pattrib->seq_num = GetSequence(ptr);
+                       pattrib->pw_save = GetPwrMgt(ptr);
+                       pattrib->mfrag = GetMFrag(ptr);
+                       pattrib->mdata = GetMData(ptr);
+                       pattrib->privacy = GetPrivacy(ptr);
+                       pattrib->order = GetOrder(ptr);
+       
+                       if(type ==WIFI_DATA_TYPE)
+                       {
+                               pda = get_da(ptr);
+                               psa = get_sa(ptr);
+                               pbssid = get_hdr_bssid(ptr);
+                               
+                               _rtw_memcpy(pattrib->dst, pda, ETH_ALEN);
+                               _rtw_memcpy(pattrib->src, psa, ETH_ALEN);
+                               _rtw_memcpy(pattrib->bssid, pbssid, ETH_ALEN);
+                       
+                       switch(pattrib->to_fr_ds)
+                       {
+                       case 0:
+                               _rtw_memcpy(pattrib->ra, pda, ETH_ALEN);
+                               _rtw_memcpy(pattrib->ta, psa, ETH_ALEN);
+                               ret = sta2sta_data_frame(padapter, rframe, &psta);
+                               break;
+
+                       case 1:
+               
+                               _rtw_memcpy(pattrib->ra, pda, ETH_ALEN);
+                               _rtw_memcpy(pattrib->ta, pbssid, ETH_ALEN);
+                               ret = ap2sta_data_frame(padapter, rframe, &psta);
+               
+                               break;
+
+                       case 2:
+                               _rtw_memcpy(pattrib->ra, pbssid, ETH_ALEN);
+                               _rtw_memcpy(pattrib->ta, psa, ETH_ALEN);
+                               ret = sta2ap_data_frame(padapter, rframe, &psta);
+                               break;
+
+                       case 3:
+                               _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN);
+                               _rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN);
+                               ret =_FAIL;
+                               RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" case 3\n"));
+                               break;
+
+                       default:
+                               ret =_FAIL;
+                               break;
+                       }
+               
+                       ret = MPwlanhdr_to_ethhdr (rframe);
+                               
+                       if (ret != _SUCCESS)
+                       {
+                                                       RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("wlanhdr_to_ethhdr: drop pkt \n"));
+                               #ifdef DBG_RX_DROP_FRAME
+                                                       DBG_871X("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr: drop pkt\n", __FUNCTION__);
+                               #endif
+                                                       rtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame
+                                                       ret = _FAIL;
+                                                       goto exit;
+                                               }
+                               
+                                               if ((padapter->bDriverStopped == _FALSE) && (padapter->bSurpriseRemoved == _FALSE))
+                                               {
+                                                       RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("@@@@ recv_func: recv_func rtw_recv_indicatepkt\n" ));
+                                                       //indicate this recv_frame
+                                                       ret = rtw_recv_indicatepkt(padapter, rframe);
+                                                       if (ret != _SUCCESS)
+                                                       {       
+                                       #ifdef DBG_RX_DROP_FRAME
+                                                               DBG_871X("DBG_RX_DROP_FRAME %s rtw_recv_indicatepkt fail!\n", __FUNCTION__);
+                                       #endif
+                                                               rtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame
+                                                               ret = _FAIL;
+
+                                                               goto exit;
+                                                       }
+                                               }
+                                               else
+                                               {
+                                                       RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("@@@@  recv_func: rtw_free_recvframe\n" ));
+                                                                               RT_TRACE(_module_rtl871x_recv_c_, _drv_debug_, ("recv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved));
+                                                       #ifdef DBG_RX_DROP_FRAME
+                                                                               DBG_871X("DBG_RX_DROP_FRAME %s ecv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", __FUNCTION__,
+                                                                                       padapter->bDriverStopped, padapter->bSurpriseRemoved);
+                                                       #endif
+                                                       ret = _FAIL;
+                                                       rtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame
+                                                       goto exit;
+                                               }
+
+                                       }
+                               }
+                               
+               }
+
+               RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("recv_func: validate_recv_frame fail! drop pkt\n"));
+               rtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame
+               ret = _FAIL;
+               goto exit;
+        }
+       
 #endif
 
        //check the frame crtl field and decache
index 82db59c670dd46557fd3124e339184ea66d2be2b..c7066f8fb9eb34d9493d0af611b8f29053661fc5 100755 (executable)
@@ -267,8 +267,7 @@ void sreset_stop_adapter(_adapter *padapter)
 \r
        DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));\r
 \r
-       if (!rtw_netif_queue_stopped(padapter->pnetdev))\r
-               rtw_netif_stop_queue(padapter->pnetdev);\r
+       rtw_netif_stop_queue(padapter->pnetdev);\r
 \r
        rtw_cancel_all_timer(padapter);\r
 \r
@@ -307,11 +306,10 @@ void sreset_start_adapter(_adapter *padapter)
        tasklet_hi_schedule(&pxmitpriv->xmit_tasklet);\r
        #endif\r
 \r
-       _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);\r
-\r
-       if (rtw_netif_queue_stopped(padapter->pnetdev))\r
-               rtw_netif_wake_queue(padapter->pnetdev);\r
+       if (is_primary_adapter(padapter))\r
+               _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);\r
 \r
+       rtw_netif_wake_queue(padapter->pnetdev);\r
 }\r
 \r
 void sreset_reset(_adapter *padapter)\r
index f03f727d9ee6e8e59e1ac9d19013e98d67302577..f17b2a2dc475e6e22e3ef859f71f741537f14bfe 100755 (executable)
@@ -456,13 +456,19 @@ u32       rtw_free_stainfo(_adapter *padapter , struct sta_info *psta)
        struct  xmit_priv       *pxmitpriv= &padapter->xmitpriv;
        struct  sta_priv *pstapriv = &padapter->stapriv;
        struct hw_xmit *phwxmit;
-
+       int pending_qcnt[4];
 
 _func_enter_;  
        
        if (psta == NULL)
                goto exit;
 
+       _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL0);
+       rtw_list_delete(&psta->hash_list);
+       RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("\n free number_%d stainfo  with hwaddr = 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x  \n",pstapriv->asoc_sta_count , psta->hwaddr[0], psta->hwaddr[1], psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]));
+       pstapriv->asoc_sta_count --;
+       _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL0);
+
 
        _enter_critical_bh(&psta->lock, &irqL0);
        psta->state &= ~_FW_LINKED;
@@ -488,6 +494,7 @@ _func_enter_;
        rtw_list_delete(&(pstaxmitpriv->vo_q.tx_pending));
        phwxmit = pxmitpriv->hwxmits;
        phwxmit->accnt -= pstaxmitpriv->vo_q.qcnt;
+       pending_qcnt[0] = pstaxmitpriv->vo_q.qcnt;
        pstaxmitpriv->vo_q.qcnt = 0;
        //_exit_critical_bh(&(pxmitpriv->vo_pending.lock), &irqL0);
 
@@ -497,6 +504,7 @@ _func_enter_;
        rtw_list_delete(&(pstaxmitpriv->vi_q.tx_pending));
        phwxmit = pxmitpriv->hwxmits+1;
        phwxmit->accnt -= pstaxmitpriv->vi_q.qcnt;
+       pending_qcnt[1] = pstaxmitpriv->vi_q.qcnt;
        pstaxmitpriv->vi_q.qcnt = 0;
        //_exit_critical_bh(&(pxmitpriv->vi_pending.lock), &irqL0);
 
@@ -506,6 +514,7 @@ _func_enter_;
        rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending));
        phwxmit = pxmitpriv->hwxmits+2;
        phwxmit->accnt -= pstaxmitpriv->be_q.qcnt;
+       pending_qcnt[2] = pstaxmitpriv->be_q.qcnt;
        pstaxmitpriv->be_q.qcnt = 0;
        //_exit_critical_bh(&(pxmitpriv->be_pending.lock), &irqL0);
        
@@ -515,15 +524,14 @@ _func_enter_;
        rtw_list_delete(&(pstaxmitpriv->bk_q.tx_pending));
        phwxmit = pxmitpriv->hwxmits+3;
        phwxmit->accnt -= pstaxmitpriv->bk_q.qcnt;
+       pending_qcnt[3] = pstaxmitpriv->bk_q.qcnt;
        pstaxmitpriv->bk_q.qcnt = 0;
        //_exit_critical_bh(&(pxmitpriv->bk_pending.lock), &irqL0);
-       
+
+       rtw_os_wake_queue_at_free_stainfo(padapter, pending_qcnt);
+
        _exit_critical_bh(&pxmitpriv->lock, &irqL0);
        
-       rtw_list_delete(&psta->hash_list);
-       RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("\n free number_%d stainfo  with hwaddr = 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x  \n",pstapriv->asoc_sta_count , psta->hwaddr[0], psta->hwaddr[1], psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]));
-       pstapriv->asoc_sta_count --;
-       
        
        // re-init sta_info; 20061114 // will be init in alloc_stainfo
        //_rtw_init_sta_xmit_priv(&psta->sta_xmitpriv);
@@ -631,7 +639,9 @@ _func_enter_;
         _rtw_spinlock_free(&psta->lock);
 
        //_enter_critical_bh(&(pfree_sta_queue->lock), &irqL0);
+       _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL0); 
        rtw_list_insert_tail(&psta->list, get_list_head(pfree_sta_queue));
+       _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL0);
        //_exit_critical_bh(&(pfree_sta_queue->lock), &irqL0);
 
 exit:
@@ -651,6 +661,9 @@ void rtw_free_all_stainfo(_adapter *padapter)
        struct sta_info *psta = NULL;
        struct  sta_priv *pstapriv = &padapter->stapriv;
        struct sta_info* pbcmc_stainfo =rtw_get_bcmc_stainfo( padapter);
+       u8 free_sta_num = 0;
+       char free_sta_list[NUM_STA];
+       int stainfo_offset;
        
 _func_enter_;  
 
@@ -670,13 +683,27 @@ _func_enter_;
 
                        plist = get_next(plist);
 
-                       if(pbcmc_stainfo!=psta)                                 
-                               rtw_free_stainfo(padapter , psta);
+                       if(pbcmc_stainfo!=psta)
+                       {
+                               rtw_list_delete(&psta->hash_list);
+                               //rtw_free_stainfo(padapter , psta);
+                               stainfo_offset = rtw_stainfo_offset(pstapriv, psta);
+                               if (stainfo_offset_valid(stainfo_offset)) {
+                                       free_sta_list[free_sta_num++] = stainfo_offset;
+                               }
+                       }       
                        
                }
        }
        
        _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
+
+
+       for (index = 0; index < free_sta_num; index++) 
+       {
+               psta = rtw_get_stainfo_by_offset(pstapriv, free_sta_list[index]);
+               rtw_free_stainfo(padapter , psta);
+       }
        
 exit:  
        
@@ -762,9 +789,6 @@ _func_enter_;
                goto exit;
        }
 
-       // default broadcast & multicast use macid 1
-       psta->mac_id = 1;
-
        ptxservq= &(psta->sta_xmitpriv.be_q);
 
 /*
index e3f1fed10f8d8f3575d29bee657d1f727230bb21..c2e4e48dddc9a1f78db1a2d13bcb09a2b0e103bb 100755 (executable)
@@ -70,6 +70,7 @@ static u8 rtw_basic_rate_mix[7] = {
        IEEE80211_OFDM_RATE_24MB|IEEE80211_BASIC_RATE_MASK
 };
 
+int new_bcn_max = 3;
 
 int cckrates_included(unsigned char *rate, int ratelen)
 {
@@ -862,8 +863,9 @@ void invalidate_cam_all(_adapter *padapter)
        struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
        struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
        _irqL irqL;
+       u8 val8 = 0;
 
-       rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, 0);
+       rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, &val8);
 
        _enter_critical_bh(&cam_ctl->lock, &irqL);
        cam_ctl->bitmap = 0;
@@ -900,6 +902,32 @@ void read_cam(_adapter *padapter ,u8 entry, u8 *get_key)
        }
        //DBG_8192C("*********************************\n");
 }
+
+bool read_phy_cam_is_gtk(_adapter *padapter, u8 entry)
+{
+       bool res = _FALSE;
+       u32 addr, cmd;
+
+       addr = entry << 3;
+       cmd = _ReadCAM(padapter, addr);
+
+       res = (cmd & BIT6)? _TRUE:_FALSE;
+       return res;
+}
+
+void dump_cam_table(_adapter *padapter) {
+       u32 i, j, addr, cmd;
+       DBG_871X("###########DUMP CAM TABLE##############\n");
+       for (i = 0; i < 8 ; i++) {
+               addr = i << 3;
+               DBG_871X("********* DUMP CAM Entry_#%02d**********\n",i);
+               for (j = 0; j < 6; j++) {
+                       cmd = _ReadCAM(padapter ,addr+j);
+                       DBG_8192C("offset:0x%02x => 0x%08x \n",addr+j,cmd);
+               }
+               DBG_871X("*********************************\n");
+       }
+}
 #endif
 
 void _write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key)
@@ -1656,7 +1684,9 @@ void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
                }
                else
                {
-                       //modify from  fw by Thomas 2010/11/17
+                       /* AMPDU Parameters field */
+
+                       /* Get MIN of MAX AMPDU Length Exp */
                        if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3) > (pIE->data[i] & 0x3))
                        {
                                max_AMPDU_len = (pIE->data[i] & 0x3);
@@ -1665,7 +1695,8 @@ void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
                        {
                                max_AMPDU_len = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3);
                        }
-                       
+
+                       /* Get MAX of MIN MPDU Start Spacing */
                        if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) > (pIE->data[i] & 0x1c))
                        {
                                min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c);
@@ -1713,7 +1744,7 @@ void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
 
        if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
                // Config STBC setting
-               if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX) && GET_HT_CAPABILITY_ELE_TX_STBC(pIE->data))
+               if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX) && GET_HT_CAP_ELE_TX_STBC(pIE->data))
                {
                        SET_FLAG(cur_stbc_cap, STBC_HT_ENABLE_TX);
                        DBG_871X("Enable HT Tx STBC !\n");
@@ -1740,7 +1771,7 @@ void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
 #endif //CONFIG_BEAMFORMING
        } else {
                // Config LDPC Coding Capability
-               if (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_TX) && GET_HT_CAPABILITY_ELE_LDPC_CAP(pIE->data))
+               if (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_TX) && GET_HT_CAP_ELE_LDPC_CAP(pIE->data))
                {
                        SET_FLAG(cur_ldpc_cap, (LDPC_HT_ENABLE_TX | LDPC_HT_CAP_TX));
                        DBG_871X("Enable HT Tx LDPC!\n");
@@ -1748,7 +1779,7 @@ void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
                phtpriv->ldpc_cap = cur_ldpc_cap;
 
                // Config STBC setting
-               if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX) && GET_HT_CAPABILITY_ELE_RX_STBC(pIE->data))
+               if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX) && GET_HT_CAP_ELE_RX_STBC(pIE->data))
                {
                        SET_FLAG(cur_stbc_cap, (STBC_HT_ENABLE_TX | STBC_HT_CAP_TX) );
                        DBG_871X("Enable HT Tx STBC!\n");
@@ -1994,8 +2025,117 @@ int check_ap_tdls_prohibited(u8 *pframe, u8 pkt_len)
 }
 #endif //CONFIG_TDLS
 
+/*
+ * rtw_get_bcn_keys: get beacon keys from recv frame
+ *
+ * TODO:
+ *     WLAN_EID_COUNTRY
+ *     WLAN_EID_ERP_INFO
+ *     WLAN_EID_CHANNEL_SWITCH
+ *     WLAN_EID_PWR_CONSTRAINT
+ */
+int rtw_get_bcn_keys(ADAPTER *Adapter, u8 *pframe, u32 packet_len,
+               struct beacon_keys *recv_beacon)
+{
+       int left;
+       u16 capability;
+       unsigned char *pos;
+       struct rtw_ieee802_11_elems elems;
+       struct rtw_ieee80211_ht_cap *pht_cap = NULL;
+       struct HT_info_element *pht_info = NULL;
+
+       _rtw_memset(recv_beacon, 0, sizeof(*recv_beacon));
+
+       /* checking capabilities */
+       capability = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN + 10));
+
+       /* checking IEs */
+       left = packet_len - sizeof(struct rtw_ieee80211_hdr_3addr) - _BEACON_IE_OFFSET_;
+       pos = pframe + sizeof(struct rtw_ieee80211_hdr_3addr) + _BEACON_IE_OFFSET_;
+       if (rtw_ieee802_11_parse_elems(pos, left, &elems, 1) == ParseFailed)
+               return _FALSE;
+
+       /* check bw and channel offset */
+       if (elems.ht_capabilities) {
+               if (elems.ht_capabilities_len != sizeof(*pht_cap))
+                       return _FALSE;
+
+               pht_cap = (struct rtw_ieee80211_ht_cap *) elems.ht_capabilities;
+               recv_beacon->ht_cap_info = pht_cap->cap_info;
+       }
+
+       if (elems.ht_operation) {
+               if (elems.ht_operation_len != sizeof(*pht_info))
+                       return _FALSE;
+
+               pht_info = (struct HT_info_element *) elems.ht_operation;
+               recv_beacon->ht_info_infos_0_sco = pht_info->infos[0] & 0x03;
+       }
+
+       /* Checking for channel */
+       if (elems.ds_params && elems.ds_params_len == sizeof(recv_beacon->bcn_channel))
+               _rtw_memcpy(&recv_beacon->bcn_channel, elems.ds_params,
+                               sizeof(recv_beacon->bcn_channel));
+       else if (pht_info)
+               /* In 5G, some ap do not have DSSET IE checking HT info for channel */
+               recv_beacon->bcn_channel = pht_info->primary_channel;
+       else {
+               /* we don't find channel IE, so don't check it */
+               //DBG_871X("Oops: %s we don't find channel IE, so don't check it \n", __func__);
+               recv_beacon->bcn_channel = Adapter->mlmeextpriv.cur_channel;
+       }
+
+       /* checking SSID */
+       if (elems.ssid) {
+              if (elems.ssid_len > sizeof(recv_beacon->ssid))
+                       return _FALSE;
+
+              _rtw_memcpy(recv_beacon->ssid, elems.ssid, elems.ssid_len);
+              recv_beacon->ssid_len = elems.ssid_len;
+       } else; // means hidden ssid
+
+       /* checking RSN first */
+       if (elems.rsn_ie && elems.rsn_ie_len) {
+               recv_beacon->encryp_protocol = ENCRYP_PROTOCOL_WPA2;
+               rtw_parse_wpa2_ie(elems.rsn_ie - 2, elems.rsn_ie_len + 2,
+                       &recv_beacon->group_cipher, &recv_beacon->pairwise_cipher,
+                       &recv_beacon->is_8021x);
+       }
+       /* checking WPA secon */
+       else if (elems.wpa_ie && elems.wpa_ie_len) {
+               recv_beacon->encryp_protocol = ENCRYP_PROTOCOL_WPA;
+               rtw_parse_wpa_ie(elems.wpa_ie - 2, elems.wpa_ie_len + 2,
+                       &recv_beacon->group_cipher, &recv_beacon->pairwise_cipher,
+                       &recv_beacon->is_8021x);
+       }
+       else if (capability & BIT(4)) {
+               recv_beacon->encryp_protocol = ENCRYP_PROTOCOL_WEP;
+       }
+
+       return _TRUE;
+}
+
+void rtw_dump_bcn_keys(struct beacon_keys *recv_beacon)
+{
+       int i;
+       char *p;
+       u8 ssid[IW_ESSID_MAX_SIZE + 1];
+
+       _rtw_memcpy(ssid, recv_beacon->ssid, recv_beacon->ssid_len);
+       ssid[recv_beacon->ssid_len] = '\0';
+
+       DBG_871X("%s: ssid = %s\n", __func__, ssid);
+       DBG_871X("%s: channel = %x\n", __func__, recv_beacon->bcn_channel);
+       DBG_871X("%s: ht_cap = %x\n", __func__, recv_beacon->ht_cap_info);
+       DBG_871X("%s: ht_info_infos_0_sco = %x\n", __func__, recv_beacon->ht_info_infos_0_sco);
+       DBG_871X("%s: sec=%d, group = %x, pair = %x, 8021X = %x\n", __func__,
+               recv_beacon->encryp_protocol, recv_beacon->group_cipher,
+               recv_beacon->pairwise_cipher, recv_beacon->is_8021x);
+}
+
 int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
 {
+#if 0
        unsigned int            len;
        unsigned char           *p;
        unsigned short  val16, subtype;
@@ -2015,7 +2155,12 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
        u32 bcn_channel;
        unsigned short  ht_cap_info;
        unsigned char   ht_info_infos_0;
+#endif
+       unsigned int len;
+       u8 *pbssid = GetAddr3Ptr(pframe);
        struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
+       struct wlan_network *cur_network = &(Adapter->mlmepriv.cur_network);
+       struct beacon_keys recv_beacon;
 
        if (is_client_associated_to_ap(Adapter) == _FALSE)
                return _TRUE;
@@ -2033,6 +2178,78 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
                return _TRUE;
        }
 
+       if (rtw_get_bcn_keys(Adapter, pframe, packet_len, &recv_beacon) == _FALSE)
+               return _TRUE; // parsing failed => broken IE
+
+       // don't care hidden ssid, use current beacon ssid directly
+       if (recv_beacon.ssid_len == 0) {
+              _rtw_memcpy(recv_beacon.ssid, pmlmepriv->cur_beacon_keys.ssid,
+                              pmlmepriv->cur_beacon_keys.ssid_len);
+              recv_beacon.ssid_len = pmlmepriv->cur_beacon_keys.ssid_len;
+       }
+
+       if (_rtw_memcmp(&recv_beacon, &pmlmepriv->cur_beacon_keys, sizeof(recv_beacon)) == _TRUE)
+       {
+               pmlmepriv->new_beacon_cnts = 0;
+       }
+       else if ((pmlmepriv->new_beacon_cnts == 0) ||
+               _rtw_memcmp(&recv_beacon, &pmlmepriv->new_beacon_keys, sizeof(recv_beacon)) == _FALSE)
+       {
+               DBG_871X_LEVEL(_drv_err_, "%s: start new beacon (seq=%d)\n", __func__, GetSequence(pframe));
+
+               if (pmlmepriv->new_beacon_cnts == 0) {
+                       DBG_871X_LEVEL(_drv_err_, "%s: cur beacon key\n", __func__);
+                       DBG_871X_EXP(_drv_err_, rtw_dump_bcn_keys(&pmlmepriv->cur_beacon_keys));
+               }
+
+               DBG_871X_LEVEL(_drv_err_, "%s: new beacon key\n", __func__);
+               DBG_871X_EXP(_drv_err_, rtw_dump_bcn_keys(&recv_beacon));
+
+               memcpy(&pmlmepriv->new_beacon_keys, &recv_beacon, sizeof(recv_beacon));
+               pmlmepriv->new_beacon_cnts = 1;
+       }
+       else
+       {
+               DBG_871X_LEVEL(_drv_err_, "%s: new beacon again (seq=%d)\n", __func__, GetSequence(pframe));
+               pmlmepriv->new_beacon_cnts++;
+       }
+
+       // if counter >= max, it means beacon is changed really
+       if (pmlmepriv->new_beacon_cnts >= new_bcn_max)
+       {
+               DBG_871X_LEVEL(_drv_err_, "%s: new beacon occur!!\n", __func__);
+
+               // check bw mode change only?
+               pmlmepriv->cur_beacon_keys.ht_cap_info = recv_beacon.ht_cap_info;
+               pmlmepriv->cur_beacon_keys.ht_info_infos_0_sco = recv_beacon.ht_info_infos_0_sco;
+
+               if (_rtw_memcmp(&recv_beacon, &pmlmepriv->cur_beacon_keys,
+                                       sizeof(recv_beacon)) == _FALSE) {
+                       // beacon is changed, have to do disconnect/connect
+                       return _FAIL;
+               }
+
+               DBG_871X("%s bw mode change\n", __func__);
+               DBG_871X("%s bcn now: ht_cap_info:%x ht_info_infos_0:%x\n", __func__,
+                               cur_network->BcnInfo.ht_cap_info,
+                               cur_network->BcnInfo.ht_info_infos_0);
+
+               cur_network->BcnInfo.ht_cap_info = recv_beacon.ht_cap_info;
+               cur_network->BcnInfo.ht_info_infos_0 =
+                       (cur_network->BcnInfo.ht_info_infos_0 & (~0x03)) |
+                       recv_beacon.ht_info_infos_0_sco;
+
+               DBG_871X("%s bcn link: ht_cap_info:%x ht_info_infos_0:%x\n", __func__,
+                               cur_network->BcnInfo.ht_cap_info,
+                               cur_network->BcnInfo.ht_info_infos_0);
+
+               memcpy(&pmlmepriv->cur_beacon_keys, &recv_beacon, sizeof(recv_beacon));
+               pmlmepriv->new_beacon_cnts = 0;
+       }
+
+       return _SUCCESS;
+
+#if 0
        bssid = (WLAN_BSSID_EX *)rtw_zmalloc(sizeof(WLAN_BSSID_EX));
        if (bssid == NULL) {
                DBG_871X("%s rtw_zmalloc fail !!!\n", __func__);
@@ -2229,6 +2446,7 @@ _mismatch:
        }
 
        return _SUCCESS;
+#endif
 }
 
 void update_beacon_info(_adapter *padapter, u8 *pframe, uint pkt_len, struct sta_info *psta)
@@ -3127,8 +3345,8 @@ void adaptive_early_32k(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len)
                        pmlmeext->bcn_delay_ratio[i] = (pmlmeext->bcn_delay_cnt[i] * 100) /pmlmeext->bcn_cnt;
                        
                
-                       DBG_871X("%s():bcn_delay_cnt[%d]=%d,  bcn_delay_ratio[%d]=%d\n", __func__, i, 
-                               pmlmeext->bcn_delay_cnt[i] , i, pmlmeext->bcn_delay_ratio[i]);
+                       //DBG_871X("%s():bcn_delay_cnt[%d]=%d,  bcn_delay_ratio[%d]=%d\n", __func__, i, 
+                       //      pmlmeext->bcn_delay_cnt[i] , i, pmlmeext->bcn_delay_ratio[i]);
 
                        ratio_20_delay += pmlmeext->bcn_delay_ratio[i];
                        ratio_80_delay += pmlmeext->bcn_delay_ratio[i];
@@ -3136,13 +3354,13 @@ void adaptive_early_32k(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len)
                        if(ratio_20_delay > 20 && DrvBcnEarly == 0xff)
                        {                       
                                DrvBcnEarly = i;
-                               DBG_871X("%s(): DrvBcnEarly = %d\n", __func__, DrvBcnEarly);
+                               //DBG_871X("%s(): DrvBcnEarly = %d\n", __func__, DrvBcnEarly);
                        }       
 
                        if(ratio_80_delay > 80 && DrvBcnTimeOut == 0xff)
                        {
                                DrvBcnTimeOut = i;
-                               DBG_871X("%s(): DrvBcnTimeOut = %d\n", __func__, DrvBcnTimeOut);
+                               //DBG_871X("%s(): DrvBcnTimeOut = %d\n", __func__, DrvBcnTimeOut);
                        }
                        
                        //reset adaptive_early_32k cnt
@@ -3164,99 +3382,278 @@ void beacon_timing_control(_adapter *padapter)
        rtw_hal_bcn_related_reg_setting(padapter);
 }
 
+#define CONFIG_SHARED_BMC_MACID
+
+void dump_macid_map(void *sel, struct macid_bmp *map, u8 max_num)
+{
+       DBG_871X_SEL_NL(sel, "0x%08x\n", map->m0);
+#if (MACID_NUM_SW_LIMIT > 32)
+       if (max_num && max_num > 32)
+               DBG_871X_SEL_NL(sel, "0x%08x\n", map->m1);
+#endif
+#if (MACID_NUM_SW_LIMIT > 64)
+       if (max_num && max_num > 64)
+               DBG_871X_SEL_NL(sel, "0x%08x\n", map->m2);
+#endif
+#if (MACID_NUM_SW_LIMIT > 96)
+       if (max_num && max_num > 96)
+               DBG_871X_SEL_NL(sel, "0x%08x\n", map->m3);
+#endif
+}
+
+inline bool rtw_macid_is_set(struct macid_bmp *map, u8 id)
+{
+       if (id < 32)
+               return (map->m0 & BIT(id));
+#if (MACID_NUM_SW_LIMIT > 32)
+       else if (id < 64)
+               return (map->m1 & BIT(id-32));
+#endif
+#if (MACID_NUM_SW_LIMIT > 64)
+       else if (id < 96)
+               return (map->m2 & BIT(id-64));
+#endif
+#if (MACID_NUM_SW_LIMIT > 96)
+       else if (id < 128)
+               return (map->m3 & BIT(id-96));
+#endif
+       else
+               rtw_warn_on(1);
+
+       return 0;
+}
+
+inline void rtw_macid_map_set(struct macid_bmp *map, u8 id)
+{
+       if (id < 32)
+               map->m0 |= BIT(id);
+#if (MACID_NUM_SW_LIMIT > 32)
+       else if (id < 64)
+               map->m1 |= BIT(id-32);
+#endif
+#if (MACID_NUM_SW_LIMIT > 64)
+       else if (id < 96)
+               map->m2 |= BIT(id-64);
+#endif
+#if (MACID_NUM_SW_LIMIT > 96)
+       else if (id < 128)
+               map->m3 |= BIT(id-96);
+#endif
+       else
+               rtw_warn_on(1);
+}
+
+inline void rtw_macid_map_clr(struct macid_bmp *map, u8 id)
+{
+       if (id < 32)
+               map->m0 &= ~BIT(id);
+#if (MACID_NUM_SW_LIMIT > 32)
+       else if (id < 64)
+               map->m1 &= ~BIT(id-32);
+#endif
+#if (MACID_NUM_SW_LIMIT > 64)
+       else if (id < 96)
+               map->m2 &= ~BIT(id-64);
+#endif
+#if (MACID_NUM_SW_LIMIT > 96)
+       else if (id < 128)
+               map->m3 &= ~BIT(id-96);
+#endif
+       else
+               rtw_warn_on(1);
+}
+
+inline bool rtw_macid_is_used(struct macid_ctl_t *macid_ctl, u8 id)
+{
+       return rtw_macid_is_set(&macid_ctl->used, id);
+}
+
+inline bool rtw_macid_is_bmc(struct macid_ctl_t *macid_ctl, u8 id)
+{
+       return rtw_macid_is_set(&macid_ctl->bmc, id);
+}
+
+inline s8 rtw_macid_get_if_g(struct macid_ctl_t *macid_ctl, u8 id)
+{
+       int i;
+
+#ifdef CONFIG_SHARED_BMC_MACID
+       if (rtw_macid_is_bmc(macid_ctl,id))
+               return -1;
+#endif
+
+       for (i=0;i<IFACE_ID_MAX;i++) {
+               if (rtw_macid_is_set(&macid_ctl->if_g[i], id))
+                       return i;
+       }
+       return -1;
+}
+
+inline s8 rtw_macid_get_ch_g(struct macid_ctl_t *macid_ctl, u8 id)
+{
+       int i;
+
+       for (i=0;i<2;i++) {
+               if (rtw_macid_is_set(&macid_ctl->ch_g[i], id))
+                       return i;
+       }
+       return -1;
+}
+
 void rtw_alloc_macid(_adapter *padapter, struct sta_info *psta)
 {
        int i;
-       _irqL   irqL;
+       _irqL irqL;
        u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
-       struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
-
+       struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
+       struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
+       struct macid_bmp *used_map = &macid_ctl->used;
+       //static u8 last_id = 0; /* for testing */
+       u8 last_id = 0;
 
-       if(_rtw_memcmp(psta->hwaddr, bc_addr, ETH_ALEN))
+       if (_rtw_memcmp(psta->hwaddr, myid(&padapter->eeprompriv), ETH_ALEN)) {
+               psta->mac_id = macid_ctl->num;
                return;
+       }
 
-       if(_rtw_memcmp(psta->hwaddr, myid(&padapter->eeprompriv), ETH_ALEN))
-       {
-               psta->mac_id = NUM_STA;
-               return;
+#ifdef CONFIG_SHARED_BMC_MACID
+       if(_rtw_memcmp(psta->hwaddr, bc_addr, ETH_ALEN)) {
+               /* use shared broadcast & multicast macid 1 */
+               _enter_critical_bh(&macid_ctl->lock, &irqL);
+               rtw_macid_map_set(used_map, 1);
+               rtw_macid_map_set(&macid_ctl->bmc, 1);
+               for (i=0;i<IFACE_ID_MAX;i++)
+                       rtw_macid_map_set(&macid_ctl->if_g[padapter->iface_id], 1);
+               /* TODO ch_g? */
+               _exit_critical_bh(&macid_ctl->lock, &irqL);
+               i = 1;
+               goto assigned;
        }
+#endif
 
-       _enter_critical_bh(&pdvobj->lock, &irqL);
-       for(i=0; i<NUM_STA; i++)
-       {
-               if(pdvobj->macid[i] == _FALSE)
-               {
-                       pdvobj->macid[i]  = _TRUE;
+       _enter_critical_bh(&macid_ctl->lock, &irqL);
+
+       for (i=last_id;i<macid_ctl->num;i++) {
+               #ifdef CONFIG_SHARED_BMC_MACID
+               if (i == 1)
+                       continue;
+               #endif
+               if (!rtw_macid_is_used(macid_ctl, i))
                        break;
-               }
        }
-       _exit_critical_bh(&pdvobj->lock, &irqL);
 
-       if( i > (NUM_STA-1))
-       {
-               psta->mac_id = NUM_STA;
-               DBG_871X("  no room for more MACIDs\n");
+       if (i < macid_ctl->num) {
+
+               rtw_macid_map_set(used_map, i);
+
+               if(_rtw_memcmp(psta->hwaddr, bc_addr, ETH_ALEN))
+                       rtw_macid_map_set(&macid_ctl->bmc, i);
+
+               rtw_macid_map_set(&macid_ctl->if_g[padapter->iface_id], i);
+
+               /* TODO ch_g? */
+
+               last_id++;
+               last_id %= macid_ctl->num;
        }
-       else
-       {
-               psta->mac_id = i;
-               DBG_871X("%s = %d\n", __FUNCTION__, psta->mac_id);
+
+       _exit_critical_bh(&macid_ctl->lock, &irqL);
+
+       if (i >= macid_ctl->num) {
+               psta->mac_id = macid_ctl->num;
+               DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT" if%u, hwaddr:"MAC_FMT" no available macid\n"
+                       , FUNC_ADPT_ARG(padapter), padapter->iface_id+1, MAC_ARG(psta->hwaddr));
+               rtw_warn_on(1);
+               goto exit;
+       } else {
+               goto assigned;
        }
 
+assigned:
+       psta->mac_id = i;
+       DBG_871X(FUNC_ADPT_FMT" if%u, hwaddr:"MAC_FMT" macid:%u\n"
+               , FUNC_ADPT_ARG(padapter), padapter->iface_id+1, MAC_ARG(psta->hwaddr), psta->mac_id);
+
+exit:
+       return;
 }
 
 void rtw_release_macid(_adapter *padapter, struct sta_info *psta)
 {
-       int i;
-       _irqL   irqL;
+       _irqL irqL;
        u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
-       struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
+       struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
+       struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
 
+       if(_rtw_memcmp(psta->hwaddr, myid(&padapter->eeprompriv), ETH_ALEN))
+               return;
 
+#ifdef CONFIG_SHARED_BMC_MACID
        if(_rtw_memcmp(psta->hwaddr, bc_addr, ETH_ALEN))
                return;
 
-       if(_rtw_memcmp(psta->hwaddr, myid(&padapter->eeprompriv), ETH_ALEN))
-       {
+       if (psta->mac_id == 1) {
+               DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT" if%u, hwaddr:"MAC_FMT" with macid:%u\n"
+                       , FUNC_ADPT_ARG(padapter), padapter->iface_id+1, MAC_ARG(psta->hwaddr), psta->mac_id);
+               rtw_warn_on(1);
                return;
        }
+#endif
 
-       _enter_critical_bh(&pdvobj->lock, &irqL);
-       if(psta->mac_id<NUM_STA && psta->mac_id !=1 )
-       {
-               if(pdvobj->macid[psta->mac_id] == _TRUE)
-               {
-                       DBG_871X("%s = %d\n", __FUNCTION__, psta->mac_id);
-                       pdvobj->macid[psta->mac_id]  = _FALSE;
-                       psta->mac_id = NUM_STA;
+       _enter_critical_bh(&macid_ctl->lock, &irqL);
+
+       if (psta->mac_id < macid_ctl->num) {
+               int i;
+
+               if (!rtw_macid_is_used(macid_ctl, psta->mac_id)) {
+                       DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT" if%u, hwaddr:"MAC_FMT" macid:%u not used\n"
+                               , FUNC_ADPT_ARG(padapter), padapter->iface_id+1, MAC_ARG(psta->hwaddr), psta->mac_id);
+                       rtw_warn_on(1);
                }
 
+               rtw_macid_map_clr(&macid_ctl->used, psta->mac_id);
+               rtw_macid_map_clr(&macid_ctl->bmc, psta->mac_id);
+               for (i=0;i<IFACE_ID_MAX;i++)
+                       rtw_macid_map_clr(&macid_ctl->if_g[i], psta->mac_id);
+               for (i=0;i<2;i++)
+                       rtw_macid_map_clr(&macid_ctl->ch_g[i], psta->mac_id);
        }
-       _exit_critical_bh(&pdvobj->lock, &irqL);
 
+       _exit_critical_bh(&macid_ctl->lock, &irqL);
+
+       psta->mac_id = macid_ctl->num;
 }
+
 //For 8188E RA
 u8 rtw_search_max_mac_id(_adapter *padapter)
 {
        u8 max_mac_id=0;
-       struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
+       struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
+       struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
        int i;
-       _irqL   irqL;   
-       _enter_critical_bh(&pdvobj->lock, &irqL);
-       for(i=(NUM_STA-1); i>=0 ; i--)
-       {
-               if(pdvobj->macid[i] == _TRUE)
-               {                       
+       _irqL irqL;
+
+       _enter_critical_bh(&macid_ctl->lock, &irqL);
+       for(i=(macid_ctl->num-1); i>0 ; i--) {
+               if (!rtw_macid_is_used(macid_ctl, i))
                        break;
-               }
        }
+       _exit_critical_bh(&macid_ctl->lock, &irqL);
        max_mac_id = i;
-       _exit_critical_bh(&pdvobj->lock, &irqL);
 
        return max_mac_id;
-
 }              
 
+inline void rtw_macid_ctl_init(struct macid_ctl_t *macid_ctl)
+{
+       _rtw_spinlock_init(&macid_ctl->lock);
+}
+
+inline void rtw_macid_ctl_deinit(struct macid_ctl_t *macid_ctl)
+{
+       _rtw_spinlock_free(&macid_ctl->lock);
+}
+
 #if 0
 unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame)
 {
@@ -3472,152 +3869,7 @@ func_exit:
        return res;
 }
 
-/*
- * Description:
- * dump_TX_FIFO: This is only used to dump TX_FIFO for debug WoW mode offload
- * contant.
- *
- * Input:
- * adapter: adapter pointer.
- * page_num: The max. page number that user want to dump. 
- * page_size: page size of each page. eg. 128 bytes, 256 bytes.
- */
-void dump_TX_FIFO(_adapter* padapter, u8 page_num, u16 page_size){
-
-       int i;
-       u8 val = 0;
-       u8 base = 0;
-       u32 addr = 0;
-       u32 count = (page_size / 8);
-
-       if (page_num <= 0) {
-               DBG_871X("!!%s: incorrect input page_num paramter!\n", __func__);
-               return;
-       }
-
-       if (page_size < 128 || page_size > 256) {
-               DBG_871X("!!%s: incorrect input page_size paramter!\n", __func__);
-               return;
-       }
-
-       DBG_871X("+%s+\n", __func__);
-       val = rtw_read8(padapter, 0x106);
-       rtw_write8(padapter, 0x106, 0x69);
-       DBG_871X("0x106: 0x%02x\n", val);
-       base = rtw_read8(padapter, 0x209);
-       DBG_871X("0x209: 0x%02x\n", base);
-
-       addr = ((base) * page_size)/8;
-       for (i = 0 ; i < page_num * count ; i+=2) {
-               rtw_write32(padapter, 0x140, addr + i);
-               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-               rtw_write32(padapter, 0x140, addr + i + 1);
-               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-       }
-}
-
-#ifdef CONFIG_GPIO_API
-int rtw_get_gpio(struct net_device *netdev, int gpio_num)
-{
-       u8 value;
-       u8 direction;
-       _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
-       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
-
-       rtw_ps_deny(adapter, PS_DENY_IOCTL);
-
-       DBG_871X("rf_pwrstate=0x%02x\n", pwrpriv->rf_pwrstate);
-       LeaveAllPowerSaveModeDirect(adapter);
-
-       /* Read GPIO Direction */
-       direction = (rtw_read8(adapter,REG_GPIO_PIN_CTRL + 2) & BIT(gpio_num)) >> gpio_num;
-
-       /* According the direction to read register value */
-       if( direction )
-               value =  (rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1)& BIT(gpio_num)) >> gpio_num;
-       else
-               value =  (rtw_read8(adapter, REG_GPIO_PIN_CTRL)& BIT(gpio_num)) >> gpio_num;
-
-       rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
-       DBG_871X("%s direction=%d value=%d\n",__FUNCTION__,direction,value);
-
-       return value;
-}
-EXPORT_SYMBOL(rtw_get_gpio);
-
-int  rtw_set_gpio_output_value(struct net_device *netdev, int gpio_num, BOOLEAN isHigh)
-{
-       u8 direction = 0;
-       u8 res = -1;
-       _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
-
-       /* Check GPIO is 4~7 */
-       if( gpio_num > 7 || gpio_num < 4)
-       {
-               DBG_871X("%s The gpio number does not included 4~7.\n",__FUNCTION__);
-               return -1;
-       }
-
-       rtw_ps_deny(adapter, PS_DENY_IOCTL);
 
-       LeaveAllPowerSaveModeDirect(adapter);
-
-       /* Read GPIO direction */
-       direction = (rtw_read8(adapter,REG_GPIO_PIN_CTRL + 2) & BIT(gpio_num)) >> gpio_num;
-
-       /* If GPIO is output direction, setting value. */
-       if( direction )
-       {
-               if(isHigh)
-                       rtw_write8(adapter, REG_GPIO_PIN_CTRL + 1, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1) | BIT(gpio_num));
-               else
-                       rtw_write8(adapter, REG_GPIO_PIN_CTRL + 1, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1) & ~BIT(gpio_num));
-
-               DBG_871X("%s Set gpio %x[%d]=%d\n",__FUNCTION__,REG_GPIO_PIN_CTRL+1,gpio_num,isHigh );
-               res = 0;
-       }
-       else
-       {
-               DBG_871X("%s The gpio is input,not be set!\n",__FUNCTION__);
-               res = -1;
-       }
-
-       rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
-       return res;
-}
-EXPORT_SYMBOL(rtw_set_gpio_output_value);
-
-int rtw_config_gpio(struct net_device *netdev, int gpio_num, BOOLEAN isOutput)
-{
-       _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
-
-       if( gpio_num > 7 || gpio_num < 4)
-       {
-               DBG_871X("%s The gpio number does not included 4~7.\n",__FUNCTION__);
-               return -1;
-       }
-
-       DBG_871X("%s gpio_num =%d direction=%d\n",__FUNCTION__,gpio_num,isOutput);
-
-       rtw_ps_deny(adapter, PS_DENY_IOCTL);
-
-       LeaveAllPowerSaveModeDirect(adapter);
-
-       if( isOutput )
-       {
-               rtw_write8(adapter, REG_GPIO_PIN_CTRL + 2, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 2) | BIT(gpio_num));
-       }
-       else
-       {
-               rtw_write8(adapter, REG_GPIO_PIN_CTRL + 2, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 2) & ~BIT(gpio_num));
-       }
-
-       rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
-
-       return 0;
-}
-EXPORT_SYMBOL(rtw_config_gpio);
-#endif
 
 #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
 void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip)
@@ -3824,9 +4076,13 @@ int rtw_dev_nlo_info_set(struct pno_nlo_info *nlo_info, pno_ssid_t* ssid,
 
        nlo_info->fast_scan_period = pno_time;
        nlo_info->ssid_num = num & BIT_LEN_MASK_32(8);
+       nlo_info->hidden_ssid_num = num & BIT_LEN_MASK_32(8);
        nlo_info->slow_scan_period = (pno_time * 2);
        nlo_info->fast_scan_iterations = 5;
 
+       if (nlo_info->hidden_ssid_num > 8)
+               nlo_info->hidden_ssid_num = 8;
+
        //TODO: channel list and probe index is all empty.
        for (i = 0 ; i < num ; i++) {
                nlo_info->ssid_length[i]
@@ -3876,6 +4132,7 @@ int rtw_dev_ssid_list_set(struct pno_ssid_list *pno_ssid_list,
        for (i = 0 ; i < num ; i++) {
                _rtw_memcpy(&pno_ssid_list->node[i].SSID,
                        ssid[i].SSID, ssid[i].SSID_len);
+               pno_ssid_list->node[i].SSID_len = ssid[i].SSID_len;
        }
        return 0;
 }
@@ -3966,15 +4223,15 @@ int rtw_dev_pno_set(struct net_device *net, pno_ssid_t* ssid, int num,
 
 failing:
        if (pwrctl->pnlo_info) {
-               rtw_mfree(pwrctl->pnlo_info, sizeof(pno_nlo_info_t));
+               rtw_mfree((u8 *)pwrctl->pnlo_info, sizeof(pno_nlo_info_t));
                pwrctl->pnlo_info = NULL;
        }
        if (pwrctl->pno_ssid_list) {
-               rtw_mfree(pwrctl->pno_ssid_list, sizeof(pno_ssid_list_t));
+               rtw_mfree((u8 *)pwrctl->pno_ssid_list, sizeof(pno_ssid_list_t));
                pwrctl->pno_ssid_list = NULL;
        }
        if (pwrctl->pscan_info) {
-               rtw_mfree(pwrctl->pscan_info, sizeof(pno_scan_info_t));
+               rtw_mfree((u8 *)pwrctl->pscan_info, sizeof(pno_scan_info_t));
                pwrctl->pscan_info = NULL;
        }
 
index 79c3b6185cede3da90e5eec9f154a11f5831cbdf..581113925c235a7d6ec8b9fd8032bdaae46db747 100755 (executable)
@@ -448,7 +448,6 @@ u8  query_ra_short_GI(struct sta_info *psta)
        if (psta->vhtpriv.vht_option) {
                sgi_80m= psta->vhtpriv.sgi_80m;
        }
-       else
 #endif //CONFIG_80211AC_VHT
        {
                sgi_20m = psta->htpriv.sgi_20m;
@@ -964,6 +963,18 @@ exit:
 
 #endif //CONFIG_TDLS
 
+//get non-qos hw_ssn control register,mapping to REG_HW_SEQ0,1,2,3
+inline u8 rtw_get_hwseq_no(_adapter *padapter)
+{
+       u8 hwseq_num = 0;
+#ifdef CONFIG_CONCURRENT_MODE
+       if(padapter->adapter_type == SECONDARY_ADAPTER)
+               hwseq_num = 1;
+       //else
+       //      hwseq_num = 2;
+#endif //CONFIG_CONCURRENT_MODE
+       return hwseq_num;
+}
 static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattrib)
 {
        uint i;
@@ -974,8 +985,9 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
        sint bmcast;
        struct sta_priv         *pstapriv = &padapter->stapriv;
        struct security_priv    *psecuritypriv = &padapter->securitypriv;
-       struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
+       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
        struct qos_priv         *pqospriv= &pmlmepriv->qospriv;
+       struct xmit_priv                *pxmitpriv = &padapter->xmitpriv;
        sint res = _SUCCESS;
 
  _func_enter_;
@@ -1181,7 +1193,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
        }
 
        //pattrib->priority = 5; //force to used VI queue, for testing
-
+       pattrib->hw_ssn_sel = pxmitpriv->hw_ssn_seq_no;
        rtw_set_tx_chksum_offload(pkt, pattrib);
 
 exit:
@@ -2242,7 +2254,7 @@ _func_enter_;
                int frame_body_len;
                u8 mic[16];
                
-               _rtw_memset(MME, 0, 18);
+               _rtw_memset(MME, 0, _MME_IE_LENGTH_);
                                
                //other types doesn't need the BIP
                if(GetFrameSubType(pframe) != WIFI_DEAUTH && GetFrameSubType(pframe) != WIFI_DISASSOC)
@@ -3001,7 +3013,7 @@ _func_enter_;
        else if(pxmitframe->ext_tag == 1)
                queue = &pxmitpriv->free_xframe_ext_queue;
        else
-       {}
+               rtw_warn_on(1);
 
        _enter_critical_bh(&queue->lock, &irqL);
 
@@ -3108,7 +3120,7 @@ static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv, str
 
                break;          
 
-               pxmitframe = NULL;
+               //pxmitframe = NULL;
 
        }
 
@@ -4011,7 +4023,7 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
 
                //pattrib->triggered=0;
                if (bmcst && xmitframe_hiq_filter(pxmitframe) == _TRUE)
-                       pattrib->qsel = 0x11;//HIQ
+                       pattrib->qsel = QSLT_HIGH;//HIQ
 
                return ret;
        }
@@ -4023,7 +4035,7 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
        
                if(pstapriv->sta_dz_bitmap)//if anyone sta is in ps mode
                {
-                       //pattrib->qsel = 0x11;//HIQ
+                       //pattrib->qsel = QSLT_HIGH;//HIQ
                        
                        rtw_list_delete(&pxmitframe->list);
                        
@@ -4042,7 +4054,10 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
                        //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
 
                        if (update_tim == _TRUE) {
-                               update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
+                               if (is_broadcast_mac_addr(pattrib->ra))
+                                       _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer BC");
+                               else
+                                       _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer MC");
                        } else {
                                chk_bmc_sleepq_cmd(padapter);
                        }
@@ -4115,7 +4130,7 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
                                {
                                        //DBG_871X("sleepq_len==1, update BCNTIM\n");
                                        //upate BCN for TIM IE
-                                       update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
+                                       _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer UC");
                                }
                        }
 
@@ -4422,8 +4437,12 @@ _exit:
        if(update_mask)
        {
                //update_BCNTIM(padapter);
-               //printk("%s => call update_beacon\n",__FUNCTION__);
-               update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
+               if ((update_mask & (BIT(0)|BIT(1))) == (BIT(0)|BIT(1)))
+                       _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear UC&BMC");
+               else if ((update_mask & BIT(1)) == BIT(1))
+                       _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear BMC");
+               else
+                       _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear UC");
        }
        
 }
index 425fbefc8b68c57924431517e5bc96b23a61737c..972a3d893fa652ce3c99b798db95d96915c17c3b 100755 (executable)
@@ -147,7 +147,7 @@ u8 HalPwrSeqCmdParsing(
                                                        rtw_udelay_os(10);\r
 \r
                                                if (pollingCount++ > maxPollingCnt) {\r
-                                                       DBG_871X("Fail to polling Offset[%#x]=%02x\n", offset, value);\r
+                                                       DBG_871X_LEVEL(_drv_always_, "HalPwrSeqCmdParsing: Fail to polling Offset[%#x]=%02x\n", offset, value);\r
                                                        return _FALSE;\r
                                                }\r
                                        } while (!bPollingBit);\r
index 9f691416a493a915788aaf85e040a24b07212773..6e9454ca5ccad201b7f70fab7da6392d267906ce 100755 (executable)
@@ -1774,11 +1774,6 @@ EXhalbtc8188c2ant_DisplayCoexInfo(
        pu1Byte                         cliBuf=pBtCoexist->cliBuf;\r
        u1Byte                          u1Tmp[4], i, btInfoExt, psTdmaCase=0;\r
        u4Byte                          u4Tmp[4];\r
-       BOOLEAN                         bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;\r
-       BOOLEAN                         bBtHsOn=FALSE, bWifiBusy=FALSE;\r
-       s4Byte                          wifiRssi=0, btHsRssi=0;\r
-       u4Byte                          wifiBw, wifiTrafficDir;\r
-       u1Byte                          wifiDot11Chnl, wifiHsChnl;\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
        CL_PRINTF(cliBuf);\r
@@ -1797,34 +1792,12 @@ EXhalbtc8188c2ant_DisplayCoexInfo(
                ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsChnl(HsMode)", \\r
-               wifiDot11Chnl, wifiHsChnl, bBtHsOn);\r
+       // wifi status\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============");\r
        CL_PRINTF(cliBuf);\r
+       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \\r
-               wifiRssi, btHsRssi);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \\r
-               bLink, bRoam, bScan);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ", "Wifi status", \\r
-               (bWifiUnder5G? "5G":"2.4G"),\r
-               ((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),\r
-               ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[BT Status]============");\r
        CL_PRINTF(cliBuf);\r
        \r
        if(pStackInfo->bProfileNotified)\r
index 239da74f52523ed985cae8e7709e637e86281516..cb60379c9a866a95ef5471af5207c180b55f14f7 100755 (executable)
@@ -1780,11 +1780,6 @@ EXhalbtc8192d2ant_DisplayCoexInfo(
        pu1Byte                         cliBuf=pBtCoexist->cliBuf;\r
        u1Byte                          u1Tmp[4], i, btInfoExt, psTdmaCase=0;\r
        u4Byte                          u4Tmp[4];\r
-       BOOLEAN                         bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;\r
-       BOOLEAN                         bBtHsOn=FALSE, bWifiBusy=FALSE;\r
-       s4Byte                          wifiRssi=0, btHsRssi=0;\r
-       u4Byte                          wifiBw, wifiTrafficDir;\r
-       u1Byte                          wifiDot11Chnl, wifiHsChnl;\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
        CL_PRINTF(cliBuf);\r
@@ -1803,34 +1798,12 @@ EXhalbtc8192d2ant_DisplayCoexInfo(
                ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsChnl(HsMode)", \\r
-               wifiDot11Chnl, wifiHsChnl, bBtHsOn);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \\r
-               wifiRssi, btHsRssi);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \\r
-               bLink, bRoam, bScan);\r
+       // wifi status\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============");\r
        CL_PRINTF(cliBuf);\r
+       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ", "Wifi status", \\r
-               (bWifiUnder5G? "5G":"2.4G"),\r
-               ((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),\r
-               ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[BT Status]============");\r
        CL_PRINTF(cliBuf);\r
        \r
        if(pStackInfo->bProfileNotified)\r
index 36a48d08213864db3e6bf89ec42427e5d323861a..12dfe4b210eb3974bfb7f4b9d2ac7ead61b9163b 100755 (executable)
@@ -2519,11 +2519,6 @@ EXhalbtc8192e1ant_DisplayCoexInfo(
        pu1Byte                         cliBuf=pBtCoexist->cliBuf;\r
        u1Byte                          u1Tmp[4], i, btInfoExt, psTdmaCase=0;\r
        u4Byte                          u4Tmp[4];\r
-       BOOLEAN                         bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;\r
-       BOOLEAN                         bBtHsOn=FALSE, bWifiBusy=FALSE;\r
-       s4Byte                          wifiRssi=0, btHsRssi=0;\r
-       u4Byte                          wifiBw, wifiTrafficDir;\r
-       u1Byte                          wifiDot11Chnl, wifiHsChnl;\r
        u4Byte                          fwVer=0, btPatchVer=0;\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
@@ -2558,40 +2553,19 @@ EXhalbtc8192e1ant_DisplayCoexInfo(
                GLCoexVerDate8192e1Ant, GLCoexVer8192e1Ant, fwVer, btPatchVer, btPatchVer);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsChnl(HsMode)", \\r
-               wifiDot11Chnl, wifiHsChnl, bBtHsOn);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "H2C Wifi inform bt chnl Info", \\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "Wifi channel informed to BT", \\r
                pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\r
                pCoexDm->wifiChnlInfo[2]);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \\r
-               wifiRssi, btHsRssi);\r
+       // wifi status\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============");\r
        CL_PRINTF(cliBuf);\r
+       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \\r
-               bLink, bRoam, bScan);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[BT Status]============");\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ", "Wifi status", \\r
-               (bWifiUnder5G? "5G":"2.4G"),\r
-               ((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),\r
-               ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));\r
-       CL_PRINTF(cliBuf);\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \\r
                ((pBtCoexist->btInfo.bBtDisabled)? ("disabled"):        ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? "non-connected idle":\r
                (  (BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy")))),\r
@@ -2620,17 +2594,6 @@ EXhalbtc8192e1ant_DisplayCoexInfo(
                        CL_PRINTF(cliBuf);\r
                }\r
        }\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/%s, (0x%x/0x%x)", "PS state, IPS/LPS, (lps/rpwm)", \\r
-               ((pCoexSta->bUnderIps? "IPS ON":"IPS OFF")),\r
-               ((pCoexSta->bUnderLps? "LPS ON":"LPS OFF")), \r
-               pBtCoexist->btInfo.lpsVal, \r
-               pBtCoexist->btInfo.rpwmVal);\r
-       CL_PRINTF(cliBuf);\r
-       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);\r
-\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "SS Type", \\r
-               pCoexDm->curSsType);\r
-       CL_PRINTF(cliBuf);\r
 \r
        if(!pBtCoexist->bManualControl)\r
        {\r
@@ -2638,10 +2601,6 @@ EXhalbtc8192e1ant_DisplayCoexInfo(
                CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw mechanism]============");\r
                CL_PRINTF(cliBuf);\r
        \r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d(0x%x) ", "SM[SwDacSwing(lvl)]", \\r
-                       pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl);\r
-               CL_PRINTF(cliBuf);\r
-\r
                CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %d ", "DelBA/ BtCtrlAgg/ AggSize", \\r
                        (pBtCoexist->btInfo.bRejectAggPkt? "Yes":"No"), (pBtCoexist->btInfo.bBtCtrlAggBufSize? "Yes":"No"),\r
                                pBtCoexist->btInfo.aggBufSize);\r
@@ -2665,8 +2624,8 @@ EXhalbtc8192e1ant_DisplayCoexInfo(
                        pCoexDm->errorCondition);\r
                CL_PRINTF(cliBuf);\r
                \r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "DecBtPwrLvl/ IgnWlanAct", \\r
-                       pCoexDm->curBtDecPwrLvl, pCoexDm->bCurIgnoreWlanAct);\r
+               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ", "IgnWlanAct", \\r
+                       pCoexDm->bCurIgnoreWlanAct);\r
                CL_PRINTF(cliBuf);\r
        }\r
 \r
index b17ee766e581c6010e9cec585cf5f968c0ab9049..8bde294c93f23a3e6e024fe7d1ab41b14f423312 100755 (executable)
@@ -1697,7 +1697,8 @@ halbtc8192e2ant_SetSwitchSsType(
                pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xd04, 0x1);\r
                pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x90c, 0x81111111);\r
                // switch cck patch\r
-               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xe77, 0x4, 0x1);\r
+               //Jenyu suggest to remove 0xe77 this line for tx issue\r
+               //pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xe77, 0x4, 0x1);\r
                //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xa07, 0x81);\r
                mimoPs=BTC_MIMO_PS_STATIC;\r
        }\r
@@ -1707,7 +1708,8 @@ halbtc8192e2ant_SetSwitchSsType(
                pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xc04, 0x33);\r
                pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xd04, 0x3);\r
                pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x90c, 0x81121313);\r
-               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xe77, 0x4, 0x0);\r
+                //Jenyu suggest to remove 0xe77 this line for tx issue\r
+               //pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xe77, 0x4, 0x0);\r
                //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xa07, 0x41);\r
                mimoPs=BTC_MIMO_PS_DYNAMIC;\r
        }\r
@@ -3827,11 +3829,7 @@ EXhalbtc8192e2ant_DisplayCoexInfo(
        u1Byte                          u1Tmp[4], i, btInfoExt, psTdmaCase=0;\r
        u2Byte                          u2Tmp[4];\r
        u4Byte                          u4Tmp[4];\r
-       BOOLEAN                         bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;\r
-       BOOLEAN                         bBtHsOn=FALSE, bWifiBusy=FALSE;\r
-       s4Byte                          wifiRssi=0, btHsRssi=0;\r
-       u4Byte                          wifiBw, wifiTrafficDir, faOfdm, faCck;\r
-       u1Byte                          wifiDot11Chnl, wifiHsChnl;\r
+       u4Byte                          faOfdm, faCck;\r
        u4Byte                          fwVer=0, btPatchVer=0;\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
@@ -3859,39 +3857,17 @@ EXhalbtc8192e2ant_DisplayCoexInfo(
                GLCoexVerDate8192e2Ant, GLCoexVer8192e2Ant, fwVer, btPatchVer, btPatchVer);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsMode(HsChnl)", \\r
-               wifiDot11Chnl, bBtHsOn, wifiHsChnl);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "H2C Wifi inform bt chnl Info", \\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "Wifi channel informed to BT", \\r
                pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\r
                pCoexDm->wifiChnlInfo[2]);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \\r
-               wifiRssi, btHsRssi);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \\r
-               bLink, bRoam, bScan);\r
+       // wifi status\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============");\r
        CL_PRINTF(cliBuf);\r
+       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ", "Wifi status", \\r
-               (bWifiUnder5G? "5G":"2.4G"),\r
-               ((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),\r
-               ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[BT Status]============");\r
        CL_PRINTF(cliBuf);\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \\r
@@ -3923,12 +3899,6 @@ EXhalbtc8192e2ant_DisplayCoexInfo(
                }\r
        }\r
 \r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/%s", "PS state, IPS/LPS", \\r
-               ((pCoexSta->bUnderIps? "IPS ON":"IPS OFF")),\r
-               ((pCoexSta->bUnderLps? "LPS ON":"LPS OFF")));\r
-       CL_PRINTF(cliBuf);\r
-       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "SS Type", \\r
                pCoexDm->curSsType);\r
        CL_PRINTF(cliBuf);\r
index 8cd3d15b3146a8320629aa5ee5ccb11ba93f1487..8ea08e87d3de1cb38066226680b3ac3cc8cb2e38 100755 (executable)
@@ -1068,11 +1068,6 @@ EXhalbtc8723a1ant_DisplayCoexInfo(
        pu1Byte                         cliBuf=pBtCoexist->cliBuf;\r
        u1Byte                          u1Tmp[4], i, btInfoExt, psTdmaCase=0;\r
        u4Byte                          u4Tmp[4];\r
-       BOOLEAN                         bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;\r
-       BOOLEAN                         bBtHsOn=FALSE, bWifiBusy=FALSE;\r
-       s4Byte                          wifiRssi=0, btHsRssi=0;\r
-       u4Byte                          wifiBw, wifiTrafficDir;\r
-       u1Byte                          wifiDot11Chnl, wifiHsChnl;\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
        CL_PRINTF(cliBuf);\r
@@ -1091,39 +1086,17 @@ EXhalbtc8723a1ant_DisplayCoexInfo(
                ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsChnl(HsMode)", \\r
-               wifiDot11Chnl, wifiHsChnl, bBtHsOn);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "H2C Wifi inform bt chnl Info", \\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "Wifi channel informed to BT", \\r
                pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\r
                pCoexDm->wifiChnlInfo[2]);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \\r
-               wifiRssi, btHsRssi);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \\r
-               bLink, bRoam, bScan);\r
+       // wifi status\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============");\r
        CL_PRINTF(cliBuf);\r
+       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ", "Wifi status", \\r
-               (bWifiUnder5G? "5G":"2.4G"),\r
-               ((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),\r
-               ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[BT Status]============");\r
        CL_PRINTF(cliBuf);\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \\r
@@ -1251,12 +1224,6 @@ EXhalbtc8723a1ant_DisplayCoexInfo(
                pCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\r
        CL_PRINTF(cliBuf);\r
 \r
-       // Tx mgnt queue hang or not, 0x41b should = 0xf, ex: 0xd ==>hang\r
-       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x41b);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x41b (mgntQ hang chk == 0xf)", \\r
-               u1Tmp[0]);\r
-       CL_PRINTF(cliBuf);      \r
-\r
        pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\r
 }\r
 \r
index 3e115864cd21b8b27545be0682496291bf5ce3ce..ffe117596f5b981a1a6de7adfa3ac313511a3c4f 100755 (executable)
@@ -3429,11 +3429,6 @@ EXhalbtc8723a2ant_DisplayCoexInfo(
        pu1Byte                         cliBuf=pBtCoexist->cliBuf;\r
        u1Byte                          u1Tmp[4], i, btInfoExt, psTdmaCase=0;\r
        u4Byte                          u4Tmp[4];\r
-       BOOLEAN                         bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;\r
-       BOOLEAN                         bBtHsOn=FALSE, bWifiBusy=FALSE;\r
-       s4Byte                          wifiRssi=0, btHsRssi=0;\r
-       u4Byte                          wifiBw, wifiTrafficDir;\r
-       u1Byte                          wifiDot11Chnl, wifiHsChnl;\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
        CL_PRINTF(cliBuf);\r
@@ -3452,39 +3447,17 @@ EXhalbtc8723a2ant_DisplayCoexInfo(
                ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsChnl(HsMode)", \\r
-               wifiDot11Chnl, wifiHsChnl, bBtHsOn);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "H2C Wifi inform bt chnl Info", \\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "Wifi channel informed to BT", \\r
                pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\r
                pCoexDm->wifiChnlInfo[2]);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \\r
-               wifiRssi, btHsRssi);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \\r
-               bLink, bRoam, bScan);\r
+       // wifi status\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============");\r
        CL_PRINTF(cliBuf);\r
+       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ", "Wifi status", \\r
-               (bWifiUnder5G? "5G":"2.4G"),\r
-               ((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),\r
-               ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[BT Status]============");\r
        CL_PRINTF(cliBuf);\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \\r
@@ -3615,12 +3588,6 @@ EXhalbtc8723a2ant_DisplayCoexInfo(
                pCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\r
        CL_PRINTF(cliBuf);\r
 \r
-       // Tx mgnt queue hang or not, 0x41b should = 0xf, ex: 0xd ==>hang\r
-       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x41b);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x41b (mgntQ hang chk == 0xf)", \\r
-               u1Tmp[0]);\r
-       CL_PRINTF(cliBuf);      \r
-\r
        pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\r
 }\r
 \r
index b351f6c87a207fd5be7d89e48de8e7e5edbfb7c2..bada4139b1f24c97b3a25cc41221628326b6033c 100755 (executable)
@@ -20,6 +20,9 @@ static COEX_DM_8723B_1ANT             GLCoexDm8723b1Ant;
 static PCOEX_DM_8723B_1ANT     pCoexDm=&GLCoexDm8723b1Ant;\r
 static COEX_STA_8723B_1ANT             GLCoexSta8723b1Ant;\r
 static PCOEX_STA_8723B_1ANT    pCoexSta=&GLCoexSta8723b1Ant;\r
+static PSDSCAN_STA_8723B_1ANT  GLPsdScan8723b1Ant;\r
+static PPSDSCAN_STA_8723B_1ANT pPsdScan = &GLPsdScan8723b1Ant;\r
+\r
 \r
 const char *const GLBtInfoSrc8723b1Ant[]={\r
        "BT Info[wifi fw]",\r
@@ -27,8 +30,8 @@ const char *const GLBtInfoSrc8723b1Ant[]={
        "BT Info[bt auto report]",\r
 };\r
 \r
-u4Byte GLCoexVerDate8723b1Ant=20140702;\r
-u4Byte GLCoexVer8723b1Ant=0x51;\r
+u4Byte GLCoexVerDate8723b1Ant=20140929;\r
+u4Byte GLCoexVer8723b1Ant=0x54;\r
 \r
 //============================================================\r
 // local function proto type if needed\r
@@ -442,6 +445,15 @@ halbtc8723b1ant_MonitorBtCtr(
        //to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS\r
        //if (! (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) & 0x8) ) \r
 \r
+       if (pCoexSta->bUnderIps)\r
+       {\r
+               //pCoexSta->highPriorityTx = 65535;\r
+               //pCoexSta->highPriorityRx = 65535;\r
+               //pCoexSta->lowPriorityTx = 65535;\r
+               //pCoexSta->lowPriorityRx = 65535;\r
+               //return;\r
+       }\r
+               \r
        regHPTxRx = 0x770;\r
        regLPTxRx = 0x774;\r
 \r
@@ -571,6 +583,9 @@ halbtc8723b1ant_MonitorWiFiCtr(
                 pCoexSta->bCCKLock = TRUE;             \r
        }\r
 \r
+       if  (pCoexSta->bCCKLock)\r
+               pCoexSta->bCCKEverLock = TRUE;\r
+       \r
        pCoexSta->bPreCCKLock =  pCoexSta->bCCKLock;    \r
                \r
 \r
@@ -627,6 +642,7 @@ halbtc8723b1ant_UpdateBtLinkInfo(
        pBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist;\r
        pBtLinkInfo->bPanExist = pCoexSta->bPanExist;\r
        pBtLinkInfo->bHidExist = pCoexSta->bHidExist;\r
+       pBtLinkInfo->bBtHiPriLinkExist = pCoexSta->bBtHiPriLinkExist;\r
 \r
        // work around for HS mode.\r
        if(bBtHsOn)\r
@@ -1057,10 +1073,13 @@ halbtc8723b1ant_CoexTableWithType(
                        halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3);\r
                        break;\r
                case 4:\r
-                       halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3);\r
+                       if ((pCoexSta->nScanAPNum <= 5) || ( pCoexSta->bCCKEverLock) )\r
+                               halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);\r
+                       else\r
+                               halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3);\r
                        break;\r
                case 5:\r
-                       halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaa5a5a5a, 0xffffff, 0x3);\r
+                       halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaaaa5a5a, 0xffffff, 0x3);\r
                        break;\r
                case 6:\r
                        halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);\r
@@ -1181,6 +1200,7 @@ VOID
 halbtc8723b1ant_SetAntPath(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
        IN      u1Byte                          antPosType,\r
+       IN      BOOLEAN                         bForceExec,\r
        IN      BOOLEAN                         bInitHwCfg,\r
        IN      BOOLEAN                         bWifiOff\r
        )\r
@@ -1192,6 +1212,8 @@ halbtc8723b1ant_SetAntPath(
        BOOLEAN                 bIsInMpMode = FALSE;\r
        u1Byte                  H2C_Parameter[2] ={0}, u1Tmp = 0;\r
 \r
+       pCoexDm->curAntPosType = antPosType;\r
+       \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_EXT_SWITCH, &bPgExtSwitch);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);        // [31:16]=fw ver, [15:0]=fw sub ver\r
 \r
@@ -1201,7 +1223,8 @@ halbtc8723b1ant_SetAntPath(
        if(bInitHwCfg)\r
        {\r
                pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); //WiFi TRx Mask on\r
-               pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); //BT TRx Mask on\r
+               //remove due to interrupt is disabled that polling c2h will fail and delay 100ms.\r
+               //pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); //BT TRx Mask on\r
 \r
                if(fwVer >= 0x180000)\r
                {\r
@@ -1217,7 +1240,7 @@ halbtc8723b1ant_SetAntPath(
                //set wlan_act control by PTA\r
                pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); \r
 \r
-               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x0); //BT select s0/s1 is controlled by BT\r
 \r
                pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x39, 0x8, 0x1);\r
                pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x974, 0xff);\r
@@ -1291,6 +1314,8 @@ halbtc8723b1ant_SetAntPath(
                        //set wlan_act control by PTA\r
                        pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); \r
                }\r
+\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi\r
        }\r
        \r
        if(bUseExtSwitch)\r
@@ -1321,31 +1346,32 @@ halbtc8723b1ant_SetAntPath(
                        }\r
                }\r
                \r
-               \r
-               // ext switch setting\r
-               switch(antPosType)\r
+               if(bForceExec || (pCoexDm->curAntPosType != pCoexDm->preAntPosType))\r
                {\r
-                       case BTC_ANT_PATH_WIFI:\r
-                               if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
-                                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1);\r
-                               else\r
-                                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2);\r
-                               break;\r
-                       case BTC_ANT_PATH_BT:\r
-                               if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
-                                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2);\r
-                               else                                    \r
-                                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1);\r
-                               break;\r
-                       default:\r
-                       case BTC_ANT_PATH_PTA:\r
-                               if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
-                                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1);\r
-                               else\r
-                                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2);\r
-                               break;\r
+                       // ext switch setting\r
+                       switch(antPosType)\r
+                       {\r
+                               case BTC_ANT_PATH_WIFI:\r
+                                       if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
+                                               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1);\r
+                                       else\r
+                                               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2);\r
+                                       break;\r
+                               case BTC_ANT_PATH_BT:\r
+                                       if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
+                                               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2);\r
+                                       else                                    \r
+                                               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1);\r
+                                       break;\r
+                               default:\r
+                               case BTC_ANT_PATH_PTA:\r
+                                       if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
+                                               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1);\r
+                                       else\r
+                                               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2);\r
+                                       break;\r
+                       }\r
                }\r
-       \r
        }\r
        else\r
        {\r
@@ -1378,31 +1404,35 @@ halbtc8723b1ant_SetAntPath(
                        }\r
                }\r
        \r
-\r
-               // internal switch setting\r
-               switch(antPosType)\r
+               if(bForceExec || (pCoexDm->curAntPosType != pCoexDm->preAntPosType))\r
                {\r
-                       case BTC_ANT_PATH_WIFI:\r
-                               if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
-                                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\r
-                               else\r
-                                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);\r
-                               break;\r
-                       case BTC_ANT_PATH_BT:\r
-                               if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
-                                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);\r
-                               else\r
-                                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\r
-                               break;\r
-                       default:\r
-                       case BTC_ANT_PATH_PTA:\r
-                               if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
-                                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x200);                                   \r
-                               else\r
-                                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x80);\r
-                               break;\r
+                       // internal switch setting\r
+                       switch(antPosType)\r
+                       {\r
+                               case BTC_ANT_PATH_WIFI:\r
+                                       if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
+                                               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\r
+                                       else\r
+                                               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);\r
+                                       break;\r
+                               case BTC_ANT_PATH_BT:\r
+                                       if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
+                                               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);\r
+                                       else\r
+                                               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\r
+                                       break;\r
+                               default:\r
+                               case BTC_ANT_PATH_PTA:\r
+                                       if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
+                                               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x200);                                   \r
+                                       else\r
+                                               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x80);\r
+                                       break;\r
+                       }\r
                }\r
        }\r
+\r
+       pCoexDm->preAntPosType = pCoexDm->curAntPosType;\r
 }\r
 \r
 VOID\r
@@ -1513,7 +1543,7 @@ halbtc8723b1ant_PsTdma(
 \r
        if (bWifiBusy != bPreWifiBusy)\r
        {\r
-               bForceExec = TRUE;\r
+               bForceExec = TRUE;      \r
                bPreWifiBusy = bWifiBusy;\r
        }\r
 \r
@@ -1536,32 +1566,33 @@ halbtc8723b1ant_PsTdma(
        }\r
 \r
        if (pCoexSta->nScanAPNum <= 5)\r
-               nWiFiDurationAdjust = 2;\r
+               nWiFiDurationAdjust = 5;\r
+               //nWiFiDurationAdjust = 2;\r
        else if  (pCoexSta->nScanAPNum >= 40)\r
-               nWiFiDurationAdjust = -15;      \r
+               nWiFiDurationAdjust = -15;      \r
        else if  (pCoexSta->nScanAPNum >= 20)\r
-               nWiFiDurationAdjust = -10;      \r
+               nWiFiDurationAdjust = -10;      \r
        \r
-       if (!pCoexSta->bForceLpsOn)  //only for A2DP-only case 1/2/9/11\r
+       if (!pCoexSta->bForceLpsOn)  //only for A2DP-only case 1/2/9/11 while wifi noisy threshold > 30\r
        {\r
                psTdmaByte0Val = 0x61;  //no null-pkt\r
                psTdmaByte3Val = 0x11; // no tx-pause at BT-slot\r
                psTdmaByte4Val = 0x10; // 0x778 = d/1 toggle\r
        }\r
        \r
-       if ( (type == 3) || (type == 13) || (type == 14) )\r
+       if (  (type == 3) || (type == 13) || (type == 14) )\r
        {\r
                psTdmaByte4Val = psTdmaByte4Val & 0xbf;  //no dynamic slot for multi-profile\r
-\r
+       \r
                if (!bWifiBusy)\r
                        psTdmaByte4Val = psTdmaByte4Val | 0x1;  //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)\r
-       }\r
-\r
+               }\r
+                \r
        if (pBtLinkInfo->bSlaveRole == TRUE)\r
                psTdmaByte4Val = psTdmaByte4Val | 0x1;  //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)\r
-\r
+               \r
        if(bTurnOn)\r
-       {\r
+       {        \r
                switch(type)\r
                {\r
                        default:\r
@@ -1684,44 +1715,35 @@ halbtc8723b1ant_PsTdma(
                        case 8: //PTA Control\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0);\r
                                //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_PTA, BTC_WIFI_STAT_NORMAL);\r
-                               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FALSE, FALSE);\r
+                               //halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FALSE, FALSE);\r
                                break;\r
                        case 0:\r
                        default:  //Software control, Antenna at BT side\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);\r
                                //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL);\r
-                               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, FALSE);\r
+                               //halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, FALSE);\r
                                break;\r
+#if 0\r
                        case 9:   //Software control, Antenna at WiFi side\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);\r
                                //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_WIFI, BTC_WIFI_STAT_NORMAL);\r
                                halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FALSE, FALSE);\r
                                break;                  \r
+#endif\r
                }\r
        }\r
        rssiAdjustVal =0;\r
        pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssiAdjustVal);\r
 \r
+\r
        BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",\r
-               pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948), pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765), pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67)));\r
+               pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948),   pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765), pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67)));\r
 \r
        // update pre state\r
        pCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;\r
        pCoexDm->prePsTdma = pCoexDm->curPsTdma;\r
 }\r
 \r
-VOID\r
-halbtc8723b1ant_CoexAllOff(\r
-       IN      PBTC_COEXIST            pBtCoexist\r
-       )\r
-{\r
-       // sw all off\r
-       halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
-\r
-       // hw all off\r
-       halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\r
-}\r
-\r
 BOOLEAN\r
 halbtc8723b1ant_IsCommonAction(\r
        IN      PBTC_COEXIST            pBtCoexist\r
@@ -2020,7 +2042,7 @@ halbtc8723b1ant_PsTdmaCheckForPowerSaveState(
                else\r
                {\r
                        // will leave LPS state, turn off psTdma first\r
-                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\r
+                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
                }\r
        }\r
        else                                            // NO PS state\r
@@ -2028,7 +2050,7 @@ halbtc8723b1ant_PsTdmaCheckForPowerSaveState(
                if(bNewPsState)\r
                {\r
                        // will enter LPS state, turn off psTdma first\r
-                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\r
+                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
                }\r
                else\r
                {\r
@@ -2082,7 +2104,8 @@ halbtc8723b1ant_ActionWifiOnly(
        )\r
 {\r
        halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\r
-       halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 9);\r
+       halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\r
+       halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\r
 }\r
 \r
 VOID\r
@@ -2248,6 +2271,18 @@ halbtc8723b1ant_ActionHidA2dp(
 //     Non-Software Coex Mechanism start\r
 //\r
 //=============================================\r
+VOID\r
+halbtc8723b1ant_ActionBtWhckTest(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+       \r
+       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+       halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\r
+       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
+}\r
+\r
 VOID\r
 halbtc8723b1ant_ActionWifiMultiPort(\r
        IN      PBTC_COEXIST            pBtCoexist\r
@@ -2256,6 +2291,7 @@ halbtc8723b1ant_ActionWifiMultiPort(
        halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
        \r
        halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+       halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\r
        halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
 }\r
 \r
@@ -2285,7 +2321,7 @@ halbtc8723b1ant_ActionBtInquiry(
        {\r
                halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
-\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\r
                halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);          \r
        }\r
        else if( (pBtLinkInfo->bScoExist) ||    (pBtLinkInfo->bHidExist) ||     (pBtLinkInfo->bA2dpExist)  )\r
@@ -2299,16 +2335,24 @@ halbtc8723b1ant_ActionBtInquiry(
        else if ( (pBtLinkInfo->bPanExist) || (bWifiBusy) )\r
        {\r
                halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);               \r
-               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);              \r
+\r
+               //for BT inquiry/page fail after S4 resume\r
+               //halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);            \r
+               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
                \r
                halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
        }\r
        else\r
        {\r
                halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+               \r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
-\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\r
                halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);          \r
+               \r
+\r
+               //halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+               //halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);                                \r
        }\r
 }\r
 \r
@@ -2418,6 +2462,7 @@ halbtc8723b1ant_ActionWifiNotConnected(
 \r
        // tdma and coex table\r
        halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\r
+       halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\r
        halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
 }\r
 \r
@@ -2459,6 +2504,7 @@ halbtc8723b1ant_ActionWifiNotConnectedScan(
        {\r
                //Bryant Add\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\r
                halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
        }\r
 }\r
@@ -2476,16 +2522,17 @@ halbtc8723b1ant_ActionWifiNotConnectedAssoAuth(
        if( (pBtLinkInfo->bScoExist)  || (pBtLinkInfo->bHidExist) ||  (pBtLinkInfo->bA2dpExist) )\r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4);\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4);           \r
        }\r
        else if (pBtLinkInfo->bPanExist)                        \r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4);\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4);           \r
        }\r
        else\r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\r
                halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 2);\r
        }\r
 }\r
@@ -2528,6 +2575,7 @@ halbtc8723b1ant_ActionWifiConnectedScan(
        {\r
                //Bryant Add\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\r
                halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
        }\r
 }\r
@@ -2555,6 +2603,7 @@ halbtc8723b1ant_ActionWifiConnectedSpecialPacket(
        else\r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\r
                halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
        }\r
 }\r
@@ -2639,7 +2688,7 @@ halbtc8723b1ant_ActionWifiConnected(
                else\r
                {\r
                        halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
-                       \r
+                       halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\r
                        if ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 )\r
                        halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
                        else\r
@@ -2662,7 +2711,7 @@ halbtc8723b1ant_ActionWifiConnected(
                else \r
                {\r
                        halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
-                               \r
+                       halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);    \r
                        if ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 )\r
                        halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
                        else\r
@@ -2773,6 +2822,13 @@ halbtc8723b1ant_RunCoexistMechanism(
                return;\r
        }\r
 \r
+       if(pCoexSta->bBtWhckTest)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT is under WHCK TEST!!!\n"));\r
+               halbtc8723b1ant_ActionBtWhckTest(pBtCoexist);\r
+               return;\r
+       }\r
+\r
        if( (BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||\r
                (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\r
                (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\r
@@ -2797,7 +2853,7 @@ halbtc8723b1ant_RunCoexistMechanism(
                }\r
                else\r
                {\r
-                       halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
+               halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
                        bMiracastPlusBt = FALSE;\r
                }\r
                pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\r
@@ -2825,15 +2881,21 @@ halbtc8723b1ant_RunCoexistMechanism(
        {\r
                halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1); \r
 \r
+               if(pBtLinkInfo->bScoExist)//if (pBtLinkInfo->bBtHiPriLinkExist)\r
+                       halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x5);   \r
+               else\r
+                       halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5);\r
+               /*\r
                if(pBtLinkInfo->bScoExist)\r
                        halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x5);\r
                else\r
                {\r
                        if (BTC_WIFI_BW_HT40==wifiBw)\r
-                               halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x10);\r
-                       else\r
-                               halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8);\r
+                       halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x10);  \r
+               else\r
+                       halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8);\r
                }\r
+               */\r
 \r
                halbtc8723b1ant_SwMechanism(pBtCoexist, TRUE);\r
                halbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist);  //just print debug message\r
@@ -2888,6 +2950,59 @@ halbtc8723b1ant_RunCoexistMechanism(
        }\r
 }\r
 \r
+u4Byte\r
+halbtc8723b1ant_Log2Base(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u4Byte                          val\r
+       \r
+       )\r
+{\r
+       u1Byte  i,j;\r
+       u4Byte  tmp, tmp2, val_integerdB=0, tindex, shiftcount=0;\r
+       u4Byte  result,val_fractiondB=0,Table_fraction[21]= {0,432, 332, 274, 232, 200,\r
+                                                                  174, 151,132,115,100,86,74,62,51,42,\r
+                                                                  32,23,15,7,0};\r
+\r
+       if (val == 0)\r
+        return 0;\r
+\r
+       tmp = val;\r
+\r
+       while(1)\r
+       {\r
+               if (tmp == 1)\r
+                       break;  \r
+               else\r
+               {\r
+                       tmp = (tmp >> 1);\r
+                       shiftcount++;                           \r
+               }\r
+       }\r
+       \r
+\r
+       val_integerdB = shiftcount+1;\r
+\r
+       tmp2=1;\r
+       for (j=1; j<= val_integerdB;j++)\r
+         tmp2 = tmp2*2;                \r
+       \r
+       tmp = (val*100) /tmp2;\r
+       tindex = tmp/5;\r
+\r
+       if (tindex > 20)\r
+        tindex = 20;\r
+\r
+       val_fractiondB = Table_fraction[tindex];\r
+\r
+       result = val_integerdB*100 - val_fractiondB;                    \r
+\r
+       return (result);\r
+\r
+\r
+}\r
+\r
+\r
+\r
 VOID\r
 halbtc8723b1ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
@@ -2899,7 +3014,7 @@ halbtc8723b1ant_InitCoexDm(
        halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
        \r
        //halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\r
-       halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\r
+       //halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\r
 \r
        pCoexSta->popEventCnt = 0;\r
 }\r
@@ -2918,6 +3033,8 @@ halbtc8723b1ant_InitHwConfig(
        u1Byte                          H2C_Parameter[2] ={0};\r
 \r
        BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 1Ant Init HW Config!!\n"));\r
+\r
+       pPsdScan->bIsAntDetEnable = FALSE;\r
 #if 0//move to BTC_MEDIA_CONNECT\r
        if(bBackUp)\r
        {\r
@@ -2940,23 +3057,19 @@ halbtc8723b1ant_InitHwConfig(
 \r
        //pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi\r
 \r
+       halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\r
+       \r
        //Antenna config\r
-#if 1\r
        if(bWifiOnly)\r
-       {\r
-               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, TRUE, FALSE);\r
-               halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 9);\r
-       }\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FORCE_EXEC, TRUE, FALSE);\r
        else\r
-               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, TRUE, FALSE);\r
-#endif \r
-\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, TRUE, FALSE);\r
 \r
 #if 0\r
        if(bWifiOnly)\r
        {\r
                halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_WIFI, BTC_WIFI_STAT_INIT);\r
-               halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 9);\r
+               halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\r
        }\r
        else\r
                halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_INIT);           \r
@@ -2975,16 +3088,508 @@ halbtc8723b1ant_InitHwConfig(
                        u4Tmp,  u1Tmpa, u1Tmpb));\r
 }\r
 \r
-/*\r
 VOID\r
-halbtc8723b1ant_WifiOffHwCfg(\r
+halbtc8723b1ant_ShowPSDData(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       // set wlan_act to low\r
-       //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\r
+       pu1Byte         cliBuf=pBtCoexist->cliBuf;\r
+       u4Byte          nDeltaFreqPerPoint;\r
+       u4Byte          freq,freq1,freq2,n=0,i=0, j=0, m=0, PsdRep1, PsdRep2;\r
+       \r
+       DbgPrint("xxxxxxxxxxxxxxxx DisplayAntIsolation()\n");\r
+\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n============[Antenna Detection info]  (%d/%d)============\n",\r
+                       pPsdScan->nPSDGenCount, pPsdScan->nPSDGenTotalCount);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       if (pPsdScan->nPSDGenTotalCount == 0)\r
+       {\r
+               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n No Data !!\n");\r
+               CL_PRINTF(cliBuf);\r
+               return;\r
+       }\r
+\r
+       if (pPsdScan->nPSDPoint == 0)\r
+               nDeltaFreqPerPoint = 0;\r
+       else                    \r
+               nDeltaFreqPerPoint = pPsdScan->nPSDBandWidth/pPsdScan->nPSDPoint;               \r
+\r
+       if (pPsdScan->bIsPSDShowMaxOnly)\r
+       {       \r
+               PsdRep1 = pPsdScan->nPSDMaxValue/100;\r
+               PsdRep2 = pPsdScan->nPSDMaxValue - PsdRep1 * 100;\r
+                               \r
+               freq = ((pPsdScan->realcentFreq-20) * 1000000 + pPsdScan->nPSDMaxValuePoint * nDeltaFreqPerPoint);\r
+               freq1 = freq/1000000;\r
+               freq2 = freq/1000 - freq1 * 1000;\r
+\r
+               if (freq2 < 100)        \r
+                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Freq = %d.0%d MHz",  \r
+                         freq1, freq2);\r
+               else\r
+                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Freq = %d.%d MHz",  \r
+                         freq1, freq2);\r
+\r
+               if (PsdRep2 < 10)       \r
+                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, ", Value = %d.0%d dB, (%d/%d) \n",  \r
+                         PsdRep1, PsdRep2, pPsdScan->nPSDGenCount, pPsdScan->nPSDGenTotalCount);\r
+               else\r
+                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, ", Value = %d.%d dB, %d, (%d/%d)\n",  \r
+                         PsdRep1, PsdRep2, pPsdScan->nPSDMaxValue, pPsdScan->nPSDGenCount, pPsdScan->nPSDGenTotalCount);\r
+               \r
+               CL_PRINTF(cliBuf);\r
+       }\r
+       else\r
+       {\r
+               m = pPsdScan->nPSDStartPoint;\r
+               n = pPsdScan->nPSDStartPoint;\r
+               i = 1;\r
+               j = 1;                          \r
+\r
+        while(1)\r
+        {\r
+               do\r
+               {\r
+                       freq = ((pPsdScan->realcentFreq-20) * 1000000 + m * nDeltaFreqPerPoint);\r
+                       freq1 = freq/1000000;\r
+                       freq2 = freq/1000 - freq1 * 1000;\r
+                       \r
+                       if (i ==1)\r
+                       {\r
+                               if (freq2 == 0)\r
+                                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Freq%6d.000", freq1);\r
+                               else if (freq2 < 100)   \r
+                                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Freq%6d.0%2d", freq1,freq2);\r
+                               else\r
+                                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Freq%6d.%3d", freq1,freq2);\r
+                       }\r
+                       else if  ( (i%8 == 0) || (m == pPsdScan->nPSDStopPoint) )\r
+                       {\r
+                               if (freq2 == 0)\r
+                                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.000\n", freq1);\r
+                               else if (freq2 < 100)   \r
+                                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.0%2d\n", freq1,freq2);\r
+                               else\r
+                                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.%3d\n", freq1,freq2);\r
+                       }                       \r
+                       else\r
+                       {\r
+                               if (freq2 == 0)\r
+                                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.000", freq1);\r
+                               else if (freq2 < 100)   \r
+                                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.0%2d", freq1,freq2);\r
+                               else\r
+                                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%6d.%3d", freq1,freq2);\r
 }\r
-*/\r
+\r
+                       i++;                                    \r
+                       m++;\r
+                       CL_PRINTF(cliBuf);\r
+\r
+               }while(  (i <= 8) && (m <= pPsdScan->nPSDStopPoint));   \r
+               \r
+               \r
+               do\r
+               {\r
+                       PsdRep1 = pPsdScan->nPSDReport_MaxHold[n]/100;\r
+                       PsdRep2 = pPsdScan->nPSDReport_MaxHold[n] - PsdRep1 * 100;\r
+                               \r
+                       if (j ==1)\r
+                       {\r
+                               if (PsdRep2 <10)\r
+                                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Val %7d.0%d", PsdRep1,PsdRep2);\r
+                               else\r
+                                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n Val %7d.%d", PsdRep1,PsdRep2);\r
+                       }\r
+                       else if ( (j%8 == 0)  || (n == pPsdScan->nPSDStopPoint) )\r
+                       {\r
+                               if (PsdRep2 <10)\r
+                                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%7d.0%d\n", PsdRep1,PsdRep2);\r
+                               else\r
+                                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%7d.%d\n", PsdRep1,PsdRep2);\r
+                       }\r
+                       else\r
+                       {\r
+                               if (PsdRep2 <10)\r
+                                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%7d.0%d", PsdRep1,PsdRep2);\r
+                               else\r
+                                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "%7d.%d", PsdRep1,PsdRep2);\r
+                       }\r
+\r
+                       j++;\r
+                       n++;\r
+                       CL_PRINTF(cliBuf);\r
+                       \r
+               } while(  (j <= 8) && (n <= pPsdScan->nPSDStopPoint));          \r
+\r
+               if  ( (m > pPsdScan->nPSDStopPoint) || (n > pPsdScan->nPSDStopPoint) )\r
+                break;\r
+               else\r
+               {\r
+                       i = 1;\r
+                       j = 1;\r
+               }\r
+               \r
+        }      \r
+       }\r
+\r
+\r
+}\r
+\r
+u4Byte\r
+halbtc8723b1ant_GetPSDData(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u4Byte                          nPoint\r
+       )\r
+{\r
+       //reg 0x808[9:0]: FFT data x\r
+       //reg 0x808[22]: 0-->1 to get 1 FFT data y\r
+       //reg 0x8b4[15:0]: FFT data y report\r
+\r
+       u4Byte val = 0, psd_report =0;\r
+       \r
+       val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x808);\r
+\r
+       val &= 0xffbffc00;\r
+       val |= nPoint;\r
+       \r
+        pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val);\r
+\r
+       val |= 0x00400000;\r
+        pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val);\r
+\r
+\r
+       val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x8b4);\r
+\r
+       psd_report = val & 0x0000ffff;\r
+        \r
+       return psd_report;\r
+}\r
+\r
+\r
+void\r
+halbtc8723b1ant_SweepPSDPoint(\r
+IN     PBTC_COEXIST                    pBtCoexist,\r
+       IN      u4Byte                          centFreq,\r
+       IN      u4Byte                          offset,\r
+       IN      u4Byte                          span,\r
+       IN      u4Byte                          points,\r
+       IN      u4Byte                          avgnum\r
+       )\r
+{\r
+       u4Byte   i,val,n,k=0;\r
+       u4Byte  nPoints=0, psd_report=0;\r
+       u4Byte  nStartP=0, nStopP=0, nDeltaFreqPerPoint=156250;\r
+       u4Byte    nPSDCenterFreq=20*10^6, freq,freq1,freq2;     \r
+       BOOLEAN outloop = FALSE;\r
+       u1Byte   flag = 0;      \r
+       u4Byte  tmp, PsdRep1, PsdRep2;\r
+\r
+       pPsdScan->bIsPSDRunning = TRUE;\r
+       \r
+       do\r
+       {\r
+               switch(flag)\r
+               {\r
+                  case 0:  //Get PSD parameters\r
+                  default:     \r
+                       DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), centFreq=0x%x, offset=0x%x, span=0x%x\n", \r
+                            centFreq, offset, span);\r
+\r
+                       pPsdScan->nPSDBandWidth = 40*1000000;\r
+                       pPsdScan->nPSDPoint = points;\r
+                       pPsdScan->nPSDStartBase = points/2; \r
+                       pPsdScan->nPSDAvgNum = avgnum;\r
+                       \r
+                       nPoints = pPsdScan->nPSDPoint;\r
+                       nDeltaFreqPerPoint = pPsdScan->nPSDBandWidth/pPsdScan->nPSDPoint;\r
+\r
+                       //PSD point setup\r
+                       val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x808);\r
+                       val &= 0xffff0fff;                              \r
+                       \r
+                       switch(pPsdScan->nPSDPoint)\r
+                       {\r
+                               case 128:\r
+                                       val |= 0x0;\r
+                                       break;\r
+                               case 256:\r
+                               default:        \r
+                                       val |=0x00004000;\r
+                                       break;\r
+                               case 512:       \r
+                                       val |= 0x00008000;\r
+                                       break;\r
+                               case 1024:      \r
+                                       val |= 0x0000c000;\r
+                                       break;\r
+                       }                       \r
+                                       \r
+                       switch(pPsdScan->nPSDAvgNum)\r
+                       {\r
+                               case 1:\r
+                                       val |= 0x0;\r
+                                       break;\r
+                               case 8:                         \r
+                                       val |=0x00001000;\r
+                                       break;\r
+                               case 16:        \r
+                                       val |= 0x00002000;\r
+                                       break;\r
+                               case 32:\r
+                               default:        \r
+                                       val |= 0x00003000;\r
+                                       break;\r
+                       }\r
+                        pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val);\r
+\r
+                       DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), PSD BW= %d, DeltaFreq=%d\n"\r
+                               , pPsdScan->nPSDBandWidth, nDeltaFreqPerPoint);\r
+                       flag = 1;\r
+                       break;\r
+                 case 1:         //calculate the PSD point index from freq/offset/span\r
+                       nPSDCenterFreq = pPsdScan->nPSDBandWidth /2 +offset*(1000000);\r
+                       DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), PSD Center Freq = %d\n", (centFreq + offset));\r
+                       \r
+                       nStartP = pPsdScan->nPSDStartBase + (nPSDCenterFreq - span *(1000000)/2) /nDeltaFreqPerPoint;\r
+                       pPsdScan->nPSDStartPoint = nStartP - pPsdScan->nPSDStartBase;\r
+                       DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), Start PSD Poin Matrix Index = %d\n", pPsdScan->nPSDStartPoint);\r
+\r
+                       nStopP = pPsdScan->nPSDStartBase + (nPSDCenterFreq + span *(1000000)/2) /nDeltaFreqPerPoint;\r
+                       pPsdScan->nPSDStopPoint = nStopP - pPsdScan->nPSDStartBase-1;\r
+                       DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), Stop PSD Poin Matrix Index = %d\n",pPsdScan->nPSDStopPoint);\r
+\r
+                       flag = 2;\r
+                       break;\r
+                 case 2:  //set RF channel/BW/Mode\r
+\r
+                       //set 3-wire off\r
+                       val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x88c);\r
+                       val |= 0x00300000;\r
+                        pBtCoexist->fBtcWrite4Byte(pBtCoexist,0x88c,val);\r
+\r
+                       //CCK off\r
+                       val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x800);\r
+                       val &= 0xfeffffff;\r
+                       pBtCoexist->fBtcWrite4Byte(pBtCoexist,0x800,val);               \r
+\r
+                       //Set RF channel\r
+                      if (centFreq == 2484)\r
+                               pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff, 0xe); //WiFi TRx Mask on\r
+                       else\r
+                               pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff, (centFreq-2412)/5 + 1); //WiFi TRx Mask on\r
+\r
+                       //Set  RF mode = Rx, RF Gain = 0x8a0\r
+                       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x0, 0xfffff, 0x308a0);\r
+\r
+                       //Set TRx mask off\r
+                       //un-lock TRx Mask setup\r
+                       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdd, 0x80, 0x1);\r
+                       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdf, 0x1, 0x1);\r
+\r
+                       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
+\r
+                       flag = 3;\r
+                       break;\r
+                 case 3:\r
+                       memset(pPsdScan->nPSDReport,0, pPsdScan->nPSDPoint*sizeof(u4Byte));\r
+                       nStartP = pPsdScan->nPSDStartPoint + pPsdScan->nPSDStartBase;\r
+                       nStopP = pPsdScan->nPSDStopPoint +  pPsdScan->nPSDStartBase + 1;\r
+                               \r
+                       i = nStartP;\r
+\r
+                       while (i < nStopP)\r
+                       {\r
+                               if (i >= nPoints)\r
+                               {\r
+                                       psd_report = halbtc8723b1ant_GetPSDData(pBtCoexist,i-nPoints);\r
+                               }\r
+                               else\r
+                               {\r
+                                       psd_report = halbtc8723b1ant_GetPSDData(pBtCoexist,i);\r
+                               }\r
+\r
+                               if (psd_report == 0)\r
+                                       tmp = 0;\r
+                               else\r
+                                       //tmp =  20*log10((double)psd_report);\r
+                                       //20*log2(x)/log2(10), log2Base return theresult of the psd_report*100\r
+                                       tmp = 6 * halbtc8723b1ant_Log2Base(pBtCoexist, psd_report);\r
+                               \r
+\r
+                               n = i-pPsdScan->nPSDStartBase;\r
+                               pPsdScan->nPSDReport[n] =  tmp;\r
+                               PsdRep1 = pPsdScan->nPSDReport[n] /100;\r
+                               PsdRep2 = pPsdScan->nPSDReport[n] - PsdRep1 * 100;\r
+                               \r
+                               freq =  ((centFreq-20) * 1000000 + n * nDeltaFreqPerPoint);\r
+                               freq1 = freq/1000000;\r
+                               freq2 = freq/1000 - freq1 * 1000;\r
+\r
+                               if (freq2 < 100)\r
+                                       DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), i = %d (%d.0%d MHz)", n, freq1, freq2);\r
+                               else\r
+                                       DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), i = %d (%d.%d MHz)", n, freq1, freq2);\r
+\r
+                               if (PsdRep2 < 10)\r
+                                       DbgPrint(", PSDReport = %d (%d.0%d dB)\n",psd_report, PsdRep1, PsdRep2);\r
+                               else\r
+                                       DbgPrint(", PSDReport = %d (%d.%d dB)\n",psd_report, PsdRep1,PsdRep2);  \r
+\r
+                               i++;\r
+\r
+                               k=0;\r
+\r
+                               //Add Delay between PSD point\r
+                               while(1)\r
+                               {\r
+                                       if (k++ > 20000)\r
+                                        break;\r
+                               }\r
+\r
+                               DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint()==============\n");\r
+                       }       \r
+\r
+                       flag = 100;\r
+                       break;\r
+                 case 99:      //error\r
+\r
+                       outloop = TRUE;\r
+                       break;\r
+                 case 100: //recovery \r
+\r
+                       //set 3-wire on\r
+                       val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x88c);\r
+                       val &=0xffcfffff;\r
+                       pBtCoexist->fBtcWrite4Byte(pBtCoexist,0x88c,val);\r
+\r
+                       //CCK on\r
+                       val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x800);\r
+                       val |= 0x01000000;\r
+                       pBtCoexist->fBtcWrite4Byte(pBtCoexist,0x800,val);       \r
+\r
+                       //PSD off\r
+                       val = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x808);\r
+                       val &=0xffbfffff;\r
+                       pBtCoexist->fBtcWrite4Byte(pBtCoexist,0x808,val);\r
+                       \r
+                       //TRx Mask on\r
+                       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdd, 0x80, 0x0);\r
+                       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdf, 0x1, 0x0);\r
+\r
+                       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780);\r
+                       \r
+                       outloop = TRUE;\r
+                       break;\r
+\r
+               }               \r
+                       \r
+       }while (!outloop);\r
+\r
+\r
+\r
+       pPsdScan->bIsPSDRunning = FALSE;\r
+\r
+\r
+}\r
+\r
+VOID\r
+halbtc8723b1ant_AntennaDetection(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u4Byte                                  centFreq,\r
+       IN      u4Byte                                  offset,\r
+       IN      u4Byte                                  span,\r
+       IN      u4Byte                                  seconds\r
+       )\r
+{\r
+       u4Byte realseconds = 0, i=0, i_max=0, val_max=0, j;\r
+\r
+       //Stop Coex DM\r
+       pBtCoexist->bStopCoexDm = TRUE;\r
+\r
+       //Set Antenna path, switch WiFi to un-certain antenna port\r
+       halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, FALSE);\r
+\r
+       //Mailbox handshake\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, 0x0);      \r
+       DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), Set BT LE Tx\n");\r
+\r
+       //sweep PSD\r
+       DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), \n");\r
+       DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), \n");\r
+       DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), \n");\r
+\r
+       \r
+       //Analysis Data\r
+\r
+       do\r
+       {\r
+               halbtc8723b1ant_SweepPSDPoint(pBtCoexist, centFreq, offset,span, BT_8723B_1ANT_ANTDET_PSD_POINTS, BT_8723B_1ANT_ANTDET_PSD_AVGNUM);     \r
+               \r
+               DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), PSDGenCount = %d\n ", pPsdScan->nPSDGenCount);\r
+       \r
+               if (pPsdScan->nPSDGenCount == 0)\r
+               {\r
+                       memcpy(pPsdScan->nPSDReport_MaxHold, pPsdScan->nPSDReport, BT_8723B_1ANT_ANTDET_PSD_POINTS*sizeof(u4Byte));\r
+\r
+                       for (i= pPsdScan->nPSDStartPoint; i<=pPsdScan->nPSDStopPoint; i++)\r
+                       {\r
+                               DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), Max_Hold i = %d, PSDReport = %d dB\n", i,  pPsdScan->nPSDReport_MaxHold[i]);\r
+                       }\r
+               }       \r
+               else\r
+               {\r
+                       for (i= pPsdScan->nPSDStartPoint; i<=pPsdScan->nPSDStopPoint; i++)\r
+                       {\r
+                               if (pPsdScan->nPSDReport[i] > pPsdScan->nPSDReport_MaxHold[i])\r
+                               pPsdScan->nPSDReport_MaxHold[i] = pPsdScan->nPSDReport[i];      \r
+\r
+                               //search Max Value\r
+                               if (i ==pPsdScan->nPSDStartPoint )\r
+                               {\r
+                                       i_max = i;\r
+                                       val_max = pPsdScan->nPSDReport_MaxHold[i];\r
+                               }\r
+                               else\r
+                               {\r
+                                       if (pPsdScan->nPSDReport_MaxHold[i] > val_max)\r
+                                       {\r
+                                               i_max = i;\r
+                                               val_max = pPsdScan->nPSDReport_MaxHold[i];\r
+                                       }\r
+                               }\r
+\r
+                               DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), Max_Hold i = %d, PSDReport = %d dB\n", i,  pPsdScan->nPSDReport_MaxHold[i]);\r
+\r
+                       }\r
+       \r
+                       pPsdScan->nPSDMaxValuePoint = i_max;\r
+                       pPsdScan->nPSDMaxValue = val_max;\r
+\r
+                       DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), Max_Hold i_Max = %d, PSDReport_Max = %d dB, TotalCnt = %d\n", pPsdScan->nPSDMaxValuePoint\r
+                                       ,pPsdScan->nPSDMaxValue, pPsdScan->nPSDGenTotalCount);\r
+               }\r
+\r
+               if (pPsdScan->nPSDGenCount+1 <=  pPsdScan->realseconds)\r
+               {\r
+                       pPsdScan->nPSDGenCount++;\r
+                       pPsdScan->nPSDGenTotalCount++;\r
+               }\r
+               else\r
+               {\r
+                       break;\r
+               }\r
+\r
+       } while (1);\r
+       //Set Antenna Path      \r
+       halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\r
+\r
+       //Resume Coex DM\r
+       pBtCoexist->bStopCoexDm = FALSE;\r
+\r
+}\r
+\r
 \r
 //============================================================\r
 // work around function start with wa_halbtc8723b1ant_\r
@@ -3059,6 +3664,13 @@ EXhalbtc8723b1ant_PowerOnSetting(
        }\r
 }\r
 \r
+VOID\r
+EXhalbtc8723b1ant_PreLoadFirmware(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+}\r
+\r
 VOID\r
 EXhalbtc8723b1ant_InitHwConfig(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
@@ -3095,14 +3707,16 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
        u1Byte                          u1Tmp[4], i, btInfoExt, psTdmaCase=0;\r
        u2Byte                          u2Tmp[4];\r
        u4Byte                          u4Tmp[4];\r
-       BOOLEAN                         bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE, bWifiUnderBMode = FALSE;\r
-       BOOLEAN                         bBtHsOn=FALSE, bWifiBusy=FALSE;\r
-       s4Byte                          wifiRssi=0, btHsRssi=0;\r
-       u4Byte                          wifiBw, wifiTrafficDir, faOfdm, faCck, wifiLinkStatus;\r
-       u1Byte                          wifiDot11Chnl, wifiHsChnl, apNum;\r
+       u4Byte                          faOfdm, faCck;\r
        u4Byte                          fwVer=0, btPatchVer=0;\r
        static u1Byte                   PopReportIn10s = 0;     \r
 \r
+       if (pPsdScan->bIsAntDetEnable == TRUE)\r
+       {\r
+               halbtc8723b1ant_ShowPSDData(pBtCoexist);\r
+               return;\r
+       }\r
+\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
        CL_PRINTF(cliBuf);\r
 \r
@@ -3135,51 +3749,24 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
                GLCoexVerDate8723b1Ant, GLCoexVer8723b1Ant, fwVer, btPatchVer, btPatchVer);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsChnl(HsMode)", \\r
-               wifiDot11Chnl, wifiHsChnl, bBtHsOn);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "H2C Wifi inform bt chnl Info", \\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "Wifi channel informed to BT", \\r
                pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\r
                pCoexDm->wifiChnlInfo[2]);\r
        CL_PRINTF(cliBuf);\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \\r
-               wifiRssi-100, btHsRssi-100);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %s", "Wifi bHi-Pri/ CCK lock/ CCK ever-lock", \\r
+               (pCoexSta->bWiFiIsHighPriTask? "Yes":"No"),\r
+               (pCoexSta->bCCKLock? "Yes":"No"),\r
+               (pCoexSta->bCCKEverLock? "Yes":"No"));\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %s", "Wifi bLink/ bRoam/ bScan/ bHi-Pri", \\r
-               bLink, bRoam, bScan,((pCoexSta->bWiFiIsHighPriTask)? "1":"0"));\r
-       CL_PRINTF(cliBuf);\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\r
-       \r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s/ AP=%d/ %s ", "Wifi status", \\r
-               (bWifiUnder5G? "5G":"2.4G"),\r
-               ((bWifiUnderBMode)? "11b": ((BTC_WIFI_BW_LEGACY==wifiBw)? "11bg": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20")))),\r
-               ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")), pCoexSta->nScanAPNum,( pCoexSta->bCCKLock)? "Lock":"noLock");\r
+       // wifi status\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============");\r
        CL_PRINTF(cliBuf);\r
+       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d/ %d", "sta/vwifi/hs/p2pGo/p2pGc", \\r
-               ((wifiLinkStatus&WIFI_STA_CONNECTED)? 1:0), ((wifiLinkStatus&WIFI_AP_CONNECTED)? 1:0), \r
-               ((wifiLinkStatus&WIFI_HS_CONNECTED)? 1:0), ((wifiLinkStatus&WIFI_P2P_GO_CONNECTED)? 1:0), \r
-               ((wifiLinkStatus&WIFI_P2P_GC_CONNECTED)? 1:0) );\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[BT Status]============");\r
        CL_PRINTF(cliBuf);\r
        \r
-\r
        PopReportIn10s++;\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d/ %d] ", "BT [status/ rssi/ retryCnt/ popCnt]", \\r
                ((pBtCoexist->btInfo.bBtDisabled)? ("disabled"):        ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? "non-connected idle":\r
@@ -3193,9 +3780,8 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
                PopReportIn10s = 0;\r
        }\r
        \r
-                               \r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP", \\r
-               pBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d / %d", "SCO/HID/PAN/A2DP/Hi-Pri", \\r
+               pBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist, pBtLinkInfo->bBtHiPriLinkExist);\r
        CL_PRINTF(cliBuf);\r
 \r
        if (pStackInfo->bProfileNotified)\r
@@ -3209,7 +3795,6 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
                CL_PRINTF(cliBuf);      \r
        }       \r
 \r
-\r
        btInfoExt = pCoexSta->btInfoExt;\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT Info A2DP rate", \\r
                (btInfoExt&BIT0)? "Basic rate":"EDR rate");\r
@@ -3227,13 +3812,6 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
                        CL_PRINTF(cliBuf);\r
                }\r
        }\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/%s, (0x%x/0x%x)", "PS state, IPS/LPS, (lps/rpwm)", \\r
-               ((pCoexSta->bUnderIps? "IPS ON":"IPS OFF")),\r
-               ((pCoexSta->bUnderLps? "LPS ON":"LPS OFF")), \r
-               pBtCoexist->btInfo.lpsVal, \r
-               pBtCoexist->btInfo.rpwmVal);\r
-       CL_PRINTF(cliBuf);\r
-       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);\r
 \r
        if(!pBtCoexist->bManualControl)\r
        {\r
@@ -3399,8 +3977,8 @@ EXhalbtc8723b1ant_IpsNotify(
                pCoexSta->bUnderIps = TRUE;\r
                \r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE);\r
                halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
-               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);   \r
                //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\r
        }\r
        else if(BTC_IPS_LEAVE == type)\r
@@ -3461,6 +4039,7 @@ EXhalbtc8723b1ant_ScanNotify(
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));\r
 \r
                halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);  //Force antenna setup for no scan result issue\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\r
                u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\r
                u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\r
                u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);\r
@@ -3553,6 +4132,7 @@ EXhalbtc8723b1ant_ConnectNotify(
        {\r
                pCoexSta->bWiFiIsHighPriTask = TRUE;\r
                halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);  //Force antenna setup for no scan result issue\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));        \r
                 pCoexDm->nArpCnt = 0;\r
        }\r
@@ -3626,6 +4206,7 @@ EXhalbtc8723b1ant_MediaStatusNotify(
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n"));\r
                halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);  //Force antenna setup for no scan result issue\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\r
                pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\r
 \r
                //Set CCK Tx/Rx high Pri except 11b mode\r
@@ -3652,6 +4233,8 @@ EXhalbtc8723b1ant_MediaStatusNotify(
 \r
                pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x0); //CCK Tx\r
                pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x0); //CCK Rx\r
+\r
+               pCoexSta->bCCKEverLock = FALSE;\r
        }\r
 \r
        // only 2.4G we need to inform bt the chnl mask\r
@@ -3796,6 +4379,12 @@ EXhalbtc8723b1ant_BtInfoNotify(
                }\r
        }\r
 \r
+       // if 0xff, it means BT is under WHCK test\r
+       if (btInfo == 0xff)\r
+               pCoexSta->bBtWhckTest = TRUE;\r
+       else\r
+               pCoexSta->bBtWhckTest = FALSE;\r
+\r
        if(BT_INFO_SRC_8723B_1ANT_WIFI_FW != rspSource)\r
        {\r
                pCoexSta->btRetryCnt =  // [3:0]\r
@@ -3879,6 +4468,8 @@ EXhalbtc8723b1ant_BtInfoNotify(
                pCoexSta->bA2dpExist = FALSE;\r
                pCoexSta->bHidExist = FALSE;\r
                pCoexSta->bScoExist = FALSE;\r
+\r
+               pCoexSta->bBtHiPriLinkExist = FALSE;\r
        }\r
        else    // connection exists\r
        {\r
@@ -3899,6 +4490,17 @@ EXhalbtc8723b1ant_BtInfoNotify(
                        pCoexSta->bScoExist = TRUE;\r
                else\r
                        pCoexSta->bScoExist = FALSE;\r
+\r
+               if ( (pCoexSta->bHidExist == FALSE) && (pCoexSta->bC2hBtInquiryPage == FALSE) )\r
+               {\r
+                       if (pCoexSta->highPriorityTx  + pCoexSta->highPriorityRx >= 160)                \r
+                               pCoexSta->bHidExist = TRUE;\r
+               }\r
+\r
+               //Add Hi-Pri Tx/Rx counter to avoid false detection\r
+               if ( ( (pCoexSta->bHidExist) || (pCoexSta->bScoExist) ) && (pCoexSta->highPriorityTx > 60)  &&  (pCoexSta->highPriorityRx > 60)\r
+                         && (!pCoexSta->bC2hBtInquiryPage))\r
+                       pCoexSta->bBtHiPriLinkExist = TRUE;\r
        }\r
 \r
        halbtc8723b1ant_UpdateBtLinkInfo(pBtCoexist);\r
@@ -3953,7 +4555,7 @@ EXhalbtc8723b1ant_RfStatusNotify(
 {\r
        u4Byte  u4Tmp;\r
        u1Byte  u1Tmpa,u1Tmpb, u1Tmpc;\r
-\r
+       \r
        BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], RF Status notify\n"));\r
 \r
        if(BTC_RF_ON == type)\r
@@ -3967,7 +4569,7 @@ EXhalbtc8723b1ant_RfStatusNotify(
                \r
                halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
                halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\r
-               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE);\r
                //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\r
                \r
                halbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
@@ -3975,11 +4577,13 @@ EXhalbtc8723b1ant_RfStatusNotify(
 \r
                u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\r
                u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\r
-               u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);\r
+               u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);\r
                u1Tmpc = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e);\r
 \r
+\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x, 0x76e=0x%x\n",\r
-                       u4Tmp, u1Tmpa, u1Tmpb, u1Tmpc));\r
+                       u4Tmp,  u1Tmpa, u1Tmpb, u1Tmpc));\r
+\r
        }\r
 }\r
 \r
@@ -3994,7 +4598,7 @@ EXhalbtc8723b1ant_HaltNotify(
 \r
        halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
        halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\r
-       halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
+       halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE);\r
        //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\r
 \r
        halbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
@@ -4018,8 +4622,8 @@ EXhalbtc8723b1ant_PnpNotify(
 \r
                halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE);\r
                halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
-               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
                //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\r
 \r
                pBtCoexist->bStopCoexDm = TRUE;\r
@@ -4089,9 +4693,131 @@ EXhalbtc8723b1ant_Periodical(
        }\r
 \r
        pCoexSta->specialPktPeriodCnt++;\r
+\r
+/*\r
+       if (pPsdScan->bIsAntDetEnable)\r
+       {\r
+                if (pPsdScan->nPSDGenCount > pPsdScan->realseconds)\r
+                       pPsdScan->nPSDGenCount = 0;\r
+                \r
+               halbtc8723b1ant_AntennaDetection(pBtCoexist, pPsdScan->realcentFreq,  pPsdScan->realoffset, pPsdScan->realspan,  pPsdScan->realseconds);        \r
+               pPsdScan->nPSDGenTotalCount +=2;\r
+               pPsdScan->nPSDGenCount += 2;\r
+       }\r
+*/             \r
 #endif\r
 }\r
 \r
+VOID\r
+EXhalbtc8723b1ant_AntennaDetection(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u4Byte                                  centFreq,\r
+       IN      u4Byte                                  offset,\r
+       IN      u4Byte                                  span,\r
+       IN      u4Byte                                  seconds\r
+       )\r
+{\r
+       pPsdScan->bIsAntDetEnable       = FALSE;\r
+\r
+       //do antenna detection periodically (every 2 seconds)\r
+       if (centFreq == 0)\r
+       {\r
+               return;\r
+       }\r
+       else\r
+       {       \r
+               //parse parameter\r
+               pPsdScan->realcentFreq = ((centFreq & 0xf000) >> 12) * 1000 + ((centFreq & 0xf00) >> 8) * 100 +\r
+                                        ((centFreq & 0xf0) >> 4) * 10 + (centFreq & 0xf);\r
+               DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), real freq = %d\n", pPsdScan->realcentFreq);\r
+               \r
+               \r
+               pPsdScan->realoffset =( (offset & 0x70) >> 4) * 10 + (offset & 0xf);            \r
+               if (offset & 0x80)      \r
+                       pPsdScan->realoffset = 0 - pPsdScan->realoffset;                                        \r
+               DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), real offst = %d\n", pPsdScan->realoffset);\r
+\r
+               if (span & 0x80)\r
+                       pPsdScan->bIsPSDShowMaxOnly = TRUE;\r
+               else\r
+                       pPsdScan->bIsPSDShowMaxOnly = FALSE;            \r
+               pPsdScan->realspan = ((span & 0x70) >> 4) * 10 + (span & 0xf);\r
+               DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), real span = %d\n", pPsdScan->realspan);\r
+               \r
+               if ( (pPsdScan->realcentFreq < 2412) || ( (pPsdScan->realcentFreq > 2472) && (pPsdScan->realcentFreq != 2484) ) )\r
+               {\r
+                        DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), center freq is not valid!!\n");    \r
+                        return;\r
+                               \r
+               }\r
+               else if ( ( (pPsdScan->realcentFreq - 2412) % 5 != 0 ) && (pPsdScan->realcentFreq != 2484) ) \r
+               {\r
+                       DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), center freq is not valid!!\n");\r
+                        return;\r
+               }                       \r
+\r
+               if ( (pPsdScan->realoffset > 20) || (pPsdScan->realoffset < -20) )\r
+               {\r
+                       DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), freq offset is not valid!!\n");\r
+                        return;                                \r
+               }                               \r
+\r
+               if (pPsdScan->realspan > 40)  \r
+               {\r
+                       DbgPrint("xxxxxxxxxxxxxxxx SweepPSDPoint(), freq span is not valid!!\n");\r
+                       return;         \r
+               }       \r
+               \r
+               pPsdScan->realseconds =( (seconds & 0xf0) >> 4) * 10 + (seconds & 0xf);         \r
+               pPsdScan->nPSDGenCount = 0;\r
+               pPsdScan->nPSDGenTotalCount= 0;\r
+       }\r
+\r
+\r
+       pPsdScan->bIsAntDetEnable       = TRUE;\r
+\r
+       \r
+       halbtc8723b1ant_AntennaDetection(pBtCoexist, pPsdScan->realcentFreq,   pPsdScan->realoffset, pPsdScan->realspan,  pPsdScan->realseconds);                       \r
+\r
+       \r
+\r
+}\r
+\r
+VOID\r
+EXhalbtc8723b1ant_AntennaIsolation(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u4Byte                                  centFreq,\r
+       IN      u4Byte                                  offset,\r
+       IN      u4Byte                                  span,\r
+       IN      u4Byte                                  seconds\r
+       )\r
+{\r
+\r
+\r
+}\r
+\r
+VOID\r
+EXhalbtc8723b1ant_PSDScan(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u4Byte                                  centFreq,\r
+       IN      u4Byte                                  offset,\r
+       IN      u4Byte                                  span,\r
+       IN      u4Byte                                  seconds\r
+       )\r
+{\r
+\r
+\r
+}\r
+\r
+VOID\r
+EXhalbtc8723b1ant_DisplayAntIsolation(\r
+       IN      PBTC_COEXIST                    pBtCoexist\r
+       )\r
+{\r
+       \r
+       //halbtc8723b1ant_ShowPSDData(pBtCoexist);\r
+}\r
+\r
 \r
 #endif\r
 \r
index 9ebec684988e187af3aca5ce0e3083b67ce85894..248874d55f56ee49cf8612f7567b9978cc3f591a 100755 (executable)
@@ -62,6 +62,9 @@ typedef enum _BT_8723B_1ANT_COEX_ALGO{
 }BT_8723B_1ANT_COEX_ALGO,*PBT_8723B_1ANT_COEX_ALGO;\r
 \r
 typedef struct _COEX_DM_8723B_1ANT{\r
+       // hw setting\r
+       u1Byte          preAntPosType;\r
+       u1Byte          curAntPosType;\r
        // fw mechanism\r
        BOOLEAN         bCurIgnoreWlanAct;\r
        BOOLEAN         bPreIgnoreWlanAct;\r
@@ -122,6 +125,7 @@ typedef struct _COEX_STA_8723B_1ANT{
        BOOLEAN                                 bA2dpExist;\r
        BOOLEAN                                 bHidExist;\r
        BOOLEAN                                 bPanExist;\r
+       BOOLEAN                                 bBtHiPriLinkExist;\r
 \r
        BOOLEAN                                 bUnderLps;\r
        BOOLEAN                                 bUnderIps;\r
@@ -137,6 +141,7 @@ typedef struct _COEX_STA_8723B_1ANT{
        BOOLEAN                                 bC2hBtInfoReqSent;\r
        u1Byte                                  btInfoC2h[BT_INFO_SRC_8723B_1ANT_MAX][10];\r
        u4Byte                                  btInfoC2hCnt[BT_INFO_SRC_8723B_1ANT_MAX];\r
+       BOOLEAN                                 bBtWhckTest;\r
        BOOLEAN                                 bC2hBtInquiryPage;\r
        BOOLEAN                                 bC2hBtPage;                             //Add for win8.1 page out issue\r
        BOOLEAN                                 bWiFiIsHighPriTask;             //Add for win8.1 page out issue\r
@@ -157,11 +162,45 @@ typedef struct _COEX_STA_8723B_1ANT{
 \r
        BOOLEAN                                 bCCKLock;\r
        BOOLEAN                                 bPreCCKLock;\r
+       BOOLEAN                                 bCCKEverLock;\r
        u1Byte                                  nCoexTableType;\r
 \r
        BOOLEAN                                 bForceLpsOn;\r
 }COEX_STA_8723B_1ANT, *PCOEX_STA_8723B_1ANT;\r
 \r
+#define  BT_8723B_1ANT_ANTDET_PSD_POINTS                       256     //MAX:1024\r
+#define  BT_8723B_1ANT_ANTDET_PSD_AVGNUM               1       //MAX:3\r
+\r
+typedef struct _PSDSCAN_STA_8723B_1ANT{\r
+\r
+BOOLEAN                        bIsAntDetEnable;\r
+BOOLEAN                        bIsAntIsoEnable;\r
+BOOLEAN                        bIsPSDScanEnable;\r
+\r
+u4Byte                 realcentFreq;  //ex:2412\r
+s4Byte                 realoffset;\r
+u4Byte                 realspan;\r
+u4Byte                 realseconds;\r
+       \r
+BOOLEAN                        bAntDetFinish;\r
+u1Byte                 nAntIsolation;\r
+u4Byte                 nPSDBandWidth;  //unit: Hz\r
+u4Byte                 nPSDPoint;              //128/256/512/1024\r
+u4Byte                 nPSDReport[1024];  //unit:dB (20logx), 0~255\r
+u4Byte                 nPSDReport_MaxHold[1024];  //unit:dB (20logx), 0~255\r
+u4Byte                 nPSDStartPoint;\r
+u4Byte                 nPSDStopPoint;\r
+u4Byte                 nPSDMaxValuePoint;\r
+u4Byte                 nPSDMaxValue;\r
+u4Byte                 nPSDStartBase;\r
+u4Byte                 nPSDAvgNum;     // 1/8/16/32\r
+u4Byte                 nPSDGenCount;\r
+u4Byte                 nPSDGenTotalCount;      \r
+BOOLEAN                        bIsSetupFinish;\r
+BOOLEAN                        bIsPSDRunning;\r
+BOOLEAN                        bIsPSDShowMaxOnly;\r
+} PSDSCAN_STA_8723B_1ANT, *PPSDSCAN_STA_8723B_1ANT;\r
+\r
 //===========================================\r
 // The following is interface which will notify coex module.\r
 //===========================================\r
@@ -170,6 +209,10 @@ EXhalbtc8723b1ant_PowerOnSetting(
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8723b1ant_PreLoadFirmware(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       );\r
+VOID\r
 EXhalbtc8723b1ant_InitHwConfig(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
        IN      BOOLEAN                         bWifiOnly\r
@@ -240,4 +283,33 @@ VOID
 EXhalbtc8723b1ant_DisplayCoexInfo(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
+VOID\r
+EXhalbtc8723b1ant_AntennaDetection(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u4Byte                                  centFreq,\r
+       IN      u4Byte                                  offset,\r
+       IN      u4Byte                                  span,\r
+       IN      u4Byte                                  seconds\r
+       );\r
+VOID\r
+EXhalbtc8723b1ant_AntennaIsolation(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u4Byte                                  centFreq,\r
+       IN      u4Byte                                  offset,\r
+       IN      u4Byte                                  span,\r
+       IN      u4Byte                                  seconds\r
+       );\r
+\r
+VOID\r
+EXhalbtc8723b1ant_PSDScan(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u4Byte                                  centFreq,\r
+       IN      u4Byte                                  offset,\r
+       IN      u4Byte                                  span,\r
+       IN      u4Byte                                  seconds\r
+       );\r
+VOID\r
+EXhalbtc8723b1ant_DisplayAntIsolation(\r
+       IN      PBTC_COEXIST                    pBtCoexist\r
+       );\r
 \r
index 34795bd91d4ffc957474d592bc26b7f41e928325..c0ced8e21a89313331c1e14d91b6923f63099d0e 100755 (executable)
@@ -27,8 +27,8 @@ const char *const GLBtInfoSrc8723b2Ant[]={
        "BT Info[bt auto report]",\r
 };\r
 \r
-u4Byte GLCoexVerDate8723b2Ant=20131211;\r
-u4Byte GLCoexVer8723b2Ant=0x40;\r
+u4Byte GLCoexVerDate8723b2Ant=20140903;\r
+u4Byte GLCoexVer8723b2Ant=0x43;\r
 \r
 //============================================================\r
 // local function proto type if needed\r
@@ -337,6 +337,8 @@ halbtc8723b2ant_MonitorBtCtr(
        u4Byte                  regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\r
        u1Byte                  u1Tmp;\r
        \r
+       PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
+       \r
        regHPTxRx = 0x770;\r
        regLPTxRx = 0x774;\r
 \r
@@ -353,6 +355,15 @@ halbtc8723b2ant_MonitorBtCtr(
        pCoexSta->lowPriorityTx = regLPTx;\r
        pCoexSta->lowPriorityRx = regLPRx;\r
 \r
+       if ( (pCoexSta->lowPriorityRx >= 950)  &&  (pCoexSta->lowPriorityRx >= pCoexSta->lowPriorityTx) && (!pCoexSta->bUnderIps) )\r
+       {\r
+               pBtLinkInfo->bSlaveRole = TRUE;\r
+       }\r
+       else\r
+       {\r
+               pBtLinkInfo->bSlaveRole = FALSE;\r
+       }\r
+\r
        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", \r
                regHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx));\r
        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", \r
@@ -362,6 +373,48 @@ halbtc8723b2ant_MonitorBtCtr(
        pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);\r
 }\r
 \r
+VOID\r
+halbtc8723b2ant_MonitorWiFiCtr(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u4Byte  u4Tmp;\r
+       u2Byte  u2Tmp[3];\r
+       s4Byte  wifiRssi=0;\r
+       BOOLEAN bWifiBusy = FALSE, bWifiUnderBMode = FALSE;\r
+       static u1Byte nCCKLockCounter = 0;\r
+\r
+\r
+       if (pCoexSta->bUnderIps)\r
+       {\r
+               pCoexSta->nCRCOK_CCK = 0;\r
+               pCoexSta->nCRCOK_11g = 0;\r
+               pCoexSta->nCRCOK_11n = 0;\r
+               pCoexSta->nCRCOK_11nAgg = 0;\r
+\r
+               pCoexSta->nCRCErr_CCK = 0;\r
+               pCoexSta->nCRCErr_11g = 0;\r
+               pCoexSta->nCRCErr_11n = 0;\r
+               pCoexSta->nCRCErr_11nAgg = 0;   \r
+       }\r
+       else\r
+       {\r
+               pCoexSta->nCRCOK_CCK    = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf88);\r
+               pCoexSta->nCRCOK_11g    = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf94);\r
+               pCoexSta->nCRCOK_11n    = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf90);\r
+               pCoexSta->nCRCOK_11nAgg= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfb8);\r
+\r
+               pCoexSta->nCRCErr_CCK    = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf84);\r
+               pCoexSta->nCRCErr_11g    = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf96);\r
+               pCoexSta->nCRCErr_11n    = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf92);\r
+               pCoexSta->nCRCErr_11nAgg = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfba);                \r
+       }\r
+\r
+       //reset counter\r
+       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x1);\r
+       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x0);\r
+}\r
+\r
 VOID\r
 halbtc8723b2ant_QueryBtInfo(\r
        IN      PBTC_COEXIST            pBtCoexist\r
@@ -387,6 +440,8 @@ halbtc8723b2ant_IsWifiStatusChanged(
        static BOOLEAN  bPreWifiBusy=FALSE, bPreUnder4way=FALSE, bPreBtHsOn=FALSE;\r
        BOOLEAN bWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE;\r
        BOOLEAN bWifiConnected=FALSE;\r
+       u1Byte                  wifiRssiState=BTC_RSSI_STATE_HIGH;\r
+       \r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
@@ -410,6 +465,15 @@ halbtc8723b2ant_IsWifiStatusChanged(
                        bPreBtHsOn = bBtHsOn;\r
                        return TRUE;\r
                }\r
+\r
+\r
+               wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist,3, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);    \r
+\r
+               if ( (BTC_RSSI_STATE_HIGH ==wifiRssiState ) ||  (BTC_RSSI_STATE_LOW ==wifiRssiState ))\r
+               {\r
+                       return TRUE;\r
+               }\r
+       \r
        }\r
 \r
        return FALSE;\r
@@ -1201,46 +1265,57 @@ halbtc8723b2ant_CoexTableWithType(
        IN      u1Byte                          type\r
        )\r
 {\r
+       pCoexSta->nCoexTableType = type;\r
+       \r
        switch(type)\r
        {\r
                case 0:\r
-                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, 0xffff, 0x3);\r
+                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, 0xffffff, 0x3);\r
                        break;\r
                case 1:\r
-                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5afa5afa, 0xffff, 0x3);\r
+                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5afa5afa, 0xffffff, 0x3);\r
                        break;\r
                case 2:\r
-                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffff, 0x3);\r
+                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5ada5ada, 0x5ada5ada, 0xffffff, 0x3);\r
                        break;\r
                case 3:\r
-                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffff, 0x3);\r
+                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3);\r
                        break;\r
                case 4:\r
-                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0xffffffff, 0xffff, 0x3);\r
+                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0xffffffff, 0xffffff, 0x3);\r
                        break;\r
                case 5:\r
-                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5fff5fff, 0xffff, 0x3);\r
+                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5fff5fff, 0xffffff, 0x3);\r
                        break;\r
                case 6:\r
-                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);\r
+                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5a5a5a, 0xffffff, 0x3);\r
                        break;\r
                case 7:\r
-                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0xfafafafa, 0xffff, 0x3);\r
+                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\r
                        break;\r
                case 8:\r
-                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5aea5aea, 0x5aea5aea, 0xffff, 0x3);\r
+                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\r
                        break;\r
                case 9:\r
-                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5aea5aea, 0xffff, 0x3);\r
+                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\r
                        break;\r
                case 10:\r
-                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5aff5aff, 0xffff, 0x3);\r
+                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\r
                        break;\r
                case 11:\r
-                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5f5a5f, 0xffff, 0x3);\r
+                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\r
                        break;\r
                case 12:\r
-                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5f5f5f5f, 0xffff, 0x3);\r
+                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\r
+                       break;\r
+               case 13:\r
+                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0xaaaaaaaa, 0xffffff, 0x3);\r
+                       break;\r
+               case 14:\r
+                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5ada5ada, 0xffffff, 0x3);\r
+                       break;\r
+               case 15:\r
+                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0xaaaaaaaa, 0xffffff, 0x3);\r
                        break;\r
                default:\r
                        break;\r
@@ -1266,6 +1341,55 @@ halbtc8723b2ant_SetFwIgnoreWlanAct(
        pBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter);\r
 }\r
 \r
+VOID\r
+halbtc8723b2ant_SetLpsRpwm(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  lpsVal,\r
+       IN      u1Byte                  rpwmVal\r
+       )\r
+{\r
+       u1Byte  lps=lpsVal;\r
+       u1Byte  rpwm=rpwmVal;\r
+       \r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_LPS_VAL, &lps);\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RPWM_VAL, &rpwm);\r
+}\r
+\r
+VOID\r
+halbtc8723b2ant_LpsRpwm(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      u1Byte                  lpsVal,\r
+       IN      u1Byte                  rpwmVal\r
+       )\r
+{\r
+       BOOLEAN bForceExecPwrCmd=FALSE;\r
+       \r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set lps/rpwm=0x%x/0x%x \n", \r
+               (bForceExec? "force to":""), lpsVal, rpwmVal));\r
+       pCoexDm->curLps = lpsVal;\r
+       pCoexDm->curRpwm = rpwmVal;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], LPS-RxBeaconMode=0x%x , LPS-RPWM=0x%x!!\n", \r
+                        pCoexDm->curLps, pCoexDm->curRpwm));\r
+\r
+               if( (pCoexDm->preLps == pCoexDm->curLps) &&\r
+                       (pCoexDm->preRpwm == pCoexDm->curRpwm) )\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], LPS-RPWM_Last=0x%x , LPS-RPWM_Now=0x%x!!\n", \r
+                                pCoexDm->preRpwm, pCoexDm->curRpwm));\r
+\r
+                       return;\r
+               }\r
+       }\r
+       halbtc8723b2ant_SetLpsRpwm(pBtCoexist, lpsVal, rpwmVal);\r
+\r
+       pCoexDm->preLps = pCoexDm->curLps;\r
+       pCoexDm->preRpwm = pCoexDm->curRpwm;\r
+}\r
+\r
 VOID\r
 halbtc8723b2ant_IgnoreWlanAct(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
@@ -1302,6 +1426,12 @@ halbtc8723b2ant_SetFwPstdma(
 {\r
        u1Byte                  H2C_Parameter[5] ={0};\r
 \r
+\r
+        if ( (pCoexSta->bA2dpExist) && (pCoexSta->bHidExist) )\r
+        {\r
+               byte5 = byte5 | 0x1;\r
+        }\r
+        \r
        H2C_Parameter[0] = byte1;       \r
        H2C_Parameter[1] = byte2;       \r
        H2C_Parameter[2] = byte3;\r
@@ -1342,7 +1472,7 @@ halbtc8723b2ant_SwMechanism1(
        }\r
        */\r
        \r
-       halbtc8723b2ant_RfShrink(pBtCoexist, NORMAL_EXEC, bShrinkRxLPF);\r
+       //halbtc8723b2ant_RfShrink(pBtCoexist, NORMAL_EXEC, bShrinkRxLPF);\r
        halbtc8723b2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);\r
 }\r
 \r
@@ -1355,9 +1485,9 @@ halbtc8723b2ant_SwMechanism2(
        IN      u4Byte          dacSwingLvl\r
        ) \r
 {\r
-       halbtc8723b2ant_AgcTable(pBtCoexist, NORMAL_EXEC, bAGCTableShift);\r
+       //halbtc8723b2ant_AgcTable(pBtCoexist, NORMAL_EXEC, bAGCTableShift);\r
        //halbtc8723b2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, bADCBackOff);\r
-       halbtc8723b2ant_DacSwing(pBtCoexist, NORMAL_EXEC, bSWDACSwing, dacSwingLvl);\r
+       //halbtc8723b2ant_DacSwing(pBtCoexist, NORMAL_EXEC, bSWDACSwing, dacSwingLvl);\r
 }\r
 \r
 VOID\r
@@ -1390,19 +1520,20 @@ halbtc8723b2ant_SetAntPath(
 \r
                if(fwVer >= 0x180000)\r
                {\r
-               /* Use H2C to set GNT_BT to LOW */\r
-               H2C_Parameter[0] = 0;\r
+                       /* Use H2C to set GNT_BT to High to avoid A2DP click */\r
+                       H2C_Parameter[0] = 1;\r
                pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\r
                }\r
                else\r
                {\r
-                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x0);\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);\r
                }\r
                \r
                pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\r
 \r
                pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); //WiFi TRx Mask off\r
-               pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01); //BT TRx Mask off\r
+               //remove due to interrupt is disabled that polling c2h will fail and delay 100ms.\r
+               //pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01); //BT TRx Mask off\r
 \r
                if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
                {\r
@@ -1427,6 +1558,19 @@ halbtc8723b2ant_SetAntPath(
                }\r
                pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\r
        }\r
+       else\r
+       {\r
+               if(fwVer >= 0x180000)\r
+               {\r
+                       /* Use H2C to set GNT_BT to "Control by PTA"*/\r
+                       H2C_Parameter[0] = 0;\r
+                       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);                    \r
+               }\r
+               else\r
+               {\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x0);\r
+               }\r
+       }\r
 \r
        // ext switch setting\r
        if(bUseExtSwitch)\r
@@ -1485,6 +1629,16 @@ halbtc8723b2ant_PsTdma(
 {\r
        BOOLEAN                 bTurnOnByCnt=FALSE;\r
        u1Byte                  psTdmaTypeByCnt=0;\r
+       u1Byte                  wifiRssiState1, btRssiState;\r
+\r
+       \r
+       wifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\r
+       btRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\r
+\r
+       if (!(BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState)) && bTurnOn)\r
+       {\r
+               type = type +100;  //for WiFi RSSI low or BT RSSI low\r
+       }\r
 \r
        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", \r
                (bForceExec? "force to":""), (bTurnOn? "ON":"OFF"), type));\r
@@ -1508,10 +1662,12 @@ halbtc8723b2ant_PsTdma(
                {\r
                        case 1:\r
                        default:\r
-                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\r
+                               //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90);\r
                                break;\r
                        case 2:\r
-                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);\r
+                               //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);\r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x03, 0xf1, 0x90);\r
                                break;\r
                        case 3:\r
                                halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90);\r
@@ -1520,10 +1676,12 @@ halbtc8723b2ant_PsTdma(
                                halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x03, 0xf1, 0x90);\r
                                break;\r
                        case 5:\r
-                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);\r
+                               //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);\r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x3, 0x70, 0x90);                           \r
                                break;\r
                        case 6:\r
-                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);\r
+                               //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);\r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x3, 0x70, 0x90);\r
                                break;\r
                        case 7:\r
                                halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90);\r
@@ -1532,28 +1690,36 @@ halbtc8723b2ant_PsTdma(
                                halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x10, 0x3, 0x70, 0x90);\r
                                break;\r
                        case 9: \r
-                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\r
+                               //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90);\r
                                break;\r
                        case 10:        \r
-                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);\r
+                               //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);\r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x03, 0xf1, 0x90);\r
                                break;\r
                        case 11:        \r
-                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0xe1, 0x90);\r
+                               //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0xe1, 0x90);\r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90);\r
                                break;\r
                        case 12:\r
-                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);\r
+                               //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);\r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0xf1, 0x90);\r
                                break;\r
                        case 13:\r
-                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);\r
+                               //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);\r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x3, 0x70, 0x90);           \r
                                break;\r
                        case 14:\r
-                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);\r
+                               //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);\r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x3, 0x70, 0x90);           \r
                                break;\r
                        case 15:\r
-                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0x60, 0x90);\r
+                               //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0x60, 0x90);\r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90);           \r
                                break;\r
                        case 16:\r
-                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0x60, 0x90);\r
+                               //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0x60, 0x90);\r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0x70, 0x90);           \r
                                break;\r
                        case 17:\r
                                halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x2f, 0x2f, 0x60, 0x90);\r
@@ -1571,7 +1737,45 @@ halbtc8723b2ant_PsTdma(
                                halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90);\r
                                break;  \r
                        case 71:\r
-                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\r
+                               //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\r
+\r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90);\r
+                               break;\r
+                       case 101:\r
+                       case 105:\r
+                       case 171:       \r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x3a, 0x03, 0x70, 0x50);\r
+                               break;\r
+                       case 102:\r
+                       case 106:\r
+                       case 110:\r
+                       case 114:       \r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x2d, 0x03, 0x70, 0x50);\r
+                               break;  \r
+                       case 103:\r
+                       case 107:\r
+                       case 111:\r
+                       case 115:       \r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1c, 0x03, 0x70, 0x50);\r
+                               break;          \r
+                       case 104:\r
+                       case 108:\r
+                       case 112:\r
+                       case 116:       \r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x10, 0x03, 0x70, 0x50);\r
+                               break;  \r
+                       case 109:\r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90);\r
+                               break;\r
+                       case 113:       \r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x70, 0x90);\r
+                               break;\r
+                       case 121:       \r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90);\r
+                               break;  \r
+                       case 22:\r
+                       case 122:\r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x35, 0x03, 0x71, 0x11);\r
                                break;\r
                }\r
        }\r
@@ -1597,12 +1801,89 @@ halbtc8723b2ant_PsTdma(
        pCoexDm->prePsTdma = pCoexDm->curPsTdma;\r
 }\r
 \r
+VOID\r
+halbtc8723b2ant_PsTdmaCheckForPowerSaveState(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bNewPsState\r
+       )\r
+{\r
+       u1Byte  lpsMode=0x0;\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_LPS_MODE, &lpsMode);\r
+       \r
+       if(lpsMode)     // already under LPS state\r
+       {\r
+               if(bNewPsState)         \r
+               {\r
+                       // keep state under LPS, do nothing.\r
+               }\r
+               else\r
+               {\r
+                       // will leave LPS state, turn off psTdma first\r
+                       halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               }\r
+       }\r
+       else                                            // NO PS state\r
+       {\r
+               if(bNewPsState)\r
+               {\r
+                       // will enter LPS state, turn off psTdma first\r
+                       halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               }\r
+               else\r
+               {\r
+                       // keep state under NO PS state, do nothing.\r
+               }\r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8723b2ant_PowerSaveState(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                          psType,\r
+       IN      u1Byte                          lpsVal,\r
+       IN      u1Byte                          rpwmVal\r
+       )\r
+{\r
+       BOOLEAN         bLowPwrDisable=FALSE;\r
+       \r
+       switch(psType)\r
+       {\r
+               case BTC_PS_WIFI_NATIVE:\r
+                       // recover to original 32k low power setting\r
+                       bLowPwrDisable = FALSE;\r
+                       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+                       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\r
+                       pCoexSta->bForceLpsOn = FALSE;\r
+                       break;\r
+               case BTC_PS_LPS_ON:\r
+                       halbtc8723b2ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE);\r
+                       halbtc8723b2ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal);                      \r
+                       // when coex force to enter LPS, do not enter 32k low power.\r
+                       bLowPwrDisable = TRUE;\r
+                       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+                       // power save must executed before psTdma.                      \r
+                       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL);\r
+                       pCoexSta->bForceLpsOn = TRUE;\r
+                       break;\r
+               case BTC_PS_LPS_OFF:\r
+                       halbtc8723b2ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE);\r
+                       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\r
+                       pCoexSta->bForceLpsOn = FALSE;\r
+                       break;\r
+               default:\r
+                       break;\r
+       }\r
+}\r
+\r
+\r
 VOID\r
 halbtc8723b2ant_CoexAllOff(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
        // fw all off\r
+       halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);               \r
        halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
        halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
@@ -1622,7 +1903,9 @@ halbtc8723b2ant_InitCoexDm(
        )\r
 {      \r
        // force to reset coex mechanism\r
+       halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
        \r
+       halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);               \r
        halbtc8723b2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);\r
        halbtc8723b2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, 0);\r
@@ -1636,33 +1919,130 @@ halbtc8723b2ant_ActionBtInquiry(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
+       u1Byte          wifiRssiState, wifiRssiState1, btRssiState;\r
        BOOLEAN bWifiConnected=FALSE;\r
        BOOLEAN bLowPwrDisable=TRUE;\r
+       BOOLEAN         bScan=FALSE, bLink=FALSE, bRoam=FALSE;\r
+\r
+\r
+       wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       wifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\r
+       btRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\r
        \r
        pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
 \r
-       if(bWifiConnected)\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
+               \r
+       \r
+       halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);               \r
+\r
+       if(bScan || bLink || bRoam)\r
        {\r
-               halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
-               halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi link process + BT Inq/Page!!\n"));\r
+               halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 15);         \r
+               halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\r
+       }\r
+       else if(bWifiConnected)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT Inq/Page!!\n"));\r
+               halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 15);         \r
+               halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\r
        }\r
        else\r
        {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi no-link + BT Inq/Page!!\n"));\r
                halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
                halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
        }       \r
+       \r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);\r
        halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
        halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
        halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
-\r
+/*\r
        pCoexDm->bNeedRecover0x948 = TRUE;\r
        pCoexDm->backup0x948 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\r
 \r
        halbtc8723b2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_AUX, FALSE, FALSE);\r
+*/     \r
 }\r
+\r
+\r
+VOID\r
+halbtc8723b2ant_ActionWiFiLinkProcess(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u4Byte  u4Tmp;\r
+       u1Byte  u1Tmpa, u1Tmpb;\r
+       \r
+       halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 15);         \r
+       halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\r
+\r
+       halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+       halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+\r
+\r
+        u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\r
+        u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\r
+        u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e);\r
+\r
+        BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x76e=0x%x\n",\r
+                     u4Tmp,  u1Tmpa, u1Tmpb));\r
+}\r
+\r
+BOOLEAN\r
+halbtc8723b2ant_ActionWifiIdleProcess(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{      \r
+       u1Byte          wifiRssiState, wifiRssiState1, btRssiState;\r
+       u4Byte          wifiBw;\r
+       u1Byte          apNum=0;\r
+\r
+       wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       //wifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\r
+       wifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES-20, 0);\r
+       btRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\r
+\r
+       // define the office environment\r
+       if(BTC_RSSI_HIGH(wifiRssiState1) && \r
+                       (pCoexSta->bHidExist == TRUE) && (pCoexSta->bA2dpExist == TRUE))\r
+       {\r
+\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi  idle process for BT HID+A2DP exist!!\n"));\r
+               \r
+               halbtc8723b2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x6);\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
+\r
+               // sw all off\r
+               halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+               halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+\r
+               halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
+\r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);               \r
+               halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+\r
+               return TRUE;\r
+       }\r
+       else\r
+       {\r
+               halbtc8723b2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18);\r
+               return FALSE;   \r
+       }\r
+       \r
+       \r
+}\r
+\r
+\r
+\r
 BOOLEAN\r
 halbtc8723b2ant_IsCommonAction(\r
        IN      PBTC_COEXIST            pBtCoexist\r
@@ -1671,6 +2051,7 @@ halbtc8723b2ant_IsCommonAction(
        u1Byte                  btRssiState=BTC_RSSI_STATE_HIGH;\r
        BOOLEAN                 bCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;\r
        BOOLEAN                 bBtHsOn=FALSE, bLowPwrDisable=FALSE;\r
+       BOOLEAN                 bAsus8723b=FALSE;\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
@@ -1686,6 +2067,8 @@ halbtc8723b2ant_IsCommonAction(
 \r
                pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
                halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
+               \r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);                       \r
                halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
                halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
                halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
@@ -1707,6 +2090,8 @@ halbtc8723b2ant_IsCommonAction(
 \r
                        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
                        halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
+\r
+                       halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);                       \r
                        halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);              \r
                        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);\r
                        halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
@@ -1728,6 +2113,8 @@ halbtc8723b2ant_IsCommonAction(
 \r
                        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
                        halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
+\r
+                       halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);                       \r
                        halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
                        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);\r
                        halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
@@ -1745,28 +2132,17 @@ halbtc8723b2ant_IsCommonAction(
                        if(bWifiBusy)\r
                        {\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Busy + BT Busy!!\n"));\r
+                               pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_IS_ASUS_8723B, &bAsus8723b);\r
+                               if(!bAsus8723b)\r
                                bCommon = FALSE;\r
+                               else\r
+                                       bCommon = halbtc8723b2ant_ActionWifiIdleProcess(pBtCoexist);    \r
                        }\r
                        else\r
                        {\r
-                               if(bBtHsOn)\r
-                                       return FALSE;\r
-                               \r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n"));\r
-                               btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
-                               halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
-\r
-                               pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
-                               halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
-                               halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 21);\r
-                               halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);\r
-                               if(BTC_RSSI_HIGH(btRssiState))\r
-                                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
-                               else    \r
-                                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
-                               halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
-                               halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
-                               bCommon = TRUE;\r
+                               //bCommon = FALSE;      \r
+                               bCommon = halbtc8723b2ant_ActionWifiIdleProcess(pBtCoexist);                    \r
                        }\r
                }       \r
        }\r
@@ -2694,7 +3070,7 @@ halbtc8723b2ant_ActionSco(
        u4Byte  wifiBw;\r
 \r
        wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
-       btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
+       btRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\r
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
@@ -2718,6 +3094,7 @@ halbtc8723b2ant_ActionSco(
                halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\r
        }\r
 \r
+       halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);                       \r
        halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality\r
 \r
        // sw mechanism\r
@@ -2761,7 +3138,7 @@ halbtc8723b2ant_ActionHid(
        u4Byte  wifiBw;\r
 \r
        wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
-       btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
+       btRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\r
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
@@ -2785,6 +3162,8 @@ halbtc8723b2ant_ActionHid(
                halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 9);\r
        }\r
 \r
+       halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);                       \r
+       \r
        if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
                (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
        {\r
@@ -2837,20 +3216,25 @@ halbtc8723b2ant_ActionA2dp(
        u1Byte          apNum=0;\r
 \r
        wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
-       wifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, 40, 0);\r
-       btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
+       wifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\r
+       btRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\r
 \r
        // define the office environment\r
-       if(apNum >= 10 && BTC_RSSI_HIGH(wifiRssiState1))\r
+       if( (apNum >= 10) && BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\r
        {\r
                //DbgPrint(" AP#>10(%d)\n", apNum);\r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);                       \r
+               \r
                pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);      \r
                halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
                halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);      \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);                   \r
+                                       \r
                halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
+\r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);               \r
                halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
 \r
                // sw mechanism\r
@@ -2866,6 +3250,7 @@ halbtc8723b2ant_ActionA2dp(
                        halbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x18);          \r
                }\r
                return;\r
+               \r
        }\r
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
@@ -2878,7 +3263,18 @@ halbtc8723b2ant_ActionA2dp(
        else    \r
                halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
+               \r
+       if (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\r
+       {\r
        halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);               \r
+       }\r
+       else\r
+       {\r
+               halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13);\r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);           \r
+       }\r
+       \r
 \r
        if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
                (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
@@ -2927,11 +3323,12 @@ halbtc8723b2ant_ActionA2dpPanHs(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       u1Byte          wifiRssiState, btRssiState;\r
+       u1Byte          wifiRssiState, wifiRssiState1, btRssiState;\r
        u4Byte          wifiBw;\r
 \r
        wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
-       btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
+       wifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);  \r
+       btRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\r
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
@@ -2944,7 +3341,16 @@ halbtc8723b2ant_ActionA2dpPanHs(
        else    \r
                halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
+       if (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\r
+       {\r
        halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);               \r
+       }\r
+       else\r
+       {\r
+               halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13);\r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);           \r
+       }\r
 \r
        halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2);\r
 \r
@@ -2985,11 +3391,12 @@ halbtc8723b2ant_ActionPanEdr(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       u1Byte          wifiRssiState, btRssiState;\r
+       u1Byte          wifiRssiState,wifiRssiState1, btRssiState;\r
        u4Byte          wifiBw;\r
 \r
        wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
-       btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
+       wifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);  \r
+       btRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\r
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
@@ -3002,7 +3409,16 @@ halbtc8723b2ant_ActionPanEdr(
        else    \r
                halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
+       if (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\r
+       {\r
        halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 10);\r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);               \r
+       }\r
+       else\r
+       {\r
+               halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13);\r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);           \r
+       }\r
 \r
        if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
                (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
@@ -3053,11 +3469,12 @@ halbtc8723b2ant_ActionPanHs(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       u1Byte          wifiRssiState, btRssiState;\r
+       u1Byte          wifiRssiState, wifiRssiState1, btRssiState;\r
        u4Byte          wifiBw;\r
 \r
        wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
-       btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
+       wifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);  \r
+       btRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\r
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
@@ -3072,6 +3489,7 @@ halbtc8723b2ant_ActionPanHs(
        \r
        halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
        \r
+       halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);               \r
        halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
@@ -3111,11 +3529,12 @@ halbtc8723b2ant_ActionPanEdrA2dp(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       u1Byte          wifiRssiState, btRssiState;\r
+       u1Byte          wifiRssiState, wifiRssiState1, btRssiState;\r
        u4Byte          wifiBw;\r
 \r
        wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
-       btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
+       wifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);  \r
+       btRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\r
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
@@ -3128,12 +3547,18 @@ halbtc8723b2ant_ActionPanEdrA2dp(
        else    \r
                halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
+       if (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))                \r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);               \r
+       else\r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\r
+\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
 \r
        if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
                (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
        {\r
                halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 12);\r
+               \r
                if(BTC_WIFI_BW_HT40 == wifiBw)\r
                        halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\r
                else\r
@@ -3141,7 +3566,7 @@ halbtc8723b2ant_ActionPanEdrA2dp(
        }\r
        else\r
        {\r
-               halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
+               halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13);\r
                halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\r
        }\r
        \r
@@ -3181,11 +3606,12 @@ halbtc8723b2ant_ActionPanEdrHid(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       u1Byte          wifiRssiState, btRssiState;\r
+       u1Byte          wifiRssiState, wifiRssiState1, btRssiState;\r
        u4Byte          wifiBw;\r
 \r
        wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
-       btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
+       wifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);  \r
+       btRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
 \r
        halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
@@ -3195,19 +3621,30 @@ halbtc8723b2ant_ActionPanEdrHid(
        else    \r
                halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
+       if (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))        \r
+       {\r
+               halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);               \r
+       }\r
+       else\r
+       {\r
+               halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14);\r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\r
+       }\r
+\r
        if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
                (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
        {\r
                if(BTC_WIFI_BW_HT40 == wifiBw)\r
                {\r
                        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 3);\r
-                       halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 11);\r
+                       //halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 11);\r
                        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780);\r
                }\r
                else\r
                {\r
                        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
-                       halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
+                       //halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
                        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
                }\r
                halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2);\r
@@ -3215,7 +3652,7 @@ halbtc8723b2ant_ActionPanEdrHid(
        else\r
        {\r
                halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
-               halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 11);\r
+               //halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14);\r
                pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
                halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
        }\r
@@ -3257,11 +3694,12 @@ halbtc8723b2ant_ActionHidA2dpPanEdr(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       u1Byte          wifiRssiState, btRssiState;\r
+       u1Byte          wifiRssiState,wifiRssiState1,  btRssiState;\r
        u4Byte          wifiBw;\r
 \r
        wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
-       btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
+       wifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);  \r
+       btRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\r
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
@@ -3274,15 +3712,24 @@ halbtc8723b2ant_ActionHidA2dpPanEdr(
        else    \r
                halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+       if (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\r
+       {\r
+               halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);               \r
+       }\r
+       else\r
+       {\r
+               halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14);\r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);           \r
+       }\r
 \r
-       halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
 \r
        if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
                (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
        {\r
                if(BTC_WIFI_BW_HT40 == wifiBw)\r
-                       halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+                       halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\r
                else\r
                        halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\r
        }\r
@@ -3327,13 +3774,14 @@ halbtc8723b2ant_ActionHidA2dp(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       u1Byte          wifiRssiState, btRssiState;\r
+       u1Byte          wifiRssiState, wifiRssiState1, btRssiState;\r
        u4Byte          wifiBw;\r
        u1Byte          apNum=0;\r
 \r
        wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
        //btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
-       btRssiState = halbtc8723b2ant_BtRssiState(3, 29, 37);\r
+       wifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);  \r
+       btRssiState = halbtc8723b2ant_BtRssiState(3, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 37);\r
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
@@ -3368,16 +3816,25 @@ halbtc8723b2ant_ActionHidA2dp(
                        halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
        }\r
 \r
+       if (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\r
+       {\r
        halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);               \r
+       }\r
+       else\r
+       {\r
+               halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14);\r
+               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);           \r
+       }\r
 \r
        if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
                (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
        {\r
-               halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2);\r
+               halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\r
        }\r
        else\r
        {\r
-               halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+               halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\r
        }\r
        \r
        // sw mechanism\r
@@ -3411,6 +3868,43 @@ halbtc8723b2ant_ActionHidA2dp(
        }\r
 }\r
 \r
+VOID\r
+halbtc8723b2ant_ActionBtWhckTest(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
+\r
+       // sw all off\r
+       halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+       halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+\r
+       halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+       \r
+       halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+       halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
+}\r
+\r
+VOID\r
+halbtc8723b2ant_ActionWifiMultiPort(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{              \r
+       halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
+\r
+       // sw all off\r
+       halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+       halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+\r
+       // hw all off\r
+       //pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
+       halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
+\r
+       halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);               \r
+       halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+}\r
+\r
 VOID\r
 halbtc8723b2ant_RunCoexistMechanism(\r
        IN      PBTC_COEXIST            pBtCoexist\r
@@ -3419,6 +3913,11 @@ halbtc8723b2ant_RunCoexistMechanism(
        BOOLEAN                         bWifiUnder5G=FALSE, bBtHsOn=FALSE;\r
        u1Byte                          btInfoOriginal=0, btRetryCnt=0;\r
        u1Byte                          algorithm=0;\r
+       u4Byte                          numOfWifiLink=0;\r
+       u4Byte                          wifiLinkStatus=0;\r
+       PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
+       BOOLEAN                         bMiracastPlusBt=FALSE;\r
+       BOOLEAN                         bScan=FALSE, bLink=FALSE, bRoam=FALSE;\r
 \r
        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism()===>\n"));\r
 \r
@@ -3434,6 +3933,13 @@ halbtc8723b2ant_RunCoexistMechanism(
                return;\r
        }\r
 \r
+       if(pCoexSta->bBtWhckTest)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT is under WHCK TEST!!!\n"));\r
+               halbtc8723b2ant_ActionBtWhckTest(pBtCoexist);\r
+               return;\r
+       }\r
+\r
        algorithm = halbtc8723b2ant_ActionAlgorithm(pBtCoexist);\r
        if(pCoexSta->bC2hBtInquiryPage && (BT_8723B_2ANT_COEX_ALGO_PANHS!=algorithm))\r
        {\r
@@ -3443,11 +3949,53 @@ halbtc8723b2ant_RunCoexistMechanism(
        }\r
        else\r
        {\r
+               /*\r
                if(pCoexDm->bNeedRecover0x948)\r
                {\r
                        pCoexDm->bNeedRecover0x948 = FALSE;\r
                        pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, pCoexDm->backup0x948);\r
                }\r
+               */\r
+       }\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
+\r
+       if(bScan || bLink || bRoam)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], WiFi is under Link Process !!\n"));\r
+               halbtc8723b2ant_ActionWiFiLinkProcess(pBtCoexist);\r
+               return;\r
+       }\r
+\r
+       //for P2P\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
+       numOfWifiLink = wifiLinkStatus>>16;\r
+       \r
+       if((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED))\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex],  Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\n", numOfWifiLink,wifiLinkStatus) );\r
+\r
+               if(pBtLinkInfo->bBtLinkExist)\r
+               {\r
+                       bMiracastPlusBt = TRUE;\r
+               }\r
+               else\r
+               {\r
+                       bMiracastPlusBt = FALSE;\r
+               }\r
+               \r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\r
+               halbtc8723b2ant_ActionWifiMultiPort(pBtCoexist);\r
+               \r
+               return;\r
+       }\r
+       else\r
+       {\r
+               bMiracastPlusBt = FALSE;\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\r
        }\r
 \r
        pCoexDm->curAlgorithm = algorithm;\r
@@ -3576,12 +4124,13 @@ halbtc8723b2ant_InitHwConfig(
 \r
        //Antenna config        \r
        halbtc8723b2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_MAIN, TRUE, FALSE);\r
+       pCoexSta->disVerInfoCnt = 0;\r
 \r
        // PTA parameter\r
        halbtc8723b2ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\r
        \r
        // Enable counter statistics\r
-       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); //0x76e[3] =1, WLAN_Act control by PTA\r
        pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3);\r
        pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);\r
 }\r
@@ -3598,7 +4147,6 @@ EXhalbtc8723b2ant_PowerOnSetting(
        )\r
 {\r
        PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
-       u1Byte u1Tmp=0x4; /* Set BIT2 by default since it's 2ant case */\r
        u2Byte u2Tmp=0x0;\r
 \r
        pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x67, 0x20);\r
@@ -3607,10 +4155,36 @@ EXhalbtc8723b2ant_PowerOnSetting(
        u2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x2);\r
        pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x2, u2Tmp|BIT0|BIT1);\r
 \r
-       // set GRAN_BT = 1\r
-       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);\r
-       // set WLAN_ACT = 0\r
-       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);     \r
+       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\r
+\r
+       if(pBtCoexist->chipInterface == BTC_INTF_USB)\r
+       {\r
+               // fixed at S0 for USB interface\r
+               pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\r
+       }\r
+       else\r
+       {\r
+               // for PCIE and SDIO interface, we check efuse 0xc3[6]\r
+               if(pBoardInfo->singleAntPath == 0)\r
+               {\r
+                       // set to S1\r
+                       pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;\r
+               }\r
+               else if(pBoardInfo->singleAntPath == 1)\r
+               {\r
+                       // set to S0\r
+                       pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\r
+               }\r
+       }\r
+}\r
+\r
+VOID\r
+EXhalbtc8723b2ant_PreLoadFirmware(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
+       u1Byte u1Tmp=0x4; /* Set BIT2 by default since it's 2ant case */\r
 \r
        // \r
        // S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info)\r
@@ -3622,28 +4196,19 @@ EXhalbtc8723b2ant_PowerOnSetting(
        if(pBtCoexist->chipInterface == BTC_INTF_USB)\r
        {\r
                // fixed at S0 for USB interface\r
-               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\r
-\r
                u1Tmp |= 0x1;   // antenna inverse\r
                pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp);\r
-\r
-               pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\r
        }\r
        else\r
        {\r
                // for PCIE and SDIO interface, we check efuse 0xc3[6]\r
                if(pBoardInfo->singleAntPath == 0)\r
                {\r
-                       // set to S1\r
-                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);\r
-                       pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;\r
                }\r
                else if(pBoardInfo->singleAntPath == 1)\r
                {\r
                        // set to S0\r
-                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\r
                        u1Tmp |= 0x1;   // antenna inverse\r
-                       pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\r
                }\r
 \r
                if(pBtCoexist->chipInterface == BTC_INTF_PCI)\r
@@ -3687,13 +4252,8 @@ EXhalbtc8723b2ant_DisplayCoexInfo(
        pu1Byte                         cliBuf=pBtCoexist->cliBuf;\r
        u1Byte                          u1Tmp[4], i, btInfoExt, psTdmaCase=0;\r
        u4Byte                          u4Tmp[4];\r
-       BOOLEAN                         bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;\r
-       BOOLEAN                         bBtHsOn=FALSE, bWifiBusy=FALSE;\r
-       s4Byte                          wifiRssi=0, btHsRssi=0;\r
-       u4Byte                          wifiBw, wifiTrafficDir, faOfdm, faCck;\r
-       u1Byte                          wifiDot11Chnl, wifiHsChnl;\r
+       u4Byte                          faOfdm, faCck;\r
        u4Byte                          fwVer=0, btPatchVer=0;\r
-       u1Byte                          apNum=0;\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
        CL_PRINTF(cliBuf);\r
@@ -3720,52 +4280,39 @@ EXhalbtc8723b2ant_DisplayCoexInfo(
                GLCoexVerDate8723b2Ant, GLCoexVer8723b2Ant, fwVer, btPatchVer, btPatchVer);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsChnl(HsMode)", \\r
-               wifiDot11Chnl, wifiHsChnl, bBtHsOn);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "H2C Wifi inform bt chnl Info", \\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "Wifi channel informed to BT", \\r
                pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\r
                pCoexDm->wifiChnlInfo[2]);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d", "Wifi rssi/ HS rssi/ AP#", \\r
-               wifiRssi, btHsRssi, apNum);\r
+       // wifi status\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============");\r
        CL_PRINTF(cliBuf);\r
+       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \\r
-               bLink, bRoam, bScan);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ", "Wifi status", \\r
-               (bWifiUnder5G? "5G":"2.4G"),\r
-               ((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),\r
-               ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[BT Status]============");\r
        CL_PRINTF(cliBuf);\r
 \r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %ddBm/ %d] ", "BT [status/ rssi/ retryCnt]", \\r
                ((pBtCoexist->btInfo.bBtDisabled)? ("disabled"):        ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? "non-connected idle":\r
                (  (BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy")))),\r
-               pCoexSta->btRssi, pCoexSta->btRetryCnt);\r
+               pCoexSta->btRssi-100, pCoexSta->btRetryCnt);\r
        CL_PRINTF(cliBuf);\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP", \\r
                pBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist);\r
        CL_PRINTF(cliBuf);\r
+\r
+       if (pStackInfo->bProfileNotified)\r
+       {\r
        pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\r
+       }\r
+       else\r
+       {\r
+               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT Role", \\r
+               (pBtLinkInfo->bSlaveRole )? "Slave":"Master");\r
+               CL_PRINTF(cliBuf);      \r
+       }       \r
 \r
        btInfoExt = pCoexSta->btInfoExt;\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT Info A2DP rate", \\r
@@ -3785,12 +4332,6 @@ EXhalbtc8723b2ant_DisplayCoexInfo(
                }\r
        }\r
 \r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/%s", "PS state, IPS/LPS", \\r
-               ((pCoexSta->bUnderIps? "IPS ON":"IPS OFF")),\r
-               ((pCoexSta->bUnderLps? "LPS ON":"LPS OFF")));\r
-       CL_PRINTF(cliBuf);\r
-       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);\r
-\r
        // Sw mechanism \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw mechanism]============");\r
        CL_PRINTF(cliBuf);\r
@@ -3812,6 +4353,10 @@ EXhalbtc8723b2ant_DisplayCoexInfo(
                pCoexDm->psTdmaPara[4], psTdmaCase, pCoexDm->bAutoTdmaAdjust);\r
        CL_PRINTF(cliBuf);\r
 \r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "Coex Table Type", \\r
+                       pCoexSta->nCoexTableType);\r
+               CL_PRINTF(cliBuf);\r
+\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "DecBtPwr/ IgnWlanAct", \\r
                pCoexDm->curBtDecPwrLvl, pCoexDm->bCurIgnoreWlanAct);\r
        CL_PRINTF(cliBuf);\r
@@ -3882,6 +4427,14 @@ EXhalbtc8723b2ant_DisplayCoexInfo(
                u4Tmp[0]&0xffff, faOfdm, faCck);\r
        CL_PRINTF(cliBuf);\r
 \r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", "CRC_OK CCK/11g/11n/11n-Agg", \\r
+               pCoexSta->nCRCOK_CCK, pCoexSta->nCRCOK_11g, pCoexSta->nCRCOK_11n, pCoexSta->nCRCOK_11nAgg);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", "CRC_Err CCK/11g/11n/11n-Agg", \\r
+               pCoexSta->nCRCErr_CCK, pCoexSta->nCRCErr_11g, pCoexSta->nCRCErr_11n, pCoexSta->nCRCErr_11nAgg);\r
+       CL_PRINTF(cliBuf);      \r
+\r
        u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\r
        u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\r
        u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\r
@@ -3897,7 +4450,7 @@ EXhalbtc8723b2ant_DisplayCoexInfo(
                pCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\r
        CL_PRINTF(cliBuf);\r
 #if(BT_AUTO_REPORT_ONLY_8723B_2ANT == 1)\r
-       halbtc8723b2ant_MonitorBtCtr(pBtCoexist);\r
+       //halbtc8723b2ant_MonitorBtCtr(pBtCoexist);\r
 #endif\r
        pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\r
 }\r
@@ -3951,6 +4504,15 @@ EXhalbtc8723b2ant_ScanNotify(
        IN      u1Byte                  type\r
        )\r
 {\r
+       u4Byte  u4Tmp;\r
+       u1Byte  u1Tmpa, u1Tmpb; \r
+       \r
+\r
+\r
+       u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\r
+       u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\r
+       u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e);\r
+       \r
        if(BTC_SCAN_START == type)\r
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));\r
@@ -3959,6 +4521,9 @@ EXhalbtc8723b2ant_ScanNotify(
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));\r
        }\r
+\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x76e=0x%x\n",\r
+               u4Tmp,  u1Tmpa, u1Tmpb));\r
 }\r
 \r
 VOID\r
@@ -4083,6 +4648,12 @@ EXhalbtc8723b2ant_BtInfoNotify(
                return;\r
        }\r
 \r
+       // if 0xff, it means BT is under WHCK test\r
+       if (btInfo == 0xff)\r
+               pCoexSta->bBtWhckTest = TRUE;\r
+       else\r
+               pCoexSta->bBtWhckTest = FALSE;\r
+\r
        if(BT_INFO_SRC_8723B_2ANT_WIFI_FW != rspSource)\r
        {\r
                pCoexSta->btRetryCnt =  // [3:0]\r
@@ -4174,6 +4745,12 @@ EXhalbtc8723b2ant_BtInfoNotify(
                        pCoexSta->bScoExist = TRUE;\r
                else\r
                        pCoexSta->bScoExist = FALSE;\r
+\r
+               if ( (pCoexSta->bHidExist == FALSE) && (pCoexSta->bC2hBtInquiryPage == FALSE) )\r
+               {\r
+                       if (pCoexSta->highPriorityTx  + pCoexSta->highPriorityRx >= 160)                \r
+                               pCoexSta->bHidExist = TRUE;\r
+               }\r
        }\r
 \r
        halbtc8723b2ant_UpdateBtLinkInfo(pBtCoexist);\r
@@ -4234,7 +4811,8 @@ EXhalbtc8723b2ant_HaltNotify(
        BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n"));\r
 \r
        halbtc8723b2ant_WifiOffHwCfg(pBtCoexist);\r
-       pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); //BT goto standby while GNT_BT 1-->0\r
+       //remove due to interrupt is disabled that polling c2h will fail and delay 100ms.\r
+       //pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); //BT goto standby while GNT_BT 1-->0\r
        halbtc8723b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
        \r
        EXhalbtc8723b2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\r
@@ -4266,16 +4844,16 @@ EXhalbtc8723b2ant_Periodical(
        IN      PBTC_COEXIST                    pBtCoexist\r
        )\r
 {\r
-       static u1Byte           disVerInfoCnt=0;\r
+       //static u1Byte         disVerInfoCnt=0;\r
        u4Byte                          fwVer=0, btPatchVer=0;\r
        PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
        PBTC_STACK_INFO         pStackInfo=&pBtCoexist->stackInfo;\r
 \r
        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ==========================Periodical===========================\n"));\r
 \r
-       if(disVerInfoCnt <= 5)\r
+       if(pCoexSta->disVerInfoCnt <= 5)\r
        {\r
-               disVerInfoCnt += 1;\r
+               pCoexSta->disVerInfoCnt += 1;\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n"));\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", \\r
                        pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos));\r
@@ -4286,13 +4864,22 @@ EXhalbtc8723b2ant_Periodical(
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", \\r
                        GLCoexVerDate8723b2Ant, GLCoexVer8723b2Ant, fwVer, btPatchVer, btPatchVer));\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n"));\r
+\r
+               if (pCoexSta->disVerInfoCnt == 3)\r
+               {\r
+                       //Antenna config to set 0x765 = 0x0 (GNT_BT control by PTA) after initial \r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Set GNT_BT control by PTA\n"));\r
+                       halbtc8723b2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_MAIN, FALSE, FALSE);\r
+               }\r
        }\r
 \r
 #if(BT_AUTO_REPORT_ONLY_8723B_2ANT == 0)\r
        halbtc8723b2ant_QueryBtInfo(pBtCoexist);\r
-       halbtc8723b2ant_MonitorBtCtr(pBtCoexist);\r
        halbtc8723b2ant_MonitorBtEnableDisable(pBtCoexist);\r
 #else\r
+       halbtc8723b2ant_MonitorBtCtr(pBtCoexist);\r
+       halbtc8723b2ant_MonitorWiFiCtr(pBtCoexist);\r
+       \r
        if( halbtc8723b2ant_IsWifiStatusChanged(pBtCoexist) ||\r
                pCoexDm->bAutoTdmaAdjust)\r
        {\r
index d16466d18f79298786e2d797205278246480a3d1..2c049f9fcebfd2116296ac191c8e845f08a084e6 100755 (executable)
 \r
 #define                BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT             2\r
 \r
+\r
+#define        BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES                                42  //WiFi RSSI Threshold for 2-Ant TDMA/1-Ant PS-TDMA translation\r
+#define        BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES                          46 //BT RSSI Threshold for 2-Ant TDMA/1-Ant PS-TDMA translation\r
+\r
 typedef enum _BT_INFO_SRC_8723B_2ANT{\r
        BT_INFO_SRC_8723B_2ANT_WIFI_FW                  = 0x0,\r
        BT_INFO_SRC_8723B_2ANT_BT_RSP                           = 0x1,\r
@@ -98,6 +102,11 @@ typedef struct _COEX_DM_8723B_2ANT{
 \r
        BOOLEAN         bNeedRecover0x948;\r
        u4Byte          backup0x948;\r
+\r
+       u1Byte          preLps;\r
+       u1Byte          curLps;\r
+       u1Byte          preRpwm;\r
+       u1Byte          curRpwm;\r
 } COEX_DM_8723B_2ANT, *PCOEX_DM_8723B_2ANT;\r
 \r
 typedef struct _COEX_STA_8723B_2ANT{   \r
@@ -120,9 +129,25 @@ typedef struct _COEX_STA_8723B_2ANT{
        BOOLEAN                                 bC2hBtInfoReqSent;\r
        u1Byte                                  btInfoC2h[BT_INFO_SRC_8723B_2ANT_MAX][10];\r
        u4Byte                                  btInfoC2hCnt[BT_INFO_SRC_8723B_2ANT_MAX];\r
+       BOOLEAN                                 bBtWhckTest;\r
        BOOLEAN                                 bC2hBtInquiryPage;\r
        u1Byte                                  btRetryCnt;\r
        u1Byte                                  btInfoExt;\r
+\r
+       u4Byte                                  nCRCOK_CCK;\r
+       u4Byte                                  nCRCOK_11g;\r
+       u4Byte                                  nCRCOK_11n;\r
+       u4Byte                                  nCRCOK_11nAgg;\r
+       \r
+       u4Byte                                  nCRCErr_CCK;\r
+       u4Byte                                  nCRCErr_11g;\r
+       u4Byte                                  nCRCErr_11n;\r
+       u4Byte                                  nCRCErr_11nAgg;\r
+\r
+       u1Byte                                  nCoexTableType;\r
+       BOOLEAN                                 bForceLpsOn;\r
+\r
+       u1Byte                                  disVerInfoCnt;\r
 }COEX_STA_8723B_2ANT, *PCOEX_STA_8723B_2ANT;\r
 \r
 //===========================================\r
@@ -133,6 +158,10 @@ EXhalbtc8723b2ant_PowerOnSetting(
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8723b2ant_PreLoadFirmware(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       );\r
+VOID\r
 EXhalbtc8723b2ant_InitHwConfig(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
        IN      BOOLEAN                         bWifiOnly\r
index d705431b51b3654c9eb9a5a80c3ba84a31bffc29..d081053b8c5c0c733edd816004a61d84f0e79b62 100755 (executable)
@@ -2168,11 +2168,6 @@ EXhalbtc8812a1ant_DisplayCoexInfo(
        pu1Byte                         cliBuf=pBtCoexist->cliBuf;\r
        u1Byte                          u1Tmp[4], i, btInfoExt, psTdmaCase=0;\r
        u4Byte                          u4Tmp[4];\r
-       BOOLEAN                         bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;\r
-       BOOLEAN                         bBtHsOn=FALSE, bWifiBusy=FALSE;\r
-       s4Byte                          wifiRssi=0, btHsRssi=0;\r
-       u4Byte                          wifiBw, wifiTrafficDir;\r
-       u1Byte                          wifiDot11Chnl, wifiHsChnl;\r
        u4Byte                          fwVer=0, btPatchVer=0;\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
@@ -2207,40 +2202,19 @@ EXhalbtc8812a1ant_DisplayCoexInfo(
                GLCoexVerDate8812a1Ant, GLCoexVer8812a1Ant, fwVer, btPatchVer, btPatchVer);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsChnl(HsMode)", \\r
-               wifiDot11Chnl, wifiHsChnl, bBtHsOn);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "H2C Wifi inform bt chnl Info", \\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "Wifi channel informed to BT", \\r
                pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\r
                pCoexDm->wifiChnlInfo[2]);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \\r
-               wifiRssi, btHsRssi);\r
+       // wifi status\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============");\r
        CL_PRINTF(cliBuf);\r
+       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \\r
-               bLink, bRoam, bScan);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[BT Status]============");\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ", "Wifi status", \\r
-               (bWifiUnder5G? "5G":"2.4G"),\r
-               ((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),\r
-               ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));\r
-       CL_PRINTF(cliBuf);\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \\r
                ((pBtCoexist->btInfo.bBtDisabled)? ("disabled"):        ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? "non-connected idle":\r
                (  (BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy")))),\r
@@ -2269,13 +2243,6 @@ EXhalbtc8812a1ant_DisplayCoexInfo(
                        CL_PRINTF(cliBuf);\r
                }\r
        }\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/%s, (0x%x/0x%x)", "PS state, IPS/LPS, (lps/rpwm)", \\r
-               ((pCoexSta->bUnderIps? "IPS ON":"IPS OFF")),\r
-               ((pCoexSta->bUnderLps? "LPS ON":"LPS OFF")), \r
-               pBtCoexist->btInfo.lpsVal, \r
-               pBtCoexist->btInfo.rpwmVal);\r
-       CL_PRINTF(cliBuf);\r
-       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);\r
 \r
        if(!pBtCoexist->bManualControl)\r
        {\r
index e0737098f83d24bc42f06afd5ab5702a563afdff..82029305e9b1858164cdec9c07a67ceacc06de13 100755 (executable)
@@ -4163,11 +4163,6 @@ EXhalbtc8812a2ant_DisplayCoexInfo(
        u1Byte                          u1Tmp[4], i, btInfoExt, psTdmaCase=0;\r
        u2Byte                          u2Tmp[4];\r
        u4Byte                          u4Tmp[4];\r
-       BOOLEAN                         bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;\r
-       BOOLEAN                         bBtHsOn=FALSE, bWifiBusy=FALSE;\r
-       s4Byte                          wifiRssi=0, btHsRssi=0;\r
-       u4Byte                          wifiBw, wifiTrafficDir;\r
-       u1Byte                          wifiDot11Chnl, wifiHsChnl;\r
        u4Byte                          fwVer=0, btPatchVer=0;\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
@@ -4195,41 +4190,18 @@ EXhalbtc8812a2ant_DisplayCoexInfo(
                GLCoexVerDate8812a2Ant, GLCoexVer8812a2Ant, fwVer, btPatchVer, btPatchVer);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsMode(HsChnl)", \\r
-               wifiDot11Chnl, bBtHsOn, wifiHsChnl);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "H2C Wifi inform bt chnl Info", \\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "Wifi channel informed to BT", \\r
                pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\r
                pCoexDm->wifiChnlInfo[2]);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \\r
-               wifiRssi, btHsRssi);\r
+       // wifi status\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============");\r
        CL_PRINTF(cliBuf);\r
+       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \\r
-               bLink, bRoam, bScan);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[BT Status]============");\r
        CL_PRINTF(cliBuf);\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ", "Wifi status", \\r
-               (bWifiUnder5G? "5G":"2.4G"),\r
-               ((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),\r
-               ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));\r
-       CL_PRINTF(cliBuf);\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \\r
                ((pBtCoexist->btInfo.bBtDisabled)? ("disabled"):        ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8812A_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? "non-connected idle":\r
                (  (BT_8812A_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy")))),\r
@@ -4259,15 +4231,6 @@ EXhalbtc8812a2ant_DisplayCoexInfo(
                }\r
        }\r
 \r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/%s, (0x%x/0x%x)", "PS state, IPS/LPS, (lps/rpwm)", \\r
-               ((pCoexSta->bUnderIps? "IPS ON":"IPS OFF")),\r
-               ((pCoexSta->bUnderLps? "LPS ON":"LPS OFF")), \r
-               pBtCoexist->btInfo.lpsVal, \r
-               pBtCoexist->btInfo.rpwmVal);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);\r
-\r
        // Sw mechanism \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw mechanism]============");\r
        CL_PRINTF(cliBuf);\r
index 130566a2f6d462ecf38edfb47b37a782486a9ba3..c05c7668623d8646aaa5231ad0ead788cc52fd6c 100755 (executable)
@@ -2650,11 +2650,7 @@ EXhalbtc8821a1ant_DisplayCoexInfo(
        u1Byte                          u1Tmp[4], i, btInfoExt, psTdmaCase=0;\r
        u2Byte                          u2Tmp[4];\r
        u4Byte                          u4Tmp[4];\r
-       BOOLEAN                         bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;\r
-       BOOLEAN                         bBtHsOn=FALSE, bWifiBusy=FALSE;\r
-       s4Byte                          wifiRssi=0, btHsRssi=0;\r
-       u4Byte                          wifiBw, wifiTrafficDir, faOfdm, faCck, wifiLinkStatus;\r
-       u1Byte                          wifiDot11Chnl, wifiHsChnl;\r
+       u4Byte                          faOfdm, faCck;\r
        u4Byte                          fwVer=0, btPatchVer=0;\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
@@ -2689,46 +2685,17 @@ EXhalbtc8821a1ant_DisplayCoexInfo(
                GLCoexVerDate8821a1Ant, GLCoexVer8821a1Ant, fwVer, btPatchVer, btPatchVer);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsChnl(HsMode)", \\r
-               wifiDot11Chnl, wifiHsChnl, bBtHsOn);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "H2C Wifi inform bt chnl Info", \\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "Wifi channel informed to BT", \\r
                pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\r
                pCoexDm->wifiChnlInfo[2]);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \\r
-               wifiRssi, btHsRssi);\r
+       // wifi status\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============");\r
        CL_PRINTF(cliBuf);\r
+       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \\r
-               bLink, bRoam, bScan);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ", "Wifi status", \\r
-               (bWifiUnder5G? "5G":"2.4G"),\r
-               ((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),\r
-               ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));\r
-       CL_PRINTF(cliBuf);\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d/ %d", "sta/vwifi/hs/p2pGo/p2pGc", \\r
-               ((wifiLinkStatus&WIFI_STA_CONNECTED)? 1:0), ((wifiLinkStatus&WIFI_AP_CONNECTED)? 1:0), \r
-               ((wifiLinkStatus&WIFI_HS_CONNECTED)? 1:0), ((wifiLinkStatus&WIFI_P2P_GO_CONNECTED)? 1:0), \r
-               ((wifiLinkStatus&WIFI_P2P_GC_CONNECTED)? 1:0) );\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[BT Status]============");\r
        CL_PRINTF(cliBuf);\r
        \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \\r
@@ -2759,13 +2726,6 @@ EXhalbtc8821a1ant_DisplayCoexInfo(
                        CL_PRINTF(cliBuf);\r
                }\r
        }\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/%s, (0x%x/0x%x)", "PS state, IPS/LPS, (lps/rpwm)", \\r
-               ((pCoexSta->bUnderIps? "IPS ON":"IPS OFF")),\r
-               ((pCoexSta->bUnderLps? "LPS ON":"LPS OFF")), \r
-               pBtCoexist->btInfo.lpsVal, \r
-               pBtCoexist->btInfo.rpwmVal);\r
-       CL_PRINTF(cliBuf);\r
-       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);\r
 \r
        if(!pBtCoexist->bManualControl)\r
        {\r
index 520c769602924bc00e6390e1ec8f27d36dde3060..14ad651a9eb36c2fce7cf09045a4fe8b8dd1a732 100755 (executable)
@@ -3572,11 +3572,6 @@ EXhalbtc8821a2ant_DisplayCoexInfo(
        pu1Byte                         cliBuf=pBtCoexist->cliBuf;\r
        u1Byte                          u1Tmp[4], i, btInfoExt, psTdmaCase=0;\r
        u4Byte                          u4Tmp[4];\r
-       BOOLEAN                         bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;\r
-       BOOLEAN                         bBtHsOn=FALSE, bWifiBusy=FALSE;\r
-       s4Byte                          wifiRssi=0, btHsRssi=0;\r
-       u4Byte                          wifiBw, wifiTrafficDir;\r
-       u1Byte                          wifiDot11Chnl, wifiHsChnl;\r
        u4Byte                          fwVer=0, btPatchVer=0;\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
@@ -3602,39 +3597,17 @@ EXhalbtc8821a2ant_DisplayCoexInfo(
                GLCoexVerDate8821a2Ant, GLCoexVer8821a2Ant, fwVer, btPatchVer, btPatchVer);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsMode(HsChnl)", \\r
-               wifiDot11Chnl, bBtHsOn, wifiHsChnl);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "H2C Wifi inform bt chnl Info", \\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "Wifi channel informed to BT", \\r
                pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\r
                pCoexDm->wifiChnlInfo[2]);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \\r
-               wifiRssi, btHsRssi);\r
+       // wifi status\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============");\r
        CL_PRINTF(cliBuf);\r
+       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \\r
-               bLink, bRoam, bScan);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ", "Wifi status", \\r
-               (bWifiUnder5G? "5G":"2.4G"),\r
-               ((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),\r
-               ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[BT Status]============");\r
        CL_PRINTF(cliBuf);\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \\r
@@ -3669,12 +3642,6 @@ EXhalbtc8821a2ant_DisplayCoexInfo(
                }\r
        }\r
 \r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/%s", "PS state, IPS/LPS", \\r
-               ((pCoexSta->bUnderIps? "IPS ON":"IPS OFF")),\r
-               ((pCoexSta->bUnderLps? "LPS ON":"LPS OFF")));\r
-       CL_PRINTF(cliBuf);\r
-       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);\r
-\r
        // Sw mechanism \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw mechanism]============");\r
        CL_PRINTF(cliBuf);\r
@@ -3768,12 +3735,6 @@ EXhalbtc8821a2ant_DisplayCoexInfo(
                pCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\r
        CL_PRINTF(cliBuf);\r
 \r
-       // Tx mgnt queue hang or not, 0x41b should = 0xf, ex: 0xd ==>hang\r
-       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x41b);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x41b (mgntQ hang chk == 0xf)", \\r
-               u1Tmp[0]);\r
-       CL_PRINTF(cliBuf);      \r
-\r
        pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\r
 }\r
 \r
index 9a7bed6f2523729ab928d9b043bea74436c12d3a..824b8fbb0f694a6135a36b10505ea53ff60c9862 100755 (executable)
 \r
 #define _BTCOEX_CSR 1\r
 \r
+#ifndef rtw_warn_on\r
+       #define rtw_warn_on(condition) do {} while (0)\r
+#endif\r
+\r
 #if(BT_30_SUPPORT == 1)\r
 //============================================================\r
 // Global variables, these are static variables\r
@@ -1340,14 +1344,14 @@ halbtc8821aCsr2ant_SetFwPstdma(
        H2C_Parameter[2] = byte3;\r
        H2C_Parameter[3] = byte4;\r
        H2C_Parameter[4] = byte5;\r
-       H2C_Parameter[5] = 0x03;\r
+       H2C_Parameter[5] = 0x01;\r
 \r
        pCoexDm->psTdmaPara[0] = byte1;\r
        pCoexDm->psTdmaPara[1] = byte2;\r
        pCoexDm->psTdmaPara[2] = byte3;\r
        pCoexDm->psTdmaPara[3] = byte4;\r
        pCoexDm->psTdmaPara[4] = byte5;\r
-       pCoexDm->psTdmaPara[5] = 0x03;\r
+       pCoexDm->psTdmaPara[5] = 0x01;\r
        \r
        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x60(6bytes)=0x%x%08x%02x\n", \r
                H2C_Parameter[0], \r
@@ -1543,7 +1547,7 @@ halbtc8821aCsr2ant_PsTdma(
                                halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90);\r
                                break;\r
                        case 22:        //ad2dp master\r
-                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xeb, 0x12, 0x12, 0x21, 0x10);\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xeb, 0x11, 0x11, 0x21, 0x10);\r
                                break;\r
                        case 23:        //a2dp slave\r
                                halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xeb, 0x12, 0x12, 0x20, 0x10);\r
@@ -3842,11 +3846,6 @@ EXhalbtc8821aCsr2ant_DisplayCoexInfo(
        pu1Byte                         cliBuf=pBtCoexist->cliBuf;\r
        u1Byte                          u1Tmp[4], i, btInfoExt, psTdmaCase=0;\r
        u4Byte                          u4Tmp[4];\r
-       BOOLEAN                         bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;\r
-       BOOLEAN                         bBtHsOn=FALSE, bWifiBusy=FALSE;\r
-       s4Byte                          wifiRssi=0, btHsRssi=0;\r
-       u4Byte                          wifiBw, wifiTrafficDir;\r
-       u1Byte                          wifiDot11Chnl, wifiHsChnl;\r
        u4Byte                          fwVer=0, btPatchVer=0;\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
@@ -3872,39 +3871,17 @@ EXhalbtc8821aCsr2ant_DisplayCoexInfo(
                GLCoexVerDate8821aCsr2Ant, GLCoexVer8821aCsr2Ant, fwVer, btPatchVer, btPatchVer);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsMode(HsChnl)", \\r
-               wifiDot11Chnl, bBtHsOn, wifiHsChnl);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "H2C Wifi inform bt chnl Info", \\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "Wifi channel informed to BT", \\r
                pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\r
                pCoexDm->wifiChnlInfo[2]);\r
        CL_PRINTF(cliBuf);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \\r
-               wifiRssi, btHsRssi);\r
+       // wifi status\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Wifi Status]============");\r
        CL_PRINTF(cliBuf);\r
+       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \\r
-               bLink, bRoam, bScan);\r
-       CL_PRINTF(cliBuf);\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ", "Wifi status", \\r
-               (bWifiUnder5G? "5G":"2.4G"),\r
-               ((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),\r
-               ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[BT Status]============");\r
        CL_PRINTF(cliBuf);\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \\r
@@ -3939,12 +3916,6 @@ EXhalbtc8821aCsr2ant_DisplayCoexInfo(
                }\r
        }\r
 \r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/%s", "PS state, IPS/LPS", \\r
-               ((pCoexSta->bUnderIps? "IPS ON":"IPS OFF")),\r
-               ((pCoexSta->bUnderLps? "LPS ON":"LPS OFF")));\r
-       CL_PRINTF(cliBuf);\r
-       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);\r
-\r
        // Sw mechanism \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw mechanism]============");\r
        CL_PRINTF(cliBuf);\r
@@ -4038,12 +4009,6 @@ EXhalbtc8821aCsr2ant_DisplayCoexInfo(
                pCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\r
        CL_PRINTF(cliBuf);\r
 \r
-       // Tx mgnt queue hang or not, 0x41b should = 0xf, ex: 0xd ==>hang\r
-       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x41b);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x41b (mgntQ hang chk == 0xf)", \\r
-               u1Tmp[0]);\r
-       CL_PRINTF(cliBuf);      \r
-\r
        pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\r
 }\r
 \r
index 9e235d62aba4d2b0fd4fd2b37cba9c6f6845f125..d74397076ee58fdf046068c1d0f56ec503e29476 100755 (executable)
@@ -203,10 +203,18 @@ typedef enum _BTC_WIFI_ROLE{
        BTC_ROLE_MAX\r
 }BTC_WIFI_ROLE,*PBTC_WIFI_ROLE;\r
 \r
+typedef enum _BTC_WIRELESS_FREQ{\r
+       BTC_FREQ_2_4G                                   = 0x0,\r
+       BTC_FREQ_5G                                             = 0x1,\r
+       BTC_FREQ_MAX    \r
+}BTC_WIRELESS_FREQ,*PBTC_WIRELESS_FREQ;\r
+\r
 typedef enum _BTC_WIFI_BW_MODE{\r
        BTC_WIFI_BW_LEGACY                                      = 0x0,\r
        BTC_WIFI_BW_HT20                                        = 0x1,\r
        BTC_WIFI_BW_HT40                                        = 0x2,\r
+       BTC_WIFI_BW_HT80                                        = 0x3,\r
+       BTC_WIFI_BW_HT160                                       = 0x4,\r
        BTC_WIFI_BW_MAX \r
 }BTC_WIFI_BW_MODE,*PBTC_WIFI_BW_MODE;\r
 \r
@@ -233,6 +241,15 @@ typedef enum _BT_WIFI_COEX_STATE{
        BTC_WIFI_STAT_MAX\r
 }BT_WIFI_COEX_STATE,*PBT_WIFI_COEX_STATE;\r
 \r
+typedef enum _BT_ANT_TYPE{\r
+       BTC_ANT_TYPE_0,\r
+       BTC_ANT_TYPE_1,\r
+       BTC_ANT_TYPE_2,\r
+       BTC_ANT_TYPE_3,\r
+       BTC_ANT_TYPE_4,\r
+       BTC_ANT_TYPE_MAX\r
+}BT_ANT_TYPE,*PBT_ANT_TYPE;\r
+\r
 // defined for BFP_BTC_GET\r
 typedef enum _BTC_GET_TYPE{\r
        // type BOOLEAN\r
@@ -250,6 +267,7 @@ typedef enum _BTC_GET_TYPE{
        BTC_GET_BL_WIFI_UNDER_B_MODE,\r
        BTC_GET_BL_EXT_SWITCH,\r
        BTC_GET_BL_WIFI_IS_IN_MP_MODE,\r
+       BTC_GET_BL_IS_ASUS_8723B,\r
 \r
        // type s4Byte\r
        BTC_GET_S4_WIFI_RSSI,\r
@@ -268,6 +286,7 @@ typedef enum _BTC_GET_TYPE{
        BTC_GET_U1_WIFI_HS_CHNL,\r
        BTC_GET_U1_MAC_PHY_MODE,\r
        BTC_GET_U1_AP_NUM,\r
+       BTC_GET_U1_ANT_TYPE,\r
 \r
        //===== for 1Ant ======\r
        BTC_GET_U1_LPS_MODE,\r
@@ -320,7 +339,7 @@ typedef enum _BTC_SET_TYPE{
 typedef enum _BTC_DBG_DISP_TYPE{\r
        BTC_DBG_DISP_COEX_STATISTICS                            = 0x0,\r
        BTC_DBG_DISP_BT_LINK_INFO                               = 0x1,\r
-       BTC_DBG_DISP_FW_PWR_MODE_CMD                    = 0x2,\r
+       BTC_DBG_DISP_WIFI_STATUS                                = 0x2,\r
        BTC_DBG_DISP_MAX\r
 }BTC_DBG_DISP_TYPE,*PBTC_DBG_DISP_TYPE;\r
 \r
@@ -489,6 +508,7 @@ typedef struct _BTC_BT_INFO{
        u1Byte                                  rssiAdjustFor1AntCoexType;\r
        BOOLEAN                                 bPreBtCtrlAggBufSize;\r
        BOOLEAN                                 bBtCtrlAggBufSize;\r
+       BOOLEAN                                 bPreRejectAggPkt;\r
        BOOLEAN                                 bRejectAggPkt;\r
        BOOLEAN                                 bIncreaseScanDevNum;\r
        BOOLEAN                                 bBtTxRxMask;\r
@@ -529,6 +549,7 @@ typedef struct _BTC_STACK_INFO{
 \r
 typedef struct _BTC_BT_LINK_INFO{\r
        BOOLEAN                                 bBtLinkExist;\r
+       BOOLEAN                                 bBtHiPriLinkExist;\r
        BOOLEAN                                 bScoExist;\r
        BOOLEAN                                 bScoOnly;\r
        BOOLEAN                                 bA2dpExist;\r
@@ -538,11 +559,13 @@ typedef struct _BTC_BT_LINK_INFO{
        BOOLEAN                                 bPanExist;\r
        BOOLEAN                                 bPanOnly;\r
        BOOLEAN                                 bSlaveRole;\r
+       BOOLEAN                                 bAclBusy;\r
 } BTC_BT_LINK_INFO, *PBTC_BT_LINK_INFO;\r
 \r
 typedef struct _BTC_STATISTICS{\r
        u4Byte                                  cntBind;\r
        u4Byte                                  cntPowerOn;\r
+       u4Byte                                  cntPreLoadFirmware;\r
        u4Byte                                  cntInitHwConfig;\r
        u4Byte                                  cntInitCoexDm;\r
        u4Byte                                  cntIpsNotify;\r
@@ -616,6 +639,10 @@ EXhalbtcoutsrc_PowerOnSetting(
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtcoutsrc_PreLoadFirmware(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       );\r
+VOID\r
 EXhalbtcoutsrc_InitHwConfig(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
        IN      BOOLEAN                         bWifiOnly\r
@@ -695,6 +722,14 @@ EXhalbtcoutsrc_DbgControl(
        IN      pu1Byte                         pData\r
        );\r
 VOID\r
+EXhalbtcoutsrc_AntennaDetection(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u4Byte                                  centFreq,\r
+       IN      u4Byte                                  offset,\r
+       IN      u4Byte                                  span,\r
+       IN      u4Byte                                  seconds\r
+       );\r
+VOID\r
 EXhalbtcoutsrc_StackUpdateProfileInfo(\r
        VOID\r
        );\r
@@ -734,5 +769,9 @@ VOID
 EXhalbtcoutsrc_DisplayBtCoexInfo(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
+VOID\r
+EXhalbtcoutsrc_DisplayAntIsolation(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       );\r
 \r
 #endif\r
index d74846cb30479ef308546442fff9f187797aabcf..3070e792b9f1008f5992025ea71914fa0ccaf881 100755 (executable)
@@ -18,8 +18,8 @@
  *
  ******************************************************************************/
 
-//#include "Mp_Precomp.h"
-#include "odm_precomp.h"
+#include "Mp_Precomp.h"
+#include "phydm_precomp.h"
 
 
 #define        CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _deltaThermal) \
@@ -161,7 +161,7 @@ ODM_TXPowerTrackingCallback_ThermalMeter(
 #endif
 
 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
-       if ( *(pDM_Odm->mp_mode) == 1)
+       if (pDM_Odm->mp_mode == TRUE)
 #endif
                // <Kordan> RFCalibrateInfo.RegA24 will be initialized when ODM HW configuring, but MP configures with para files.
                pDM_Odm->RFCalibrateInfo.RegA24 = 0x090e1317;
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/Mp_Precomp.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/Mp_Precomp.h
new file mode 100755 (executable)
index 0000000..43ea006
--- /dev/null
@@ -0,0 +1,24 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//#include <Precomp.h>\r
+//#include "phydm_precomp.h"\r
+//#include "../phydm_precomp.h"\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/PhyDM_Adaptivity.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/PhyDM_Adaptivity.c
new file mode 100755 (executable)
index 0000000..64ed3bc
--- /dev/null
@@ -0,0 +1,880 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+#include "Mp_Precomp.h"\r
+#include "phydm_precomp.h"\r
+\r
+\r
+VOID\r
+Phydm_CheckAdaptivity(\r
+       IN              PVOID                   pDM_VOID\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       if(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY)\r
+       {\r
+               if(pDM_Odm->bAdaOn == TRUE)\r
+               {\r
+                       if(pDM_Odm->DynamicLinkAdaptivity == TRUE)\r
+                       {\r
+                               if(pDM_Odm->bLinked && pDM_Odm->bCheck == FALSE)\r
+                               {\r
+                                       Phydm_NHMCounterStatistics(pDM_Odm);\r
+                                       Phydm_CheckEnvironment(pDM_Odm);\r
+                               }\r
+                               else if(!pDM_Odm->bLinked)\r
+                               {\r
+                               pDM_Odm->bCheck = FALSE;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA);\r
+                               pDM_Odm->adaptivity_flag = TRUE;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       Phydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA);\r
+                       pDM_Odm->adaptivity_flag = FALSE;\r
+               }\r
+       }       \r
+}\r
+\r
+VOID\r
+Phydm_NHMCounterStatisticsInit(\r
+       IN              PVOID                   pDM_VOID\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+\r
+       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
+       {\r
+               //PHY parameters initialize for ac series\r
+               ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11AC+2, 0xC350);      //0x990[31:16]=0xC350   Time duration for NHM unit: us, 0xc350=200ms\r
+               ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC+2, 0xffff);   //0x994[31:16]=0xffff   th_9, th_10\r
+               //ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0xffffff5c);     //0x998=0xffffff5c              th_3, th_2, th_1, th_0\r
+               ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0xffffff50);       //0x998=0xffffff52              th_3, th_2, th_1, th_0\r
+               ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11AC, 0xffffffff);       //0x99c=0xffffffff              th_7, th_6, th_5, th_4\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH8_11AC, bMaskByte0, 0xff);          //0x9a0[7:0]=0xff               th_8\r
+               //ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT8|BIT9|BIT10, 0x7);       //0x994[9:8]=3                  enable CCX\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT8|BIT9|BIT10, 0x1); //0x994[10:8]=1 ignoreCCA ignore PHYTXON        enable CCX\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_9E8_11AC, BIT0, 0x1);         //0x9e8[7]=1                    max power among all RX ants     \r
+                               \r
+       }\r
+       else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
+       {\r
+               //PHY parameters initialize for n series\r
+               ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N+2, 0xC350);       //0x894[31:16]=0x0xC350 Time duration for NHM unit: us, 0xc350=200ms\r
+               //ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N+2, 0x4e20);     //0x894[31:16]=0x4e20   Time duration for NHM unit: 4us, 0x4e20=80ms\r
+               ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N+2, 0xffff);    //0x890[31:16]=0xffff   th_9, th_10\r
+               //ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff5c);      //0x898=0xffffff5c              th_3, th_2, th_1, th_0\r
+               ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff50);        //0x898=0xffffff52              th_3, th_2, th_1, th_0\r
+               ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11N, 0xffffffff);        //0x89c=0xffffffff              th_7, th_6, th_5, th_4\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_FPGA0_IQK_11N, bMaskByte0, 0xff);         //0xe28[7:0]=0xff               th_8\r
+               //ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT10|BIT9|BIT8, 0x7);        //0x890[9:8]=3                  enable CCX\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT10|BIT9|BIT8, 0x1);  //0x890[10:8]=1         ignoreCCA ignore PHYTXON        enable CCX\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT7, 0x1);             //0xc0c[7]=1                    max power among all RX ants                             \r
+       }\r
+}\r
+\r
+VOID\r
+Phydm_NHMCounterStatistics(\r
+       IN              PVOID                   pDM_VOID\r
+       )\r
+{\r
+       PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+\r
+       if(!(pDM_Odm->SupportAbility & ODM_BB_NHM_CNT))\r
+               return;\r
+\r
+       // Get NHM report\r
+       Phydm_GetNHMCounterStatistics(pDM_Odm);\r
+\r
+       // Reset NHM counter\r
+       Phydm_NHMCounterStatisticsReset(pDM_Odm);\r
+}\r
+\r
+VOID\r
+Phydm_GetNHMCounterStatistics(\r
+       IN              PVOID                   pDM_VOID\r
+       )\r
+{\r
+       PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       u4Byte          value32 = 0;\r
+\r
+       if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
+               value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11AC, bMaskDWord);\r
+       else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
+               value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11N, bMaskDWord);\r
+\r
+       pDM_Odm->NHM_cnt_0 = (u1Byte)(value32 & bMaskByte0);\r
+       pDM_Odm->NHM_cnt_1 = (u1Byte)((value32 & bMaskByte1)>>8);\r
+\r
+}\r
+\r
+VOID\r
+Phydm_NHMCounterStatisticsReset(\r
+       IN              PVOID                   pDM_VOID\r
+       )\r
+{\r
+       PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       \r
+       if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
+       {                       \r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 0);\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 1);\r
+       }\r
+       else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
+       {\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 0);\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 1);\r
+       }\r
+}\r
+\r
+VOID\r
+Phydm_NHMBBInit(\r
+       IN              PVOID                   pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+\r
+       pDM_Odm->adaptivity_flag = FALSE;\r
+       pDM_Odm->tolerance_cnt = 3;\r
+       pDM_Odm->NHMLastTxOkcnt = 0;\r
+       pDM_Odm->NHMLastRxOkcnt = 0;\r
+       pDM_Odm->NHMCurTxOkcnt = 0;\r
+       pDM_Odm->NHMCurRxOkcnt = 0;\r
+}\r
+\r
+VOID\r
+Phydm_SetEDCCAThreshold(\r
+       IN      PVOID   pDM_VOID,\r
+       IN      s1Byte  H2L,\r
+       IN      s1Byte  L2H\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       \r
+       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
+               {\r
+               ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, (u1Byte)L2H);\r
+               ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, (u1Byte)H2L);\r
+               }\r
+       else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
+               {\r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, bMaskByte0, (u1Byte)L2H);\r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, bMaskByte1, (u1Byte)H2L);\r
+               }\r
+}\r
+\r
+VOID\r
+Phydm_SetTRxMux(\r
+       IN      PVOID                           pDM_VOID,\r
+       IN      PhyDM_Trx_MUX_Type      txMode,\r
+       IN      PhyDM_Trx_MUX_Type      rxMode\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+\r
+       if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
+       {\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N, BIT3|BIT2|BIT1, txMode);      // set TXmod to standby mode to remove outside noise affect\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N, BIT22|BIT21|BIT20, rxMode);   // set RXmod to standby mode to remove outside noise affect\r
+               if(pDM_Odm->RFType > ODM_1T1R)\r
+               {\r
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N_B, BIT3|BIT2|BIT1, txMode);    // set TXmod to standby mode to remove outside noise affect\r
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N_B, BIT22|BIT21|BIT20, rxMode); // set RXmod to standby mode to remove outside noise affect\r
+               }\r
+       }\r
+       else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
+       {\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC, BIT11|BIT10|BIT9|BIT8, txMode);       // set TXmod to standby mode to remove outside noise affect\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC, BIT7|BIT6|BIT5|BIT4, rxMode); // set RXmod to standby mode to remove outside noise affect\r
+               if(pDM_Odm->RFType > ODM_1T1R)\r
+               {\r
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC_B, BIT11|BIT10|BIT9|BIT8, txMode);     // set TXmod to standby mode to remove outside noise affect\r
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC_B, BIT7|BIT6|BIT5|BIT4, rxMode);       // set RXmod to standby mode to remove outside noise affect\r
+               }\r
+       }\r
+\r
+}\r
+\r
+VOID\r
+Phydm_MACEDCCAState(\r
+       IN      PVOID                                   pDM_VOID,\r
+       IN      PhyDM_MACEDCCA_Type             State\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       if(State == PhyDM_IGNORE_EDCCA)\r
+       {\r
+               ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 1);     //ignore EDCCA  reg520[15]=1\r
+               ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 0);          //reg524[11]=0\r
+       }\r
+       else            // don't set MAC ignore EDCCA signal\r
+       {\r
+               ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 0);     //don't ignore EDCCA     reg520[15]=0\14\r
+               ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 1);  //reg524[11]=1  \r
+       }\r
+\r
+       pDM_Odm->EDCCA_enable_state = State;\r
+       \r
+       ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("EDCCA enable State = %d \n", State));\r
+\r
+}\r
+\r
+BOOLEAN\r
+Phydm_CalNHMcnt(\r
+       IN              PVOID           pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       u2Byte                  Base = 0;\r
+\r
+       Base = pDM_Odm->NHM_cnt_0 + pDM_Odm->NHM_cnt_1;\r
+\r
+       if(Base != 0)\r
+       {\r
+               pDM_Odm->NHM_cnt_0 = ((pDM_Odm->NHM_cnt_0) << 8) / Base;\r
+               pDM_Odm->NHM_cnt_1 = ((pDM_Odm->NHM_cnt_1) << 8) / Base;\r
+       }\r
+       if((pDM_Odm->NHM_cnt_0 - pDM_Odm->NHM_cnt_1) >= 100)\r
+               return TRUE;                    // clean environment\r
+       else\r
+               return FALSE;           //noisy environment\r
+\r
+}\r
+\r
+\r
+VOID\r
+Phydm_CheckEnvironment(\r
+       IN      PVOID   pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       BOOLEAN         isCleanEnvironment = FALSE;\r
+       u1Byte          i, clean = 0;\r
+\r
+       if(pDM_Odm->bFirstLink == TRUE)\r
+       {\r
+               pDM_Odm->adaptivity_flag = TRUE;\r
+               pDM_Odm->bFirstLink = FALSE;\r
+               return;\r
+       }\r
+       else\r
+       {\r
+               if(pDM_Odm->NHMWait < 3)                        // Start enter NHM after 4 NHMWait\r
+               {\r
+                       pDM_Odm->NHMWait ++;\r
+                       Phydm_NHMCounterStatistics(pDM_Odm);\r
+                       return;\r
+               }\r
+               else\r
+               {\r
+                       Phydm_NHMCounterStatistics(pDM_Odm);\r
+                       isCleanEnvironment = Phydm_CalNHMcnt(pDM_Odm);\r
+                       if(isCleanEnvironment == TRUE)\r
+                       {\r
+                               Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA);\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+                               pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup;                       //mode 1\r
+                               pDM_Odm->TH_EDCCA_HL_diff= pDM_Odm->TH_EDCCA_HL_diff_backup;\r
+#endif\r
+                               pDM_Odm->adaptivity_flag = TRUE;\r
+                       }\r
+                       else\r
+                       {\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+                               Phydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA);\r
+#else\r
+                               Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA);\r
+                               pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2;                        // for AP mode 2\r
+                               pDM_Odm->TH_EDCCA_HL_diff= pDM_Odm->TH_EDCCA_HL_diff_mode2;\r
+#endif\r
+                               pDM_Odm->adaptivity_flag = FALSE;\r
+                       }\r
+\r
+                       pDM_Odm->bFirstLink = TRUE;\r
+                       pDM_Odm->bCheck = TRUE;\r
+               }\r
+               \r
+       }\r
+\r
+\r
+}\r
+\r
+\r
+VOID\r
+Phydm_NHMBB(\r
+       IN              PVOID                   pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       BOOLEAN         bCleanEnvironment;\r
+\r
+       bCleanEnvironment = Phydm_CalNHMcnt(pDM_Odm);\r
+\r
+       pDM_Odm->NHMCurTxOkcnt = *(pDM_Odm->pNumTxBytesUnicast) - pDM_Odm->NHMLastTxOkcnt;\r
+       pDM_Odm->NHMCurRxOkcnt = *(pDM_Odm->pNumRxBytesUnicast) - pDM_Odm->NHMLastRxOkcnt;\r
+       pDM_Odm->NHMLastTxOkcnt = *(pDM_Odm->pNumTxBytesUnicast);\r
+       pDM_Odm->NHMLastRxOkcnt = *(pDM_Odm->pNumRxBytesUnicast);       \r
+       ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("cnt_0=%d, cnt_1=%d, bCleanEnvironment = %d, NHMCurTxOkcnt = %llu, NHMCurRxOkcnt = %llu\n", \r
+               pDM_Odm->NHM_cnt_0, pDM_Odm->NHM_cnt_1, bCleanEnvironment, pDM_Odm->NHMCurTxOkcnt, pDM_Odm->NHMCurRxOkcnt));\r
+\r
+       if(pDM_Odm->NHMWait < 4)                        // Start enter NHM after 4 NHMWait\r
+       {\r
+               pDM_Odm->NHMWait ++;\r
+               Phydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA);\r
+       }\r
+       else if ( ((pDM_Odm->NHMCurTxOkcnt>>10) > 2) && ((pDM_Odm->NHMCurTxOkcnt) + 1 > (u8Byte)(pDM_Odm->NHMCurRxOkcnt<<2) + 1))               //Tx > 4*Rx and Tx > 2Mb possible for adaptivity test\r
+       {\r
+               if(bCleanEnvironment == TRUE || pDM_Odm->adaptivity_flag == TRUE)\r
+               {\r
+                       //Enable EDCCA since it is possible running Adaptivity testing\r
+                       pDM_Odm->adaptivity_flag = TRUE;\r
+                       Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA);\r
+                       pDM_Odm->tolerance_cnt = 0;\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+                       pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup;\r
+                       pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_backup ;\r
+#endif\r
+               }\r
+               else\r
+               {\r
+                       if(pDM_Odm->tolerance_cnt < 3)\r
+                               pDM_Odm->tolerance_cnt ++;\r
+                       else\r
+                       {\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+                       pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2;\r
+                       pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2 ;\r
+#else                          \r
+                       Phydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA);\r
+#endif\r
+                       pDM_Odm->adaptivity_flag = FALSE;\r
+                       }\r
+               }\r
+       }\r
+       else    // TX<RX \r
+       {\r
+               if(pDM_Odm->adaptivity_flag == TRUE && bCleanEnvironment == FALSE)\r
+               {\r
+                       Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA);\r
+                       pDM_Odm->tolerance_cnt = 0;\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+                       pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup;\r
+                       pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_backup ;\r
+#endif\r
+               }\r
+#if(DM_ODM_SUPPORT_TYPE & ODM_AP)              // for repeater mode add by YuChen 2014.06.23\r
+#ifdef UNIVERSAL_REPEATER\r
+               else if((bCleanEnvironment == TRUE) && (pDM_Odm->VXD_bLinked) && ((pDM_Odm->NHMCurTxOkcnt>>10) > 1))            // clean environment and VXD linked and Tx TP>1Mb\r
+               {\r
+                       pDM_Odm->adaptivity_flag = TRUE;\r
+                       Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA);\r
+                       pDM_Odm->tolerance_cnt = 0;\r
+                       pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup;\r
+                       pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_backup ;\r
+               }\r
+#endif \r
+#endif                                                                 // for repeater mode add by YuChen 2014.06.23\r
+               else\r
+               {\r
+                       if(pDM_Odm->tolerance_cnt < 3)\r
+                               pDM_Odm->tolerance_cnt ++;\r
+                       else\r
+                       {\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+                       pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2;\r
+                       pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2 ;\r
+#else\r
+                       Phydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA);\r
+#endif\r
+                       pDM_Odm->adaptivity_flag = FALSE;\r
+                       }\r
+               }\r
+       }\r
+        \r
+       ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("adaptivity_flag = %d\n ", pDM_Odm->adaptivity_flag));\r
+}\r
+\r
+VOID\r
+Phydm_SearchPwdBLowerBound(\r
+       IN              PVOID           pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       u4Byte                  value32 =0;\r
+       u1Byte                  cnt, IGI_Pause = 0x7f, IGI_Resume = 0x20, IGI = 0x50;   //IGI = 0x50 for cal EDCCA lower bound\r
+       u1Byte                  txEdcca1 = 0, txEdcca0 = 0;\r
+       BOOLEAN                 bAdjust=TRUE;\r
+       s1Byte                  TH_L2H_dmc, TH_H2L_dmc, IGI_target = 0x32;\r
+       s1Byte                  Diff;\r
+\r
+       Phydm_SetTRxMux(pDM_Odm, PhyDM_STANDBY_MODE, PhyDM_STANDBY_MODE);\r
+       ODM_Write_DIG(pDM_Odm, IGI_Pause);\r
+       \r
+       Diff = IGI_target -(s1Byte)IGI;\r
+       TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;\r
+               if(TH_L2H_dmc > 10)     \r
+                       TH_L2H_dmc = 10;\r
+       TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;\r
+\r
+       Phydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc);                       \r
+       ODM_delay_ms(5);\r
+               \r
+               while(bAdjust)\r
+                       {\r
+                       for(cnt=0; cnt<20; cnt ++)\r
+                               {\r
+                               if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
+                                       value32 = ODM_GetBBReg(pDM_Odm,ODM_REG_RPT_11N, bMaskDWord);\r
+                               else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
+                                       value32 = ODM_GetBBReg(pDM_Odm,ODM_REG_RPT_11AC, bMaskDWord);\r
+                       \r
+                               if (value32 & BIT30 && (pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8723B|ODM_RTL8188E)))\r
+                                       txEdcca1 = txEdcca1 + 1;\r
+                               else if(value32 & BIT29)\r
+                                       txEdcca1 = txEdcca1 + 1;\r
+                               else\r
+                                       txEdcca0 = txEdcca0 + 1;\r
+                               }\r
+                       \r
+                               if(txEdcca1 > 9 )\r
+                               {\r
+                                       IGI = IGI -1;\r
+                                       TH_L2H_dmc = TH_L2H_dmc + 1;\r
+                                               if(TH_L2H_dmc > 10)\r
+                                                       TH_L2H_dmc = 10;\r
+                                       TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;\r
+\r
+                                       Phydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc);\r
+\r
+                                       txEdcca1 = 0;\r
+                                       txEdcca0 = 0;\r
+\r
+                                       if(TH_L2H_dmc == 10)\r
+                                               {\r
+                                               bAdjust = FALSE;\r
+                                               pDM_Odm->H2L_lb = TH_H2L_dmc;\r
+                                               pDM_Odm->L2H_lb = TH_L2H_dmc;\r
+                                               pDM_Odm->Adaptivity_IGI_upper = IGI;\r
+                                               }\r
+                               }\r
+                               else\r
+                               {\r
+                                       bAdjust = FALSE;\r
+                                       pDM_Odm->H2L_lb = TH_H2L_dmc;\r
+                                       pDM_Odm->L2H_lb = TH_L2H_dmc;   \r
+                                       pDM_Odm->Adaptivity_IGI_upper = IGI;\r
+                               }\r
+                       }\r
+                                                       \r
+       Phydm_SetTRxMux(pDM_Odm, PhyDM_TX_MODE, PhyDM_RX_MODE);\r
+       ODM_Write_DIG(pDM_Odm, IGI_Resume);\r
+       Phydm_SetEDCCAThreshold(pDM_Odm, 0x7f, 0x7f); // resume to no link state\r
+}\r
+\r
+VOID\r
+Phydm_AdaptivityInit(\r
+       IN      PVOID           pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if(DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;\r
+       PMGNT_INFO              pMgntInfo = &(pAdapter->MgntInfo);\r
+       pDM_Odm->Carrier_Sense_enable = (BOOLEAN)pMgntInfo->RegEnableCarrierSense;\r
+       pDM_Odm->NHM_enable = (BOOLEAN)pMgntInfo->RegNHMEnable;\r
+       pDM_Odm->DynamicLinkAdaptivity = (BOOLEAN)pMgntInfo->RegDmLinkAdaptivity;\r
+#elif(DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+       pDM_Odm->Carrier_Sense_enable = (pDM_Odm->Adapter->registrypriv.adaptivity_mode!=0)?TRUE:FALSE;\r
+       pDM_Odm->NHM_enable = (BOOLEAN)pDM_Odm->Adapter->registrypriv.nhm_en;\r
+       pDM_Odm->DynamicLinkAdaptivity = FALSE; // Jeff please add this\r
+#endif\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\r
+\r
+       if(pDM_Odm->Carrier_Sense_enable == FALSE)\r
+       {\r
+#if(DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+               if( pMgntInfo->RegL2HForAdaptivity != 0 )\r
+                       pDM_Odm->TH_L2H_ini = pMgntInfo->RegL2HForAdaptivity;\r
+               else\r
+#endif\r
+                       pDM_Odm->TH_L2H_ini = 0xf5; // -7\r
+       }\r
+       else\r
+       {\r
+#if(DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+               if( pMgntInfo->RegL2HForAdaptivity != 0 )\r
+                       pDM_Odm->TH_L2H_ini = pMgntInfo->RegL2HForAdaptivity;\r
+               else\r
+#endif\r
+               pDM_Odm->TH_L2H_ini = 0xa; \r
+       }\r
+\r
+       pDM_Odm->AdapEn_RSSI = 20;\r
+\r
+#if(DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       if( pMgntInfo->RegHLDiffForAdaptivity != 0 )\r
+               pDM_Odm->TH_EDCCA_HL_diff = pMgntInfo->RegHLDiffForAdaptivity;\r
+       else\r
+#endif\r
+       pDM_Odm->TH_EDCCA_HL_diff = 7;\r
+\r
+       ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("TH_L2H_ini = 0x%x, TH_EDCCA_HL_diff = 0x%x\n", pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff));\r
+\r
+#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       prtl8192cd_priv                         priv = pDM_Odm->priv;\r
+\r
+       if(pDM_Odm->Carrier_Sense_enable){\r
+               pDM_Odm->TH_L2H_ini = 10;\r
+               pDM_Odm->TH_EDCCA_HL_diff = 7;          \r
+               pDM_Odm->AdapEn_RSSI = 30;\r
+       }\r
+       else\r
+       {\r
+               pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup;       //set by mib\r
+               pDM_Odm->TH_EDCCA_HL_diff = 7;\r
+               pDM_Odm->AdapEn_RSSI = 20;\r
+       }\r
+\r
+       pDM_Odm->TH_L2H_ini_mode2 = 20;\r
+       pDM_Odm->TH_EDCCA_HL_diff_mode2 = 8;\r
+       //pDM_Odm->TH_L2H_ini_backup = pDM_Odm->TH_L2H_ini;\r
+       pDM_Odm->TH_EDCCA_HL_diff_backup = pDM_Odm->TH_EDCCA_HL_diff ;\r
+       if(priv->pshare->rf_ft_var.adaptivity_enable == 2)\r
+               pDM_Odm->DynamicLinkAdaptivity = TRUE;\r
+       else\r
+               pDM_Odm->DynamicLinkAdaptivity = FALSE;\r
+//     pDM_Odm->NHM_enable = FALSE;\r
+#endif\r
+\r
+       pDM_Odm->IGI_Base = 0x32;       \r
+       pDM_Odm->IGI_target = 0x1c;\r
+       pDM_Odm->ForceEDCCA = 0;\r
+       pDM_Odm->H2L_lb= 0;\r
+       pDM_Odm->L2H_lb= 0;\r
+       pDM_Odm->Adaptivity_IGI_upper = 0;\r
+       pDM_Odm->NHMWait = 0;\r
+       Phydm_NHMBBInit(pDM_Odm);\r
+       pDM_Odm->bCheck = FALSE;\r
+       pDM_Odm->bFirstLink = TRUE;\r
+       pDM_Odm->bAdaOn = TRUE;\r
+\r
+       ODM_SetBBReg(pDM_Odm, REG_RD_CTRL, BIT11, 1); // stop counting if EDCCA is asserted\r
+\r
+       //Search pwdB lower bound\r
+       {\r
+       if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
+               ODM_SetBBReg(pDM_Odm,ODM_REG_DBG_RPT_11N, bMaskDWord, 0x208);\r
+       else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
+               ODM_SetBBReg(pDM_Odm,ODM_REG_DBG_RPT_11AC, bMaskDWord, 0x209);\r
+       Phydm_SearchPwdBLowerBound(pDM_Odm);\r
+       }\r
+       Phydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA);\r
+}\r
+\r
+\r
+BOOLEAN\r
+Phydm_Adaptivity(\r
+       IN              PVOID                   pDM_VOID,\r
+       IN              u1Byte                  IGI\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       s1Byte TH_L2H_dmc, TH_H2L_dmc, L2H_nolink_Band4 = 0x7f, H2L_nolink_Band4 = 0x7f;\r
+       s1Byte Diff, IGI_target;\r
+       BOOLEAN EDCCA_State = FALSE;\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
+       BOOLEAN         bFwCurrentInPSMode=FALSE;       \r
+       PMGNT_INFO                              pMgntInfo = &(pAdapter->MgntInfo);\r
+       \r
+       pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));   \r
+\r
+       // Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.\r
+       if(bFwCurrentInPSMode)\r
+               return FALSE;\r
+#endif\r
+\r
+       if(!(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY))\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Go to odm_DynamicEDCCA() \n"));\r
+               // Add by Neil Chen to enable edcca to MP Platform \r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+               // Adjust EDCCA.\r
+               if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
+                       Phydm_DynamicEDCCA(pDM_Odm);\r
+#endif\r
+               return FALSE;\r
+       }\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       if(pMgntInfo->RegEnableAdaptivity== 2)\r
+#else\r
+       if (pDM_Odm->Adapter->registrypriv.adaptivity_en == 2)\r
+#endif\r
+       {\r
+               if(pDM_Odm->Carrier_Sense_enable == FALSE)              // check domain Code for Adaptivity or CarrierSense\r
+               {\r
+                       if ((*pDM_Odm->pBandType == ODM_BAND_5G) && \r
+                               !(pDM_Odm->odm_Regulation5G == REGULATION_ETSI || pDM_Odm->odm_Regulation5G == REGULATION_WW))\r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity skip 5G domain code : %d \n", pDM_Odm->odm_Regulation5G));\r
+                               return FALSE;\r
+                       }\r
+\r
+                       else if((*pDM_Odm->pBandType == ODM_BAND_2_4G) &&\r
+                               !(pDM_Odm->odm_Regulation2_4G == REGULATION_ETSI || pDM_Odm->odm_Regulation2_4G == REGULATION_WW))\r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity skip 2.4G domain code : %d \n", pDM_Odm->odm_Regulation2_4G));\r
+                               return FALSE;\r
+                       \r
+                       }\r
+                       else if ((*pDM_Odm->pBandType != ODM_BAND_2_4G) && (*pDM_Odm->pBandType != ODM_BAND_5G))\r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity neither 2G nor 5G band, return\n"));\r
+                               return FALSE;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if ((*pDM_Odm->pBandType == ODM_BAND_5G) && \r
+                               !(pDM_Odm->odm_Regulation5G == REGULATION_ETSI || pDM_Odm->odm_Regulation5G == REGULATION_WW))\r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense skip 5G domain code : %d\n", pDM_Odm->odm_Regulation5G));\r
+                               return FALSE;\r
+                       }\r
+\r
+                       else if((*pDM_Odm->pBandType == ODM_BAND_2_4G) &&\r
+                               !(pDM_Odm->odm_Regulation2_4G == REGULATION_ETSI || pDM_Odm->odm_Regulation2_4G == REGULATION_WW))\r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense skip 2.4G domain code : %d\n", pDM_Odm->odm_Regulation2_4G));\r
+                               return FALSE;\r
+                       \r
+                       }\r
+                       else if ((*pDM_Odm->pBandType != ODM_BAND_2_4G) && (*pDM_Odm->pBandType != ODM_BAND_5G))\r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense neither 2G nor 5G band, return\n"));\r
+                               return FALSE;\r
+                       }\r
+               }\r
+       }\r
+#endif\r
+\r
+       \r
+       ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("odm_Adaptivity() =====> \n"));\r
+       ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("ForceEDCCA=%d, IGI_Base=0x%x, TH_L2H_ini = %d, TH_EDCCA_HL_diff = %d, AdapEn_RSSI = %d\n", \r
+               pDM_Odm->ForceEDCCA, pDM_Odm->IGI_Base, pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff, pDM_Odm->AdapEn_RSSI));\r
+\r
+       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
+               ODM_SetBBReg(pDM_Odm, 0x800, BIT10, 0); //ADC_mask enable\r
+\r
+       if(*pDM_Odm->pBandWidth == ODM_BW20M) //CHANNEL_WIDTH_20\r
+               IGI_target = pDM_Odm->IGI_Base;\r
+       else if(*pDM_Odm->pBandWidth == ODM_BW40M)\r
+               IGI_target = pDM_Odm->IGI_Base + 2;\r
+       else if(*pDM_Odm->pBandWidth == ODM_BW80M)\r
+               IGI_target = pDM_Odm->IGI_Base + 2;\r
+       else\r
+               IGI_target = pDM_Odm->IGI_Base;\r
+       pDM_Odm->IGI_target = (u1Byte) IGI_target;\r
+       \r
+       if(*pDM_Odm->pChannel >= 149)           // Band4 -> for AP : mode2, for sd4 and sd7 : turnoff adaptivity\r
+       {\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+               if(pDM_Odm->bLinked)\r
+               {\r
+               Diff = IGI_target -(s1Byte)IGI;\r
+               L2H_nolink_Band4 = pDM_Odm->TH_L2H_ini_mode2 + Diff;\r
+               if(L2H_nolink_Band4 > 10)       \r
+                       L2H_nolink_Band4 = 10;          \r
+               H2L_nolink_Band4 = L2H_nolink_Band4 - pDM_Odm->TH_EDCCA_HL_diff_mode2;\r
+               }\r
+#endif\r
+               Phydm_SetEDCCAThreshold(pDM_Odm, H2L_nolink_Band4, L2H_nolink_Band4);\r
+               return FALSE;\r
+       }\r
+\r
+       if(!pDM_Odm->ForceEDCCA)\r
+       {\r
+               if(pDM_Odm->RSSI_Min > pDM_Odm->AdapEn_RSSI)\r
+                       EDCCA_State = 1;\r
+               else if(pDM_Odm->RSSI_Min < (pDM_Odm->AdapEn_RSSI - 5))\r
+                       EDCCA_State = 0;\r
+       }\r
+       else\r
+               EDCCA_State = 1;\r
+\r
+       if(pDM_Odm->Carrier_Sense_enable == FALSE && pDM_Odm->NHM_enable == TRUE)\r
+               Phydm_NHMBB(pDM_Odm);\r
+       \r
+       ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("BandWidth=%s, IGI_target=0x%x, EDCCA_State=%d, EDCCA_enable_state = %d\n",\r
+               (*pDM_Odm->pBandWidth==ODM_BW80M)?"80M":((*pDM_Odm->pBandWidth==ODM_BW40M)?"40M":"20M"), IGI_target, EDCCA_State, pDM_Odm->EDCCA_enable_state));\r
+       ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("RSSI_min = %d, AdapIGIUpper= 0x %x\n", pDM_Odm->RSSI_Min, pDM_Odm->Adaptivity_IGI_upper));\r
+\r
+\r
+       if(EDCCA_State == 1)\r
+       {\r
+               Diff = IGI_target -(s1Byte)IGI;\r
+               TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;\r
+               if(TH_L2H_dmc > 10)     \r
+                       TH_L2H_dmc = 10;\r
+                               \r
+               TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;\r
+\r
+               //replace lower bound to prevent EDCCA always equal 1\r
+                       if(TH_H2L_dmc < pDM_Odm->H2L_lb)                                \r
+                               TH_H2L_dmc = pDM_Odm->H2L_lb;\r
+                       if(TH_L2H_dmc < pDM_Odm->L2H_lb)\r
+                               TH_L2H_dmc = pDM_Odm->L2H_lb;\r
+       }\r
+       else\r
+       {\r
+               TH_L2H_dmc = 0x7f;\r
+               TH_H2L_dmc = 0x7f;\r
+       }\r
+       ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("IGI=0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d, adaptivity_flg = %d, bAdaOn = %d, DynamicLinkAdaptivity = %d, NHM_enable = %d\n", \r
+               IGI, TH_L2H_dmc, TH_H2L_dmc, pDM_Odm->adaptivity_flag, pDM_Odm->bAdaOn, pDM_Odm->DynamicLinkAdaptivity, pDM_Odm->NHM_enable));\r
+       \r
+       Phydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc);\r
+       return TRUE;\r
+}\r
+\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+VOID\r
+Phydm_EnableEDCCA(\r
+       IN              PVOID                                   pDM_VOID\r
+)\r
+{\r
+\r
+       // This should be moved out of OUTSRC\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;\r
+       // Enable EDCCA. The value is suggested by SD3 Wilson.\r
+\r
+       //\r
+       // Revised for ASUS 11b/g performance issues, suggested by BB Neil, 2012.04.13.\r
+       //\r
+       if((pDM_Odm->SupportICType == ODM_RTL8723A)&&(IS_WIRELESS_MODE_G(pAdapter)))\r
+       {\r
+               //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x00);\r
+               ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x00);\r
+               ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0xFD);\r
+               \r
+       }       \r
+       else\r
+       {\r
+               //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x03);\r
+               ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x03);\r
+               ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0x00);\r
+       }       \r
+       \r
+       //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold+2, 0x00);\r
+}\r
+\r
+VOID\r
+Phydm_DisableEDCCA(\r
+       IN              PVOID                                   pDM_VOID\r
+)\r
+{      \r
+       // Disable EDCCA..\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold, 0x7f);\r
+       ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold+2, 0x7f);\r
+}\r
+\r
+//\r
+// Description: According to initial gain value to determine to enable or disable EDCCA.\r
+//\r
+// Suggested by SD3 Wilson. Added by tynli. 2011.11.25.\r
+//\r
+VOID\r
+Phydm_DynamicEDCCA(\r
+       IN              PVOID                                   pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
+       u1Byte                  RegC50, RegC58;\r
+       BOOLEAN                 bEDCCAenable = FALSE;\r
+       \r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))  \r
+       BOOLEAN                 bFwCurrentInPSMode=FALSE;       \r
+\r
+       pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));   \r
+\r
+       // Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.\r
+       if(bFwCurrentInPSMode)\r
+               return;\r
+#endif\r
+       //\r
+       // 2013/11/14 Ken According to BB team Jame's suggestion, we need to disable soft AP mode EDCCA.\r
+       // 2014/01/08 MH For Miracst AP mode test. We need to disable EDCCA. Otherwise, we may stop\r
+       // to send beacon in noisy environment or platform.\r
+       //\r
+       if(ACTING_AS_AP(pAdapter) || ACTING_AS_AP(GetFirstAPAdapter(pAdapter)))\r
+       //if(ACTING_AS_AP(pAdapter))\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("At least One Port as AP disable EDCCA\n"));\r
+               Phydm_DisableEDCCA(pDM_Odm);\r
+               if(pHalData->bPreEdccaEnable)\r
+                       Phydm_DisableEDCCA(pDM_Odm);\r
+               pHalData->bPreEdccaEnable = FALSE;\r
+               return;\r
+       }\r
+       \r
+       RegC50 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0);\r
+       RegC58 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0);\r
+\r
+\r
+       if((RegC50 > 0x28 && RegC58 > 0x28) ||\r
+               ((pDM_Odm->SupportICType == ODM_RTL8723A && IS_WIRELESS_MODE_G(pAdapter) && RegC50>0x26)) ||\r
+               (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 > 0x28))\r
+       {\r
+               if(!pHalData->bPreEdccaEnable)\r
+               {\r
+                       Phydm_EnableEDCCA(pDM_Odm);\r
+                       pHalData->bPreEdccaEnable = TRUE;\r
+               }\r
+               \r
+       }\r
+       else if((RegC50 < 0x25 && RegC58 < 0x25) || (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 < 0x25))\r
+       {\r
+               if(pHalData->bPreEdccaEnable)\r
+               {\r
+                       Phydm_DisableEDCCA(pDM_Odm);\r
+                       pHalData->bPreEdccaEnable = FALSE;\r
+               }\r
+       }\r
+}\r
+\r
+#endif\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/PhyDM_Adaptivity.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/PhyDM_Adaptivity.h
new file mode 100755 (executable)
index 0000000..e586ac8
--- /dev/null
@@ -0,0 +1,146 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __PHYDMADAPTIVITY_H__\r
+#define    __PHYDMADAPTIVITY_H__\r
+\r
+#define ADAPTIVITY_VERSION     "7.1"\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+typedef enum _tag_PhyDM_REGULATION_Type {\r
+       REGULATION_FCC = 0,\r
+       REGULATION_MKK = 1,\r
+       REGULATION_ETSI = 2,\r
+       REGULATION_WW = 3,      \r
+       \r
+       MAX_REGULATION_NUM = 4\r
+} PhyDM_REGULATION_TYPE;\r
+#endif\r
+\r
+typedef enum tag_PhyDM_TRx_MUX_Type\r
+{\r
+       PhyDM_SHUTDOWN                  = 0,\r
+       PhyDM_STANDBY_MODE              = 1,\r
+       PhyDM_TX_MODE                   = 2,\r
+       PhyDM_RX_MODE                   = 3\r
+}PhyDM_Trx_MUX_Type;\r
+\r
+typedef enum tag_PhyDM_MACEDCCA_Type\r
+{\r
+       PhyDM_IGNORE_EDCCA                      = 0,\r
+       PhyDM_DONT_IGNORE_EDCCA = 1\r
+}PhyDM_MACEDCCA_Type;\r
+\r
+\r
+VOID\r
+Phydm_CheckAdaptivity(\r
+       IN              PVOID                   pDM_VOID\r
+       );\r
+\r
+VOID\r
+Phydm_CheckEnvironment(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+VOID\r
+Phydm_NHMCounterStatisticsInit(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+VOID\r
+Phydm_NHMCounterStatistics(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+VOID\r
+Phydm_NHMBBInit(\r
+       IN              PVOID                                   pDM_VOID\r
+);\r
+\r
+VOID\r
+Phydm_NHMBB(\r
+       IN              PVOID                                   pDM_VOID\r
+);\r
+\r
+VOID\r
+Phydm_NHMCounterStatisticsReset(\r
+       IN              PVOID                   pDM_VOID\r
+);\r
+\r
+VOID\r
+Phydm_GetNHMCounterStatistics(\r
+       IN              PVOID                   pDM_VOID\r
+);\r
+\r
+VOID\r
+Phydm_MACEDCCAState(\r
+       IN      PVOID                                   pDM_VOID,\r
+       IN      PhyDM_MACEDCCA_Type             State\r
+);\r
+\r
+VOID\r
+Phydm_SetEDCCAThreshold(\r
+       IN              PVOID           pDM_VOID,\r
+       IN              s1Byte          H2L,\r
+       IN              s1Byte          L2H\r
+);\r
+\r
+VOID\r
+Phydm_SetTRxMux(\r
+       IN              PVOID                   pDM_VOID,\r
+       IN              PhyDM_Trx_MUX_Type                      txMode,\r
+       IN              PhyDM_Trx_MUX_Type                      rxMode\r
+);     \r
+\r
+BOOLEAN\r
+Phydm_CalNHMcnt(\r
+       IN              PVOID           pDM_VOID\r
+);\r
+\r
+VOID\r
+Phydm_SearchPwdBLowerBound(\r
+       IN              PVOID                                   pDM_VOID\r
+);\r
+\r
+VOID \r
+Phydm_AdaptivityInit(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+BOOLEAN\r
+Phydm_Adaptivity(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN              u1Byte                                  IGI\r
+       );\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+VOID\r
+Phydm_DisableEDCCA(\r
+       IN              PVOID                                   pDM_VOID\r
+);\r
+\r
+VOID\r
+Phydm_DynamicEDCCA(\r
+       IN              PVOID                                   pDM_VOID\r
+);\r
+#endif\r
+\r
+\r
+#endif\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm.c
new file mode 100755 (executable)
index 0000000..13e5e28
--- /dev/null
@@ -0,0 +1,2397 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *                                        
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+//============================================================
+// include files
+//============================================================
+
+#include "Mp_Precomp.h"
+#include "phydm_precomp.h"
+
+
+const u2Byte dB_Invert_Table[8][12] = {
+       {       1,              1,              1,              2,              2,              2,              2,              3,              3,              3,              4,              4},
+       {       4,              5,              6,              6,              7,              8,              9,              10,             11,             13,             14,             16},
+       {       18,             20,             22,             25,             28,             32,             35,             40,             45,             50,             56,             63},
+       {       71,             79,             89,             100,    112,    126,    141,    158,    178,    200,    224,    251},
+       {       282,    316,    355,    398,    447,    501,    562,    631,    708,    794,    891,    1000},
+       {       1122,   1259,   1413,   1585,   1778,   1995,   2239,   2512,   2818,   3162,   3548,   3981},
+       {       4467,   5012,   5623,   6310,   7079,   7943,   8913,   10000,  11220,  12589,  14125,  15849},
+       {       17783,  19953,  22387,  25119,  28184,  31623,  35481,  39811,  44668,  50119,  56234,  65535}};
+
+
+//============================================================
+// Local Function predefine.
+//============================================================
+
+VOID
+odm_SwAntDetectInit(
+       IN              PDM_ODM_T               pDM_Odm
+       );
+
+
+
+
+
+VOID
+odm_AntennaDiversityInit(
+       IN              PDM_ODM_T               pDM_Odm 
+);
+
+VOID
+odm_AntennaDiversity(
+       IN              PDM_ODM_T               pDM_Odm 
+);
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+VOID
+ODM_UpdateInitRateWorkItemCallback(
+    IN PVOID            pContext
+    );
+#endif
+
+
+VOID
+odm_GlobalAdapterCheck(
+       IN              VOID
+       );
+
+//Remove RAMask by RS_James
+
+
+
+VOID
+odm_IQCalibrate(
+               IN      PDM_ODM_T       pDM_Odm 
+               );
+
+//remove PT by Yuchen
+
+//Remove Edca by Yu Chen
+
+
+VOID
+odm_UpdatePowerTrainingState(
+       IN      PDM_ODM_T       pDM_Odm
+);
+
+VOID
+ODM_AsocEntry_Init(
+       IN      PDM_ODM_T       pDM_Odm
+       );
+
+//============================================================
+//3 Export Interface
+//============================================================
+
+VOID
+ODM_InitMpDriverStatus(
+       IN              PDM_ODM_T               pDM_Odm
+)
+{
+#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+
+       // Decide when compile time
+       #if(MP_DRIVER == 1)
+       pDM_Odm->mp_mode = TRUE;
+       #else
+       pDM_Odm->mp_mode = FALSE;
+       #endif
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+
+       PADAPTER        Adapter =  pDM_Odm->Adapter;
+
+       // Update information every period
+       pDM_Odm->mp_mode = (BOOLEAN)Adapter->registrypriv.mp_mode;
+
+#else
+
+       // MP mode is always false at AP side
+       pDM_Odm->mp_mode = FALSE;
+
+#endif
+}
+
+VOID
+ODM_UpdateMpDriverStatus(
+       IN              PDM_ODM_T               pDM_Odm
+)
+{
+#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+
+       // Do nothing.
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+       PADAPTER        Adapter =  pDM_Odm->Adapter;
+
+       // Update information erery period
+       pDM_Odm->mp_mode = (BOOLEAN)Adapter->registrypriv.mp_mode;
+
+#else
+
+       // Do nothing.
+
+#endif
+}
+
+VOID
+odm_CommonInfoSelfInit(
+       IN              PDM_ODM_T               pDM_Odm
+       )
+{
+       pFAT_T                  pDM_FatTable = &pDM_Odm->DM_FatTable;
+       pDM_Odm->bCckHighPower = (BOOLEAN) ODM_GetBBReg(pDM_Odm, ODM_REG(CCK_RPT_FORMAT,pDM_Odm), ODM_BIT(CCK_RPT_FORMAT,pDM_Odm));             
+       pDM_Odm->RFPathRxEnable = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(BB_RX_PATH,pDM_Odm), ODM_BIT(BB_RX_PATH,pDM_Odm));
+#if (DM_ODM_SUPPORT_TYPE != ODM_CE)    
+       pDM_Odm->pbNet_closed = &pDM_Odm->BOOLEAN_temp;
+#endif
+
+       PHYDM_InitDebugSetting(pDM_Odm);
+       ODM_InitMpDriverStatus(pDM_Odm);
+
+       pDM_Odm->TxRate = 0xFF;
+
+}
+
+VOID
+odm_CommonInfoSelfUpdate(
+       IN              PDM_ODM_T               pDM_Odm
+       )
+{
+       u1Byte  EntryCnt=0;
+       u1Byte  i;
+       PSTA_INFO_T     pEntry;
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+       PADAPTER        Adapter =  pDM_Odm->Adapter;
+       PMGNT_INFO      pMgntInfo = &Adapter->MgntInfo;
+
+       pEntry = pDM_Odm->pODM_StaInfo[0];
+       if(pMgntInfo->mAssoc)
+       {
+               pEntry->bUsed=TRUE;
+               for (i=0; i<6; i++)
+                       pEntry->MacAddr[i] = pMgntInfo->Bssid[i];
+       }
+       else
+       {
+               pEntry->bUsed=FALSE;
+               for (i=0; i<6; i++)
+                       pEntry->MacAddr[i] = 0;
+       }
+
+       //STA mode is linked to AP
+       if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0]) && !ACTING_AS_AP(Adapter))
+               pDM_Odm->bsta_state = TRUE;
+       else
+               pDM_Odm->bsta_state = FALSE;
+#endif
+
+
+       if(*(pDM_Odm->pBandWidth) == ODM_BW40M)
+       {
+               if(*(pDM_Odm->pSecChOffset) == 1)
+                       pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) -2;
+               else if(*(pDM_Odm->pSecChOffset) == 2)
+                       pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) +2;
+       }
+       else
+               pDM_Odm->ControlChannel = *(pDM_Odm->pChannel);
+
+       for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
+       {
+               pEntry = pDM_Odm->pODM_StaInfo[i];
+               if(IS_STA_VALID(pEntry))
+                       EntryCnt++;
+       }
+       
+       if(EntryCnt == 1)
+               pDM_Odm->bOneEntryOnly = TRUE;
+       else
+               pDM_Odm->bOneEntryOnly = FALSE;
+
+       // Update MP driver status
+       ODM_UpdateMpDriverStatus(pDM_Odm);
+}
+
+VOID
+odm_CommonInfoSelfReset(
+       IN              PDM_ODM_T               pDM_Odm
+       )
+{
+#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       pDM_Odm->PhyDbgInfo.NumQryBeaconPkt = 0;
+#endif
+}
+
+PVOID
+PhyDM_Get_Structure(
+       IN              PDM_ODM_T               pDM_Odm,
+       IN              u1Byte                  Structure_Type
+)
+
+{
+       PVOID   pStruct = NULL;
+#if RTL8195A_SUPPORT
+       switch (Structure_Type){
+               case    PHYDM_FALSEALMCNT:
+                       pStruct = &FalseAlmCnt;
+               break;
+               
+               case    PHYDM_CFOTRACK:
+                       pStruct = &DM_CfoTrack;
+               break;
+               
+               default:
+               break;
+       }
+
+#else
+       switch (Structure_Type){
+               case    PHYDM_FALSEALMCNT:
+                       pStruct = &(pDM_Odm->FalseAlmCnt);
+               break;
+               
+               case    PHYDM_CFOTRACK:
+                       pStruct = &(pDM_Odm->DM_CfoTrack);
+               break;
+               
+               default:
+               break;
+       }
+
+#endif
+       return  pStruct;
+}
+
+VOID
+odm_HWSetting(
+       IN              PDM_ODM_T               pDM_Odm
+       )
+{
+#if (RTL8821A_SUPPORT == 1)
+       if(pDM_Odm->SupportICType & ODM_RTL8821)
+               odm_HWSetting_8821A(pDM_Odm);
+#endif
+
+}
+
+//
+// 2011/09/21 MH Add to describe different team necessary resource allocate??
+//
+VOID
+ODM_DMInit(
+       IN              PDM_ODM_T               pDM_Odm
+       )
+{
+
+       odm_CommonInfoSelfInit(pDM_Odm);
+       odm_DIGInit(pDM_Odm);
+       Phydm_NHMCounterStatisticsInit(pDM_Odm);
+       Phydm_AdaptivityInit(pDM_Odm);
+       odm_RateAdaptiveMaskInit(pDM_Odm);
+       ODM_CfoTrackingInit(pDM_Odm);
+       ODM_EdcaTurboInit(pDM_Odm);
+       odm_RSSIMonitorInit(pDM_Odm);
+       odm_TXPowerTrackingInit(pDM_Odm);
+       odm_AntennaDiversityInit(pDM_Odm);
+       odm_AutoChannelSelectInit(pDM_Odm);
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       ODM_ClearTxPowerTrackingState(pDM_Odm);
+       odm_PathDiversityInit(pDM_Odm);
+#endif
+
+       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+       {
+               odm_DynamicBBPowerSavingInit(pDM_Odm);
+               odm_DynamicTxPowerInit(pDM_Odm);
+
+#if (RTL8188E_SUPPORT == 1)
+               if(pDM_Odm->SupportICType==ODM_RTL8188E)
+               {
+                       odm_PrimaryCCA_Init(pDM_Odm);
+                       ODM_RAInfo_Init_all(pDM_Odm);
+               }
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       
+       #if (RTL8723B_SUPPORT == 1)
+               if(pDM_Odm->SupportICType == ODM_RTL8723B)
+                       odm_SwAntDetectInit(pDM_Odm);
+       #endif
+
+       #if (RTL8192E_SUPPORT == 1)
+               if(pDM_Odm->SupportICType==ODM_RTL8192E)
+                       odm_PrimaryCCA_Check_Init(pDM_Odm);
+       #endif
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       #if (RTL8723A_SUPPORT == 1)
+               if(pDM_Odm->SupportICType == ODM_RTL8723A)
+                       odm_PSDMonitorInit(pDM_Odm);
+       #endif
+
+       #if (RTL8192D_SUPPORT == 1)
+               if(pDM_Odm->SupportICType==ODM_RTL8192D)
+                       odm_PathDivInit_92D(pDM_Odm);
+       #endif
+
+       #if ((RTL8192C_SUPPORT == 1) || (RTL8192D_SUPPORT == 1))
+               if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
+                       odm_RXHPInit(pDM_Odm);
+       #endif
+#endif
+#endif
+
+       }
+
+}
+
+VOID
+ODM_DMReset(
+       IN              PDM_ODM_T               pDM_Odm
+       )
+{
+        #if (defined(CONFIG_HW_ANTENNA_DIVERSITY))
+       ODM_AntDivReset(pDM_Odm);
+        #endif
+}
+
+//
+// 2011/09/20 MH This is the entry pointer for all team to execute HW out source DM.
+// You can not add any dummy function here, be care, you can only use DM structure
+// to perform any new ODM_DM.
+//
+VOID
+ODM_DMWatchdog(
+       IN              PDM_ODM_T               pDM_Odm
+       )
+{
+       ODM_AsocEntry_Init(pDM_Odm);
+       odm_CommonInfoSelfUpdate(pDM_Odm);
+       phydm_BasicDbgMessage(pDM_Odm);
+       odm_HWSetting(pDM_Odm);
+       odm_FalseAlarmCounterStatistics(pDM_Odm);
+       odm_RSSIMonitorCheck(pDM_Odm);
+
+       if(*(pDM_Odm->pbPowerSaving) == TRUE)
+       {
+               odm_DIGbyRSSI_LPS(pDM_Odm);
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("DMWatchdog in power saving mode\n"));
+               return;
+       }
+       
+       Phydm_CheckAdaptivity(pDM_Odm);
+       odm_UpdatePowerTrainingState(pDM_Odm);
+       odm_DIG(pDM_Odm);
+       {
+               pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;
+               pDM_Odm->bAdaOn = Phydm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue);
+       }
+       odm_CCKPacketDetectionThresh(pDM_Odm);
+       odm_RefreshRateAdaptiveMask(pDM_Odm);
+       odm_RefreshBasicRateMask(pDM_Odm);
+       odm_DynamicBBPowerSaving(pDM_Odm);
+       odm_EdcaTurboCheck(pDM_Odm);
+       odm_PathDiversity(pDM_Odm);
+       ODM_CfoTracking(pDM_Odm);
+       odm_DynamicTxPower(pDM_Odm);
+       odm_AntennaDiversity(pDM_Odm);
+
+#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+
+       ODM_TXPowerTrackingCheck(pDM_Odm);
+
+       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+               odm_IQCalibrate(pDM_Odm);
+       else 
+#endif
+       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+       {
+#if (RTL8192D_SUPPORT == 1)
+               if(pDM_Odm->SupportICType==ODM_RTL8192D)
+                       ODM_DynamicEarlyMode(pDM_Odm);
+#endif
+               
+#if (RTL8188E_SUPPORT == 1)
+               if(pDM_Odm->SupportICType==ODM_RTL8188E)
+                       odm_DynamicPrimaryCCA(pDM_Odm); 
+#endif
+
+#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+
+       #if (RTL8192E_SUPPORT == 1)
+               if(pDM_Odm->SupportICType==ODM_RTL8192E)
+                       odm_DynamicPrimaryCCA_Check(pDM_Odm); 
+       #endif
+
+#if( DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       #if ((RTL8192C_SUPPORT == 1) || (RTL8192D_SUPPORT == 1))
+               if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
+                       odm_RXHP(pDM_Odm);
+       #endif
+#endif
+#endif
+       }
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
+       odm_dtc(pDM_Odm);
+#endif
+
+       odm_CommonInfoSelfReset(pDM_Odm);
+       
+}
+
+
+//
+// Init /.. Fixed HW value. Only init time.
+//
+VOID
+ODM_CmnInfoInit(
+       IN              PDM_ODM_T               pDM_Odm,
+       IN              ODM_CMNINFO_E   CmnInfo,
+       IN              u4Byte                  Value   
+       )
+{
+       //
+       // This section is used for init value
+       //
+       switch  (CmnInfo)
+       {
+               //
+               // Fixed ODM value.
+               //
+               case    ODM_CMNINFO_ABILITY:
+                       pDM_Odm->SupportAbility = (u4Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_RF_TYPE:
+                       pDM_Odm->RFType = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_PLATFORM:
+                       pDM_Odm->SupportPlatform = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_INTERFACE:
+                       pDM_Odm->SupportInterface = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_MP_TEST_CHIP:
+                       pDM_Odm->bIsMPChip= (u1Byte)Value;
+                       break;
+            
+               case    ODM_CMNINFO_IC_TYPE:
+                       pDM_Odm->SupportICType = Value;
+                       break;
+
+               case    ODM_CMNINFO_CUT_VER:
+                       pDM_Odm->CutVersion = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_FAB_VER:
+                       pDM_Odm->FabVersion = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_RFE_TYPE:
+                       pDM_Odm->RFEType = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_RF_ANTENNA_TYPE:
+                       pDM_Odm->AntDivType= (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_BOARD_TYPE:
+                       pDM_Odm->BoardType = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_PACKAGE_TYPE:
+                       pDM_Odm->PackageType = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_EXT_LNA:
+                       pDM_Odm->ExtLNA = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_5G_EXT_LNA:
+                       pDM_Odm->ExtLNA5G = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_EXT_PA:
+                       pDM_Odm->ExtPA = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_5G_EXT_PA:
+                       pDM_Odm->ExtPA5G = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_GPA:
+                       pDM_Odm->TypeGPA= (ODM_TYPE_GPA_E)Value;
+                       break;
+               case    ODM_CMNINFO_APA:
+                       pDM_Odm->TypeAPA= (ODM_TYPE_APA_E)Value;
+                       break;
+               case    ODM_CMNINFO_GLNA:
+                       pDM_Odm->TypeGLNA= (ODM_TYPE_GLNA_E)Value;
+                       break;
+               case    ODM_CMNINFO_ALNA:
+                       pDM_Odm->TypeALNA= (ODM_TYPE_ALNA_E)Value;
+                       break;
+
+               case    ODM_CMNINFO_EXT_TRSW:
+                       pDM_Odm->ExtTRSW = (u1Byte)Value;
+                       break;
+               case    ODM_CMNINFO_PATCH_ID:
+                       pDM_Odm->PatchID = (u1Byte)Value;
+                       break;
+               case    ODM_CMNINFO_BINHCT_TEST:
+                       pDM_Odm->bInHctTest = (BOOLEAN)Value;
+                       break;
+               case    ODM_CMNINFO_BWIFI_TEST:
+                       pDM_Odm->bWIFITest = (BOOLEAN)Value;
+                       break;  
+               case    ODM_CMNINFO_SMART_CONCURRENT:
+                       pDM_Odm->bDualMacSmartConcurrent = (BOOLEAN )Value;
+                       break;
+               case    ODM_CMNINFO_DOMAIN_CODE_2G:
+                       pDM_Odm->odm_Regulation2_4G = (u1Byte)Value;
+                       break;
+               case    ODM_CMNINFO_DOMAIN_CODE_5G:
+                       pDM_Odm->odm_Regulation5G = (u1Byte)Value;
+                       break;
+               case    ODM_CMNINFO_IQKFWOFFLOAD:
+                       pDM_Odm->IQKFWOffload = (u1Byte)Value;
+                       break;
+               //To remove the compiler warning, must add an empty default statement to handle the other values.       
+               default:
+                       //do nothing
+                       break;  
+               
+       }
+
+}
+
+
+VOID
+ODM_CmnInfoHook(
+       IN              PDM_ODM_T               pDM_Odm,
+       IN              ODM_CMNINFO_E   CmnInfo,
+       IN              PVOID                   pValue  
+       )
+{
+       //
+       // Hook call by reference pointer.
+       //
+       switch  (CmnInfo)
+       {
+               //
+               // Dynamic call by reference pointer.
+               //
+               case    ODM_CMNINFO_MAC_PHY_MODE:
+                       pDM_Odm->pMacPhyMode = (u1Byte *)pValue;
+                       break;
+               
+               case    ODM_CMNINFO_TX_UNI:
+                       pDM_Odm->pNumTxBytesUnicast = (u8Byte *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_RX_UNI:
+                       pDM_Odm->pNumRxBytesUnicast = (u8Byte *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_WM_MODE:
+                       pDM_Odm->pWirelessMode = (u1Byte *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_BAND:
+                       pDM_Odm->pBandType = (u1Byte *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_SEC_CHNL_OFFSET:
+                       pDM_Odm->pSecChOffset = (u1Byte *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_SEC_MODE:
+                       pDM_Odm->pSecurity = (u1Byte *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_BW:
+                       pDM_Odm->pBandWidth = (u1Byte *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_CHNL:
+                       pDM_Odm->pChannel = (u1Byte *)pValue;
+                       break;
+               
+               case    ODM_CMNINFO_DMSP_GET_VALUE:
+                       pDM_Odm->pbGetValueFromOtherMac = (BOOLEAN *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_BUDDY_ADAPTOR:
+                       pDM_Odm->pBuddyAdapter = (PADAPTER *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_DMSP_IS_MASTER:
+                       pDM_Odm->pbMasterOfDMSP = (BOOLEAN *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_SCAN:
+                       pDM_Odm->pbScanInProcess = (BOOLEAN *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_POWER_SAVING:
+                       pDM_Odm->pbPowerSaving = (BOOLEAN *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_ONE_PATH_CCA:
+                       pDM_Odm->pOnePathCCA = (u1Byte *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_DRV_STOP:
+                       pDM_Odm->pbDriverStopped =  (BOOLEAN *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_PNP_IN:
+                       pDM_Odm->pbDriverIsGoingToPnpSetPowerSleep =  (BOOLEAN *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_INIT_ON:
+                       pDM_Odm->pinit_adpt_in_progress =  (BOOLEAN *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_ANT_TEST:
+                       pDM_Odm->pAntennaTest =  (u1Byte *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_NET_CLOSED:
+                       pDM_Odm->pbNet_closed = (BOOLEAN *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_FORCED_RATE:
+                       pDM_Odm->pForcedDataRate = (pu2Byte)pValue;
+                       break;
+
+               case  ODM_CMNINFO_FORCED_IGI_LB:
+                       pDM_Odm->pu1ForcedIgiLb = (u1Byte *)pValue;
+                       break;
+
+               case    ODM_CMNINFO_P2P_LINK:
+                       pDM_Odm->DM_DigTable.pbP2pLinkInProgress = (u1Byte *)pValue;
+                       break;
+
+               case ODM_CMNINFO_FCS_MODE:
+                       pDM_Odm->pIsFcsModeEnable = (BOOLEAN *)pValue;
+                       break;
+//sd7 only
+
+               //case  ODM_CMNINFO_RTSTA_AID:
+               //      pDM_Odm->pAidMap =  (u1Byte *)pValue;
+               //      break;
+
+               //case  ODM_CMNINFO_BT_COEXIST:
+               //      pDM_Odm->BTCoexist = (BOOLEAN *)pValue;         
+
+               //case  ODM_CMNINFO_STA_STATUS:
+                       //pDM_Odm->pODM_StaInfo[] = (PSTA_INFO_T)pValue;
+                       //break;
+
+               //case  ODM_CMNINFO_PHY_STATUS:
+               //      pDM_Odm->pPhyInfo = (ODM_PHY_INFO *)pValue;
+               //      break;
+
+               //case  ODM_CMNINFO_MAC_STATUS:
+               //      pDM_Odm->pMacInfo = (ODM_MAC_INFO *)pValue;
+               //      break;
+               //To remove the compiler warning, must add an empty default statement to handle the other values.                               
+               default:
+                       //do nothing
+                       break;
+
+       }
+
+}
+
+
+VOID
+ODM_CmnInfoPtrArrayHook(
+       IN              PDM_ODM_T               pDM_Odm,
+       IN              ODM_CMNINFO_E   CmnInfo,
+       IN              u2Byte                  Index,
+       IN              PVOID                   pValue  
+       )
+{
+       //
+       // Hook call by reference pointer.
+       //
+       switch  (CmnInfo)
+       {
+               //
+               // Dynamic call by reference pointer.
+               //              
+               case    ODM_CMNINFO_STA_STATUS:
+                       pDM_Odm->pODM_StaInfo[Index] = (PSTA_INFO_T)pValue;
+                       break;          
+               //To remove the compiler warning, must add an empty default statement to handle the other values.                               
+               default:
+                       //do nothing
+                       break;
+       }
+       
+}
+
+
+//
+// Update Band/CHannel/.. The values are dynamic but non-per-packet.
+//
+VOID
+ODM_CmnInfoUpdate(
+       IN              PDM_ODM_T               pDM_Odm,
+       IN              u4Byte                  CmnInfo,
+       IN              u8Byte                  Value   
+       )
+{
+       //
+       // This init variable may be changed in run time.
+       //
+       switch  (CmnInfo)
+       {
+               case ODM_CMNINFO_LINK_IN_PROGRESS:
+                       pDM_Odm->bLinkInProcess = (BOOLEAN)Value;
+                       break;
+               
+               case    ODM_CMNINFO_ABILITY:
+                       pDM_Odm->SupportAbility = (u4Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_RF_TYPE:
+                       pDM_Odm->RFType = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_WIFI_DIRECT:
+                       pDM_Odm->bWIFI_Direct = (BOOLEAN)Value;
+                       break;
+
+               case    ODM_CMNINFO_WIFI_DISPLAY:
+                       pDM_Odm->bWIFI_Display = (BOOLEAN)Value;
+                       break;
+
+               case    ODM_CMNINFO_LINK:
+                       pDM_Odm->bLinked = (BOOLEAN)Value;
+                       break;
+                       
+               case    ODM_CMNINFO_STATION_STATE:
+                       pDM_Odm->bsta_state = (BOOLEAN)Value;
+                       break;
+                       
+               case    ODM_CMNINFO_RSSI_MIN:
+                       pDM_Odm->RSSI_Min= (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_DBG_COMP:
+                       pDM_Odm->DebugComponents = Value;
+                       break;
+
+               case    ODM_CMNINFO_DBG_LEVEL:
+                       pDM_Odm->DebugLevel = (u4Byte)Value;
+                       break;
+               case    ODM_CMNINFO_RA_THRESHOLD_HIGH:
+                       pDM_Odm->RateAdaptive.HighRSSIThresh = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_RA_THRESHOLD_LOW:
+                       pDM_Odm->RateAdaptive.LowRSSIThresh = (u1Byte)Value;
+                       break;
+               // The following is for BT HS mode and BT coexist mechanism.
+               case ODM_CMNINFO_BT_ENABLED:
+                       pDM_Odm->bBtEnabled = (BOOLEAN)Value;
+                       break;
+                       
+               case ODM_CMNINFO_BT_HS_CONNECT_PROCESS:
+                       pDM_Odm->bBtConnectProcess = (BOOLEAN)Value;
+                       break;
+               
+               case ODM_CMNINFO_BT_HS_RSSI:
+                       pDM_Odm->btHsRssi = (u1Byte)Value;
+                       break;
+                       
+               case    ODM_CMNINFO_BT_OPERATION:
+                       pDM_Odm->bBtHsOperation = (BOOLEAN)Value;
+                       break;
+
+               case    ODM_CMNINFO_BT_LIMITED_DIG:
+                       pDM_Odm->bBtLimitedDig = (BOOLEAN)Value;
+                       break;  
+
+               case    ODM_CMNINFO_BT_DISABLE_EDCA:
+                       pDM_Odm->bBtDisableEdcaTurbo = (BOOLEAN)Value;
+                       break;
+
+
+#if(DM_ODM_SUPPORT_TYPE & ODM_AP)              // for repeater mode add by YuChen 2014.06.23
+#ifdef UNIVERSAL_REPEATER
+               case    ODM_CMNINFO_VXD_LINK:
+                       pDM_Odm->VXD_bLinked= (BOOLEAN)Value;
+                       break;
+#endif
+#endif
+/*
+               case    ODM_CMNINFO_OP_MODE:
+                       pDM_Odm->OPMode = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_WM_MODE:
+                       pDM_Odm->WirelessMode = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_BAND:
+                       pDM_Odm->BandType = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_SEC_CHNL_OFFSET:
+                       pDM_Odm->SecChOffset = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_SEC_MODE:
+                       pDM_Odm->Security = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_BW:
+                       pDM_Odm->BandWidth = (u1Byte)Value;
+                       break;
+
+               case    ODM_CMNINFO_CHNL:
+                       pDM_Odm->Channel = (u1Byte)Value;
+                       break;                  
+*/     
+                default:
+                       //do nothing
+                       break;
+       }
+
+       
+}
+
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+VOID
+ODM_InitAllWorkItems(IN PDM_ODM_T      pDM_Odm )
+{
+#if USE_WORKITEM
+       PADAPTER                pAdapter = pDM_Odm->Adapter;
+
+       ODM_InitializeWorkItem( pDM_Odm, 
+                                                       &pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem_8723B, 
+                                                       (RT_WORKITEM_CALL_BACK)ODM_SW_AntDiv_WorkitemCallback,
+                                                       (PVOID)pAdapter,
+                                                       "AntennaSwitchWorkitem");
+       
+       ODM_InitializeWorkItem( pDM_Odm, 
+                                                       &pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem, 
+                                                       (RT_WORKITEM_CALL_BACK)odm_SwAntDivChkAntSwitchWorkitemCallback,
+                                                       (PVOID)pAdapter,
+                                                       "AntennaSwitchWorkitem");
+       
+
+       ODM_InitializeWorkItem(
+               pDM_Odm,
+               &(pDM_Odm->PathDivSwitchWorkitem), 
+               (RT_WORKITEM_CALL_BACK)odm_PathDivChkAntSwitchWorkitemCallback, 
+               (PVOID)pAdapter,
+               "SWAS_WorkItem");
+
+       ODM_InitializeWorkItem(
+               pDM_Odm,
+               &(pDM_Odm->CCKPathDiversityWorkitem), 
+               (RT_WORKITEM_CALL_BACK)odm_CCKTXPathDiversityWorkItemCallback, 
+               (PVOID)pAdapter,
+               "CCKTXPathDiversityWorkItem");
+
+       ODM_InitializeWorkItem(
+               pDM_Odm,
+               &(pDM_Odm->MPT_DIGWorkitem), 
+               (RT_WORKITEM_CALL_BACK)odm_MPT_DIGWorkItemCallback, 
+               (PVOID)pAdapter,
+               "MPT_DIGWorkitem");
+
+       ODM_InitializeWorkItem(
+               pDM_Odm,
+               &(pDM_Odm->RaRptWorkitem), 
+               (RT_WORKITEM_CALL_BACK)ODM_UpdateInitRateWorkItemCallback, 
+               (PVOID)pAdapter,
+               "RaRptWorkitem");
+       
+#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
+#if (RTL8188E_SUPPORT == 1)
+       ODM_InitializeWorkItem(
+               pDM_Odm,
+               &(pDM_Odm->FastAntTrainingWorkitem), 
+               (RT_WORKITEM_CALL_BACK)odm_FastAntTrainingWorkItemCallback, 
+               (PVOID)pAdapter,
+               "FastAntTrainingWorkitem");
+#endif
+#endif
+       ODM_InitializeWorkItem(
+               pDM_Odm,
+               &(pDM_Odm->DM_RXHP_Table.PSDTimeWorkitem), 
+               (RT_WORKITEM_CALL_BACK)odm_PSD_RXHPWorkitemCallback, 
+               (PVOID)pAdapter,
+               "PSDRXHP_WorkItem");  
+#endif
+}
+
+VOID
+ODM_FreeAllWorkItems(IN PDM_ODM_T      pDM_Odm )
+{
+#if USE_WORKITEM
+       ODM_FreeWorkItem(       &(pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem_8723B));
+       
+       ODM_FreeWorkItem(       &(pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem));
+
+       ODM_FreeWorkItem(&(pDM_Odm->PathDivSwitchWorkitem));      
+
+       ODM_FreeWorkItem(&(pDM_Odm->CCKPathDiversityWorkitem));
+       
+       ODM_FreeWorkItem(&(pDM_Odm->FastAntTrainingWorkitem));
+
+       ODM_FreeWorkItem(&(pDM_Odm->MPT_DIGWorkitem));
+
+       ODM_FreeWorkItem(&(pDM_Odm->RaRptWorkitem));
+
+       ODM_FreeWorkItem((&pDM_Odm->DM_RXHP_Table.PSDTimeWorkitem));
+#endif
+
+}
+#endif
+
+/*
+VOID
+odm_FindMinimumRSSI(
+       IN              PDM_ODM_T               pDM_Odm
+       )
+{
+       u4Byte  i;
+       u1Byte  RSSI_Min = 0xFF;
+
+       for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
+       {
+//             if(pDM_Odm->pODM_StaInfo[i] != NULL)
+               if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[i]) )
+               {
+                       if(pDM_Odm->pODM_StaInfo[i]->RSSI_Ave < RSSI_Min)
+                       {
+                               RSSI_Min = pDM_Odm->pODM_StaInfo[i]->RSSI_Ave;
+                       }
+               }
+       }
+
+       pDM_Odm->RSSI_Min = RSSI_Min;
+
+}
+
+VOID
+odm_IsLinked(
+       IN              PDM_ODM_T               pDM_Odm
+       )
+{
+       u4Byte i;
+       BOOLEAN Linked = FALSE;
+       
+       for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
+       {
+                       if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[i]) )
+                       {                       
+                               Linked = TRUE;
+                               break;
+                       }
+               
+       }
+
+       pDM_Odm->bLinked = Linked;
+}
+*/
+
+
+//3============================================================
+//3 DIG
+//3============================================================
+/*-----------------------------------------------------------------------------
+ * Function:   odm_DIGInit()
+ *
+ * Overview:   Set DIG scheme init value.
+ *
+ * Input:              NONE
+ *
+ * Output:             NONE
+ *
+ * Return:             NONE
+ *
+ * Revised History:
+ *     When            Who             Remark
+ *
+ *---------------------------------------------------------------------------*/
+
+//Remove DIG by yuchen
+
+//Remove DIG and FA check by Yu Chen
+
+
+//3============================================================
+//3 BB Power Save
+//3============================================================
+
+//Remove BB power saving by Yuchen
+
+//3============================================================
+//3 RATR MASK
+//3============================================================
+//3============================================================
+//3 Rate Adaptive
+//3============================================================
+
+//Remove RAMask by RS_James
+
+//3============================================================
+//3 Dynamic Tx Power
+//3============================================================
+
+//Remove BY YuChen
+
+//Remove  Rssimonitorcheck related function to odm_rssimonitorcheck.c 
+
+
+VOID
+ODM_InitAllTimers(
+       IN PDM_ODM_T    pDM_Odm 
+       )
+{
+#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
+       ODM_AntDivTimers(pDM_Odm,INIT_ANTDIV_TIMMER);
+#elif(defined(CONFIG_SW_ANTENNA_DIVERSITY))
+       ODM_InitializeTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer,
+               (RT_TIMER_CALL_BACK)odm_SwAntDivChkAntSwitchCallback, NULL, "SwAntennaSwitchTimer");
+#endif
+       
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->PSDTimer, 
+               (RT_TIMER_CALL_BACK)dm_PSDMonitorCallback, NULL, "PSDTimer");
+       //
+       //Path Diversity
+       //Neil Chen--2011--06--16--  / 2012/02/23 MH Revise Arch.
+       //
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 
+               (RT_TIMER_CALL_BACK)odm_PathDivChkAntSwitchCallback, NULL, "PathDivTimer");
+
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, 
+               (RT_TIMER_CALL_BACK)odm_CCKTXPathDiversityCallback, NULL, "CCKPathDiversityTimer");
+
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 
+               (RT_TIMER_CALL_BACK)odm_MPT_DIGCallback, NULL, "MPT_DIGTimer");
+
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer,
+               (RT_TIMER_CALL_BACK)odm_PSD_RXHPCallback, NULL, "PSDRXHPTimer");  
+#endif 
+}
+
+VOID
+ODM_CancelAllTimers(
+       IN PDM_ODM_T    pDM_Odm 
+       )
+{
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       //
+       // 2012/01/12 MH Temp BSOD fix. We need to find NIC allocate mem fail reason in 
+       // win7 platform.
+       //
+       HAL_ADAPTER_STS_CHK(pDM_Odm)
+#endif 
+
+#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
+       ODM_AntDivTimers(pDM_Odm,CANCEL_ANTDIV_TIMMER);
+#elif(defined(CONFIG_SW_ANTENNA_DIVERSITY))
+       ODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->PSDTimer);   
+       //
+       //Path Diversity
+       //Neil Chen--2011--06--16--  / 2012/02/23 MH Revise Arch.
+       //
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer);
+
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer);
+
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);
+
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer);
+#endif 
+}
+
+
+VOID
+ODM_ReleaseAllTimers(
+       IN PDM_ODM_T    pDM_Odm 
+       )
+{
+#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
+       ODM_AntDivTimers(pDM_Odm,RELEASE_ANTDIV_TIMMER);
+#elif(defined(CONFIG_SW_ANTENNA_DIVERSITY))
+       ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->PSDTimer);
+       //
+       //Path Diversity
+       //Neil Chen--2011--06--16--  / 2012/02/23 MH Revise Arch.
+       //
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer);
+
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer);
+
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);
+
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer); 
+#endif 
+}
+
+
+//3============================================================
+//3 Tx Power Tracking
+//3============================================================
+
+VOID
+odm_IQCalibrate(
+               IN      PDM_ODM_T       pDM_Odm 
+               )
+{
+       PADAPTER        Adapter = pDM_Odm->Adapter;
+
+#if( DM_ODM_SUPPORT_TYPE == ODM_WIN)   
+       if(*pDM_Odm->pIsFcsModeEnable)
+               return;
+#endif
+
+       if(!IS_HARDWARE_TYPE_JAGUAR(Adapter))
+               return;
+       else if(IS_HARDWARE_TYPE_8812AU(Adapter))
+               return;
+#if (RTL8821A_SUPPORT == 1)
+       if(pDM_Odm->bLinked)
+       {
+               if((*pDM_Odm->pChannel != pDM_Odm->preChannel) && (!*pDM_Odm->pbScanInProcess))
+               {
+                       pDM_Odm->preChannel = *pDM_Odm->pChannel;
+                       pDM_Odm->LinkedInterval = 0;
+               }
+
+               if(pDM_Odm->LinkedInterval < 3)
+                       pDM_Odm->LinkedInterval++;
+               
+               if(pDM_Odm->LinkedInterval == 2)
+               {
+                       // Mark out IQK flow to prevent tx stuck. by Maddest 20130306
+                       // Open it verified by James 20130715
+                       PHY_IQCalibrate_8821A(pDM_Odm, FALSE);
+               }
+       }
+       else
+               pDM_Odm->LinkedInterval = 0;
+#endif
+}
+
+
+
+//antenna mapping info
+// 1: right-side antenna
+// 2/0: left-side antenna
+//PDM_SWAT_Table->CCK_Ant1_Cnt /OFDM_Ant1_Cnt:  for right-side antenna:   Ant:1    RxDefaultAnt1
+//PDM_SWAT_Table->CCK_Ant2_Cnt /OFDM_Ant2_Cnt:  for left-side antenna:     Ant:0    RxDefaultAnt2
+// We select left antenna as default antenna in initial process, modify it as needed
+//
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+// Only for 8723A SW ANT DIV INIT--2012--07--17
+VOID
+odm_SwAntDivInit_NIC_8723A(
+       IN      PDM_ODM_T               pDM_Odm)
+{
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       
+       u1Byte                  btAntNum=BT_GetPgAntNum(Adapter);
+
+       if(IS_HARDWARE_TYPE_8723A(Adapter))
+       {
+               pDM_SWAT_Table->ANTA_ON =TRUE;
+               
+               // Set default antenna B status by PG
+               if(btAntNum == 2)
+                       pDM_SWAT_Table->ANTB_ON = TRUE;
+               else if(btAntNum == 1)
+                       pDM_SWAT_Table->ANTB_ON = FALSE;
+               else
+                       pDM_SWAT_Table->ANTB_ON = TRUE;
+       }       
+       
+}
+
+#endif //end #ifMP
+
+
+
+//3============================================================
+//3 SW Antenna Diversity
+//3============================================================
+
+VOID
+odm_AntennaDiversityInit(
+       IN              PDM_ODM_T               pDM_Odm 
+)
+{
+       if(pDM_Odm->mp_mode == TRUE)
+               return;
+
+       if(pDM_Odm->SupportICType & (ODM_OLD_IC_ANTDIV_SUPPORT))
+       {
+               #if (RTL8192C_SUPPORT==1) 
+               ODM_OldIC_AntDiv_Init(pDM_Odm);
+               #endif
+       }
+       else
+       {
+               #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
+               ODM_AntDiv_Config(pDM_Odm);
+               ODM_AntDivInit(pDM_Odm);
+               #endif
+       }
+}
+
+VOID
+odm_AntennaDiversity(
+       IN              PDM_ODM_T               pDM_Odm 
+)
+{
+       if(pDM_Odm->mp_mode == TRUE)
+               return;
+
+       if(pDM_Odm->SupportICType & (ODM_OLD_IC_ANTDIV_SUPPORT))
+       {
+               #if (RTL8192C_SUPPORT==1) 
+               ODM_OldIC_AntDiv(pDM_Odm);
+               #endif
+       }
+       else
+       {
+               #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
+               ODM_AntDiv(pDM_Odm);
+               #endif
+       }
+}
+
+
+void
+odm_SwAntDetectInit(
+       IN              PDM_ODM_T               pDM_Odm
+       )
+{
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+#if (RTL8723B_SUPPORT == 1)
+       pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ODM_Read4Byte(pDM_Odm, rDPDT_control);
+#endif
+       pDM_SWAT_Table->PreAntenna = MAIN_ANT;
+       pDM_SWAT_Table->CurAntenna = MAIN_ANT;
+       pDM_SWAT_Table->SWAS_NoLink_State = 0;
+}
+
+
+//============================================================
+//EDCA Turbo
+//============================================================
+
+//Remove Edca by Yuchen
+
+
+#if( DM_ODM_SUPPORT_TYPE == ODM_WIN) 
+//
+// 2011/07/26 MH Add an API for testing IQK fail case.
+//
+BOOLEAN
+ODM_CheckPowerStatus(
+       IN      PADAPTER                Adapter)
+{
+
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T                       pDM_Odm = &pHalData->DM_OutSrc;
+       RT_RF_POWER_STATE       rtState;
+       PMGNT_INFO                      pMgntInfo       = &(Adapter->MgntInfo);
+
+       // 2011/07/27 MH We are not testing ready~~!! We may fail to get correct value when init sequence.
+       if (pMgntInfo->init_adpt_in_progress == TRUE)
+       {
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("ODM_CheckPowerStatus Return TRUE, due to initadapter"));
+               return  TRUE;
+       }
+       
+       //
+       //      2011/07/19 MH We can not execute tx pwoer tracking/ LLC calibrate or IQK.
+       //
+       Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState));        
+       if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff)
+       {
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("ODM_CheckPowerStatus Return FALSE, due to %d/%d/%d\n", 
+               Adapter->bDriverStopped, Adapter->bDriverIsGoingToPnpSetPowerSleep, rtState));
+               return  FALSE;
+       }
+       return  TRUE;
+}
+#endif
+
+// need to ODM CE Platform
+//move to here for ANT detection mechanism using
+
+#if ((DM_ODM_SUPPORT_TYPE == ODM_WIN)||(DM_ODM_SUPPORT_TYPE == ODM_CE))
+u4Byte
+GetPSDData(
+       IN PDM_ODM_T    pDM_Odm,
+       unsigned int    point,
+       u1Byte initial_gain_psd)
+{
+       //unsigned int  val, rfval;
+       //int   psd_report;
+       u4Byte  psd_report;
+       
+       //HAL_DATA_TYPE         *pHalData = GET_HAL_DATA(Adapter);
+       //Debug Message
+       //val = PHY_QueryBBReg(Adapter,0x908, bMaskDWord);
+       //DbgPrint("Reg908 = 0x%x\n",val);
+       //val = PHY_QueryBBReg(Adapter,0xDF4, bMaskDWord);
+       //rfval = PHY_QueryRFReg(Adapter, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask);
+       //DbgPrint("RegDF4 = 0x%x, RFReg00 = 0x%x\n",val, rfval);
+       //DbgPrint("PHYTXON = %x, OFDMCCA_PP = %x, CCKCCA_PP = %x, RFReg00 = %x\n",
+               //(val&BIT25)>>25, (val&BIT14)>>14, (val&BIT15)>>15, rfval);
+
+       //Set DCO frequency index, offset=(40MHz/SamplePts)*point
+       ODM_SetBBReg(pDM_Odm, 0x808, 0x3FF, point);
+
+       //Start PSD calculation, Reg808[22]=0->1
+       ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 1);
+       //Need to wait for HW PSD report
+       ODM_StallExecution(1000);
+       ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 0);
+       //Read PSD report, Reg8B4[15:0]
+       psd_report = ODM_GetBBReg(pDM_Odm,0x8B4, bMaskDWord) & 0x0000FFFF;
+       
+#if 1//(DEV_BUS_TYPE == RT_PCI_INTERFACE) && ( (RT_PLATFORM == PLATFORM_LINUX) || (RT_PLATFORM == PLATFORM_MACOSX))
+       psd_report = (u4Byte) (ConvertTo_dB(psd_report))+(u4Byte)(initial_gain_psd-0x1c);
+#else
+       psd_report = (int) (20*log10((double)psd_report))+(int)(initial_gain_psd-0x1c);
+#endif
+
+       return psd_report;
+       
+}
+
+u4Byte 
+ConvertTo_dB(
+       u4Byte  Value)
+{
+       u1Byte i;
+       u1Byte j;
+       u4Byte dB;
+
+       Value = Value & 0xFFFF;
+       
+       for (i=0;i<8;i++)
+       {
+               if (Value <= dB_Invert_Table[i][11])
+               {
+                       break;
+               }
+       }
+
+       if (i >= 8)
+       {
+               return (96);    // maximum 96 dB
+       }
+
+       for (j=0;j<12;j++)
+       {
+               if (Value <= dB_Invert_Table[i][j])
+               {
+                       break;
+               }
+       }
+
+       dB = i*12 + j + 1;
+
+       return (dB);
+}
+
+#endif
+
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN| ODM_CE))
+
+VOID
+odm_PHY_SaveAFERegisters(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      pu4Byte         AFEReg,
+       IN      pu4Byte         AFEBackup,
+       IN      u4Byte          RegisterNum
+       )
+{
+       u4Byte  i;
+       
+       //RT_DISP(FINIT, INIT_IQK, ("Save ADDA parameters.\n"));
+       for( i = 0 ; i < RegisterNum ; i++){
+               AFEBackup[i] = ODM_GetBBReg(pDM_Odm, AFEReg[i], bMaskDWord);
+       }
+}
+
+VOID
+odm_PHY_ReloadAFERegisters(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      pu4Byte         AFEReg,
+       IN      pu4Byte         AFEBackup,
+       IN      u4Byte          RegiesterNum
+       )
+{
+       u4Byte  i;
+
+       //RT_DISP(FINIT, INIT_IQK, ("Reload ADDA power saving parameters !\n"));
+       for(i = 0 ; i < RegiesterNum; i++)
+       {
+       
+               ODM_SetBBReg(pDM_Odm, AFEReg[i], bMaskDWord, AFEBackup[i]);
+       }
+}
+
+//
+// Description:
+//     Set Single/Dual Antenna default setting for products that do not do detection in advance.
+//
+// Added by Joseph, 2012.03.22
+//
+VOID
+ODM_SingleDualAntennaDefaultSetting(
+       IN              PDM_ODM_T               pDM_Odm
+       )
+{
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+       PADAPTER        pAdapter         =  pDM_Odm->Adapter;
+       u1Byte btAntNum = 2;
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
+       btAntNum=BT_GetPgAntNum(pAdapter);
+#elif (DM_ODM_SUPPORT_TYPE & (ODM_CE))
+#ifdef CONFIG_BT_COEXIST
+       btAntNum = hal_btcoex_GetPgAntNum(pAdapter);
+#endif
+#endif
+
+       // Set default antenna A and B status
+       if(btAntNum == 2)
+       {
+               pDM_SWAT_Table->ANTA_ON=TRUE;
+               pDM_SWAT_Table->ANTB_ON=TRUE;
+               //RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("Dual antenna\n"));
+       }
+#ifdef CONFIG_BT_COEXIST
+       else if(btAntNum == 1)
+       {// Set antenna A as default
+               pDM_SWAT_Table->ANTA_ON=TRUE;
+               pDM_SWAT_Table->ANTB_ON=FALSE;
+               //RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("Single antenna\n"));
+       }
+       else
+       {
+               //RT_ASSERT(FALSE, ("Incorrect antenna number!!\n"));
+       }
+#endif
+}
+
+
+
+//2 8723A ANT DETECT
+//
+// Description:
+//     Implement IQK single tone for RF DPK loopback and BB PSD scanning. 
+//     This function is cooperated with BB team Neil. 
+//
+// Added by Roger, 2011.12.15
+//
+BOOLEAN
+ODM_SingleDualAntennaDetection(
+       IN              PDM_ODM_T               pDM_Odm,
+       IN              u1Byte                  mode
+       )
+{
+       PADAPTER        pAdapter         =  pDM_Odm->Adapter;
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+       u4Byte          CurrentChannel,RfLoopReg;
+       u1Byte          n;
+       u4Byte          Reg88c, Regc08, Reg874, Regc50, Reg948=0, Regb2c=0, Reg92c=0, AFE_rRx_Wait_CCA=0;
+       u1Byte          initial_gain = 0x5a;
+       u4Byte          PSD_report_tmp;
+       u4Byte          AntA_report = 0x0, AntB_report = 0x0,AntO_report=0x0;
+       BOOLEAN         bResult = TRUE;
+       u4Byte          AFE_Backup[16];
+       u4Byte          AFE_REG_8723A[16] = {
+                                       rRx_Wait_CCA,   rTx_CCK_RFON, 
+                                       rTx_CCK_BBON,   rTx_OFDM_RFON,
+                                       rTx_OFDM_BBON,  rTx_To_Rx,
+                                       rTx_To_Tx,              rRx_CCK, 
+                                       rRx_OFDM,               rRx_Wait_RIFS, 
+                                       rRx_TO_Rx,              rStandby,
+                                       rSleep,                 rPMPD_ANAEN,    
+                                       rFPGA0_XCD_SwitchControl, rBlue_Tooth};
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection()============> \n"));     
+
+       
+       if(!(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C|ODM_RTL8723B)))
+               return bResult;
+
+       // Retrieve antenna detection registry info, added by Roger, 2012.11.27.
+       if(!IS_ANT_DETECT_SUPPORT_SINGLE_TONE(pAdapter))
+               return bResult;
+
+       if(pDM_Odm->SupportICType == ODM_RTL8192C)
+       {
+               //Which path in ADC/DAC is turnned on for PSD: both I/Q
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT10|BIT11, 0x3);
+               //Ageraged number: 8
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT12|BIT13, 0x1);
+               //pts = 128;
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);
+       }
+
+       //1 Backup Current RF/BB Settings       
+       
+       CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask);
+       RfLoopReg = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask);
+       if(!(pDM_Odm->SupportICType == ODM_RTL8723B))
+       ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_A);  // change to Antenna A
+#if (RTL8723B_SUPPORT == 1)
+       else
+       {
+               Reg92c = ODM_GetBBReg(pDM_Odm, 0x92c, bMaskDWord);
+               Reg948 = ODM_GetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord);
+               Regb2c = ODM_GetBBReg(pDM_Odm, AGC_table_select, bMaskDWord);
+               ODM_SetBBReg(pDM_Odm, rDPDT_control, 0x3, 0x1);
+               ODM_SetBBReg(pDM_Odm, rfe_ctrl_anta_src, 0xff, 0x77);
+               ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0x3ff, 0x000);
+               ODM_SetBBReg(pDM_Odm, AGC_table_select, BIT31, 0x0);
+       }
+#endif
+       ODM_StallExecution(10);
+       
+       //Store A Path Register 88c, c08, 874, c50
+       Reg88c = ODM_GetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord);
+       Regc08 = ODM_GetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord);
+       Reg874 = ODM_GetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord);
+       Regc50 = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord);  
+       
+       // Store AFE Registers
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
+       odm_PHY_SaveAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16);       
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)
+               AFE_rRx_Wait_CCA = ODM_GetBBReg(pDM_Odm, rRx_Wait_CCA,bMaskDWord);
+       
+       //Set PSD 128 pts
+       ODM_SetBBReg(pDM_Odm, rFPGA0_PSDFunction, BIT14|BIT15, 0x0);  //128 pts
+       
+       // To SET CH1 to do
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask, 0x7401);     //Channel 1
+       
+       // AFE all on step
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
+       {
+               ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, 0x6FDB25A4);
+               ODM_SetBBReg(pDM_Odm, rTx_CCK_RFON, bMaskDWord, 0x6FDB25A4);
+               ODM_SetBBReg(pDM_Odm, rTx_CCK_BBON, bMaskDWord, 0x6FDB25A4);
+               ODM_SetBBReg(pDM_Odm, rTx_OFDM_RFON, bMaskDWord, 0x6FDB25A4);
+               ODM_SetBBReg(pDM_Odm, rTx_OFDM_BBON, bMaskDWord, 0x6FDB25A4);
+               ODM_SetBBReg(pDM_Odm, rTx_To_Rx, bMaskDWord, 0x6FDB25A4);
+               ODM_SetBBReg(pDM_Odm, rTx_To_Tx, bMaskDWord, 0x6FDB25A4);
+               ODM_SetBBReg(pDM_Odm, rRx_CCK, bMaskDWord, 0x6FDB25A4);
+               ODM_SetBBReg(pDM_Odm, rRx_OFDM, bMaskDWord, 0x6FDB25A4);
+               ODM_SetBBReg(pDM_Odm, rRx_Wait_RIFS, bMaskDWord, 0x6FDB25A4);
+               ODM_SetBBReg(pDM_Odm, rRx_TO_Rx, bMaskDWord, 0x6FDB25A4);
+               ODM_SetBBReg(pDM_Odm, rStandby, bMaskDWord, 0x6FDB25A4);
+               ODM_SetBBReg(pDM_Odm, rSleep, bMaskDWord, 0x6FDB25A4);
+               ODM_SetBBReg(pDM_Odm, rPMPD_ANAEN, bMaskDWord, 0x6FDB25A4);
+               ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_SwitchControl, bMaskDWord, 0x6FDB25A4);
+               ODM_SetBBReg(pDM_Odm, rBlue_Tooth, bMaskDWord, 0x6FDB25A4);
+       }
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)
+       {
+               ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, 0x01c00016);
+       }
+
+       // 3 wire Disable
+       ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, 0xCCF000C0);
+       
+       //BB IQK Setting
+       ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, 0x000800E4);
+       ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22208000);
+
+       //IQK setting tone@ 4.34Mhz
+       ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_A, bMaskDWord, 0x10008C1C);
+       ODM_SetBBReg(pDM_Odm, rTx_IQK, bMaskDWord, 0x01007c00); 
+
+       //Page B init
+       ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x00080000);
+       ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x0f600000);
+       ODM_SetBBReg(pDM_Odm, rRx_IQK, bMaskDWord, 0x01004800);
+       ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_A, bMaskDWord, 0x10008c1f);
+       ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82150008);
+       ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28150008);
+       ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x001028d0);    
+
+       //RF loop Setting
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x0, 0xFFFFF, 0x50008);    
+       
+       //IQK Single tone start
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
+       ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);
+       ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);
+       
+       ODM_StallExecution(10000);
+
+       // PSD report of antenna A
+       PSD_report_tmp=0x0;
+       for (n=0;n<2;n++)
+       {
+               PSD_report_tmp =  GetPSDData(pDM_Odm, 14, initial_gain);        
+               if(PSD_report_tmp >AntA_report)
+                       AntA_report=PSD_report_tmp;
+       }
+
+        // change to Antenna B
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
+               ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_B); 
+#if (RTL8723B_SUPPORT == 1)
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)
+               ODM_SetBBReg(pDM_Odm, rDPDT_control, 0x3, 0x2);
+#endif
+
+       ODM_StallExecution(10); 
+
+       // PSD report of antenna B
+       PSD_report_tmp=0x0;
+       for (n=0;n<2;n++)
+       {
+               PSD_report_tmp =  GetPSDData(pDM_Odm, 14, initial_gain);        
+               if(PSD_report_tmp > AntB_report)
+                       AntB_report=PSD_report_tmp;
+       }
+
+       // change to open case
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
+               ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, 0);  // change to Antenna A
+#if (RTL8723B_SUPPORT == 1)
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)
+               ODM_SetBBReg(pDM_Odm, rDPDT_control, 0x3, 0x0);
+#endif
+
+       ODM_StallExecution(10); 
+       
+       // PSD report of open case
+       PSD_report_tmp=0x0;
+       for (n=0;n<2;n++)
+       {
+               PSD_report_tmp =  GetPSDData(pDM_Odm, 14, initial_gain);        
+               if(PSD_report_tmp > AntO_report)
+                       AntO_report=PSD_report_tmp;
+       }
+
+       //Close IQK Single Tone function
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      
+
+       //1 Return to antanna A
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
+               ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_A);  // change to Antenna A
+#if (RTL8723B_SUPPORT == 1)
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)
+       {
+               // external DPDT
+               ODM_SetBBReg(pDM_Odm, rDPDT_control, bMaskDWord, Reg92c);
+
+               //internal S0/S1
+               ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord, Reg948);
+               ODM_SetBBReg(pDM_Odm, AGC_table_select, bMaskDWord, Regb2c);
+       }
+#endif
+       ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, Reg88c);
+       ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, Regc08);
+       ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, Reg874);
+       ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, 0x7F, 0x40);
+       ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord, Regc50);
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask,CurrentChannel);
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask,RfLoopReg);
+
+       //Reload AFE Registers
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
+       odm_PHY_ReloadAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16);     
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)
+               ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, AFE_rRx_Wait_CCA);
+
+       if(pDM_Odm->SupportICType == ODM_RTL8723A)
+       {
+               //2 Test Ant B based on Ant A is ON
+               if(mode==ANTTESTB)
+               {
+                       if(AntA_report >=       100)
+                       {
+                               if(AntB_report > (AntA_report+1))
+                               {
+                                       pDM_SWAT_Table->ANTB_ON=FALSE;
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));         
+                               }       
+                               else
+                               {
+                                       pDM_SWAT_Table->ANTB_ON=TRUE;
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Dual Antenna is A and B\n"));  
+                               }       
+                       }
+                       else
+                       {
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
+                               pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default 
+                               bResult = FALSE;
+                       }
+               }       
+               //2 Test Ant A and B based on DPDT Open
+               else if(mode==ANTTESTALL)
+               {
+                       if((AntO_report >=100) && (AntO_report <=118))
+                       {
+                               if(AntA_report > (AntO_report+1))
+                               {
+                                       pDM_SWAT_Table->ANTA_ON=FALSE;
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant A is OFF\n"));
+                               }       
+                               else
+                               {
+                                       pDM_SWAT_Table->ANTA_ON=TRUE;
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant A is ON\n"));
+                               }
+
+                               if(AntB_report > (AntO_report+2))
+                               {
+                                       pDM_SWAT_Table->ANTB_ON=FALSE;
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant B is OFF\n"));
+                               }       
+                               else
+                               {
+                                       pDM_SWAT_Table->ANTB_ON=TRUE;
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant B is ON\n"));
+                               }
+                               
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_A[%d]= %d \n", 2416, AntA_report));   
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_B[%d]= %d \n", 2416, AntB_report));   
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_O[%d]= %d \n", 2416, AntO_report));
+                               
+                               pDM_Odm->AntDetectedInfo.bAntDetected= TRUE;
+                               pDM_Odm->AntDetectedInfo.dBForAntA = AntA_report;
+                               pDM_Odm->AntDetectedInfo.dBForAntB = AntB_report;
+                               pDM_Odm->AntDetectedInfo.dBForAntO = AntO_report;
+                               
+                               }
+                       else
+                               {
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("return FALSE!!\n"));
+                               bResult = FALSE;
+                       }
+               }
+       }
+       else if(pDM_Odm->SupportICType == ODM_RTL8192C)
+       {
+               if(AntA_report >=       100)
+               {
+                       if(AntB_report > (AntA_report+2))
+                       {
+                               pDM_SWAT_Table->ANTA_ON=FALSE;
+                               pDM_SWAT_Table->ANTB_ON=TRUE;
+                               ODM_SetBBReg(pDM_Odm,  rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_B);
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna B\n"));         
+                       }       
+                       else if(AntA_report > (AntB_report+2))
+                       {
+                               pDM_SWAT_Table->ANTA_ON=TRUE;
+                               pDM_SWAT_Table->ANTB_ON=FALSE;
+                               ODM_SetBBReg(pDM_Odm,  rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_A);
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));
+                       }       
+                       else
+                       {
+                               pDM_SWAT_Table->ANTA_ON=TRUE;
+                               pDM_SWAT_Table->ANTB_ON=TRUE;
+                               RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Dual Antenna \n"));
+                       }
+               }
+               else
+               {
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
+                       pDM_SWAT_Table->ANTA_ON=TRUE; // Set Antenna A on as default 
+                       pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default 
+                       bResult = FALSE;
+               }
+       }
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_A[%d]= %d \n", 2416, AntA_report));   
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_B[%d]= %d \n", 2416, AntB_report));   
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_O[%d]= %d \n", 2416, AntO_report));
+               
+               //2 Test Ant B based on Ant A is ON
+               if(mode==ANTTESTB)
+               {
+                       if(AntA_report >=100 && AntA_report <= 116)
+                       {
+                               if(AntB_report >= (AntA_report+4) && AntB_report > 116)
+                               {
+                                       pDM_SWAT_Table->ANTB_ON=FALSE;
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));         
+                               }       
+                               else if(AntB_report >=100 && AntB_report <= 116)
+                               {
+                                       pDM_SWAT_Table->ANTB_ON=TRUE;
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Dual Antenna is A and B\n"));  
+                               }
+                               else
+                               {
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
+                                       pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default 
+                                       bResult = FALSE;
+                               }
+                       }
+                       else
+                       {
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
+                               pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default 
+                               bResult = FALSE;
+                       }
+               }       
+               //2 Test Ant A and B based on DPDT Open
+               else if(mode==ANTTESTALL)
+               {
+                       if((AntA_report >= 100) && (AntB_report >= 100) && (AntA_report <= 120) && (AntB_report <= 120))
+                       {
+                               if((AntA_report - AntB_report < 2) || (AntB_report - AntA_report < 2))
+                               {
+                                       pDM_SWAT_Table->ANTA_ON=TRUE;
+                                       pDM_SWAT_Table->ANTB_ON=TRUE;
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SingleDualAntennaDetection(): Dual Antenna\n"));
+                               }
+                               else if(((AntA_report - AntB_report >= 2) && (AntA_report - AntB_report <= 4)) || 
+                                       ((AntB_report - AntA_report >= 2) && (AntB_report - AntA_report <= 4)))
+                               {
+                                       pDM_SWAT_Table->ANTA_ON=FALSE;
+                                       pDM_SWAT_Table->ANTB_ON=FALSE;
+                                       bResult = FALSE;
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
+                               }
+                               else
+                               {
+                                       pDM_SWAT_Table->ANTA_ON = TRUE;
+                                       pDM_SWAT_Table->ANTB_ON=FALSE;
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));
+                               }
+                               
+                               pDM_Odm->AntDetectedInfo.bAntDetected= TRUE;
+                               pDM_Odm->AntDetectedInfo.dBForAntA = AntA_report;
+                               pDM_Odm->AntDetectedInfo.dBForAntB = AntB_report;
+                               pDM_Odm->AntDetectedInfo.dBForAntO = AntO_report;
+                               
+                       }
+                       else
+                       {
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("return FALSE!!\n"));
+                               bResult = FALSE;
+                       }
+               }
+       }
+               
+       return bResult;
+
+}
+
+
+#endif   // end odm_CE
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN| ODM_CE))
+
+VOID
+odm_Set_RA_DM_ARFB_by_Noisy(
+       IN      PDM_ODM_T       pDM_Odm
+)
+{
+       //DbgPrint("DM_ARFB ====> \n");
+       if (pDM_Odm->bNoisyState){
+               ODM_Write4Byte(pDM_Odm,0x430,0x00000000);
+               ODM_Write4Byte(pDM_Odm,0x434,0x05040200);
+               //DbgPrint("DM_ARFB ====> Noisy State\n");
+       }
+       else{
+               ODM_Write4Byte(pDM_Odm,0x430,0x02010000);
+               ODM_Write4Byte(pDM_Odm,0x434,0x07050403);
+               //DbgPrint("DM_ARFB ====> Clean State\n");
+       }
+       
+}
+
+VOID
+ODM_UpdateNoisyState(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      BOOLEAN         bNoisyStateFromC2H
+       )
+{
+       //DbgPrint("Get C2H Command! NoisyState=0x%x\n ", bNoisyStateFromC2H);
+       if(pDM_Odm->SupportICType == ODM_RTL8821  || pDM_Odm->SupportICType == ODM_RTL8812  || 
+          pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8188E)
+       {
+               pDM_Odm->bNoisyState = bNoisyStateFromC2H;
+       }
+       odm_Set_RA_DM_ARFB_by_Noisy(pDM_Odm);
+};
+
+u4Byte
+Set_RA_DM_Ratrbitmap_by_Noisy(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      WIRELESS_MODE   WirelessMode,
+       IN      u4Byte                  ratr_bitmap,
+       IN      u1Byte                  rssi_level
+)
+{
+       u4Byte ret_bitmap = ratr_bitmap;
+       switch (WirelessMode)
+       {
+               case WIRELESS_MODE_AC_24G :
+               case WIRELESS_MODE_AC_5G :
+               case WIRELESS_MODE_AC_ONLY:
+                       if (pDM_Odm->bNoisyState){ // in Noisy State
+                               if (rssi_level==1)
+                                       ret_bitmap&=0xfe3f0e08;
+                               else if (rssi_level==2)
+                                       ret_bitmap&=0xff3f8f8c;
+                               else if (rssi_level==3)
+                                       ret_bitmap&=0xffffffcc ;
+                               else
+                                       ret_bitmap&=0xffffffff ;
+                       }
+                       else{                                   // in SNR State
+                               if (rssi_level==1){
+                                       ret_bitmap&=0xfc3e0c08;
+                               }
+                               else if (rssi_level==2){
+                                       ret_bitmap&=0xfe3f0e08;
+                               }
+                               else if (rssi_level==3){
+                                       ret_bitmap&=0xffbfefcc;
+                               }
+                               else{
+                                       ret_bitmap&=0x0fffffff;
+                               }
+                       }
+                       break;
+               case WIRELESS_MODE_B:
+               case WIRELESS_MODE_A:
+               case WIRELESS_MODE_G:
+               case WIRELESS_MODE_N_24G:
+               case WIRELESS_MODE_N_5G:
+                       if (pDM_Odm->bNoisyState){
+                               if (rssi_level==1)
+                                       ret_bitmap&=0x0f0e0c08;
+                               else if (rssi_level==2)
+                                       ret_bitmap&=0x0f8f0e0c;
+                               else if (rssi_level==3)
+                                       ret_bitmap&=0x0fefefcc ;
+                               else
+                                       ret_bitmap&=0xffffffff ;
+                       }
+                       else{
+                               if (rssi_level==1){
+                                       ret_bitmap&=0x0f8f0e08;
+                               }
+                               else if (rssi_level==2){
+                                       ret_bitmap&=0x0fcf8f8c;
+                               }
+                               else if (rssi_level==3){
+                                       ret_bitmap&=0x0fffffcc;
+                               }
+                               else{
+                                       ret_bitmap&=0x0fffffff;
+                               }
+                       }
+                       break;
+               default:
+                       break;
+       }
+       //DbgPrint("DM_RAMask ====> rssi_LV = %d, BITMAP = %x \n", rssi_level, ret_bitmap);
+       return ret_bitmap;
+
+}
+
+
+
+VOID
+ODM_UpdateInitRate(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      u1Byte          Rate
+       )
+{
+       u1Byte                  p = 0;
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("Get C2H Command! Rate=0x%x\n", Rate));
+       
+       if(pDM_Odm->SupportICType == ODM_RTL8821  || pDM_Odm->SupportICType == ODM_RTL8812  || 
+          pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8188E)
+       {
+               pDM_Odm->TxRate = Rate;
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       #if DEV_BUS_TYPE==RT_PCI_INTERFACE
+               #if USE_WORKITEM
+               PlatformScheduleWorkItem(&pDM_Odm->RaRptWorkitem);
+               #else
+               if(pDM_Odm->SupportICType == ODM_RTL8821)
+               {
+                       ODM_TxPwrTrackSetPwr8821A(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
+               }
+               else if(pDM_Odm->SupportICType == ODM_RTL8812)
+               {
+                       for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8812A; p++)            
+                       {
+                               ODM_TxPwrTrackSetPwr8812A(pDM_Odm, MIX_MODE, p, 0);
+                       }
+               }
+               else if(pDM_Odm->SupportICType == ODM_RTL8723B)
+               {
+                       ODM_TxPwrTrackSetPwr_8723B(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
+               }
+               else if(pDM_Odm->SupportICType == ODM_RTL8192E)
+               {
+                       for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8192E; p++)            
+                       {
+                               ODM_TxPwrTrackSetPwr92E(pDM_Odm, MIX_MODE, p, 0);
+                       }
+               }
+               else if(pDM_Odm->SupportICType == ODM_RTL8188E)
+               {
+                       ODM_TxPwrTrackSetPwr88E(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
+               }
+               #endif
+       #else
+               PlatformScheduleWorkItem(&pDM_Odm->RaRptWorkitem);
+       #endif  
+#endif
+       }
+       else
+               return;
+}
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+VOID
+ODM_UpdateInitRateWorkItemCallback(
+    IN PVOID            pContext
+    )
+{
+       PADAPTER        Adapter = (PADAPTER)pContext;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+
+       u1Byte                  p = 0;  
+
+       if(pDM_Odm->SupportICType == ODM_RTL8821)
+       {
+               ODM_TxPwrTrackSetPwr8821A(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
+       }
+       else if(pDM_Odm->SupportICType == ODM_RTL8812)
+       {
+               for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8812A; p++)    //DOn't know how to include &c
+               {
+                       ODM_TxPwrTrackSetPwr8812A(pDM_Odm, MIX_MODE, p, 0);
+               }
+       }
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)
+       {
+                       ODM_TxPwrTrackSetPwr_8723B(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
+       }
+       else if(pDM_Odm->SupportICType == ODM_RTL8192E)
+       {
+               for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8192E; p++)    //DOn't know how to include &c
+               {
+                       ODM_TxPwrTrackSetPwr92E(pDM_Odm, MIX_MODE, p, 0);
+               }
+       }
+       else if(pDM_Odm->SupportICType == ODM_RTL8188E)
+       {
+                       ODM_TxPwrTrackSetPwr88E(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
+       }
+}
+#endif
+#endif
+
+//
+// ODM multi-port consideration, added by Roger, 2013.10.01.
+//
+VOID
+ODM_AsocEntry_Init(
+       IN      PDM_ODM_T       pDM_Odm
+       )
+{
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       PADAPTER pLoopAdapter = GetDefaultAdapter(pDM_Odm->Adapter);
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pLoopAdapter);
+       PDM_ODM_T                pDM_OutSrc = &pHalData->DM_OutSrc;
+       u1Byte  TotalAssocEntryNum = 0;
+       u1Byte  index = 0;
+
+
+       ODM_CmnInfoPtrArrayHook(pDM_OutSrc, ODM_CMNINFO_STA_STATUS, 0, &pLoopAdapter->MgntInfo.DefaultPort[0]);
+       pLoopAdapter->MgntInfo.DefaultPort[0].MultiPortStationIdx = TotalAssocEntryNum;
+               
+       pLoopAdapter = GetNextExtAdapter(pLoopAdapter);
+       TotalAssocEntryNum +=1;
+
+       while(pLoopAdapter)
+       {
+               for (index = 0; index <ASSOCIATE_ENTRY_NUM; index++)
+               {
+                       ODM_CmnInfoPtrArrayHook(pDM_OutSrc, ODM_CMNINFO_STA_STATUS, TotalAssocEntryNum+index, &pLoopAdapter->MgntInfo.AsocEntry[index]);
+                       pLoopAdapter->MgntInfo.AsocEntry[index].MultiPortStationIdx = TotalAssocEntryNum+index;                         
+               }
+               
+               TotalAssocEntryNum+= index;
+               if(IS_HARDWARE_TYPE_8188E((pDM_Odm->Adapter)))
+                       pLoopAdapter->RASupport = TRUE;
+               pLoopAdapter = GetNextExtAdapter(pLoopAdapter);
+       }
+#endif
+}
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
+/* Justin: According to the current RRSI to adjust Response Frame TX power, 2012/11/05 */
+void odm_dtc(PDM_ODM_T pDM_Odm)
+{
+#ifdef CONFIG_DM_RESP_TXAGC
+       #define DTC_BASE            35  /* RSSI higher than this value, start to decade TX power */
+       #define DTC_DWN_BASE       (DTC_BASE-5) /* RSSI lower than this value, start to increase TX power */
+
+       /* RSSI vs TX power step mapping: decade TX power */
+       static const u8 dtc_table_down[]={
+               DTC_BASE,
+               (DTC_BASE+5),
+               (DTC_BASE+10),
+               (DTC_BASE+15),
+               (DTC_BASE+20),
+               (DTC_BASE+25)
+       };
+
+       /* RSSI vs TX power step mapping: increase TX power */
+       static const u8 dtc_table_up[]={
+               DTC_DWN_BASE,
+               (DTC_DWN_BASE-5),
+               (DTC_DWN_BASE-10),
+               (DTC_DWN_BASE-15),
+               (DTC_DWN_BASE-15),
+               (DTC_DWN_BASE-20),
+               (DTC_DWN_BASE-20),
+               (DTC_DWN_BASE-25),
+               (DTC_DWN_BASE-25),
+               (DTC_DWN_BASE-30),
+               (DTC_DWN_BASE-35)
+       };
+
+       u8 i;
+       u8 dtc_steps=0;
+       u8 sign;
+       u8 resp_txagc=0;
+
+       #if 0
+       /* As DIG is disabled, DTC is also disable */
+       if(!(pDM_Odm->SupportAbility & ODM_XXXXXX))
+               return;
+       #endif
+
+       if (DTC_BASE < pDM_Odm->RSSI_Min) {
+               /* need to decade the CTS TX power */
+               sign = 1;
+               for (i=0;i<ARRAY_SIZE(dtc_table_down);i++)
+               {
+                       if ((dtc_table_down[i] >= pDM_Odm->RSSI_Min) || (dtc_steps >= 6))
+                               break;
+                       else
+                               dtc_steps++;
+               }
+       }
+#if 0
+       else if (DTC_DWN_BASE > pDM_Odm->RSSI_Min)
+       {
+               /* needs to increase the CTS TX power */
+               sign = 0;
+               dtc_steps = 1;
+               for (i=0;i<ARRAY_SIZE(dtc_table_up);i++)
+               {
+                       if ((dtc_table_up[i] <= pDM_Odm->RSSI_Min) || (dtc_steps>=10))
+                               break;
+                       else
+                               dtc_steps++;
+               }
+       }
+#endif
+       else
+       {
+               sign = 0;
+               dtc_steps = 0;
+       }
+
+       resp_txagc = dtc_steps | (sign << 4);
+       resp_txagc = resp_txagc | (resp_txagc << 5);
+       ODM_Write1Byte(pDM_Odm, 0x06d9, resp_txagc);
+
+       DBG_871X("%s RSSI_Min:%u, set RESP_TXAGC to %s %u\n", 
+               __func__, pDM_Odm->RSSI_Min, sign?"minus":"plus", dtc_steps);
+#endif /* CONFIG_RESP_TXAGC_ADJUST */
+}
+
+#endif /* #if (DM_ODM_SUPPORT_TYPE == ODM_CE) */
+
+VOID
+odm_UpdatePowerTrainingState(
+       IN      PDM_ODM_T       pDM_Odm
+       )
+{
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       PFALSE_ALARM_STATISTICS         FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm , PHYDM_FALSEALMCNT);
+       pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+       u4Byte                                          score = 0;
+
+       if(!(pDM_Odm->SupportAbility & ODM_BB_PWR_TRAIN))
+               return;
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState()============>\n"));
+       pDM_Odm->bChangeState = FALSE;
+
+       // Debug command
+       if(pDM_Odm->ForcePowerTrainingState)
+       {
+               if(pDM_Odm->ForcePowerTrainingState == 1 && !pDM_Odm->bDisablePowerTraining)
+               {
+                       pDM_Odm->bChangeState = TRUE;
+                       pDM_Odm->bDisablePowerTraining = TRUE;
+               }
+               else if(pDM_Odm->ForcePowerTrainingState == 2 && pDM_Odm->bDisablePowerTraining)
+               {
+                       pDM_Odm->bChangeState = TRUE;
+                       pDM_Odm->bDisablePowerTraining = FALSE;
+               }
+
+               pDM_Odm->PT_score = 0;
+               pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;
+               pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): ForcePowerTrainingState = %d\n", 
+                       pDM_Odm->ForcePowerTrainingState));
+               return;
+       }
+       
+       if(!pDM_Odm->bLinked)
+               return;
+       
+       // First connect
+       if((pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE))
+       {
+               pDM_Odm->PT_score = 0;
+               pDM_Odm->bChangeState = TRUE;
+               pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;
+               pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): First Connect\n"));
+               return;
+       }
+
+       // Compute score
+       if(pDM_Odm->NHM_cnt_0 >= 215)
+               score = 2;
+       else if(pDM_Odm->NHM_cnt_0 >= 190) 
+               score = 1;                                                      // unknow state
+       else
+       {
+               u4Byte  RX_Pkt_Cnt;
+               
+               RX_Pkt_Cnt = (u4Byte)(pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM) + (u4Byte)(pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK);
+               
+               if((FalseAlmCnt->Cnt_CCA_all > 31 && RX_Pkt_Cnt > 31) && (FalseAlmCnt->Cnt_CCA_all >= RX_Pkt_Cnt))
+               {
+                       if((RX_Pkt_Cnt + (RX_Pkt_Cnt >> 1)) <= FalseAlmCnt->Cnt_CCA_all)
+                               score = 0;
+                       else if((RX_Pkt_Cnt + (RX_Pkt_Cnt >> 2)) <= FalseAlmCnt->Cnt_CCA_all)
+                               score = 1;
+                       else
+                               score = 2;
+               }
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): RX_Pkt_Cnt = %d, Cnt_CCA_all = %d\n", 
+                       RX_Pkt_Cnt, FalseAlmCnt->Cnt_CCA_all));
+       }
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): NumQryPhyStatusOFDM = %d, NumQryPhyStatusCCK = %d\n",
+                       (u4Byte)(pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM), (u4Byte)(pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK)));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): NHM_cnt_0 = %d, score = %d\n", 
+               pDM_Odm->NHM_cnt_0, score));
+
+       // smoothing
+       pDM_Odm->PT_score = (score << 4) + (pDM_Odm->PT_score>>1) + (pDM_Odm->PT_score>>2);
+       score = (pDM_Odm->PT_score + 32) >> 6;
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): PT_score = %d, score after smoothing = %d\n", 
+               pDM_Odm->PT_score, score));
+
+       // Mode decision
+       if(score == 2)
+       {
+               if(pDM_Odm->bDisablePowerTraining)
+               {
+                       pDM_Odm->bChangeState = TRUE;
+                       pDM_Odm->bDisablePowerTraining = FALSE;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): Change state\n"));
+               }
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): Enable Power Training\n"));
+       }
+       else if(score == 0)
+       {
+               if(!pDM_Odm->bDisablePowerTraining)
+               {
+                       pDM_Odm->bChangeState = TRUE;
+                       pDM_Odm->bDisablePowerTraining = TRUE;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): Change state\n"));
+               }
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): Disable Power Training\n"));
+       }
+
+       pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;
+       pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;
+#endif
+}
+
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm.h
new file mode 100755 (executable)
index 0000000..3a50704
--- /dev/null
@@ -0,0 +1,2000 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+\r
+#ifndef        __HALDMOUTSRC_H__\r
+#define __HALDMOUTSRC_H__\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+#include "phydm_DIG.h"\r
+#include "phydm_EdcaTurboCheck.h"\r
+#include "phydm_PathDiv.h"\r
+#include "phydm_DynamicBBPowerSaving.h"\r
+#include "phydm_RaInfo.h"\r
+#include "phydm_DynamicTxPower.h"\r
+#include "phydm_CfoTracking.h"\r
+#include "phydm_ACS.h"\r
+#include "phydm_PowerTracking.h"\r
+#include "PhyDM_Adaptivity.h"\r
+#include "phydm_NoiseMonitor.h"\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN))\r
+#include "phydm_RXHP.h"\r
+#endif\r
+\r
+//============================================================\r
+// Definition \r
+//============================================================\r
+//\r
+// 2011/09/22 MH Define all team supprt ability.\r
+//\r
+\r
+//\r
+// 2011/09/22 MH Define for all teams. Please Define the constan in your precomp header.\r
+//\r
+//#define              DM_ODM_SUPPORT_AP                       0\r
+//#define              DM_ODM_SUPPORT_ADSL                     0\r
+//#define              DM_ODM_SUPPORT_CE                       0\r
+//#define              DM_ODM_SUPPORT_MP                       1\r
+\r
+//\r
+// 2011/09/28 MH Define ODM SW team support flag.\r
+//\r
+\r
+\r
+\r
+//\r
+// Antenna Switch Relative Definition.\r
+//\r
+\r
+//\r
+// 20100503 Joseph:\r
+// Add new function SwAntDivCheck8192C().\r
+// This is the main function of Antenna diversity function before link.\r
+// Mainly, it just retains last scan result and scan again.\r
+// After that, it compares the scan result to see which one gets better RSSI.\r
+// It selects antenna with better receiving power and returns better scan result.\r
+//\r
+#define        TP_MODE         0\r
+#define        RSSI_MODE               1\r
+#define        TRAFFIC_LOW     0\r
+#define        TRAFFIC_HIGH    1\r
+#define        NONE                    0\r
+\r
+\r
+//============================================================\r
+//3 Tx Power Tracking\r
+//3============================================================\r
+\r
+\r
+//============================================================\r
+//3 PSD Handler\r
+//3============================================================\r
+\r
+#define        AFH_PSD         1       //0:normal PSD scan, 1: only do 20 pts PSD\r
+#define        MODE_40M                0       //0:20M, 1:40M\r
+#define        PSD_TH2         3  \r
+#define        PSD_CHMIN               20   // Minimum channel number for BT AFH\r
+#define        SIR_STEP_SIZE   3\r
+#define   Smooth_Size_1        5\r
+#define        Smooth_TH_1     3\r
+#define   Smooth_Size_2        10\r
+#define        Smooth_TH_2     4\r
+#define   Smooth_Size_3        20\r
+#define        Smooth_TH_3     4\r
+#define   Smooth_Step_Size 5\r
+#define        Adaptive_SIR    1\r
+#if(RTL8723_FPGA_VERIFICATION == 1)\r
+#define        PSD_RESCAN              1\r
+#else\r
+#define        PSD_RESCAN              4\r
+#endif\r
+#define        PSD_SCAN_INTERVAL       700 //ms\r
+\r
+\r
+\r
+//8723A High Power IGI Setting\r
+#define                DM_DIG_HIGH_PWR_IGI_LOWER_BOUND 0x22\r
+#define                DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND 0x28\r
+#define                DM_DIG_HIGH_PWR_THRESHOLD       0x3a\r
+#define                DM_DIG_LOW_PWR_THRESHOLD        0x14\r
+\r
+//ANT Test\r
+#define                ANTTESTALL              0x00            //Ant A or B will be Testing   \r
+#define                ANTTESTA                0x01            //Ant A will be Testing \r
+#define                ANTTESTB                0x02            //Ant B will be testing\r
+\r
+//for 8723A Ant Definition--2012--06--07 due to different IC may be different ANT define\r
+#define                MAIN_ANT                1               //Ant A or Ant Main\r
+#define                AUX_ANT         2               //AntB or Ant Aux\r
+#define                MAX_ANT         3               // 3 for AP using\r
+\r
+\r
+//Antenna Diversity Type\r
+#define        SW_ANTDIV       0\r
+#define        HW_ANTDIV       1\r
+//============================================================\r
+// structure and define\r
+//============================================================\r
+\r
+//\r
+// 2011/09/20 MH Add for AP/ADSLpseudo DM structuer requirement.\r
+// We need to remove to other position???\r
+//\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\r
+typedef                struct rtl8192cd_priv {\r
+       u1Byte          temp;\r
+\r
+}rtl8192cd_priv, *prtl8192cd_priv;\r
+#endif\r
+\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+typedef                struct _ADAPTER{\r
+       u1Byte          temp;\r
+       #ifdef AP_BUILD_WORKAROUND\r
+       HAL_DATA_TYPE*          temp2;\r
+       prtl8192cd_priv         priv;\r
+       #endif\r
+}ADAPTER, *PADAPTER;\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+\r
+typedef                struct _WLAN_STA{\r
+       u1Byte          temp;\r
+} WLAN_STA, *PRT_WLAN_STA;\r
+\r
+#endif\r
+\r
+//Remove DIG by Yuchen\r
+\r
+//Remoce BB power saving by Yuchn\r
+\r
+//Remove DIG by yuchen\r
+\r
+typedef struct _Dynamic_Primary_CCA{\r
+       u1Byte          PriCCA_flag;\r
+       u1Byte          intf_flag;\r
+       u1Byte          intf_type;  \r
+       u1Byte          DupRTS_flag;\r
+       u1Byte          Monitor_flag;\r
+       u1Byte          CH_offset;\r
+       u1Byte                  MF_state;\r
+}Pri_CCA_T, *pPri_CCA_T;\r
+\r
+//Remove RA_T,*pRA_T by RS_James\r
+\r
+typedef struct _RX_High_Power_\r
+{\r
+       u1Byte          RXHP_flag;\r
+       u1Byte          PSD_func_trigger;\r
+       u1Byte          PSD_bitmap_RXHP[80];\r
+       u1Byte          Pre_IGI;\r
+       u1Byte          Cur_IGI;\r
+       u1Byte          Pre_pw_th;\r
+       u1Byte          Cur_pw_th;\r
+       BOOLEAN         First_time_enter;\r
+       BOOLEAN         RXHP_enable;\r
+       u1Byte          TP_Mode;\r
+       RT_TIMER        PSDTimer;\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)   \r
+       #if USE_WORKITEM\r
+       RT_WORK_ITEM            PSDTimeWorkitem;\r
+       #endif\r
+#endif\r
+\r
+}RXHP_T, *pRXHP_T;\r
+       \r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_CE))\r
+#define ASSOCIATE_ENTRY_NUM                                    32 // Max size of AsocEntry[].\r
+#define        ODM_ASSOCIATE_ENTRY_NUM                         ASSOCIATE_ENTRY_NUM\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+#define ASSOCIATE_ENTRY_NUM                                    NUM_STAT\r
+#define        ODM_ASSOCIATE_ENTRY_NUM                         ASSOCIATE_ENTRY_NUM+1\r
+\r
+#else\r
+//\r
+// 2012/01/12 MH Revise for compatiable with other SW team. \r
+// 0 is for STA 1-n is for AP clients.\r
+//\r
+#define ODM_ASSOCIATE_ENTRY_NUM                                ASSOCIATE_ENTRY_NUM+1// Default port only one\r
+#endif\r
+\r
+//#ifdef CONFIG_ANTENNA_DIVERSITY\r
+// This indicates two different the steps. \r
+// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air.\r
+// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK\r
+// with original RSSI to determine if it is necessary to switch antenna.\r
+#define SWAW_STEP_PEAK         0\r
+#define SWAW_STEP_DETERMINE    1\r
+\r
+#define        TP_MODE         0\r
+#define        RSSI_MODE               1\r
+#define        TRAFFIC_LOW     0\r
+#define        TRAFFIC_HIGH    1\r
+#define        TRAFFIC_UltraLOW        2\r
+\r
+typedef struct _SW_Antenna_Switch_\r
+{\r
+       u1Byte          Double_chk_flag;\r
+       u1Byte          try_flag;\r
+       s4Byte          PreRSSI;\r
+       u1Byte          CurAntenna;\r
+       u1Byte          PreAntenna;\r
+       u1Byte          RSSI_Trying;\r
+       u1Byte          TestMode;\r
+       u1Byte          bTriggerAntennaSwitch;\r
+       u1Byte          SelectAntennaMap;\r
+       u1Byte          RSSI_target;    \r
+       u1Byte          reset_idx;\r
+       u2Byte          Single_Ant_Counter;\r
+       u2Byte          Dual_Ant_Counter;\r
+       u2Byte          Aux_FailDetec_Counter;\r
+       u2Byte          Retry_Counter;\r
+\r
+       // Before link Antenna Switch check\r
+       u1Byte          SWAS_NoLink_State;\r
+       u4Byte          SWAS_NoLink_BK_Reg860;\r
+       u4Byte          SWAS_NoLink_BK_Reg92c;\r
+       u4Byte          SWAS_NoLink_BK_Reg948;\r
+       BOOLEAN         ANTA_ON;        //To indicate Ant A is or not\r
+       BOOLEAN         ANTB_ON;        //To indicate Ant B is on or not\r
+       BOOLEAN         Pre_Aux_FailDetec;\r
+       BOOLEAN         RSSI_AntDect_bResult;   \r
+       u1Byte          Ant5G;\r
+       u1Byte          Ant2G;\r
+\r
+       s4Byte          RSSI_sum_A;\r
+       s4Byte          RSSI_sum_B;\r
+       s4Byte          RSSI_cnt_A;\r
+       s4Byte          RSSI_cnt_B;\r
+\r
+       u8Byte          lastTxOkCnt;\r
+       u8Byte          lastRxOkCnt;\r
+       u8Byte          TXByteCnt_A;\r
+       u8Byte          TXByteCnt_B;\r
+       u8Byte          RXByteCnt_A;\r
+       u8Byte          RXByteCnt_B;\r
+       u1Byte          TrafficLoad;\r
+       u1Byte          Train_time;\r
+       u1Byte          Train_time_flag;\r
+       RT_TIMER        SwAntennaSwitchTimer;\r
+#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)   \r
+       RT_TIMER        SwAntennaSwitchTimer_8723B;\r
+       u4Byte          PktCnt_SWAntDivByCtrlFrame;\r
+       BOOLEAN         bSWAntDivByCtrlFrame;\r
+#endif\r
+       \r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)   \r
+       #if USE_WORKITEM\r
+       RT_WORK_ITEM                    SwAntennaSwitchWorkitem;\r
+#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)   \r
+       RT_WORK_ITEM                    SwAntennaSwitchWorkitem_8723B;\r
+       #endif\r
+#endif\r
+#endif\r
+/* CE Platform use\r
+#ifdef CONFIG_SW_ANTENNA_DIVERSITY\r
+       _timer SwAntennaSwitchTimer; \r
+       u8Byte lastTxOkCnt;\r
+       u8Byte lastRxOkCnt;\r
+       u8Byte TXByteCnt_A;\r
+       u8Byte TXByteCnt_B;\r
+       u8Byte RXByteCnt_A;\r
+       u8Byte RXByteCnt_B;\r
+       u1Byte DoubleComfirm;\r
+       u1Byte TrafficLoad;\r
+       //SW Antenna Switch\r
+\r
+\r
+#endif\r
+*/\r
+#ifdef CONFIG_HW_ANTENNA_DIVERSITY\r
+       //Hybrid Antenna Diversity\r
+       u4Byte          CCK_Ant1_Cnt[ASSOCIATE_ENTRY_NUM+1];\r
+       u4Byte          CCK_Ant2_Cnt[ASSOCIATE_ENTRY_NUM+1];\r
+       u4Byte          OFDM_Ant1_Cnt[ASSOCIATE_ENTRY_NUM+1];\r
+       u4Byte          OFDM_Ant2_Cnt[ASSOCIATE_ENTRY_NUM+1];\r
+       u4Byte          RSSI_Ant1_Sum[ASSOCIATE_ENTRY_NUM+1];\r
+       u4Byte          RSSI_Ant2_Sum[ASSOCIATE_ENTRY_NUM+1];\r
+       u1Byte          TxAnt[ASSOCIATE_ENTRY_NUM+1];\r
+       u1Byte          TargetSTA;\r
+       u1Byte          antsel;\r
+       u1Byte          RxIdleAnt;\r
+\r
+#endif\r
+       \r
+}SWAT_T, *pSWAT_T;\r
+//#endif\r
+\r
+// Edca Remove by YuChen\r
+\r
+//ODM_RATE_ADAPTIVE Remove by RS_James\r
+\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+\r
+\r
+#ifdef ADSL_AP_BUILD_WORKAROUND\r
+#define MAX_TOLERANCE                  5\r
+#define IQK_DELAY_TIME                 1               //ms\r
+#endif\r
+\r
+//\r
+// Indicate different AP vendor for IOT issue.\r
+//\r
+typedef enum _HT_IOT_PEER\r
+{\r
+       HT_IOT_PEER_UNKNOWN                     = 0,\r
+       HT_IOT_PEER_REALTEK                     = 1,\r
+       HT_IOT_PEER_REALTEK_92SE                = 2,\r
+       HT_IOT_PEER_BROADCOM            = 3,\r
+       HT_IOT_PEER_RALINK                      = 4,\r
+       HT_IOT_PEER_ATHEROS                     = 5,\r
+       HT_IOT_PEER_CISCO                               = 6,\r
+       HT_IOT_PEER_MERU                                = 7,    \r
+       HT_IOT_PEER_MARVELL                     = 8,\r
+       HT_IOT_PEER_REALTEK_SOFTAP      = 9,// peer is RealTek SOFT_AP, by Bohn, 2009.12.17\r
+       HT_IOT_PEER_SELF_SOFTAP                 = 10, // Self is SoftAP\r
+       HT_IOT_PEER_AIRGO                               = 11,\r
+       HT_IOT_PEER_INTEL                               = 12, \r
+       HT_IOT_PEER_RTK_APCLIENT                = 13, \r
+       HT_IOT_PEER_REALTEK_81XX                = 14,   \r
+       HT_IOT_PEER_REALTEK_WOW                 = 15,   \r
+       HT_IOT_PEER_MAX                                 = 16\r
+}HT_IOT_PEER_E, *PHTIOT_PEER_E;\r
+#endif//#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+\r
+#define                DM_Type_ByFW                    0\r
+#define                DM_Type_ByDriver                1\r
+\r
+//\r
+// Declare for common info\r
+//\r
+#define MAX_PATH_NUM_92CS              2\r
+#define MAX_PATH_NUM_8188E             1\r
+#define MAX_PATH_NUM_8192E             2\r
+#define MAX_PATH_NUM_8723B             1\r
+#define MAX_PATH_NUM_8812A             2\r
+#define MAX_PATH_NUM_8821A             1\r
+#define MAX_PATH_NUM_8814A             4\r
+#define MAX_PATH_NUM_8822B             2\r
+\r
+\r
+#define IQK_THRESHOLD                  8\r
+#define DPK_THRESHOLD                  4\r
+\r
+typedef struct _ODM_Phy_Status_Info_\r
+{\r
+       //\r
+       // Be care, if you want to add any element please insert between \r
+       // RxPWDBAll & SignalStrength.\r
+       //\r
+#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN))\r
+       u4Byte          RxPWDBAll;      \r
+#else\r
+       u1Byte          RxPWDBAll;      \r
+#endif\r
+\r
+       u1Byte          SignalQuality;                  // in 0-100 index. \r
+       s1Byte          RxMIMOSignalQuality[4]; //per-path's EVM\r
+       u1Byte          RxMIMOEVMdbm[4];                //per-path's EVM dbm\r
+\r
+       u1Byte          RxMIMOSignalStrength[4];// in 0~100 index\r
+\r
+       u2Byte          Cfo_short[4];                   // per-path's Cfo_short\r
+       u2Byte          Cfo_tail[4];                    // per-path's Cfo_tail\r
+       \r
+#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\r
+       s1Byte          RxPower;                                // in dBm Translate from PWdB\r
+       s1Byte          RecvSignalPower;                // Real power in dBm for this packet, no beautification and aggregation. Keep this raw info to be used for the other procedures.\r
+       u1Byte          BTRxRSSIPercentage;     \r
+       u1Byte          SignalStrength;                 // in 0-100 index.\r
\r
+       s1Byte          RxPwr[4];                               //per-path's pwdb\r
+#endif\r
+       u1Byte          RxSNR[4];                               //per-path's SNR        \r
+       u1Byte          BandWidth;\r
+       u1Byte          btCoexPwrAdjust;\r
+}ODM_PHY_INFO_T,*PODM_PHY_INFO_T;\r
+\r
+\r
+typedef struct _ODM_Per_Pkt_Info_\r
+{\r
+       //u1Byte                Rate;   \r
+       u1Byte          DataRate;\r
+       u1Byte          StationID;\r
+       BOOLEAN         bPacketMatchBSSID;\r
+       BOOLEAN         bPacketToSelf;\r
+       BOOLEAN         bPacketBeacon;\r
+       BOOLEAN         bToSelf;\r
+}ODM_PACKET_INFO_T,*PODM_PACKET_INFO_T;\r
+\r
+\r
+typedef struct _ODM_Phy_Dbg_Info_\r
+{\r
+       //ODM Write,debug info\r
+       s1Byte          RxSNRdB[4];\r
+       u4Byte          NumQryPhyStatus;\r
+       u4Byte          NumQryPhyStatusCCK;\r
+       u4Byte          NumQryPhyStatusOFDM;\r
+       u1Byte          NumQryBeaconPkt;\r
+       //Others\r
+       s4Byte          RxEVM[4];       \r
+       \r
+}ODM_PHY_DBG_INFO_T;\r
+\r
+\r
+typedef struct _ODM_Mac_Status_Info_\r
+{\r
+       u1Byte  test;\r
+       \r
+}ODM_MAC_INFO;\r
+\r
+\r
+typedef enum tag_Dynamic_ODM_Support_Ability_Type\r
+{\r
+       // BB Team\r
+       ODM_DIG                         = 0x00000001,\r
+       ODM_HIGH_POWER          = 0x00000002,\r
+       ODM_CCK_CCA_TH          = 0x00000004,\r
+       ODM_FA_STATISTICS               = 0x00000008,\r
+       ODM_RAMASK                      = 0x00000010,\r
+       ODM_RSSI_MONITOR                = 0x00000020,\r
+       ODM_SW_ANTDIV           = 0x00000040,\r
+       ODM_HW_ANTDIV           = 0x00000080,\r
+       ODM_BB_PWRSV                    = 0x00000100,\r
+       ODM_2TPATHDIV                   = 0x00000200,\r
+       ODM_1TPATHDIV                   = 0x00000400,\r
+       ODM_PSD2AFH                     = 0x00000800\r
+}ODM_Ability_E;\r
+\r
+//\r
+// 2011/20/20 MH For MP driver RT_WLAN_STA =  STA_INFO_T\r
+// Please declare below ODM relative info in your STA info structure.\r
+//\r
+#if 1\r
+typedef                struct _ODM_STA_INFO{\r
+       // Driver Write\r
+       BOOLEAN         bUsed;                          // record the sta status link or not?\r
+       //u1Byte                WirelessMode;           // \r
+       u1Byte          IOTPeer;                        // Enum value.  HT_IOT_PEER_E\r
+\r
+       // ODM Write\r
+       //1 PHY_STATUS_INFO\r
+       u1Byte          RSSI_Path[4];           // \r
+       u1Byte          RSSI_Ave;\r
+       u1Byte          RXEVM[4];\r
+       u1Byte          RXSNR[4];\r
+\r
+       // ODM Write\r
+       //1 TX_INFO (may changed by IC)\r
+       //TX_INFO_T             pTxInfo;                                // Define in IC folder. Move lower layer.\r
+#if 0\r
+       u1Byte          ANTSEL_A;                       //in Jagar: 4bit; others: 2bit\r
+       u1Byte          ANTSEL_B;                       //in Jagar: 4bit; others: 2bit\r
+       u1Byte          ANTSEL_C;                       //only in Jagar: 4bit\r
+       u1Byte          ANTSEL_D;                       //only in Jagar: 4bit\r
+       u1Byte          TX_ANTL;                        //not in Jagar: 2bit\r
+       u1Byte          TX_ANT_HT;                      //not in Jagar: 2bit\r
+       u1Byte          TX_ANT_CCK;                     //not in Jagar: 2bit\r
+       u1Byte          TXAGC_A;                        //not in Jagar: 4bit\r
+       u1Byte          TXAGC_B;                        //not in Jagar: 4bit\r
+       u1Byte          TXPWR_OFFSET;           //only in Jagar: 3bit\r
+       u1Byte          TX_ANT;                         //only in Jagar: 4bit for TX_ANTL/TX_ANTHT/TX_ANT_CCK\r
+#endif\r
+\r
+       //\r
+       //      Please use compile flag to disabe the strcutrue for other IC except 88E.\r
+       //      Move To lower layer.\r
+       //\r
+       // ODM Write Wilson will handle this part(said by Luke.Lee)\r
+       //TX_RPT_T              pTxRpt;                         // Define in IC folder. Move lower layer.\r
+#if 0  \r
+       //1 For 88E RA (don't redefine the naming)\r
+       u1Byte          rate_id;\r
+       u1Byte          rate_SGI;\r
+       u1Byte          rssi_sta_ra;\v\r
+\r
+       u1Byte          SGI_enable;\r
+       u1Byte          Decision_rate;\r
+       u1Byte          Pre_rate;\r
+       u1Byte          Active;\r
+\r
+       // Driver write Wilson handle.\r
+       //1 TX_RPT (don't redefine the naming)\r
+       u2Byte          RTY[4];                         // ???\r
+       u2Byte          TOTAL;                          // ???\r
+       u2Byte          DROP;                           // ???\r
+       //\r
+       // Please use compile flag to disabe the strcutrue for other IC except 88E.\r
+       //\r
+#endif\r
+\r
+}ODM_STA_INFO_T, *PODM_STA_INFO_T;\r
+#endif\r
+\r
+//\r
+// 2011/10/20 MH Define Common info enum for all team.\r
+//\r
+typedef enum _ODM_Common_Info_Definition\r
+{\r
+//-------------REMOVED CASE-----------//\r
+       //ODM_CMNINFO_CCK_HP,\r
+       //ODM_CMNINFO_RFPATH_ENABLE,            // Define as ODM write???       \r
+       //ODM_CMNINFO_BT_COEXIST,                               // ODM_BT_COEXIST_E\r
+       //ODM_CMNINFO_OP_MODE,                          // ODM_OPERATION_MODE_E\r
+//-------------REMOVED CASE-----------//\r
+\r
+       //\r
+       // Fixed value:\r
+       //\r
+\r
+       //-----------HOOK BEFORE REG INIT-----------//\r
+       ODM_CMNINFO_PLATFORM = 0,\r
+       ODM_CMNINFO_ABILITY,                                    // ODM_ABILITY_E\r
+       ODM_CMNINFO_INTERFACE,                          // ODM_INTERFACE_E\r
+       ODM_CMNINFO_MP_TEST_CHIP,\r
+       ODM_CMNINFO_IC_TYPE,                                    // ODM_IC_TYPE_E\r
+       ODM_CMNINFO_CUT_VER,                                    // ODM_CUT_VERSION_E\r
+       ODM_CMNINFO_FAB_VER,                                    // ODM_FAB_E\r
+       ODM_CMNINFO_RF_TYPE,                                    // ODM_RF_PATH_E or ODM_RF_TYPE_E?\r
+       ODM_CMNINFO_RFE_TYPE, \r
+       ODM_CMNINFO_BOARD_TYPE,                         // ODM_BOARD_TYPE_E\r
+       ODM_CMNINFO_PACKAGE_TYPE,\r
+       ODM_CMNINFO_EXT_LNA,                                    // TRUE\r
+       ODM_CMNINFO_5G_EXT_LNA, \r
+       ODM_CMNINFO_EXT_PA,\r
+       ODM_CMNINFO_5G_EXT_PA,\r
+       ODM_CMNINFO_GPA,\r
+       ODM_CMNINFO_APA,\r
+       ODM_CMNINFO_GLNA,\r
+       ODM_CMNINFO_ALNA,\r
+       ODM_CMNINFO_EXT_TRSW,\r
+       ODM_CMNINFO_PATCH_ID,                           //CUSTOMER ID\r
+       ODM_CMNINFO_BINHCT_TEST,\r
+       ODM_CMNINFO_BWIFI_TEST,\r
+       ODM_CMNINFO_SMART_CONCURRENT,\r
+       ODM_CMNINFO_DOMAIN_CODE_2G,\r
+       ODM_CMNINFO_DOMAIN_CODE_5G,\r
+       ODM_CMNINFO_IQKFWOFFLOAD,\r
+       //-----------HOOK BEFORE REG INIT-----------//  \r
+\r
+\r
+       //\r
+       // Dynamic value:\r
+       //\r
+//--------- POINTER REFERENCE-----------//\r
+       ODM_CMNINFO_MAC_PHY_MODE,                       // ODM_MAC_PHY_MODE_E\r
+       ODM_CMNINFO_TX_UNI,\r
+       ODM_CMNINFO_RX_UNI,\r
+       ODM_CMNINFO_WM_MODE,                            // ODM_WIRELESS_MODE_E\r
+       ODM_CMNINFO_BAND,                                       // ODM_BAND_TYPE_E\r
+       ODM_CMNINFO_SEC_CHNL_OFFSET,            // ODM_SEC_CHNL_OFFSET_E\r
+       ODM_CMNINFO_SEC_MODE,                           // ODM_SECURITY_E\r
+       ODM_CMNINFO_BW,                                         // ODM_BW_E\r
+       ODM_CMNINFO_CHNL,\r
+       ODM_CMNINFO_FORCED_RATE,\r
+       \r
+       ODM_CMNINFO_DMSP_GET_VALUE,\r
+       ODM_CMNINFO_BUDDY_ADAPTOR,\r
+       ODM_CMNINFO_DMSP_IS_MASTER,\r
+       ODM_CMNINFO_SCAN,\r
+       ODM_CMNINFO_POWER_SAVING,\r
+       ODM_CMNINFO_ONE_PATH_CCA,                       // ODM_CCA_PATH_E\r
+       ODM_CMNINFO_DRV_STOP,\r
+       ODM_CMNINFO_PNP_IN,\r
+       ODM_CMNINFO_INIT_ON,\r
+       ODM_CMNINFO_ANT_TEST,\r
+       ODM_CMNINFO_NET_CLOSED,\r
+       //ODM_CMNINFO_RTSTA_AID,                                // For win driver only?\r
+       ODM_CMNINFO_FORCED_IGI_LB,\r
+       ODM_CMNINFO_P2P_LINK,\r
+       ODM_CMNINFO_FCS_MODE,\r
+       ODM_CMNINFO_IS1ANTENNA,\r
+       ODM_CMNINFO_RFDEFAULTPATH,\r
+//--------- POINTER REFERENCE-----------//\r
+\r
+//------------CALL BY VALUE-------------//\r
+       ODM_CMNINFO_WIFI_DIRECT,\r
+       ODM_CMNINFO_WIFI_DISPLAY,\r
+       ODM_CMNINFO_LINK_IN_PROGRESS,                   \r
+       ODM_CMNINFO_LINK,\r
+       ODM_CMNINFO_STATION_STATE,\r
+       ODM_CMNINFO_RSSI_MIN,\r
+       ODM_CMNINFO_DBG_COMP,                           // u8Byte\r
+       ODM_CMNINFO_DBG_LEVEL,                          // u4Byte\r
+       ODM_CMNINFO_RA_THRESHOLD_HIGH,          // u1Byte\r
+       ODM_CMNINFO_RA_THRESHOLD_LOW,           // u1Byte\r
+       ODM_CMNINFO_RF_ANTENNA_TYPE,            // u1Byte\r
+       ODM_CMNINFO_BT_ENABLED,\r
+       ODM_CMNINFO_BT_HS_CONNECT_PROCESS,\r
+       ODM_CMNINFO_BT_HS_RSSI,\r
+       ODM_CMNINFO_BT_OPERATION,\r
+       ODM_CMNINFO_BT_LIMITED_DIG,                                     //Need to Limited Dig or not\r
+       ODM_CMNINFO_BT_DISABLE_EDCA,\r
+#if(DM_ODM_SUPPORT_TYPE & ODM_AP)              // for repeater mode add by YuChen 2014.06.\r
+#ifdef UNIVERSAL_REPEATER\r
+       ODM_CMNINFO_VXD_LINK,\r
+#endif\r
+#endif\r
+       \r
+//------------CALL BY VALUE-------------//\r
+\r
+       //\r
+       // Dynamic ptr array hook itms.\r
+       //\r
+       ODM_CMNINFO_STA_STATUS,\r
+       ODM_CMNINFO_PHY_STATUS,\r
+       ODM_CMNINFO_MAC_STATUS,\r
+       \r
+       ODM_CMNINFO_MAX,\r
+\r
+\r
+}ODM_CMNINFO_E;\r
+\r
+//\r
+// 2011/10/20 MH Define ODM support ability.  ODM_CMNINFO_ABILITY\r
+//\r
+typedef enum _ODM_Support_Ability_Definition\r
+{\r
+       //\r
+       // BB ODM section BIT 0-19\r
+       //\r
+       ODM_BB_DIG                                      = BIT0,\r
+       ODM_BB_RA_MASK                          = BIT1,\r
+       ODM_BB_DYNAMIC_TXPWR            = BIT2,\r
+       ODM_BB_FA_CNT                                   = BIT3,\r
+       ODM_BB_RSSI_MONITOR                     = BIT4,\r
+       ODM_BB_CCK_PD                                   = BIT5,\r
+       ODM_BB_ANT_DIV                          = BIT6,\r
+       ODM_BB_PWR_SAVE                         = BIT7,\r
+       ODM_BB_PWR_TRAIN                                = BIT8,\r
+       ODM_BB_RATE_ADAPTIVE                    = BIT9,\r
+       ODM_BB_PATH_DIV                         = BIT10,\r
+       ODM_BB_PSD                                      = BIT11,\r
+       ODM_BB_RXHP                                     = BIT12,\r
+       ODM_BB_ADAPTIVITY                               = BIT13,\r
+       ODM_BB_CFO_TRACKING                     = BIT14,\r
+       ODM_BB_NHM_CNT                          = BIT15,\r
+       ODM_BB_PRIMARY_CCA                      = BIT16,\r
+       \r
+       //\r
+       // MAC DM section BIT 20-23\r
+       //\r
+       ODM_MAC_EDCA_TURBO                      = BIT20,\r
+       ODM_MAC_EARLY_MODE                      = BIT21,\r
+       \r
+       //\r
+       // RF ODM section BIT 24-31\r
+       //\r
+       ODM_RF_TX_PWR_TRACK                     = BIT24,\r
+       ODM_RF_RX_GAIN_TRACK                    = BIT25,\r
+       ODM_RF_CALIBRATION                              = BIT26,\r
+       \r
+}ODM_ABILITY_E;\r
+\r
+//     ODM_CMNINFO_INTERFACE\r
+typedef enum tag_ODM_Support_Interface_Definition\r
+{\r
+       ODM_ITRF_PCIE   =       0x1,\r
+       ODM_ITRF_USB    =       0x2,\r
+       ODM_ITRF_SDIO   =       0x4,\r
+       ODM_ITRF_ALL    =       0x7,\r
+}ODM_INTERFACE_E;\r
+\r
+// ODM_CMNINFO_IC_TYPE\r
+typedef enum tag_ODM_Support_IC_Type_Definition\r
+{\r
+       ODM_RTL8192S    =       BIT0,\r
+       ODM_RTL8192C    =       BIT1,\r
+       ODM_RTL8192D    =       BIT2,\r
+       ODM_RTL8723A    =       BIT3,\r
+       ODM_RTL8188E    =       BIT4,\r
+       ODM_RTL8812     =       BIT5,\r
+       ODM_RTL8821     =       BIT6,\r
+       ODM_RTL8192E    =       BIT7,   \r
+       ODM_RTL8723B    =       BIT8,\r
+       ODM_RTL8814A    =       BIT9,   \r
+       ODM_RTL8881A    =       BIT10,\r
+       ODM_RTL8821B    =       BIT11,\r
+       ODM_RTL8822B    =       BIT12,\r
+        ODM_RTL8703B   =       BIT13\r
+}ODM_IC_TYPE_E;\r
+\r
+#define ODM_IC_11N_SERIES              (ODM_RTL8192S|ODM_RTL8192C|ODM_RTL8192D|ODM_RTL8723A|ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8703B)\r
+#define ODM_IC_11AC_SERIES             (ODM_RTL8812|ODM_RTL8821|ODM_RTL8814A|ODM_RTL8881A|ODM_RTL8821B|ODM_RTL8822B)\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+\r
+#ifdef RTK_AC_SUPPORT\r
+#define ODM_IC_11AC_SERIES_SUPPORT             1\r
+#else\r
+#define ODM_IC_11AC_SERIES_SUPPORT             0\r
+#endif\r
+\r
+#define ODM_IC_11N_SERIES_SUPPORT                      1\r
+#define ODM_CONFIG_BT_COEXIST                          0\r
+\r
+#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+\r
+#define ODM_IC_11AC_SERIES_SUPPORT             1\r
+#define ODM_IC_11N_SERIES_SUPPORT                      1\r
+#define ODM_CONFIG_BT_COEXIST                          1\r
+\r
+#else \r
+\r
+#if((RTL8192C_SUPPORT == 1) || (RTL8192D_SUPPORT == 1) || (RTL8723A_SUPPORT == 1) || (RTL8188E_SUPPORT == 1) ||\\r
+(RTL8723B_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8195A_SUPPORT == 1))\r
+#define ODM_IC_11N_SERIES_SUPPORT                      1\r
+#define ODM_IC_11AC_SERIES_SUPPORT             0\r
+#else\r
+#define ODM_IC_11N_SERIES_SUPPORT                      0\r
+#define ODM_IC_11AC_SERIES_SUPPORT             1\r
+#endif\r
+\r
+#ifdef CONFIG_BT_COEXIST\r
+#define ODM_CONFIG_BT_COEXIST                          1\r
+#else\r
+#define ODM_CONFIG_BT_COEXIST                          0\r
+#endif\r
+\r
+#endif\r
+\r
+\r
+//ODM_CMNINFO_CUT_VER\r
+typedef enum tag_ODM_Cut_Version_Definition\r
+{\r
+       ODM_CUT_A               =       0,\r
+       ODM_CUT_B               =       1,\r
+       ODM_CUT_C               =       2,\r
+       ODM_CUT_D               =       3,\r
+       ODM_CUT_E               =       4,\r
+       ODM_CUT_F               =       5,\r
+\r
+       ODM_CUT_I               =       8,\r
+       ODM_CUT_J               =       9,\r
+       ODM_CUT_K               =       10,     \r
+       ODM_CUT_TEST    =       15,\r
+}ODM_CUT_VERSION_E;\r
+\r
+// ODM_CMNINFO_FAB_VER\r
+typedef enum tag_ODM_Fab_Version_Definition\r
+{\r
+       ODM_TSMC        =       0,\r
+       ODM_UMC         =       1,\r
+}ODM_FAB_E;\r
+\r
+// ODM_CMNINFO_RF_TYPE\r
+//\r
+// For example 1T2R (A+AB = BIT0|BIT4|BIT5)\r
+//\r
+typedef enum tag_ODM_RF_Path_Bit_Definition\r
+{\r
+       ODM_RF_TX_A     =       BIT0,\r
+       ODM_RF_TX_B     =       BIT1,\r
+       ODM_RF_TX_C     =       BIT2,\r
+       ODM_RF_TX_D     =       BIT3,\r
+       ODM_RF_RX_A     =       BIT4,\r
+       ODM_RF_RX_B     =       BIT5,\r
+       ODM_RF_RX_C     =       BIT6,\r
+       ODM_RF_RX_D     =       BIT7,\r
+}ODM_RF_PATH_E;\r
+\r
+\r
+typedef enum tag_ODM_RF_Type_Definition\r
+{\r
+       ODM_1T1R        =       0,\r
+       ODM_1T2R        =       1,\r
+       ODM_2T2R        =       2,\r
+       ODM_2T3R        =       3,\r
+       ODM_2T4R        =       4,\r
+       ODM_3T3R        =       5,\r
+       ODM_3T4R        =       6,\r
+       ODM_4T4R        =       7,\r
+}ODM_RF_TYPE_E;\r
+\r
+\r
+//\r
+// ODM Dynamic common info value definition\r
+//\r
+\r
+//typedef enum _MACPHY_MODE_8192D{\r
+//     SINGLEMAC_SINGLEPHY,\r
+//     DUALMAC_DUALPHY,\r
+//     DUALMAC_SINGLEPHY,\r
+//}MACPHY_MODE_8192D,*PMACPHY_MODE_8192D;\r
+// Above is the original define in MP driver. Please use the same define. THX.\r
+typedef enum tag_ODM_MAC_PHY_Mode_Definition\r
+{\r
+       ODM_SMSP        = 0,\r
+       ODM_DMSP        = 1,\r
+       ODM_DMDP        = 2,\r
+}ODM_MAC_PHY_MODE_E;\r
+\r
+\r
+typedef enum tag_BT_Coexist_Definition\r
+{      \r
+       ODM_BT_BUSY             = 1,\r
+       ODM_BT_ON                       = 2,\r
+       ODM_BT_OFF              = 3,\r
+       ODM_BT_NONE             = 4,\r
+}ODM_BT_COEXIST_E;\r
+\r
+// ODM_CMNINFO_OP_MODE\r
+typedef enum tag_Operation_Mode_Definition\r
+{\r
+       ODM_NO_LINK             = BIT0,\r
+       ODM_LINK                        = BIT1,\r
+       ODM_SCAN                        = BIT2,\r
+       ODM_POWERSAVE   = BIT3,\r
+       ODM_AP_MODE             = BIT4,\r
+       ODM_CLIENT_MODE = BIT5,\r
+       ODM_AD_HOC              = BIT6,\r
+       ODM_WIFI_DIRECT = BIT7,\r
+       ODM_WIFI_DISPLAY        = BIT8,\r
+}ODM_OPERATION_MODE_E;\r
+\r
+// ODM_CMNINFO_WM_MODE\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_CE))\r
+typedef enum tag_Wireless_Mode_Definition\r
+{\r
+        ODM_WM_UNKNOW     = 0x0,\r
+        ODM_WM_B                  = BIT0,\r
+        ODM_WM_G                  = BIT1,\r
+        ODM_WM_A                  = BIT2,\r
+        ODM_WM_N24G           = BIT3,\r
+        ODM_WM_N5G             = BIT4,\r
+        ODM_WM_AUTO           = BIT5,\r
+        ODM_WM_AC                = BIT6,\r
+}ODM_WIRELESS_MODE_E;\r
+#else\r
+typedef enum tag_Wireless_Mode_Definition\r
+{\r
+        ODM_WM_UNKNOWN         = 0x00,\r
+        ODM_WM_A                       = BIT0,\r
+        ODM_WM_B                       = BIT1,\r
+        ODM_WM_G                       = BIT2,\r
+        ODM_WM_AUTO            = BIT3,\r
+        ODM_WM_N24G            = BIT4,\r
+        ODM_WM_N5G             = BIT5,\r
+        ODM_WM_AC_5G   = BIT6,\r
+        ODM_WM_AC_24G          = BIT7,\r
+        ODM_WM_AC_ONLY         = BIT8,\r
+        ODM_WM_MAX             = BIT9\r
+}ODM_WIRELESS_MODE_E;\r
+#endif\r
+\r
+// ODM_CMNINFO_BAND\r
+typedef enum tag_Band_Type_Definition\r
+{\r
+    ODM_BAND_2_4G = 0,\r
+    ODM_BAND_5G,\r
+    ODM_BAND_ON_BOTH,\r
+    ODM_BANDMAX\r
+\r
+}ODM_BAND_TYPE_E;\r
+\r
+// ODM_CMNINFO_SEC_CHNL_OFFSET\r
+typedef enum tag_Secondary_Channel_Offset_Definition\r
+{\r
+       ODM_DONT_CARE   = 0,\r
+       ODM_BELOW               = 1,\r
+       ODM_ABOVE                       = 2\r
+}ODM_SEC_CHNL_OFFSET_E;\r
+\r
+// ODM_CMNINFO_SEC_MODE\r
+typedef enum tag_Security_Definition\r
+{\r
+       ODM_SEC_OPEN                    = 0,\r
+       ODM_SEC_WEP40           = 1,\r
+       ODM_SEC_TKIP                    = 2,\r
+       ODM_SEC_RESERVE                 = 3,\r
+       ODM_SEC_AESCCMP                 = 4,\r
+       ODM_SEC_WEP104          = 5,\r
+       ODM_WEP_WPA_MIXED    = 6, // WEP + WPA\r
+       ODM_SEC_SMS4                    = 7,\r
+}ODM_SECURITY_E;\r
+\r
+// ODM_CMNINFO_BW\r
+typedef enum tag_Bandwidth_Definition\r
+{      \r
+       ODM_BW20M               = 0,\r
+       ODM_BW40M               = 1,\r
+       ODM_BW80M               = 2,\r
+       ODM_BW160M              = 3,\r
+       ODM_BW10M               = 4,\r
+}ODM_BW_E;\r
+\r
+\r
+// ODM_CMNINFO_BOARD_TYPE\r
+// For non-AC-series IC , ODM_BOARD_5G_EXT_PA and ODM_BOARD_5G_EXT_LNA are ignored\r
+// For AC-series IC, external PA & LNA can be indivisuallly added on 2.4G and/or 5G \r
+typedef enum tag_Board_Definition\r
+{\r
+    ODM_BOARD_DEFAULT          = 0,      // The DEFAULT case.\r
+    ODM_BOARD_MINICARD  = BIT(0), // 0 = non-mini card, 1= mini card.\r
+    ODM_BOARD_SLIM      = BIT(1), // 0 = non-slim card, 1 = slim card\r
+    ODM_BOARD_BT        = BIT(2), // 0 = without BT card, 1 = with BT\r
+    ODM_BOARD_EXT_PA    = BIT(3), // 0 = no 2G ext-PA, 1 = existing 2G ext-PA\r
+    ODM_BOARD_EXT_LNA   = BIT(4), // 0 = no 2G ext-LNA, 1 = existing 2G ext-LNA\r
+    ODM_BOARD_EXT_TRSW  = BIT(5), // 0 = no ext-TRSW, 1 = existing ext-TRSW\r
+    ODM_BOARD_EXT_PA_5G        = BIT(6), // 0 = no 5G ext-PA, 1 = existing 5G ext-PA\r
+    ODM_BOARD_EXT_LNA_5G= BIT(7), // 0 = no 5G ext-LNA, 1 = existing 5G ext-LNA\r
+}ODM_BOARD_TYPE_E;\r
+\r
+typedef enum tag_ODM_Package_Definition\r
+{\r
+    ODM_PACKAGE_DEFAULT         = 0,     \r
+    ODM_PACKAGE_QFN68        = BIT(0), \r
+    ODM_PACKAGE_TFBGA90      = BIT(1), \r
+    ODM_PACKAGE_TFBGA79      = BIT(2), \r
+}ODM_Package_TYPE_E;\r
+\r
+typedef enum tag_ODM_TYPE_GPA_Definition\r
+{\r
+    TYPE_GPA0 = 0,       \r
+    TYPE_GPA1 = BIT(1)|BIT(0)\r
+}ODM_TYPE_GPA_E;\r
+\r
+typedef enum tag_ODM_TYPE_APA_Definition\r
+{\r
+    TYPE_APA0 = 0,       \r
+    TYPE_APA1 = BIT(1)|BIT(0)\r
+}ODM_TYPE_APA_E;\r
+\r
+typedef enum tag_ODM_TYPE_GLNA_Definition\r
+{\r
+    TYPE_GLNA0 = 0,      \r
+    TYPE_GLNA1 = BIT(2)|BIT(0),\r
+    TYPE_GLNA2 = BIT(3)|BIT(1),\r
+    TYPE_GLNA3 = BIT(3)|BIT(2)|BIT(1)|BIT(0)\r
+}ODM_TYPE_GLNA_E;\r
+\r
+typedef enum tag_ODM_TYPE_ALNA_Definition\r
+{\r
+    TYPE_ALNA0 = 0,      \r
+    TYPE_ALNA1 = BIT(2)|BIT(0),\r
+    TYPE_ALNA2 = BIT(3)|BIT(1),\r
+    TYPE_ALNA3 = BIT(3)|BIT(2)|BIT(1)|BIT(0)\r
+}ODM_TYPE_ALNA_E;\r
+\r
+// ODM_CMNINFO_ONE_PATH_CCA\r
+typedef enum tag_CCA_Path\r
+{\r
+       ODM_CCA_2R                      = 0,\r
+       ODM_CCA_1R_A            = 1,\r
+       ODM_CCA_1R_B            = 2,\r
+}ODM_CCA_PATH_E;\r
+\r
+\r
+typedef struct _ODM_RA_Info_\r
+{\r
+       u1Byte RateID;\r
+       u4Byte RateMask;\r
+       u4Byte RAUseRate;\r
+       u1Byte RateSGI;\r
+       u1Byte RssiStaRA;\r
+       u1Byte PreRssiStaRA;\r
+       u1Byte SGIEnable;\r
+       u1Byte DecisionRate;\r
+       u1Byte PreRate;\r
+       u1Byte HighestRate;\r
+       u1Byte LowestRate;\r
+       u4Byte NscUp;\r
+       u4Byte NscDown;\r
+       u2Byte RTY[5];\r
+       u4Byte TOTAL;\r
+       u2Byte DROP;\r
+       u1Byte Active;\r
+       u2Byte RptTime;\r
+       u1Byte RAWaitingCounter;\r
+       u1Byte RAPendingCounter;        \r
+#if 1 //POWER_TRAINING_ACTIVE == 1 // For compile  pass only~!\r
+       u1Byte PTActive;  // on or off\r
+       u1Byte PTTryState;  // 0 trying state, 1 for decision state\r
+       u1Byte PTStage;  // 0~6\r
+       u1Byte PTStopCount; //Stop PT counter\r
+       u1Byte PTPreRate;  // if rate change do PT\r
+       u1Byte PTPreRssi; // if RSSI change 5% do PT\r
+       u1Byte PTModeSS;  // decide whitch rate should do PT\r
+       u1Byte RAstage;  // StageRA, decide how many times RA will be done between PT\r
+       u1Byte PTSmoothFactor;\r
+#endif\r
+} ODM_RA_INFO_T,*PODM_RA_INFO_T;\r
+\r
+//Remove struct  PATHDIV_PARA to odm_PathDiv.h \r
+\r
+//move to PowerTracking.h by YuChen\r
+\r
+//\r
+// ODM Dynamic common info value definition\r
+//\r
+\r
+typedef struct _FAST_ANTENNA_TRAINNING_\r
+{\r
+       u1Byte  Bssid[6];\r
+       u1Byte  antsel_rx_keep_0;\r
+       u1Byte  antsel_rx_keep_1;\r
+       u1Byte  antsel_rx_keep_2;\r
+       u1Byte  antsel_rx_keep_3;\r
+       u4Byte  antSumRSSI[7];\r
+       u4Byte  antRSSIcnt[7];\r
+       u4Byte  antAveRSSI[7];\r
+       u1Byte  FAT_State;\r
+       u4Byte  TrainIdx;\r
+       u1Byte  antsel_a[ODM_ASSOCIATE_ENTRY_NUM];\r
+       u1Byte  antsel_b[ODM_ASSOCIATE_ENTRY_NUM];\r
+       u1Byte  antsel_c[ODM_ASSOCIATE_ENTRY_NUM];\r
+       u4Byte  MainAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM];\r
+       u4Byte  AuxAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM];\r
+       u4Byte  MainAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM];\r
+       u4Byte  AuxAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM];\r
+       u1Byte  RxIdleAnt;\r
+       BOOLEAN bBecomeLinked;\r
+       u4Byte  MinMaxRSSI;\r
+       u1Byte  idx_AntDiv_counter_2G;\r
+       u1Byte  idx_AntDiv_counter_5G;\r
+       u4Byte  AntDiv_2G_5G;\r
+       u4Byte    CCK_counter_main;\r
+       u4Byte    CCK_counter_aux;      \r
+       u4Byte    OFDM_counter_main;\r
+       u4Byte    OFDM_counter_aux;     \r
+\r
+\r
+       u4Byte    CCK_CtrlFrame_Cnt_main;\r
+       u4Byte    CCK_CtrlFrame_Cnt_aux;\r
+       u4Byte    OFDM_CtrlFrame_Cnt_main;\r
+       u4Byte    OFDM_CtrlFrame_Cnt_aux;\r
+       u4Byte  MainAnt_CtrlFrame_Sum;\r
+       u4Byte  AuxAnt_CtrlFrame_Sum;\r
+       u4Byte  MainAnt_CtrlFrame_Cnt;\r
+       u4Byte  AuxAnt_CtrlFrame_Cnt;\r
+\r
+}FAT_T,*pFAT_T;\r
+\r
+typedef enum _FAT_STATE\r
+{\r
+       FAT_NORMAL_STATE                        = 0,\r
+       FAT_TRAINING_STATE              = 1,\r
+}FAT_STATE_E, *PFAT_STATE_E;\r
+\r
+typedef enum _ANT_DIV_TYPE\r
+{\r
+       NO_ANTDIV                       = 0xFF, \r
+       CG_TRX_HW_ANTDIV                = 0x01,\r
+       CGCS_RX_HW_ANTDIV       = 0x02,\r
+       FIXED_HW_ANTDIV         = 0x03,\r
+       CG_TRX_SMART_ANTDIV     = 0x04,\r
+       CGCS_RX_SW_ANTDIV       = 0x05,\r
+       S0S1_SW_ANTDIV          = 0x06 //8723B intrnal switch S0 S1\r
+}ANT_DIV_TYPE_E, *PANT_DIV_TYPE_E;\r
+\r
+\r
+typedef struct _ODM_PATH_DIVERSITY_\r
+{\r
+       u1Byte  RespTxPath;\r
+       u1Byte  PathSel[ODM_ASSOCIATE_ENTRY_NUM];\r
+       u4Byte  PathA_Sum[ODM_ASSOCIATE_ENTRY_NUM];\r
+       u4Byte  PathB_Sum[ODM_ASSOCIATE_ENTRY_NUM];\r
+       u4Byte  PathA_Cnt[ODM_ASSOCIATE_ENTRY_NUM];\r
+       u4Byte  PathB_Cnt[ODM_ASSOCIATE_ENTRY_NUM];\r
+}PATHDIV_T, *pPATHDIV_T;\r
+\r
+\r
+typedef enum _BASEBAND_CONFIG_PHY_REG_PG_VALUE_TYPE{\r
+       PHY_REG_PG_RELATIVE_VALUE = 0,\r
+       PHY_REG_PG_EXACT_VALUE = 1\r
+} PHY_REG_PG_TYPE;\r
+\r
+\r
+//\r
+// Antenna detection information from single tone mechanism, added by Roger, 2012.11.27.\r
+//\r
+typedef struct _ANT_DETECTED_INFO{\r
+       BOOLEAN                 bAntDetected;\r
+       u4Byte                  dBForAntA;\r
+       u4Byte                  dBForAntB;\r
+       u4Byte                  dBForAntO;\r
+}ANT_DETECTED_INFO, *PANT_DETECTED_INFO;\r
+\r
+//\r
+// 2011/09/22 MH Copy from SD4 defined structure. We use to support PHY DM integration.\r
+//\r
+#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+#if (RT_PLATFORM != PLATFORM_LINUX)\r
+typedef \r
+#endif\r
+struct DM_Out_Source_Dynamic_Mechanism_Structure\r
+#else// for AP,ADSL,CE Team\r
+typedef  struct DM_Out_Source_Dynamic_Mechanism_Structure\r
+#endif\r
+{\r
+       //RT_TIMER      FastAntTrainingTimer;\r
+       //\r
+       //      Add for different team use temporarily\r
+       //\r
+       PADAPTER                Adapter;                // For CE/NIC team\r
+       prtl8192cd_priv priv;                   // For AP/ADSL team\r
+       // WHen you use Adapter or priv pointer, you must make sure the pointer is ready.\r
+       BOOLEAN                 odm_ready;\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\r
+       rtl8192cd_priv          fake_priv;\r
+#endif\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       // ADSL_AP_BUILD_WORKAROUND\r
+       ADAPTER                 fake_adapter;\r
+#endif\r
+       \r
+       PHY_REG_PG_TYPE         PhyRegPgValueType;\r
+       u1Byte                          PhyRegPgVersion;\r
+\r
+       u8Byte                  DebugComponents;\r
+       u4Byte                  DebugLevel;\r
+       \r
+       u4Byte                  NumQryPhyStatusAll;     //CCK + OFDM\r
+       u4Byte                  LastNumQryPhyStatusAll; \r
+       u4Byte                  RxPWDBAve;\r
+       BOOLEAN                 MPDIG_2G;               //off MPDIG\r
+       u1Byte                  Times_2G;\r
+       \r
+//------ ODM HANDLE, DRIVER NEEDS NOT TO HOOK------//\r
+       BOOLEAN                 bCckHighPower; \r
+       u1Byte                  RFPathRxEnable;         // ODM_CMNINFO_RFPATH_ENABLE\r
+       u1Byte                  ControlChannel;\r
+//------ ODM HANDLE, DRIVER NEEDS NOT TO HOOK------//\r
+\r
+//--------REMOVED COMMON INFO----------//\r
+       //u1Byte                                PseudoMacPhyMode;\r
+       //BOOLEAN                       *BTCoexist;\r
+       //BOOLEAN                       PseudoBtCoexist;\r
+       //u1Byte                                OPMode;\r
+       //BOOLEAN                       bAPMode;\r
+       //BOOLEAN                       bClientMode;\r
+       //BOOLEAN                       bAdHocMode;\r
+       //BOOLEAN                       bSlaveOfDMSP;\r
+//--------REMOVED COMMON INFO----------//\r
+\r
+\r
+//1  COMMON INFORMATION\r
+\r
+       //\r
+       // Init Value\r
+       //\r
+//-----------HOOK BEFORE REG INIT-----------// \r
+       // ODM Platform info AP/ADSL/CE/MP = 1/2/3/4\r
+       u1Byte                  SupportPlatform;                \r
+       // ODM Support Ability DIG/RATR/TX_PWR_TRACK/ Â¡K¡K = 1/2/3/¡K\r
+       u4Byte                  SupportAbility;\r
+       // ODM PCIE/USB/SDIO = 1/2/3\r
+       u1Byte                  SupportInterface;                       \r
+       // ODM composite or independent. Bit oriented/ 92C+92D+ .... or any other type = 1/2/3/...\r
+       u4Byte                  SupportICType;  \r
+       // Cut Version TestChip/A-cut/B-cut... = 0/1/2/3/...\r
+       u1Byte                  CutVersion;\r
+       // Fab Version TSMC/UMC = 0/1\r
+       u1Byte                  FabVersion;\r
+       // RF Type 4T4R/3T3R/2T2R/1T2R/1T1R/...\r
+       u1Byte                  RFType;\r
+       u1Byte                  RFEType;        \r
+       // Board Type Normal/HighPower/MiniCard/SLIM/Combo/... = 0/1/2/3/4/...\r
+       u1Byte                  BoardType;\r
+       u1Byte                  PackageType;\r
+       u1Byte                  TypeGLNA;\r
+       u1Byte                  TypeGPA;\r
+       u1Byte                  TypeALNA;\r
+       u1Byte                  TypeAPA;\r
+       // with external LNA  NO/Yes = 0/1\r
+       u1Byte                  ExtLNA;\r
+       u1Byte                  ExtLNA5G;\r
+       // with external PA  NO/Yes = 0/1\r
+       u1Byte                  ExtPA;\r
+       u1Byte                  ExtPA5G;\r
+       // with external TRSW  NO/Yes = 0/1\r
+       u1Byte                  ExtTRSW;\r
+       u1Byte                  PatchID; //Customer ID\r
+       BOOLEAN                 bInHctTest;\r
+       BOOLEAN                 bWIFITest;\r
+\r
+       BOOLEAN                 bDualMacSmartConcurrent;\r
+       u4Byte                  BK_SupportAbility;\r
+       u1Byte                  AntDivType;\r
+\r
+       u1Byte                  odm_Regulation2_4G;\r
+       u1Byte                  odm_Regulation5G;\r
+       u1Byte                  IQKFWOffload;\r
+//-----------HOOK BEFORE REG INIT-----------// \r
+\r
+       //\r
+       // Dynamic Value\r
+       //      \r
+//--------- POINTER REFERENCE-----------//\r
+\r
+       u1Byte                  u1Byte_temp;\r
+       BOOLEAN                 BOOLEAN_temp;\r
+       PADAPTER                PADAPTER_temp;\r
+       \r
+       // MAC PHY Mode SMSP/DMSP/DMDP = 0/1/2\r
+       u1Byte                  *pMacPhyMode;\r
+       //TX Unicast byte count\r
+       u8Byte                  *pNumTxBytesUnicast;\r
+       //RX Unicast byte count\r
+       u8Byte                  *pNumRxBytesUnicast;\r
+       // Wireless mode B/G/A/N = BIT0/BIT1/BIT2/BIT3\r
+       u1Byte                  *pWirelessMode; //ODM_WIRELESS_MODE_E\r
+       // Frequence band 2.4G/5G = 0/1\r
+       u1Byte                  *pBandType;\r
+       // Secondary channel offset don't_care/below/above = 0/1/2\r
+       u1Byte                  *pSecChOffset;\r
+       // Security mode Open/WEP/AES/TKIP = 0/1/2/3\r
+       u1Byte                  *pSecurity;\r
+       // BW info 20M/40M/80M = 0/1/2\r
+       u1Byte                  *pBandWidth;\r
+       // Central channel location Ch1/Ch2/....\r
+       u1Byte                  *pChannel;      //central channel number\r
+       BOOLEAN                 DPK_Done;\r
+       // Common info for 92D DMSP\r
+       \r
+       BOOLEAN                 *pbGetValueFromOtherMac;\r
+       PADAPTER                *pBuddyAdapter;\r
+       BOOLEAN                 *pbMasterOfDMSP; //MAC0: master, MAC1: slave\r
+       // Common info for Status\r
+       BOOLEAN                 *pbScanInProcess;\r
+       BOOLEAN                 *pbPowerSaving;\r
+       // CCA Path 2-path/path-A/path-B = 0/1/2; using ODM_CCA_PATH_E.\r
+       u1Byte                  *pOnePathCCA;\r
+       //pMgntInfo->AntennaTest\r
+       u1Byte                  *pAntennaTest;\r
+       BOOLEAN                 *pbNet_closed;\r
+       //u1Byte                        *pAidMap;\r
+       u1Byte                  *pu1ForcedIgiLb;\r
+       BOOLEAN                 *pIsFcsModeEnable;\r
+//--------- For 8723B IQK-----------//\r
+       BOOLEAN                 *pIs1Antenna;\r
+       u1Byte                  *pRFDefaultPath;\r
+       // 0:S1, 1:S0\r
+       \r
+//--------- POINTER REFERENCE-----------//\r
+       pu2Byte                 pForcedDataRate;\r
+//------------CALL BY VALUE-------------//\r
+       BOOLEAN                 bLinkInProcess;\r
+       BOOLEAN                 bWIFI_Direct;\r
+       BOOLEAN                 bWIFI_Display;\r
+       BOOLEAN                 bLinked;\r
+       BOOLEAN                 bsta_state;\r
+       u1Byte                  RSSI_Min;       \r
+       u1Byte          InterfaceIndex; // Add for 92D  dual MAC: 0--Mac0 1--Mac1\r
+       BOOLEAN         bIsMPChip;\r
+       BOOLEAN                 bOneEntryOnly;\r
+       BOOLEAN                 mp_mode;\r
+       // Common info for BTDM\r
+       BOOLEAN                 bBtEnabled;                     // BT is enabled\r
+       BOOLEAN                 bBtConnectProcess;      // BT HS is under connection progress.\r
+       u1Byte                  btHsRssi;                               // BT HS mode wifi rssi value.\r
+       BOOLEAN                 bBtHsOperation;         // BT HS mode is under progress\r
+       BOOLEAN                 bBtDisableEdcaTurbo;    // Under some condition, don't enable the EDCA Turbo\r
+       BOOLEAN                 bBtLimitedDig;                  // BT is busy.\r
+//------------CALL BY VALUE-------------//\r
+       u1Byte                  RSSI_A;\r
+       u1Byte                  RSSI_B;\r
+       u1Byte                  RSSI_C;\r
+       u1Byte                  RSSI_D;\r
+       u8Byte                  RSSI_TRSW;      \r
+       u8Byte                  RSSI_TRSW_H;\r
+       u8Byte                  RSSI_TRSW_L;    \r
+       u8Byte                  RSSI_TRSW_iso;\r
+\r
+       u1Byte                  RxRate;\r
+       BOOLEAN                 bNoisyState;\r
+       u1Byte                  TxRate;\r
+       u1Byte                  LinkedInterval;\r
+       u1Byte                  preChannel;\r
+       u4Byte                  TxagcOffsetValueA;\r
+       BOOLEAN                 IsTxagcOffsetPositiveA;\r
+       u4Byte                  TxagcOffsetValueB;\r
+       BOOLEAN                 IsTxagcOffsetPositiveB;\r
+       u8Byte                  lastTxOkCnt;\r
+       u8Byte                  lastRxOkCnt;\r
+       u4Byte                  BbSwingOffsetA;\r
+       BOOLEAN                 IsBbSwingOffsetPositiveA;\r
+       u4Byte                  BbSwingOffsetB;\r
+       BOOLEAN                 IsBbSwingOffsetPositiveB;\r
+       s1Byte                  TH_L2H_ini;\r
+       s1Byte                  TH_EDCCA_HL_diff;\r
+       s1Byte                  IGI_Base;\r
+       u1Byte                  IGI_target;\r
+       BOOLEAN                 ForceEDCCA;\r
+       u1Byte                  AdapEn_RSSI;\r
+       s1Byte                  Force_TH_H;\r
+       s1Byte                  Force_TH_L;\r
+       u1Byte                  IGI_LowerBound;\r
+       u1Byte                  antdiv_rssi;\r
+       u1Byte                  AntType;\r
+       u1Byte                  pre_AntType;\r
+       u1Byte                  antdiv_period;\r
+        u1Byte                 antdiv_select;  \r
+       u1Byte                  NdpaPeriod;\r
+       BOOLEAN                 H2C_RARpt_connect;\r
+\r
+       // add by Yu Cehn for adaptivtiy\r
+       BOOLEAN                 adaptivity_flag;\r
+       u1Byte                  tolerance_cnt;\r
+       u8Byte                  NHMCurTxOkcnt;\r
+       u8Byte                  NHMCurRxOkcnt;\r
+       u8Byte                  NHMLastTxOkcnt;\r
+       u8Byte                  NHMLastRxOkcnt;\r
+       u1Byte                  NHMWait;\r
+       s1Byte                  H2L_lb;\r
+       s1Byte                  L2H_lb;\r
+       u1Byte                  Adaptivity_IGI_upper;\r
+       u2Byte                  NHM_cnt_0;\r
+       u2Byte                  NHM_cnt_1;\r
+       BOOLEAN                 Carrier_Sense_enable;\r
+       BOOLEAN                 bFirstLink;\r
+       BOOLEAN                 bCheck;\r
+       BOOLEAN                 EDCCA_enable_state;\r
+       BOOLEAN                 NHM_enable;\r
+       BOOLEAN                 DynamicLinkAdaptivity;\r
+       BOOLEAN                 bAdaOn;\r
+\r
+       ODM_NOISE_MONITOR noise_level;//[ODM_MAX_CHANNEL_NUM];\r
+       //\r
+       //2 Define STA info.\r
+       // _ODM_STA_INFO\r
+       // 2012/01/12 MH For MP, we need to reduce one array pointer for default port.??\r
+       PSTA_INFO_T             pODM_StaInfo[ODM_ASSOCIATE_ENTRY_NUM];\r
+\r
+#if (RATE_ADAPTIVE_SUPPORT == 1)\r
+       u2Byte                  CurrminRptTime;\r
+       ODM_RA_INFO_T   RAInfo[ODM_ASSOCIATE_ENTRY_NUM]; //See HalMacID support\r
+#endif\r
+       //\r
+       // 2012/02/14 MH Add to share 88E ra with other SW team.\r
+       // We need to colelct all support abilit to a proper area.\r
+       //\r
+       BOOLEAN                         RaSupport88E;\r
+\r
+       // Define ...........\r
+\r
+       // Latest packet phy info (ODM write)\r
+       ODM_PHY_DBG_INFO_T       PhyDbgInfo;\r
+       //PHY_INFO_88E          PhyInfo;\r
+\r
+       // Latest packet phy info (ODM write)\r
+       ODM_MAC_INFO            *pMacInfo;\r
+       //MAC_INFO_88E          MacInfo;\r
+\r
+       // Different Team independt structure??\r
+\r
+       //\r
+       //TX_RTP_CMN            TX_retrpo;\r
+       //TX_RTP_88E            TX_retrpo;\r
+       //TX_RTP_8195           TX_retrpo;\r
+\r
+       //\r
+       //ODM Structure\r
+       //\r
+       FAT_T                                           DM_FatTable;\r
+       DIG_T                                           DM_DigTable;\r
+       PS_T                                            DM_PSTable;\r
+       Pri_CCA_T                                       DM_PriCCA;\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       RXHP_T                                          DM_RXHP_Table;\r
+#endif\r
+       RA_T                                            DM_RA_Table;  \r
+       FALSE_ALARM_STATISTICS          FalseAlmCnt;\r
+       FALSE_ALARM_STATISTICS          FlaseAlmCntBuddyAdapter;\r
+       //#ifdef CONFIG_ANTENNA_DIVERSITY\r
+       SWAT_T                                          DM_SWAT_Table;\r
+       BOOLEAN                                         RSSI_test;\r
+       CFO_TRACKING                                    DM_CfoTrack;\r
+       ACS                                                     DM_ACS;\r
+       //#endif \r
+       \r
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       //Path Div Struct\r
+       PATHDIV_PARA    pathIQK;\r
+#endif \r
+\r
+       EDCA_T          DM_EDCA_Table;\r
+       u4Byte          WMMEDCA_BE;\r
+       PATHDIV_T       DM_PathDiv;\r
+       // Copy from SD4 structure\r
+       //\r
+       // ==================================================\r
+       //\r
+\r
+       //common\r
+       //u1Byte                DM_Type;        \r
+       //u1Byte    PSD_Report_RXHP[80];   // Add By Gary\r
+       //u1Byte    PSD_func_flag;               // Add By Gary\r
+       //for DIG\r
+       //u1Byte                bDMInitialGainEnable;\r
+       //u1Byte                binitialized; // for dm_initial_gain_Multi_STA use.\r
+       //for Antenna diversity\r
+       //u8    AntDivCfg;// 0:OFF , 1:ON, 2:by efuse\r
+       //PSTA_INFO_T RSSI_target;\r
+\r
+       BOOLEAN                 *pbDriverStopped;\r
+       BOOLEAN                 *pbDriverIsGoingToPnpSetPowerSleep;\r
+       BOOLEAN                 *pinit_adpt_in_progress;\r
+\r
+       //PSD\r
+       BOOLEAN                 bUserAssignLevel;\r
+       RT_TIMER                PSDTimer;\r
+       u1Byte                  RSSI_BT;                        //come from BT\r
+       BOOLEAN                 bPSDinProcess;\r
+       BOOLEAN                 bPSDactive;\r
+       BOOLEAN                 bDMInitialGainEnable;\r
+\r
+       //MPT DIG\r
+       RT_TIMER                MPT_DIGTimer;\r
+       \r
+       //for rate adaptive, in fact,  88c/92c fw will handle this\r
+       u1Byte                  bUseRAMask;\r
+\r
+       ODM_RATE_ADAPTIVE       RateAdaptive;\r
+\r
+       ANT_DETECTED_INFO       AntDetectedInfo; // Antenna detected information for RSSI tool\r
+\r
+       ODM_RF_CAL_T    RFCalibrateInfo;\r
+       \r
+       //\r
+       // TX power tracking\r
+       //\r
+       u1Byte                  BbSwingIdxOfdm[MAX_RF_PATH];\r
+       u1Byte                  BbSwingIdxOfdmCurrent;\r
+       u1Byte                  BbSwingIdxOfdmBase[MAX_RF_PATH];\r
+       BOOLEAN                 BbSwingFlagOfdm;\r
+       u1Byte                  BbSwingIdxCck;\r
+       u1Byte                  BbSwingIdxCckCurrent;\r
+       u1Byte                  BbSwingIdxCckBase;\r
+       u1Byte                  DefaultOfdmIndex;\r
+       u1Byte                  DefaultCckIndex;        \r
+       BOOLEAN                 BbSwingFlagCck;\r
+       \r
+       s1Byte                  Absolute_OFDMSwingIdx[MAX_RF_PATH];   \r
+       s1Byte                  Remnant_OFDMSwingIdx[MAX_RF_PATH];   \r
+       s1Byte                  Remnant_CCKSwingIdx;\r
+       s1Byte                  Modify_TxAGC_Value;       //Remnat compensate value at TxAGC \r
+       BOOLEAN                 Modify_TxAGC_Flag_PathA;\r
+       BOOLEAN                 Modify_TxAGC_Flag_PathB;\r
+       BOOLEAN                 Modify_TxAGC_Flag_PathC;\r
+       BOOLEAN                 Modify_TxAGC_Flag_PathD;\r
+       BOOLEAN                 Modify_TxAGC_Flag_PathA_CCK;\r
+       \r
+       s1Byte                  KfreeOffset[MAX_RF_PATH];\r
+\r
+       //\r
+       // Dynamic ATC switch\r
+       //\r
+\r
+#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))  \r
+       //\r
+       // Power Training\r
+       //\r
+       BOOLEAN                 bDisablePowerTraining;\r
+       u1Byte                  ForcePowerTrainingState;\r
+       BOOLEAN                 bChangeState;\r
+       u4Byte                  PT_score;\r
+       u8Byte                  OFDM_RX_Cnt;\r
+       u8Byte                  CCK_RX_Cnt;\r
+#endif\r
+\r
+       //\r
+       // ODM system resource.\r
+       //\r
+\r
+       // ODM relative time.\r
+       RT_TIMER                                PathDivSwitchTimer;\r
+       //2011.09.27 add for Path Diversity\r
+       RT_TIMER                                CCKPathDiversityTimer;\r
+       RT_TIMER        FastAntTrainingTimer;\r
+       \r
+       // ODM relative workitem.\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       #if USE_WORKITEM\r
+       RT_WORK_ITEM                    PathDivSwitchWorkitem;\r
+       RT_WORK_ITEM                    CCKPathDiversityWorkitem;\r
+       RT_WORK_ITEM                    FastAntTrainingWorkitem;\r
+       RT_WORK_ITEM                    MPT_DIGWorkitem;\r
+       RT_WORK_ITEM                    RaRptWorkitem;\r
+       #endif\r
+#endif\r
+\r
+       #if (BEAMFORMING_SUPPORT == 1)\r
+       RT_BEAMFORMING_INFO BeamformingInfo;\r
+       #endif \r
+\r
+#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       \r
+#if (RT_PLATFORM != PLATFORM_LINUX)\r
+} DM_ODM_T, *PDM_ODM_T;                // DM_Dynamic_Mechanism_Structure\r
+#else\r
+};\r
+#endif \r
+\r
+#else// for AP,ADSL,CE Team\r
+} DM_ODM_T, *PDM_ODM_T;                // DM_Dynamic_Mechanism_Structure\r
+#endif\r
+\r
+\r
+\r
+#if 1 //92c-series\r
+#define ODM_RF_PATH_MAX 2\r
+#else //jaguar - series\r
+#define ODM_RF_PATH_MAX 4\r
+#endif\r
+\r
+typedef enum _PhyDM_Structure_Type{\r
+       PHYDM_FALSEALMCNT,\r
+       PHYDM_CFOTRACK,\r
+       PHYDM_ROMINFO,\r
+       \r
+}PhyDM_Structure_Type;\r
+\r
+typedef enum _ODM_RF_RADIO_PATH {\r
+    ODM_RF_PATH_A = 0,   //Radio Path A\r
+    ODM_RF_PATH_B = 1,   //Radio Path B\r
+    ODM_RF_PATH_C = 2,   //Radio Path C\r
+    ODM_RF_PATH_D = 3,   //Radio Path D\r
+    ODM_RF_PATH_AB,\r
+    ODM_RF_PATH_AC,\r
+    ODM_RF_PATH_AD,\r
+    ODM_RF_PATH_BC,\r
+    ODM_RF_PATH_BD,\r
+    ODM_RF_PATH_CD,\r
+    ODM_RF_PATH_ABC,\r
+    ODM_RF_PATH_ACD,\r
+    ODM_RF_PATH_BCD,\r
+    ODM_RF_PATH_ABCD,\r
+  //  ODM_RF_PATH_MAX,    //Max RF number 90 support\r
+} ODM_RF_RADIO_PATH_E, *PODM_RF_RADIO_PATH_E;\r
+\r
+ typedef enum _ODM_RF_CONTENT{\r
+       odm_radioa_txt = 0x1000,\r
+       odm_radiob_txt = 0x1001,\r
+       odm_radioc_txt = 0x1002,\r
+       odm_radiod_txt = 0x1003\r
+} ODM_RF_CONTENT;\r
+\r
+typedef enum _ODM_BB_Config_Type{\r
+    CONFIG_BB_PHY_REG,   \r
+    CONFIG_BB_AGC_TAB,   \r
+    CONFIG_BB_AGC_TAB_2G,\r
+    CONFIG_BB_AGC_TAB_5G, \r
+    CONFIG_BB_PHY_REG_PG,  \r
+    CONFIG_BB_PHY_REG_MP,\r
+    CONFIG_BB_AGC_TAB_DIFF,\r
+} ODM_BB_Config_Type, *PODM_BB_Config_Type;\r
+\r
+typedef enum _ODM_RF_Config_Type{ \r
+       CONFIG_RF_RADIO,\r
+    CONFIG_RF_TXPWR_LMT,\r
+} ODM_RF_Config_Type, *PODM_RF_Config_Type;\r
+\r
+typedef enum _ODM_FW_Config_Type{\r
+    CONFIG_FW_NIC,\r
+    CONFIG_FW_NIC_2,\r
+    CONFIG_FW_AP,\r
+    CONFIG_FW_MP,\r
+    CONFIG_FW_WoWLAN,\r
+    CONFIG_FW_WoWLAN_2,\r
+    CONFIG_FW_AP_WoWLAN,\r
+    CONFIG_FW_BT,\r
+} ODM_FW_Config_Type;\r
+\r
+// Status code\r
+#if (DM_ODM_SUPPORT_TYPE != ODM_WIN)\r
+typedef enum _RT_STATUS{\r
+       RT_STATUS_SUCCESS,\r
+       RT_STATUS_FAILURE,\r
+       RT_STATUS_PENDING,\r
+       RT_STATUS_RESOURCE,\r
+       RT_STATUS_INVALID_CONTEXT,\r
+       RT_STATUS_INVALID_PARAMETER,\r
+       RT_STATUS_NOT_SUPPORT,\r
+       RT_STATUS_OS_API_FAILED,\r
+}RT_STATUS,*PRT_STATUS;\r
+#endif // end of RT_STATUS definition\r
+\r
+#ifdef REMOVE_PACK\r
+#pragma pack()\r
+#endif\r
+\r
+//#include "odm_function.h"\r
+\r
+//3===========================================================\r
+//3 DIG\r
+//3===========================================================\r
+\r
+//Remove DIG by Yuchen\r
+\r
+//3===========================================================\r
+//3 AGC RX High Power Mode\r
+//3===========================================================\r
+#define          LNA_Low_Gain_1                      0x64\r
+#define          LNA_Low_Gain_2                      0x5A\r
+#define          LNA_Low_Gain_3                      0x58\r
+\r
+#define          FA_RXHP_TH1                           5000\r
+#define          FA_RXHP_TH2                           1500\r
+#define          FA_RXHP_TH3                             800\r
+#define          FA_RXHP_TH4                             600\r
+#define          FA_RXHP_TH5                             500\r
+\r
+//3===========================================================\r
+//3 EDCA\r
+//3===========================================================\r
+\r
+//3===========================================================\r
+//3 Dynamic Tx Power\r
+//3===========================================================\r
+//Dynamic Tx Power Control Threshold\r
+\r
+//Remove By YuChen\r
+\r
+//3===========================================================\r
+//3 Tx Power Tracking\r
+//3===========================================================\r
+#if 0 //mask this, since these have been defined in typdef.h, vivi\r
+#define        OFDM_TABLE_SIZE         43\r
+#define        CCK_TABLE_SIZE          33\r
+#endif \r
+\r
+\r
+//3===========================================================\r
+//3 Rate Adaptive\r
+//3===========================================================\r
+//Remove to odm_RaInfo.h by RS_James\r
+\r
+//3===========================================================\r
+//3 BB Power Save\r
+//3===========================================================\r
+\r
+typedef enum tag_1R_CCA_Type_Definition\r
+{\r
+       CCA_1R =0,\r
+       CCA_2R = 1,\r
+       CCA_MAX = 2,\r
+}DM_1R_CCA_E;\r
+\r
+typedef enum tag_RF_Type_Definition\r
+{\r
+       RF_Save =0,\r
+       RF_Normal = 1,\r
+       RF_MAX = 2,\r
+}DM_RF_E;\r
+\r
+//3===========================================================\r
+//3 Antenna Diversity\r
+//3===========================================================\r
+typedef enum tag_SW_Antenna_Switch_Definition\r
+{\r
+       Antenna_A = 1,\r
+       Antenna_B = 2,  \r
+       Antenna_MAX = 3,\r
+}DM_SWAS_E;\r
+\r
+\r
+// Maximal number of antenna detection mechanism needs to perform, added by Roger, 2011.12.28.\r
+#define        MAX_ANTENNA_DETECTION_CNT       10 \r
+\r
+//\r
+// Extern Global Variables.\r
+//\r
+//remove PT by YuChen\r
+//\r
+// check Sta pointer valid or not\r
+//\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+#define IS_STA_VALID(pSta)             (pSta && pSta->expire_to)\r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+#define IS_STA_VALID(pSta)             (pSta && pSta->bUsed)\r
+#else\r
+#define IS_STA_VALID(pSta)             (pSta)\r
+#endif\r
+// 20100514 Joseph: Add definition for antenna switching test after link.\r
+// This indicates two different the steps. \r
+// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air.\r
+// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK\r
+// with original RSSI to determine if it is necessary to switch antenna.\r
+#define SWAW_STEP_PEAK         0\r
+#define SWAW_STEP_DETERMINE    1\r
+\r
+//Remove DIG by yuchen\r
+\r
+\r
+\r
+\r
+//Remove BB power saving by Yuchen\r
+\r
+\r
+\r
+\r
+                                               \r
+//ODM_RAStateCheck() Remove by RS_James\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_AP|ODM_ADSL))\r
+//============================================================\r
+// function prototype\r
+//============================================================\r
+//#define DM_ChangeDynamicInitGainThresh               ODM_ChangeDynamicInitGainThresh\r
+//void ODM_ChangeDynamicInitGainThresh(IN      PADAPTER        pAdapter,\r
+//                                                                                     IN      INT32           DM_Type,\r
+//                                                                                     IN      INT32           DM_Value);\r
+\r
+//Remove DIG by yuchen\r
+\r
+\r
+BOOLEAN\r
+ODM_CheckPowerStatus(\r
+       IN      PADAPTER                Adapter\r
+       );\r
+\r
+\r
+//Remove ODM_RateAdaptiveStateApInit() by RS_James\r
+\r
+//Remove Edca by YuChen\r
+\r
+#endif\r
+\r
+#if((DM_ODM_SUPPORT_TYPE==ODM_WIN)||(DM_ODM_SUPPORT_TYPE==ODM_CE))\r
+\r
+u4Byte ConvertTo_dB(u4Byte Value);\r
+\r
+u4Byte\r
+GetPSDData(\r
+       PDM_ODM_T       pDM_Odm,\r
+       unsigned int    point,\r
+       u1Byte initial_gain_psd);\r
+\r
+#endif\r
+\r
+//Remove ODM_Get_Rate_Bitmap() by RS_James     \r
+\r
+\r
+#if (BEAMFORMING_SUPPORT == 1)\r
+BEAMFORMING_CAP\r
+Beamforming_GetEntryBeamCapByMacId(\r
+ IN PMGNT_INFO pMgntInfo,\r
+ IN u1Byte  MacId\r
+ );\r
+#endif\r
+\r
+VOID \r
+ODM_DMInit(\r
+ IN    PDM_ODM_T       pDM_Odm\r
+);\r
+\r
+VOID\r
+ODM_DMReset(\r
+       IN      PDM_ODM_T       pDM_Odm\r
+       );\r
+\r
+VOID\r
+ODM_DMWatchdog(\r
+       IN              PDM_ODM_T                       pDM_Odm                 // For common use in the future\r
+       );\r
+\r
+VOID\r
+ODM_CmnInfoInit(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              ODM_CMNINFO_E   CmnInfo,\r
+       IN              u4Byte                  Value   \r
+       );\r
+\r
+VOID\r
+ODM_CmnInfoHook(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              ODM_CMNINFO_E   CmnInfo,\r
+       IN              PVOID                   pValue  \r
+       );\r
+\r
+VOID\r
+ODM_CmnInfoPtrArrayHook(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              ODM_CMNINFO_E   CmnInfo,\r
+       IN              u2Byte                  Index,\r
+       IN              PVOID                   pValue  \r
+       );\r
+\r
+VOID\r
+ODM_CmnInfoUpdate(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              u4Byte                  CmnInfo,\r
+       IN              u8Byte                  Value   \r
+       );\r
+\r
+VOID \r
+ODM_InitAllTimers(\r
+    IN PDM_ODM_T       pDM_Odm \r
+    );\r
+\r
+VOID \r
+ODM_CancelAllTimers(\r
+    IN PDM_ODM_T    pDM_Odm \r
+    );\r
+\r
+VOID\r
+ODM_ReleaseAllTimers(\r
+    IN PDM_ODM_T       pDM_Odm \r
+    );\r
+\r
+VOID\r
+ODM_ResetIQKResult(\r
+    IN PDM_ODM_T pDM_Odm \r
+    );\r
+\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+VOID ODM_InitAllWorkItems(IN PDM_ODM_T pDM_Odm );\r
+VOID ODM_FreeAllWorkItems(IN PDM_ODM_T pDM_Odm );\r
+\r
+\r
+//===========================================//\r
+// Neil Chen----2011--06--15--\r
+\r
+//3 Path Diversity\r
+//===========================================================\r
+\r
+#define        TP_MODE                0\r
+#define        RSSI_MODE                      1\r
+#define        TRAFFIC_LOW            0\r
+#define        TRAFFIC_HIGH           1\r
+\r
+//#define   PATHDIV_ENABLE      1\r
+\r
+//#define dm_PathDiv_RSSI_Check        ODM_PathDivChkPerPktRssi\r
+\r
+u8Byte\r
+PlatformDivision64(\r
+       IN u8Byte       x,\r
+       IN u8Byte       y\r
+);\r
+\r
+\r
+// 20100514 Joseph: Add definition for antenna switching test after link.\r
+// This indicates two different the steps. \r
+// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air.\r
+// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK\r
+// with original RSSI to determine if it is necessary to switch antenna.\r
+#define SWAW_STEP_PEAK         0\r
+#define SWAW_STEP_DETERMINE    1\r
+\r
+//====================================================\r
+//3 PathDiV End\r
+//====================================================\r
+\r
+//#define PathDivCheckBeforeLink8192C  ODM_PathDiversityBeforeLink92C\r
+\r
+#define DM_ChangeDynamicInitGainThresh         ODM_ChangeDynamicInitGainThresh\r
+//void ODM_ChangeDynamicInitGainThresh(IN      PADAPTER        pAdapter,\r
+//                                                                                     IN      INT32           DM_Type,\r
+//                                                                                     IN      INT32           DM_Value);\r
+//\r
+\r
+typedef enum tag_DIG_Connect_Definition\r
+{\r
+       DIG_STA_DISCONNECT = 0, \r
+       DIG_STA_CONNECT = 1,\r
+       DIG_STA_BEFORE_CONNECT = 2,\r
+       DIG_MultiSTA_DISCONNECT = 3,\r
+       DIG_MultiSTA_CONNECT = 4,\r
+       DIG_CONNECT_MAX\r
+}DM_DIG_CONNECT_E;\r
+\r
+\r
+//\r
+// 2012/01/12 MH Check afapter status. Temp fix BSOD.\r
+//\r
+#define        HAL_ADAPTER_STS_CHK(pDM_Odm)\\r
+       if (pDM_Odm->Adapter == NULL)\\r
+       {\\r
+               return;\\r
+       }\\r
+\r
+\r
+//\r
+// For new definition in MP temporarily fro power tracking,\r
+//\r
+#define odm_TXPowerTrackingDirectCall(_Adapter)        \\r
+       IS_HARDWARE_TYPE_8192D(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_92D(_Adapter) : \\r
+       IS_HARDWARE_TYPE_8192C(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_92C(_Adapter) : \\r
+       IS_HARDWARE_TYPE_8723A(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_8723A(_Adapter) :\\r
+       ODM_TXPowerTrackingCallback_ThermalMeter(_Adapter)\r
+\r
+\r
+\r
+#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+\r
+\r
+#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN |ODM_CE))\r
+\r
+VOID\r
+ODM_SingleDualAntennaDefaultSetting(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       );\r
+\r
+BOOLEAN\r
+ODM_SingleDualAntennaDetection(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              u1Byte                  mode\r
+       );\r
+\r
+#endif // #if((DM_ODM_SUPPORT_TYPE==ODM_WIN)||(DM_ODM_SUPPORT_TYPE==ODM_CE))\r
+VOID\r
+ODM_UpdateNoisyState(\r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       IN      BOOLEAN         bNoisyStateFromC2H\r
+);\r
+\r
+u4Byte\r
+Set_RA_DM_Ratrbitmap_by_Noisy(\r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       IN      WIRELESS_MODE   WirelessMode,\r
+       IN      u4Byte                  ratr_bitmap,\r
+       IN      u1Byte                  rssi_level\r
+);\r
+\r
+VOID\r
+ODM_UpdateInitRate(\r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       IN      u1Byte          Rate\r
+       );\r
+\r
+VOID\r
+ODM_InitializeTimer(\r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      PRT_TIMER                       pTimer, \r
+       IN      RT_TIMER_CALL_BACK      CallBackFunc, \r
+       IN      PVOID                           pContext,\r
+       IN      const char*                     szID\r
+);\r
+\r
+VOID\r
+ODM_CancelAllTimers(\r
+       IN PDM_ODM_T    pDM_Odm \r
+);\r
+\r
+VOID\r
+ODM_ReleaseAllTimers(\r
+       IN PDM_ODM_T    pDM_Odm \r
+);\r
+\r
+//Remove ODM_DynamicARFBSelect() by RS_James\r
+\r
+PVOID\r
+PhyDM_Get_Structure(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              u1Byte                  Structure_Type\r
+);\r
+\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+void odm_dtc(PDM_ODM_T pDM_Odm);\r
+#endif /* #if (DM_ODM_SUPPORT_TYPE == ODM_CE) */\r
+\r
+#endif\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_ACS.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_ACS.c
new file mode 100755 (executable)
index 0000000..f82846d
--- /dev/null
@@ -0,0 +1,213 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+#include "Mp_Precomp.h"\r
+#include "phydm_precomp.h"\r
+\r
+\r
+u1Byte\r
+ODM_GetAutoChannelSelectResult(\r
+       IN              PVOID                   pDM_VOID,\r
+       IN              u1Byte                  Band\r
+)\r
+{\r
+       PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PACS                                    pACS = &pDM_Odm->DM_ACS;\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+       if(Band == ODM_BAND_2_4G)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, ("[ACS] ODM_GetAutoChannelSelectResult(): CleanChannel_2G(%d)\n", pACS->CleanChannel_2G));\r
+               return (u1Byte)pACS->CleanChannel_2G;   \r
+       }\r
+       else\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, ("[ACS] ODM_GetAutoChannelSelectResult(): CleanChannel_5G(%d)\n", pACS->CleanChannel_5G));\r
+               return (u1Byte)pACS->CleanChannel_5G;   \r
+       }\r
+#else\r
+       return (u1Byte)pACS->CleanChannel_2G;\r
+#endif\r
+\r
+}\r
+\r
+VOID\r
+odm_AutoChannelSelectSetting(\r
+       IN              PVOID                   pDM_VOID,\r
+       IN              BOOLEAN                 IsEnable\r
+)\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       u2Byte                                          period = 0x2710;// 40ms in default\r
+       u2Byte                                          NHMType = 0x7;\r
+\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, ("odm_AutoChannelSelectSetting()=========> \n"));\r
+\r
+       if(IsEnable)\r
+       {//20 ms\r
+               period = 0x1388;\r
+               NHMType = 0x1;\r
+       }\r
+\r
+       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
+       {\r
+               //PHY parameters initialize for ac series\r
+               ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11AC+2, period);      //0x990[31:16]=0x2710   Time duration for NHM unit: 4us, 0x2710=40ms\r
+               //ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT8|BIT9|BIT10, NHMType);   //0x994[9:8]=3                  enable CCX\r
+       }\r
+       else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
+       {\r
+               //PHY parameters initialize for n series\r
+               ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N+2, period);       //0x894[31:16]=0x2710   Time duration for NHM unit: 4us, 0x2710=40ms\r
+               //ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT10|BIT9|BIT8, NHMType);    //0x890[9:8]=3                  enable CCX              \r
+       }\r
+#endif\r
+}\r
+\r
+VOID\r
+odm_AutoChannelSelectInit(\r
+       IN              PVOID                   pDM_VOID\r
+)\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PACS                                            pACS = &pDM_Odm->DM_ACS;\r
+       u1Byte                                          i;\r
+\r
+       if(!(pDM_Odm->SupportAbility & ODM_BB_NHM_CNT))\r
+               return;\r
+\r
+       if(pACS->bForceACSResult)\r
+               return;\r
+\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, ("odm_AutoChannelSelectInit()=========> \n"));\r
+\r
+       pACS->CleanChannel_2G = 1;\r
+       pACS->CleanChannel_5G = 36;\r
+\r
+       for (i = 0; i < ODM_MAX_CHANNEL_2G; ++i)\r
+       {\r
+               pACS->Channel_Info_2G[0][i] = 0;\r
+               pACS->Channel_Info_2G[1][i] = 0;\r
+       }\r
+\r
+       if(pDM_Odm->SupportICType & (ODM_IC_11AC_SERIES|ODM_RTL8192D))\r
+       {\r
+               for (i = 0; i < ODM_MAX_CHANNEL_5G; ++i)\r
+               {\r
+                       pACS->Channel_Info_5G[0][i] = 0;\r
+                       pACS->Channel_Info_5G[1][i] = 0;\r
+               }\r
+       }\r
+#endif\r
+}\r
+\r
+VOID\r
+odm_AutoChannelSelectReset(\r
+       IN              PVOID                   pDM_VOID\r
+)\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PACS                                            pACS = &pDM_Odm->DM_ACS;\r
+\r
+       if(!(pDM_Odm->SupportAbility & ODM_BB_NHM_CNT))\r
+               return;\r
+\r
+       if(pACS->bForceACSResult)\r
+               return;\r
+\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, ("odm_AutoChannelSelectReset()=========> \n"));\r
+\r
+       odm_AutoChannelSelectSetting(pDM_Odm,TRUE);// for 20ms measurement\r
+       Phydm_NHMCounterStatisticsReset(pDM_Odm);\r
+#endif\r
+}\r
+\r
+VOID\r
+odm_AutoChannelSelect(\r
+       IN              PVOID                   pDM_VOID,\r
+       IN              u1Byte                  Channel\r
+)\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PACS                                            pACS = &pDM_Odm->DM_ACS;\r
+       u1Byte                                          ChannelIDX = 0, SearchIDX = 0;\r
+       u2Byte                                          MaxScore=0;\r
+\r
+       if(!(pDM_Odm->SupportAbility & ODM_BB_NHM_CNT))\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_AutoChannelSelect(): Return: SupportAbility ODM_BB_NHM_CNT is disabled\n"));\r
+               return;\r
+       }\r
+\r
+       if(pACS->bForceACSResult)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_AutoChannelSelect(): Force 2G clean channel = %d, 5G clean channel = %d\n",\r
+                       pACS->CleanChannel_2G, pACS->CleanChannel_5G));\r
+               return;\r
+       }\r
+\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, ("odm_AutoChannelSelect(): Channel = %d=========> \n", Channel));\r
+\r
+       Phydm_GetNHMCounterStatistics(pDM_Odm);\r
+       odm_AutoChannelSelectSetting(pDM_Odm,FALSE);\r
+\r
+       if(Channel >=1 && Channel <=14)\r
+       {\r
+               ChannelIDX = Channel - 1;\r
+               pACS->Channel_Info_2G[1][ChannelIDX]++;\r
+               \r
+               if(pACS->Channel_Info_2G[1][ChannelIDX] >= 2)\r
+                       pACS->Channel_Info_2G[0][ChannelIDX] = (pACS->Channel_Info_2G[0][ChannelIDX] >> 1) + \r
+                       (pACS->Channel_Info_2G[0][ChannelIDX] >> 2) + (pDM_Odm->NHM_cnt_0>>2);\r
+               else\r
+                       pACS->Channel_Info_2G[0][ChannelIDX] = pDM_Odm->NHM_cnt_0;\r
+       \r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, ("odm_AutoChannelSelect(): NHM_cnt_0 = %d \n", pDM_Odm->NHM_cnt_0));\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, ("odm_AutoChannelSelect(): Channel_Info[0][%d] = %d, Channel_Info[1][%d] = %d\n", ChannelIDX, pACS->Channel_Info_2G[0][ChannelIDX], ChannelIDX, pACS->Channel_Info_2G[1][ChannelIDX]));\r
+\r
+               for(SearchIDX = 0; SearchIDX < ODM_MAX_CHANNEL_2G; SearchIDX++)\r
+               {\r
+                       if(pACS->Channel_Info_2G[1][SearchIDX] != 0)\r
+                       {\r
+                               if(pACS->Channel_Info_2G[0][SearchIDX] >= MaxScore)\r
+                               {\r
+                                       MaxScore = pACS->Channel_Info_2G[0][SearchIDX];\r
+                                       pACS->CleanChannel_2G = SearchIDX+1;\r
+                               }\r
+                       }\r
+               }\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, ("(1)odm_AutoChannelSelect(): 2G: CleanChannel_2G = %d, MaxScore = %d \n", \r
+                       pACS->CleanChannel_2G, MaxScore));\r
+\r
+       }\r
+       else if(Channel >= 36)\r
+       {\r
+               // Need to do\r
+               pACS->CleanChannel_5G = Channel;\r
+       }\r
+#endif\r
+}\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_ACS.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_ACS.h
new file mode 100755 (executable)
index 0000000..d24c4c6
--- /dev/null
@@ -0,0 +1,61 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __PHYDMACS_H__\r
+#define    __PHYDMACS_H__\r
+\r
+#define ACS_VERSION    "1.0"\r
+\r
+#define ODM_MAX_CHANNEL_2G                     14\r
+#define ODM_MAX_CHANNEL_5G                     24\r
+\r
+typedef struct _ACS_\r
+{\r
+       BOOLEAN         bForceACSResult;\r
+       u1Byte          CleanChannel_2G;\r
+       u1Byte          CleanChannel_5G;\r
+       u2Byte          Channel_Info_2G[2][ODM_MAX_CHANNEL_2G];         //Channel_Info[1]: Channel Score, Channel_Info[2]:Channel_Scan_Times\r
+       u2Byte          Channel_Info_5G[2][ODM_MAX_CHANNEL_5G]; \r
+}ACS, *PACS;\r
+\r
+\r
+VOID\r
+odm_AutoChannelSelectInit(\r
+       IN              PVOID                   pDM_VOID\r
+);\r
+\r
+VOID\r
+odm_AutoChannelSelectReset(\r
+       IN              PVOID                   pDM_VOID\r
+);\r
+\r
+VOID\r
+odm_AutoChannelSelect(\r
+       IN              PVOID                   pDM_VOID,\r
+       IN              u1Byte                  Channel\r
+);\r
+\r
+u1Byte\r
+ODM_GetAutoChannelSelectResult(\r
+       IN              PVOID                   pDM_VOID,\r
+       IN              u1Byte                  Band\r
+);\r
+\r
+#endif
\ No newline at end of file
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDect.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDect.c
new file mode 100755 (executable)
index 0000000..d6a1c5d
--- /dev/null
@@ -0,0 +1,1206 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+\r
+#include "Mp_Precomp.h"\r
+#include "phydm_precomp.h"\r
+\r
+#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN |ODM_CE))\r
+\r
+//IS_ANT_DETECT_SUPPORT_SINGLE_TONE(Adapter)   \r
+//IS_ANT_DETECT_SUPPORT_RSSI(Adapter)          \r
+//IS_ANT_DETECT_SUPPORT_PSD(Adapter)\r
+\r
+//1 [1. Single Tone Method] ===================================================\r
+\r
+\r
+VOID\r
+odm_PHY_SaveAFERegisters(\r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       IN      pu4Byte         AFEReg,\r
+       IN      pu4Byte         AFEBackup,\r
+       IN      u4Byte          RegisterNum\r
+       )\r
+{\r
+       u4Byte  i;\r
+       \r
+       //RT_DISP(FINIT, INIT_IQK, ("Save ADDA parameters.\n"));\r
+       for( i = 0 ; i < RegisterNum ; i++){\r
+               AFEBackup[i] = ODM_GetBBReg(pDM_Odm, AFEReg[i], bMaskDWord);\r
+       }\r
+}\r
+\r
+VOID\r
+odm_PHY_ReloadAFERegisters(\r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       IN      pu4Byte         AFEReg,\r
+       IN      pu4Byte         AFEBackup,\r
+       IN      u4Byte          RegiesterNum\r
+       )\r
+{\r
+       u4Byte  i;\r
+\r
+       //RT_DISP(FINIT, INIT_IQK, ("Reload ADDA power saving parameters !\n"));\r
+       for(i = 0 ; i < RegiesterNum; i++)\r
+       {\r
+       \r
+               ODM_SetBBReg(pDM_Odm, AFEReg[i], bMaskDWord, AFEBackup[i]);\r
+       }\r
+}\r
+\r
+//\r
+// Description:\r
+//     Set Single/Dual Antenna default setting for products that do not do detection in advance.\r
+//\r
+// Added by Joseph, 2012.03.22\r
+//\r
+VOID\r
+ODM_SingleDualAntennaDefaultSetting(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
+       PADAPTER        pAdapter         =  pDM_Odm->Adapter;\r
+\r
+       u1Byte btAntNum=BT_GetPgAntNum(pAdapter);\r
+       // Set default antenna A and B status\r
+       if(btAntNum == 2)\r
+       {\r
+               pDM_SWAT_Table->ANTA_ON=TRUE;\r
+               pDM_SWAT_Table->ANTB_ON=TRUE;\r
+       \r
+       }\r
+       else if(btAntNum == 1)\r
+       {// Set antenna A as default\r
+               pDM_SWAT_Table->ANTA_ON=TRUE;\r
+               pDM_SWAT_Table->ANTB_ON=FALSE;\r
+       \r
+       }\r
+       else\r
+       {\r
+               RT_ASSERT(FALSE, ("Incorrect antenna number!!\n"));\r
+       }\r
+}\r
+\r
+\r
+//2 8723A ANT DETECT\r
+//\r
+// Description:\r
+//     Implement IQK single tone for RF DPK loopback and BB PSD scanning. \r
+//     This function is cooperated with BB team Neil. \r
+//\r
+// Added by Roger, 2011.12.15\r
+//\r
+BOOLEAN\r
+ODM_SingleDualAntennaDetection(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              u1Byte                  mode\r
+       )\r
+{\r
+       PADAPTER        pAdapter         =  pDM_Odm->Adapter;\r
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
+       u4Byte          CurrentChannel,RfLoopReg;\r
+       u1Byte          n;\r
+       u4Byte          Reg88c, Regc08, Reg874, Regc50, Reg948, Regb2c, Reg92c, Reg930, Reg064, AFE_rRx_Wait_CCA;\r
+       u1Byte          initial_gain = 0x5a;\r
+       u4Byte          PSD_report_tmp;\r
+       u4Byte          AntA_report = 0x0, AntB_report = 0x0,AntO_report=0x0,temp;\r
+       BOOLEAN         bResult = TRUE;\r
+       u4Byte          AFE_Backup[16];\r
+       u4Byte          AFE_REG_8723A[16] = {\r
+                                       rRx_Wait_CCA,   rTx_CCK_RFON, \r
+                                       rTx_CCK_BBON,   rTx_OFDM_RFON,\r
+                                       rTx_OFDM_BBON,  rTx_To_Rx,\r
+                                       rTx_To_Tx,              rRx_CCK, \r
+                                       rRx_OFDM,               rRx_Wait_RIFS, \r
+                                       rRx_TO_Rx,              rStandby,\r
+                                       rSleep,                 rPMPD_ANAEN,    \r
+                                       rFPGA0_XCD_SwitchControl, rBlue_Tooth};\r
+\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection()============> \n"));     \r
+\r
+       \r
+       if(!(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C|ODM_RTL8723B)))\r
+               return bResult;\r
+\r
+       // Retrieve antenna detection registry info, added by Roger, 2012.11.27.\r
+       if(!IS_ANT_DETECT_SUPPORT_SINGLE_TONE(pAdapter))\r
+               return bResult;\r
+\r
+       if(pDM_Odm->SupportICType == ODM_RTL8192C)\r
+       {\r
+               //Which path in ADC/DAC is turnned on for PSD: both I/Q\r
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT10|BIT11, 0x3);\r
+               //Ageraged number: 8\r
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT12|BIT13, 0x1);\r
+               //pts = 128;\r
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);\r
+       }\r
+\r
+       //1 Backup Current RF/BB Settings       \r
+       \r
+       CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask);\r
+       RfLoopReg = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask);\r
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_A);  // change to Antenna A\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+       {\r
+               Reg92c = ODM_GetBBReg(pDM_Odm, rDPDT_control, bMaskDWord);      \r
+               Reg930 = ODM_GetBBReg(pDM_Odm, rfe_ctrl_anta_src, bMaskDWord);\r
+               Reg948 = ODM_GetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord);\r
+               Regb2c = ODM_GetBBReg(pDM_Odm, rAGC_table_select, bMaskDWord);\r
+               Reg064 = ODM_GetMACReg(pDM_Odm, rSYM_WLBT_PAPE_SEL, BIT29);\r
+               ODM_SetBBReg(pDM_Odm, rDPDT_control, 0x3, 0x1);\r
+               ODM_SetBBReg(pDM_Odm, rfe_ctrl_anta_src, 0xff, 0x77);\r
+               ODM_SetMACReg(pDM_Odm, rSYM_WLBT_PAPE_SEL, BIT29, 0x1);  //dbg 7\r
+               ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0x3c0, 0x0);//dbg 8\r
+               ODM_SetBBReg(pDM_Odm, rAGC_table_select, BIT31, 0x0);\r
+       }\r
+\r
+       ODM_StallExecution(10);\r
+       \r
+       //Store A Path Register 88c, c08, 874, c50\r
+       Reg88c = ODM_GetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord);\r
+       Regc08 = ODM_GetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord);\r
+       Reg874 = ODM_GetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord);\r
+       Regc50 = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord);  \r
+       \r
+       // Store AFE Registers\r
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
+       odm_PHY_SaveAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16);       \r
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+               AFE_rRx_Wait_CCA = ODM_GetBBReg(pDM_Odm, rRx_Wait_CCA,bMaskDWord);\r
+       \r
+       //Set PSD 128 pts\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_PSDFunction, BIT14|BIT15, 0x0);  //128 pts\r
+       \r
+       // To SET CH1 to do\r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask, 0x7401);     //Channel 1\r
+       \r
+       // AFE all on step\r
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
+       {\r
+               ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, 0x6FDB25A4);\r
+               ODM_SetBBReg(pDM_Odm, rTx_CCK_RFON, bMaskDWord, 0x6FDB25A4);\r
+               ODM_SetBBReg(pDM_Odm, rTx_CCK_BBON, bMaskDWord, 0x6FDB25A4);\r
+               ODM_SetBBReg(pDM_Odm, rTx_OFDM_RFON, bMaskDWord, 0x6FDB25A4);\r
+               ODM_SetBBReg(pDM_Odm, rTx_OFDM_BBON, bMaskDWord, 0x6FDB25A4);\r
+               ODM_SetBBReg(pDM_Odm, rTx_To_Rx, bMaskDWord, 0x6FDB25A4);\r
+               ODM_SetBBReg(pDM_Odm, rTx_To_Tx, bMaskDWord, 0x6FDB25A4);\r
+               ODM_SetBBReg(pDM_Odm, rRx_CCK, bMaskDWord, 0x6FDB25A4);\r
+               ODM_SetBBReg(pDM_Odm, rRx_OFDM, bMaskDWord, 0x6FDB25A4);\r
+               ODM_SetBBReg(pDM_Odm, rRx_Wait_RIFS, bMaskDWord, 0x6FDB25A4);\r
+               ODM_SetBBReg(pDM_Odm, rRx_TO_Rx, bMaskDWord, 0x6FDB25A4);\r
+               ODM_SetBBReg(pDM_Odm, rStandby, bMaskDWord, 0x6FDB25A4);\r
+               ODM_SetBBReg(pDM_Odm, rSleep, bMaskDWord, 0x6FDB25A4);\r
+               ODM_SetBBReg(pDM_Odm, rPMPD_ANAEN, bMaskDWord, 0x6FDB25A4);\r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_SwitchControl, bMaskDWord, 0x6FDB25A4);\r
+               ODM_SetBBReg(pDM_Odm, rBlue_Tooth, bMaskDWord, 0x6FDB25A4);\r
+       }\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+       {\r
+               ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, 0x01c00016);\r
+       }\r
+\r
+       // 3 wire Disable\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, 0xCCF000C0);\r
+       \r
+       //BB IQK Setting\r
+       ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, 0x000800E4);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22208000);\r
+\r
+       //IQK setting tone@ 4.34Mhz\r
+       ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_A, bMaskDWord, 0x10008C1C);\r
+       ODM_SetBBReg(pDM_Odm, rTx_IQK, bMaskDWord, 0x01007c00); \r
+\r
+       //Page B init\r
+       ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x00080000);\r
+       ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x0f600000);\r
+       ODM_SetBBReg(pDM_Odm, rRx_IQK, bMaskDWord, 0x01004800);\r
+       ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_A, bMaskDWord, 0x10008c1f);\r
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
+       {\r
+       ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82150008);\r
+       ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28150008);\r
+       }\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+       {\r
+               ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82150016);\r
+               ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28150016);\r
+       }\r
+       ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x001028d0);    \r
+       ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, 0x7f, initial_gain);\r
+\r
+       //RF loop Setting\r
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x0, 0xFFFFF, 0x50008);    \r
+       \r
+       //IQK Single tone start\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, 0xffffff00, 0x808000);\r
+       ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);\r
+       ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);\r
+       \r
+       ODM_StallExecution(10000);\r
+\r
+       // PSD report of antenna A\r
+       PSD_report_tmp=0x0;\r
+       for (n=0;n<2;n++)\r
+       {\r
+               PSD_report_tmp =  GetPSDData(pDM_Odm, 14, initial_gain);        \r
+               if(PSD_report_tmp >AntA_report)\r
+                       AntA_report=PSD_report_tmp;\r
+       }\r
+\r
+        // change to Antenna B\r
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_B); \r
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+       {\r
+               //ODM_SetBBReg(pDM_Odm, rDPDT_control, 0x3, 0x2);\r
+               ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0xfff, 0x280);\r
+               ODM_SetBBReg(pDM_Odm, rAGC_table_select, BIT31, 0x1);\r
+       }\r
+\r
+       ODM_StallExecution(10); \r
+\r
+       // PSD report of antenna B\r
+       PSD_report_tmp=0x0;\r
+       for (n=0;n<2;n++)\r
+       {\r
+               PSD_report_tmp =  GetPSDData(pDM_Odm, 14, initial_gain);        \r
+               if(PSD_report_tmp > AntB_report)\r
+                       AntB_report=PSD_report_tmp;\r
+       }\r
+\r
+       // change to open case\r
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
+       {\r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, 0);  // change to Antenna A\r
+\r
+               ODM_StallExecution(10); \r
+               \r
+               // PSD report of open case\r
+               PSD_report_tmp=0x0;\r
+               for (n=0;n<2;n++)\r
+               {\r
+                       PSD_report_tmp =  GetPSDData(pDM_Odm, 14, initial_gain);        \r
+                       if(PSD_report_tmp > AntO_report)\r
+                               AntO_report=PSD_report_tmp;\r
+               }\r
+       }\r
+       //Close IQK Single Tone function\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, 0xffffff00, 0x000000);\r
+\r
+       //1 Return to antanna A\r
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_A);  // change to Antenna A\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+       {\r
+               // external DPDT\r
+               ODM_SetBBReg(pDM_Odm, rDPDT_control, bMaskDWord, Reg92c);\r
+\r
+               //internal S0/S1\r
+               ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord, Reg948);\r
+               ODM_SetBBReg(pDM_Odm, rAGC_table_select, bMaskDWord, Regb2c);\r
+               ODM_SetBBReg(pDM_Odm, rfe_ctrl_anta_src, bMaskDWord, Reg930);\r
+               ODM_SetMACReg(pDM_Odm, rSYM_WLBT_PAPE_SEL, BIT29, Reg064);\r
+       }\r
+       \r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, Reg88c);\r
+       ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, Regc08);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, Reg874);\r
+       ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, 0x7F, 0x40);\r
+       ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord, Regc50);\r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask,CurrentChannel);\r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask,RfLoopReg);\r
+\r
+       //Reload AFE Registers\r
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
+               odm_PHY_ReloadAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16);     \r
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+               ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, AFE_rRx_Wait_CCA);\r
+\r
+       if(pDM_Odm->SupportICType == ODM_RTL8723A)\r
+       {\r
+               //2 Test Ant B based on Ant A is ON\r
+               if(mode==ANTTESTB)\r
+               {\r
+                       if(AntA_report >=       100)\r
+                       {\r
+                               if(AntB_report > (AntA_report+1))\r
+                               {\r
+                                       pDM_SWAT_Table->ANTB_ON=FALSE;\r
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));         \r
+                               }       \r
+                               else\r
+                               {\r
+                                       pDM_SWAT_Table->ANTB_ON=TRUE;\r
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Dual Antenna is A and B\n"));  \r
+                               }       \r
+                       }\r
+                       else\r
+                       {\r
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));\r
+                               pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default \r
+                               bResult = FALSE;\r
+                       }\r
+               }       \r
+               //2 Test Ant A and B based on DPDT Open\r
+               else if(mode==ANTTESTALL)\r
+               {\r
+                       if((AntO_report >=100) && (AntO_report <=118))\r
+                       {\r
+                               if(AntA_report > (AntO_report+1))\r
+                               {\r
+                                       pDM_SWAT_Table->ANTA_ON=FALSE;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant A is OFF\n"));\r
+                               }       \r
+                               else\r
+                               {\r
+                                       pDM_SWAT_Table->ANTA_ON=TRUE;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant A is ON\n"));\r
+                               }\r
+\r
+                               if(AntB_report > (AntO_report+2))\r
+                               {\r
+                                       pDM_SWAT_Table->ANTB_ON=FALSE;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant B is OFF\n"));\r
+                               }       \r
+                               else\r
+                               {\r
+                                       pDM_SWAT_Table->ANTB_ON=TRUE;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant B is ON\n"));\r
+                               }\r
+                               \r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_A[%d]= %d \n", 2416, AntA_report));   \r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_B[%d]= %d \n", 2416, AntB_report));   \r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_O[%d]= %d \n", 2416, AntO_report));\r
+                               \r
+                               pDM_Odm->AntDetectedInfo.bAntDetected= TRUE;\r
+                               pDM_Odm->AntDetectedInfo.dBForAntA = AntA_report;\r
+                               pDM_Odm->AntDetectedInfo.dBForAntB = AntB_report;\r
+                               pDM_Odm->AntDetectedInfo.dBForAntO = AntO_report;\r
+                               \r
+                               }\r
+                       else\r
+                               {\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("return FALSE!!\n"));\r
+                               bResult = FALSE;\r
+                       }\r
+               }\r
+       }\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8192C)\r
+       {\r
+               if(AntA_report >=       100)\r
+               {\r
+                       if(AntB_report > (AntA_report+2))\r
+                       {\r
+                               pDM_SWAT_Table->ANTA_ON=FALSE;\r
+                               pDM_SWAT_Table->ANTB_ON=TRUE;\r
+                               ODM_SetBBReg(pDM_Odm,  rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_B);\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna B\n"));         \r
+                       }       \r
+                       else if(AntA_report > (AntB_report+2))\r
+                       {\r
+                               pDM_SWAT_Table->ANTA_ON=TRUE;\r
+                               pDM_SWAT_Table->ANTB_ON=FALSE;\r
+                               ODM_SetBBReg(pDM_Odm,  rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_A);\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));\r
+                       }       \r
+                       else\r
+                       {\r
+                               pDM_SWAT_Table->ANTA_ON=TRUE;\r
+                               pDM_SWAT_Table->ANTB_ON=TRUE;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));\r
+                       pDM_SWAT_Table->ANTA_ON=TRUE; // Set Antenna A on as default \r
+                       pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default \r
+                       bResult = FALSE;\r
+               }\r
+       }\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_A[%d]= %d \n", 2416, AntA_report));   \r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_B[%d]= %d \n", 2416, AntB_report));   \r
+               \r
+               //2 Test Ant B based on Ant A is ON\r
+               if((AntA_report >= 100) && (AntB_report >= 100) && (AntA_report <= 135) && (AntB_report <= 135))\r
+               {\r
+                       u1Byte TH1=2, TH2=6;\r
+               \r
+                       if((AntA_report - AntB_report < TH1) || (AntB_report - AntA_report < TH1))\r
+                       {\r
+                               pDM_SWAT_Table->ANTA_ON=TRUE;\r
+                               pDM_SWAT_Table->ANTB_ON=TRUE;\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SingleDualAntennaDetection(): Dual Antenna\n"));\r
+                       }\r
+                       else if(((AntA_report - AntB_report >= TH1) && (AntA_report - AntB_report <= TH2)) || \r
+                               ((AntB_report - AntA_report >= TH1) && (AntB_report - AntA_report <= TH2)))\r
+                       {\r
+                               pDM_SWAT_Table->ANTA_ON=FALSE;\r
+                               pDM_SWAT_Table->ANTB_ON=FALSE;\r
+                               bResult = FALSE;\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               pDM_SWAT_Table->ANTA_ON = TRUE;\r
+                               pDM_SWAT_Table->ANTB_ON=FALSE;\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SingleDualAntennaDetection(): Single Antenna\n"));\r
+                       }\r
+                       pDM_Odm->AntDetectedInfo.bAntDetected= TRUE;\r
+                       pDM_Odm->AntDetectedInfo.dBForAntA = AntA_report;\r
+                       pDM_Odm->AntDetectedInfo.dBForAntB = AntB_report;\r
+                       pDM_Odm->AntDetectedInfo.dBForAntO = AntO_report;\r
+                               \r
+               }\r
+               else\r
+               {\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("return FALSE!!\n"));\r
+                       bResult = FALSE;\r
+               }\r
+       }\r
+       return bResult;\r
+\r
+}\r
+\r
+\r
+\r
+//1 [2. Scan AP RSSI Method] ==================================================\r
+\r
+\r
+void\r
+odm_SwAntDetectInit(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
+       \r
+       //pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ODM_Read4Byte(pDM_Odm, rDPDT_control);\r
+       //pDM_SWAT_Table->PreAntenna = MAIN_ANT;\r
+       //pDM_SWAT_Table->CurAntenna = MAIN_ANT;\r
+       pDM_SWAT_Table->SWAS_NoLink_State = 0;\r
+       pDM_SWAT_Table->Pre_Aux_FailDetec = FALSE;\r
+       pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 = 0xff;\r
+}\r
+\r
+\r
+BOOLEAN\r
+ODM_SwAntDivCheckBeforeLink(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+\r
+#if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)\r
+\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       HAL_DATA_TYPE*  pHalData = GET_HAL_DATA(Adapter);\r
+       PMGNT_INFO              pMgntInfo = &Adapter->MgntInfo;\r
+       pSWAT_T                 pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
+       pFAT_T  pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+       s1Byte                  Score = 0;\r
+       PRT_WLAN_BSS    pTmpBssDesc, pTestBssDesc;\r
+       u1Byte                  power_target = 10, power_target_L = 9, power_target_H = 16;\r
+       u1Byte                  tmp_power_diff = 0,power_diff = 0,avg_power_diff = 0,max_power_diff = 0,min_power_diff = 0xff;\r
+       u2Byte                  index, counter = 0;\r
+       static u1Byte           ScanChannel;\r
+       u8Byte                  tStamp_diff = 0;                \r
+       u4Byte                  tmp_SWAS_NoLink_BK_Reg948;\r
+\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ANTA_ON = (( %d )) , ANTB_ON = (( %d )) \n",pDM_Odm->DM_SWAT_Table.ANTA_ON ,pDM_Odm->DM_SWAT_Table.ANTB_ON ));\r
+\r
+       //if(HP id)\r
+       {\r
+               if(pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult==TRUE && pDM_Odm->SupportICType == ODM_RTL8723B)\r
+               {\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("8723B RSSI-based Antenna Detection is done\n"));\r
+                       return FALSE;\r
+               }\r
+               \r
+               if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+               {\r
+                       if(pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 == 0xff)\r
+                               pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 = ODM_Read4Byte(pDM_Odm, rS0S1_PathSwitch );\r
+               }\r
+       }\r
+\r
+       if (pDM_Odm->Adapter == NULL)  //For BSOD when plug/unplug fast.  //By YJ,120413\r
+       {       // The ODM structure is not initialized.\r
+               return FALSE;\r
+       }\r
+\r
+       // Retrieve antenna detection registry info, added by Roger, 2012.11.27.\r
+       if(!IS_ANT_DETECT_SUPPORT_RSSI(Adapter))\r
+       {\r
+               return FALSE;\r
+       }\r
+       else\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Antenna Detection: RSSI Method\n"));     \r
+       }\r
+\r
+       // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.\r
+       PlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK);\r
+       if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)\r
+       {\r
+               PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);\r
+       \r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, \r
+                               ("ODM_SwAntDivCheckBeforeLink(): RFChangeInProgress(%x), eRFPowerState(%x)\n", \r
+                               pMgntInfo->RFChangeInProgress, pHalData->eRFPowerState));\r
+       \r
+               pDM_SWAT_Table->SWAS_NoLink_State = 0;\r
+               \r
+               return FALSE;\r
+       }\r
+       else\r
+       {\r
+               PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);\r
+       }\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("pDM_SWAT_Table->SWAS_NoLink_State = %d\n", pDM_SWAT_Table->SWAS_NoLink_State));\r
+       //1 Run AntDiv mechanism "Before Link" part.\r
+       if(pDM_SWAT_Table->SWAS_NoLink_State == 0)\r
+       {\r
+               //1 Prepare to do Scan again to check current antenna state.\r
+\r
+               // Set check state to next step.\r
+               pDM_SWAT_Table->SWAS_NoLink_State = 1;\r
+       \r
+               // Copy Current Scan list.\r
+               pMgntInfo->tmpNumBssDesc = pMgntInfo->NumBssDesc;\r
+               PlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);\r
+               \r
+               // Go back to scan function again.\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Scan one more time\n"));\r
+               pMgntInfo->ScanStep=0;\r
+               pMgntInfo->bScanAntDetect = TRUE;\r
+               ScanChannel = odm_SwAntDivSelectScanChnl(Adapter);\r
+\r
+               \r
+               if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))\r
+               {\r
+                       if(pDM_FatTable->RxIdleAnt == MAIN_ANT)\r
+                               ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);\r
+                       else\r
+                               ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\r
+                       if(ScanChannel == 0)\r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, \r
+                                       ("ODM_SwAntDivCheckBeforeLink(): No AP List Avaiable, Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT"));\r
+\r
+                               if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))\r
+                               {\r
+                                       pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant5G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));\r
+                               }\r
+                               else\r
+                               {\r
+                                       pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant2G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));\r
+                               }\r
+                               return FALSE;\r
+                       }\r
+\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, \r
+                               ("ODM_SwAntDivCheckBeforeLink: Change to %s for testing.\n", ((pDM_FatTable->RxIdleAnt == MAIN_ANT)?"MAIN_ANT":"AUX_ANT")));\r
+               }\r
+               else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8723B))\r
+               {\r
+                       if(pDM_Odm->SupportICType == ODM_RTL8192C)\r
+                       {\r
+                       // Switch Antenna to another one.\r
+                       pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;\r
+                       pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?AUX_ANT:MAIN_ANT;\r
+                       \r
+                               pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));\r
+                               ODM_SetBBReg(pDM_Odm,  rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);\r
+                       }\r
+                       else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+                       {\r
+                               // Switch Antenna to another one.\r
+                               \r
+                               tmp_SWAS_NoLink_BK_Reg948 = ODM_Read4Byte(pDM_Odm, rS0S1_PathSwitch );\r
+                               \r
+                               if( (pDM_SWAT_Table->CurAntenna = MAIN_ANT) && (tmp_SWAS_NoLink_BK_Reg948==0x200))\r
+                               {\r
+                                       ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0xfff, 0x280);\r
+                                       ODM_SetBBReg(pDM_Odm, rAGC_table_select, BIT31, 0x1);\r
+                                       pDM_SWAT_Table->CurAntenna = AUX_ANT;\r
+                       }\r
+                               else\r
+                               {\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Reg[948]= (( %x )) was in wrong state\n", tmp_SWAS_NoLink_BK_Reg948 ));\r
+                                       return FALSE;\r
+                               }\r
+                               ODM_StallExecution(10);\r
+               \r
+                       }\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Change to (( %s-ant))  for testing.\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX"));\r
+               }\r
+               \r
+               odm_SwAntDivConstructScanChnl(Adapter, ScanChannel);\r
+               PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);\r
+\r
+               return TRUE;\r
+       }\r
+       else //pDM_SWAT_Table->SWAS_NoLink_State == 1\r
+       {\r
+               //1 ScanComple() is called after antenna swiched.\r
+               //1 Check scan result and determine which antenna is going\r
+               //1 to be used.\r
+\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" tmpNumBssDesc= (( %d )) \n",pMgntInfo->tmpNumBssDesc));// debug for Dino\r
+               \r
+               for(index = 0; index < pMgntInfo->tmpNumBssDesc; index++)\r
+               {\r
+                       pTmpBssDesc = &(pMgntInfo->tmpbssDesc[index]); // Antenna 1\r
+                       pTestBssDesc = &(pMgntInfo->bssDesc[index]); // Antenna 2\r
+\r
+                       if(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)\r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): ERROR!! This shall not happen.\n"));\r
+                               continue;\r
+                       }\r
+\r
+                       if(pDM_Odm->SupportICType != ODM_RTL8723B)\r
+                       {\r
+                               if(pTmpBssDesc->ChannelNumber == ScanChannel)\r
+                               {\r
+                       if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)\r
+                       {\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score++\n"));\r
+                                               RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);\r
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));\r
+                       \r
+                               Score++;\r
+                               PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));\r
+                       }\r
+                       else if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)\r
+                       {\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score--\n"));\r
+                                               RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);\r
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));\r
+                               Score--;\r
+                       }\r
+                                       else\r
+                                       {\r
+                                               if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp < 5000)\r
+                                               {\r
+                                                       RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);\r
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));\r
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("The 2nd Antenna didn't get this AP\n\n"));\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+                       else // 8723B\r
+                       { \r
+                               if(pTmpBssDesc->ChannelNumber == ScanChannel)\r
+                               {\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ChannelNumber == ScanChannel -> (( %d )) \n", pTmpBssDesc->ChannelNumber ));\r
+                               \r
+                                       if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower) // Pow(Ant1) > Pow(Ant2)\r
+                                       {\r
+                                               counter++;\r
+                                               tmp_power_diff=(u1Byte)(pTmpBssDesc->RecvSignalPower - pTestBssDesc->RecvSignalPower);\r
+                                               power_diff = power_diff + tmp_power_diff;       \r
+                                               \r
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));\r
+                                               ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);\r
+                                               ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf);\r
+\r
+                                               //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("tmp_power_diff: (( %d)),max_power_diff: (( %d)),min_power_diff: (( %d))  \n", tmp_power_diff,max_power_diff,min_power_diff));\r
+                                               if(tmp_power_diff > max_power_diff)\r
+                                                       max_power_diff=tmp_power_diff;\r
+                                               if(tmp_power_diff < min_power_diff)\r
+                                                       min_power_diff=tmp_power_diff;\r
+                                               //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("max_power_diff: (( %d)),min_power_diff: (( %d))  \n",max_power_diff,min_power_diff));\r
+                                               \r
+                                               PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));\r
+                                       }\r
+                                       else if(pTestBssDesc->RecvSignalPower > pTmpBssDesc->RecvSignalPower) // Pow(Ant1) < Pow(Ant2)\r
+                                       {\r
+                                               counter++;\r
+                                               tmp_power_diff=(u1Byte)(pTestBssDesc->RecvSignalPower - pTmpBssDesc->RecvSignalPower);\r
+                                               power_diff = power_diff + tmp_power_diff;                                               \r
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));\r
+                                               ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);\r
+                                               ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf);                                                        \r
+                                               if(tmp_power_diff > max_power_diff)\r
+                                                       max_power_diff=tmp_power_diff;\r
+                                               if(tmp_power_diff < min_power_diff)\r
+                                                       min_power_diff=tmp_power_diff;                                                  \r
+                                       }\r
+                                       else // Pow(Ant1) = Pow(Ant2)\r
+                                       {\r
+                                               if(pTestBssDesc->bdTstamp > pTmpBssDesc->bdTstamp) //  Stamp(Ant1) < Stamp(Ant2) \r
+                                       {\r
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("time_diff: %lld\n", (pTestBssDesc->bdTstamp-pTmpBssDesc->bdTstamp)/1000));\r
+                                               if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp > 5000)\r
+                                               {\r
+                                                       counter++;\r
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));\r
+                                                       ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);\r
+                                                               ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf);\r
+                                                               min_power_diff = 0;\r
+                                               }\r
+                                       }\r
+                                               else\r
+                                               {\r
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Error !!!]: Time_diff: %lld\n", (pTestBssDesc->bdTstamp-pTmpBssDesc->bdTstamp)/1000));\r
+                                               }\r
+                               }\r
+                       }\r
+               }\r
+               }\r
+\r
+               if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))\r
+               {\r
+                       if(pMgntInfo->NumBssDesc!=0 && Score<0)\r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,\r
+                                                       ("ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));\r
+                       }\r
+                       else\r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, \r
+                                               ("ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT"));\r
+\r
+                               if(pDM_FatTable->RxIdleAnt == MAIN_ANT)\r
+                                       ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);\r
+                               else\r
+                                       ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\r
+                       }\r
+                       \r
+                       if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))\r
+                       {\r
+                               pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant5G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));\r
+                       }\r
+                       else\r
+                       {\r
+                               pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant2G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));\r
+                       }\r
+               }\r
+               else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+               {\r
+                       if(counter == 0)\r
+                       {       \r
+                               if(pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec == FALSE)\r
+                               {\r
+                                       pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec = TRUE;\r
+                                       pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=FALSE;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Counter=(( 0 )) , [[ Cannot find any AP with Aux-ant ]] ->  Scan Target-channel again  \n"));    \r
+\r
+                                        //3 [ Scan again ]\r
+                                       odm_SwAntDivConstructScanChnl(Adapter, ScanChannel);\r
+                                       PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);\r
+                                       return TRUE;\r
+                               }\r
+                               else// Pre_Aux_FailDetec == TRUE\r
+                               {\r
+                                       //2 [ Single Antenna ]\r
+                                       pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec = FALSE;\r
+                                       pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Counter=(( 0 )) , [[  Still cannot find any AP ]] \n"));\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));      \r
+                               }\r
+                               pDM_Odm->DM_SWAT_Table.Aux_FailDetec_Counter++;\r
+                       }\r
+                       else\r
+                       {\r
+                               pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec = FALSE;\r
+                               \r
+                               if(counter==3)\r
+                               {\r
+                                       avg_power_diff = ((power_diff-max_power_diff - min_power_diff)>>1)+ ((max_power_diff + min_power_diff)>>2);\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("counter: (( %d )) ,  power_diff: (( %d )) \n", counter, power_diff));\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ counter==3 ] Modified avg_power_diff: (( %d )) , max_power_diff: (( %d )) ,  min_power_diff: (( %d )) \n", avg_power_diff,max_power_diff, min_power_diff));\r
+                               }\r
+                               else if(counter>=4)\r
+                               {\r
+                                       avg_power_diff=(power_diff-max_power_diff - min_power_diff) / (counter - 2);\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("counter: (( %d )) ,  power_diff: (( %d )) \n", counter, power_diff));\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ counter>=4 ] Modified avg_power_diff: (( %d )) , max_power_diff: (( %d )) ,  min_power_diff: (( %d )) \n", avg_power_diff,max_power_diff, min_power_diff));\r
+                                       \r
+                               }\r
+                               else//counter==1,2\r
+                               {\r
+                                       avg_power_diff=power_diff/counter;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("avg_power_diff: (( %d )) , counter: (( %d )) ,  power_diff: (( %d )) \n", avg_power_diff,counter, power_diff));\r
+                               }\r
+\r
+                               //2 [ Retry ]\r
+                               if( (avg_power_diff >=power_target_L) && (avg_power_diff <=power_target_H)  )\r
+                               {\r
+                                       pDM_Odm->DM_SWAT_Table.Retry_Counter++;\r
+                                       \r
+                                       if(pDM_Odm->DM_SWAT_Table.Retry_Counter<=3)\r
+                                       {\r
+                                               pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=FALSE;\r
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[[ Low confidence result ]] avg_power_diff= (( %d ))  ->  Scan Target-channel again ]] \n", avg_power_diff));    \r
+\r
+                                                //3 [ Scan again ]\r
+                                               odm_SwAntDivConstructScanChnl(Adapter, ScanChannel);\r
+                                               PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);\r
+                                               return TRUE;                                             \r
+                                       }\r
+                                       else\r
+                       {\r
+                                               pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;\r
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[[ Still Low confidence result ]]  (( Retry_Counter > 3 )) \n"));\r
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));\r
+                                       }\r
+                                       \r
+                               }\r
+                               //2 [ Dual Antenna ]\r
+                               else if( (pMgntInfo->NumBssDesc != 0) && (avg_power_diff < power_target_L)   ) \r
+                               {\r
+                                       pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;\r
+                                       if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)\r
+                                       {\r
+                                               pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;\r
+                                               pDM_Odm->DM_SWAT_Table.ANTB_ON = TRUE;\r
+                                       }\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Dual antenna\n"));\r
+                                       pDM_Odm->DM_SWAT_Table.Dual_Ant_Counter++;\r
+\r
+                                       // set bt coexDM from 1ant coexDM to 2ant coexDM\r
+                                       BT_SetBtCoexAntNum(Adapter, BT_COEX_ANT_TYPE_DETECTED, 2);\r
+                                       \r
+                                       //3 [ Init antenna diversity ]\r
+                                       pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV; \r
+                                       ODM_AntDivInit(pDM_Odm);\r
+                               }\r
+                               //2 [ Single Antenna ]\r
+                               else if(avg_power_diff > power_target_H)\r
+                               {\r
+                                       pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;\r
+                                       if(pDM_Odm->DM_SWAT_Table.ANTB_ON == TRUE)\r
+                                       {\r
+                                               pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;\r
+                                               pDM_Odm->DM_SWAT_Table.ANTB_ON = FALSE;\r
+                                               //BT_SetBtCoexAntNum(Adapter, BT_COEX_ANT_TYPE_DETECTED, 1);\r
+                                       }\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));\r
+                                       pDM_Odm->DM_SWAT_Table.Single_Ant_Counter++;\r
+                               }\r
+                       }\r
+                       //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("bResult=(( %d ))\n",pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult));\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Dual_Ant_Counter = (( %d )), Single_Ant_Counter = (( %d )) , Retry_Counter = (( %d )) , Aux_FailDetec_Counter = (( %d ))\n\n\n",\r
+                       pDM_Odm->DM_SWAT_Table.Dual_Ant_Counter,pDM_Odm->DM_SWAT_Table.Single_Ant_Counter,pDM_Odm->DM_SWAT_Table.Retry_Counter,pDM_Odm->DM_SWAT_Table.Aux_FailDetec_Counter));\r
+\r
+                       //2 recover the antenna setting\r
+\r
+                       if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)\r
+                               ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0xfff, (pDM_SWAT_Table->SWAS_NoLink_BK_Reg948));\r
+                       \r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("bResult=(( %d )), Recover  Reg[948]= (( %x )) \n\n",pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult, pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 ));\r
+\r
+                       \r
+               }\r
+               else if(pDM_Odm->SupportICType == ODM_RTL8192C)\r
+               {\r
+                       if(pMgntInfo->NumBssDesc!=0 && Score<=0)\r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,\r
+                                       ("ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX"));\r
+\r
+                               pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;\r
+                       }\r
+                       else\r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, \r
+                                       ("ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"AUX":"MAIN"));\r
+\r
+                               pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;\r
+\r
+                               //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);\r
+                               pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));\r
+                               PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);\r
+                       }\r
+               }\r
+               \r
+               // Check state reset to default and wait for next time.\r
+               pDM_SWAT_Table->SWAS_NoLink_State = 0;\r
+               pMgntInfo->bScanAntDetect = FALSE;\r
+\r
+               return FALSE;\r
+       }\r
+\r
+#else\r
+               return  FALSE;\r
+#endif\r
+\r
+return FALSE;\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+//1 [3. PSD Method] ==========================================================\r
+\r
+\r
+\r
+\r
+u4Byte\r
+odm_GetPSDData(\r
+       IN PDM_ODM_T    pDM_Odm,\r
+       IN u2Byte                       point,\r
+       IN u1Byte               initial_gain)\r
+{\r
+       u4Byte                  psd_report;\r
+       \r
+       ODM_SetBBReg(pDM_Odm, 0x808, 0x3FF, point);\r
+       ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 1);  //Start PSD calculation, Reg808[22]=0->1\r
+       ODM_StallExecution(150);//Wait for HW PSD report\r
+       ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 0);//Stop PSD calculation,  Reg808[22]=1->0\r
+       psd_report = ODM_GetBBReg(pDM_Odm,0x8B4, bMaskDWord) & 0x0000FFFF;//Read PSD report, Reg8B4[15:0]\r
+       \r
+       psd_report = (u4Byte) (ConvertTo_dB(psd_report));//+(u4Byte)(initial_gain);\r
+       return psd_report;\r
+}\r
+\r
+\r
+\r
+VOID\r
+ODM_SingleDualAntennaDetection_PSD(\r
+       IN       PDM_ODM_T      pDM_Odm\r
+)\r
+{\r
+       PADAPTER        pAdapter         =  pDM_Odm->Adapter;\r
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
+       u4Byte  Channel_ori;\r
+       u1Byte  initial_gain = 0x36;\r
+       u1Byte  tone_idx;\r
+       u1Byte  Tone_lenth_1=7, Tone_lenth_2=4;\r
+       u2Byte  Tone_idx_1[7]={88, 104, 120, 8, 24, 40, 56};\r
+       u2Byte  Tone_idx_2[4]={8, 24, 40, 56};\r
+       u4Byte  PSD_report_Main[11]={0}, PSD_report_Aux[11]={0};\r
+       //u1Byte        Tone_lenth_1=4, Tone_lenth_2=2;\r
+       //u2Byte        Tone_idx_1[4]={88, 120, 24, 56};\r
+       //u2Byte        Tone_idx_2[2]={ 24,  56};\r
+       //u4Byte        PSD_report_Main[6]={0}, PSD_report_Aux[6]={0};\r
+\r
+       u4Byte  PSD_report_temp,MAX_PSD_report_Main=0,MAX_PSD_report_Aux=0;\r
+       u4Byte  PSD_power_threshold;\r
+       u4Byte  Main_psd_result=0, Aux_psd_result=0;\r
+       u4Byte  Regc50, Reg948, Regb2c,Regc14,Reg908;\r
+       u4Byte  i=0,test_num=8;\r
+       \r
+\r
+       if(pDM_Odm->SupportICType != ODM_RTL8723B)\r
+               return;\r
+       \r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection_PSD()============> \n")); \r
+       \r
+       //2 [ Backup Current RF/BB Settings ]   \r
+       \r
+       Channel_ori = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask);\r
+       Reg948 = ODM_GetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord);\r
+       Regb2c =  ODM_GetBBReg(pDM_Odm, rAGC_table_select, bMaskDWord);\r
+       Regc50 = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord);\r
+       Regc14 = ODM_GetBBReg(pDM_Odm, 0xc14, bMaskDWord);\r
+       Reg908 = ODM_GetBBReg(pDM_Odm, 0x908, bMaskDWord);\r
+\r
+       //2 [ Setting for doing PSD function (CH4)]\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0); //disable whole CCK block\r
+       ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0xFF); // Turn off TX  ->  Pause TX Queue\r
+       ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0); // [ Set IQK Matrix = 0 ] equivalent to [ Turn off CCA]\r
+\r
+       // PHYTXON while loop\r
+       ODM_SetBBReg(pDM_Odm, 0x908, bMaskDWord, 0x803); \r
+       while (ODM_GetBBReg(pDM_Odm, 0xdf4, BIT6)) \r
+       {\r
+               i++;\r
+               if (i > 1000000) \r
+               {\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Wait in %s() more than %d times!\n", __FUNCTION__, i));  \r
+                       break;\r
+               }\r
+       }\r
+       \r
+       ODM_SetBBReg(pDM_Odm, 0xc50, 0x7f, initial_gain);  \r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, 0x7ff, 0x04);     // Set RF to CH4 & 40M\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0xf);  // 3 wire Disable    88c[23:20]=0xf\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_PSDFunction, BIT14|BIT15, 0x0);  //128 pt  //Set PSD 128 ptss\r
+       ODM_StallExecution(3000);       \r
+       \r
+       \r
+       //2 [ Doing PSD Function in (CH4)]\r
+       \r
+        //Antenna A\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Switch to Main-ant   (CH4)\n"));\r
+       ODM_SetBBReg(pDM_Odm, 0x948, 0xfff, 0x200);\r
+       ODM_StallExecution(10);\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dbg\n"));\r
+       for (i=0;i<test_num;i++)\r
+       {       \r
+               for (tone_idx=0;tone_idx<Tone_lenth_1;tone_idx++)\r
+               {\r
+                       PSD_report_temp = odm_GetPSDData(pDM_Odm, Tone_idx_1[tone_idx], initial_gain);\r
+                       //if(  PSD_report_temp>PSD_report_Main[tone_idx]  )\r
+                               PSD_report_Main[tone_idx]+=PSD_report_temp;\r
+               }\r
+       }\r
+        //Antenna B\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Switch to Aux-ant   (CH4)\n"));\r
+       ODM_SetBBReg(pDM_Odm, 0x948, 0xfff, 0x280);\r
+       ODM_StallExecution(10); \r
+       for (i=0;i<test_num;i++)\r
+       {\r
+               for (tone_idx=0;tone_idx<Tone_lenth_1;tone_idx++)\r
+               {\r
+                       PSD_report_temp = odm_GetPSDData(pDM_Odm, Tone_idx_1[tone_idx], initial_gain);\r
+                       //if(  PSD_report_temp>PSD_report_Aux[tone_idx]  )\r
+                               PSD_report_Aux[tone_idx]+=PSD_report_temp;\r
+               }\r
+       }\r
+       //2 [ Doing PSD Function in (CH8)]\r
+\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0x0);  // 3 wire enable    88c[23:20]=0x0\r
+       ODM_StallExecution(3000);       \r
+       \r
+       ODM_SetBBReg(pDM_Odm, 0xc50, 0x7f, initial_gain);  \r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, 0x7ff, 0x04);     // Set RF to CH8 & 40M\r
+       \r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0xf);  // 3 wire Disable    88c[23:20]=0xf\r
+       ODM_StallExecution(3000);\r
+\r
+        //Antenna A\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Switch to Main-ant   (CH8)\n"));\r
+       ODM_SetBBReg(pDM_Odm, 0x948, 0xfff, 0x200);\r
+       ODM_StallExecution(10);\r
+\r
+       for (i=0;i<test_num;i++)\r
+       {\r
+               for (tone_idx=0;tone_idx<Tone_lenth_2;tone_idx++)\r
+               {\r
+                       PSD_report_temp = odm_GetPSDData(pDM_Odm, Tone_idx_2[tone_idx], initial_gain);\r
+                       //if(  PSD_report_temp>PSD_report_Main[tone_idx]  )\r
+                               PSD_report_Main[Tone_lenth_1+tone_idx]+=PSD_report_temp;\r
+               }\r
+       }\r
+\r
+        //Antenna B\r
+        ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Switch to Aux-ant   (CH8)\n"));\r
+        ODM_SetBBReg(pDM_Odm, 0x948, 0xfff, 0x280);\r
+       ODM_StallExecution(10); \r
+\r
+       for (i=0;i<test_num;i++)\r
+       {\r
+               for (tone_idx=0;tone_idx<Tone_lenth_2;tone_idx++)\r
+               {\r
+                       PSD_report_temp = odm_GetPSDData(pDM_Odm, Tone_idx_2[tone_idx], initial_gain);\r
+                       //if(  PSD_report_temp>PSD_report_Aux[tone_idx]  )\r
+                               PSD_report_Aux[Tone_lenth_1+tone_idx]+=PSD_report_temp;\r
+               }\r
+       }\r
+\r
+        //2 [ Calculate Result ]\r
+\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\nMain PSD Result: (ALL) \n"));\r
+       for (tone_idx=0;tone_idx<(Tone_lenth_1+Tone_lenth_2);tone_idx++)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Tone-%d]: %d, \n",(tone_idx+1), PSD_report_Main[tone_idx] ));\r
+               Main_psd_result+= PSD_report_Main[tone_idx];\r
+               if(PSD_report_Main[tone_idx]>MAX_PSD_report_Main)\r
+                       MAX_PSD_report_Main=PSD_report_Main[tone_idx];\r
+       }\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("--------------------------- \nTotal_Main= (( %d ))\n", Main_psd_result));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("MAX_Main = (( %d ))\n", MAX_PSD_report_Main));\r
+       \r
+\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\nAux PSD Result: (ALL) \n"));\r
+       for (tone_idx=0;tone_idx<(Tone_lenth_1+Tone_lenth_2);tone_idx++)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Tone-%d]: %d, \n",(tone_idx+1), PSD_report_Aux[tone_idx] ));\r
+               Aux_psd_result+= PSD_report_Aux[tone_idx];\r
+               if(PSD_report_Aux[tone_idx]>MAX_PSD_report_Aux)\r
+                       MAX_PSD_report_Aux=PSD_report_Aux[tone_idx];\r
+       }\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("--------------------------- \nTotal_Aux= (( %d ))\n", Aux_psd_result));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("MAX_Aux = (( %d ))\n\n", MAX_PSD_report_Aux));\r
+               \r
+       //Main_psd_result=Main_psd_result-MAX_PSD_report_Main;\r
+       //Aux_psd_result=Aux_psd_result-MAX_PSD_report_Aux;\r
+       PSD_power_threshold=(Main_psd_result*7)>>3;\r
+       \r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Main_result , Aux_result ] = [ %d , %d ], PSD_power_threshold=(( %d ))\n", Main_psd_result, Aux_psd_result,PSD_power_threshold));\r
+       \r
+       //3 [ Dual Antenna ]\r
+        if(Aux_psd_result >= PSD_power_threshold   ) \r
+       {\r
+               if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)\r
+               {\r
+                       pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;\r
+                       pDM_Odm->DM_SWAT_Table.ANTB_ON = TRUE;\r
+               }\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Dual antenna\n"));\r
+               \r
+               // set bt coexDM from 1ant coexDM to 2ant coexDM\r
+               //BT_SetBtCoexAntNum(pAdapter, BT_COEX_ANT_TYPE_DETECTED, 2);\r
+                                       \r
+               // Init antenna diversity\r
+               pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV; \r
+               ODM_AntDivInit(pDM_Odm);\r
+               }\r
+       //3 [ Single Antenna ]\r
+       else\r
+       {\r
+               if(pDM_Odm->DM_SWAT_Table.ANTB_ON == TRUE)\r
+               {\r
+                       pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;\r
+                       pDM_Odm->DM_SWAT_Table.ANTB_ON = FALSE;\r
+               }\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));\r
+       }\r
+\r
+       //2 [ Recover all parameters ]\r
+       \r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask,Channel_ori);  \r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0x0);  // 3 wire enable    88c[23:20]=0x0\r
+       ODM_SetBBReg(pDM_Odm, 0xc50, 0x7f, Regc50);     \r
+       \r
+       ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord, Reg948);\r
+       ODM_SetBBReg(pDM_Odm, rAGC_table_select, bMaskDWord, Regb2c);\r
+\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1); //enable whole CCK block\r
+       ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0x0); //Turn on TX         // Resume TX Queue\r
+       ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, Regc14); // [ Set IQK Matrix = 0 ] equivalent to [ Turn on CCA]\r
+       ODM_SetBBReg(pDM_Odm, 0x908, bMaskDWord, Reg908); \r
+       \r
+       return;\r
+\r
+}\r
+\r
+\r
+\r
+\r
+#endif\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDect.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDect.h
new file mode 100755 (executable)
index 0000000..9e18c2e
--- /dev/null
@@ -0,0 +1,76 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __PHYDMANTDECT_H__\r
+#define    __PHYDMANTDECT_H__\r
+\r
+#define ANTDECT_VERSION        "1.0"\r
+\r
+#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN |ODM_CE))\r
+//1 [1. Single Tone Method] ===================================================\r
+\r
+\r
+\r
+VOID\r
+ODM_SingleDualAntennaDefaultSetting(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       );\r
+\r
+BOOLEAN\r
+ODM_SingleDualAntennaDetection(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              u1Byte                  mode\r
+       );\r
+\r
+//1 [2. Scan AP RSSI Method] ==================================================\r
+\r
+VOID
+odm_SwAntDetectInit(
+       IN              PDM_ODM_T               pDM_Odm
+       );\r
+\r
+\r
+#define SwAntDivCheckBeforeLink        ODM_SwAntDivCheckBeforeLink\r
+\r
+BOOLEAN \r
+ODM_SwAntDivCheckBeforeLink(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       );\r
+\r
+\r
+\r
+\r
+//1 [3. PSD Method] ==========================================================\r
+\r
+\r
+VOID\r
+ODM_SingleDualAntennaDetection_PSD(\r
+       IN       PDM_ODM_T      pDM_Odm\r
+);\r
+\r
+\r
+\r
+\r
+\r
+\r
+#endif\r
+#endif\r
+\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDiv.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDiv.c
new file mode 100755 (executable)
index 0000000..4898e9c
--- /dev/null
@@ -0,0 +1,2850 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+\r
+#include "Mp_Precomp.h"\r
+#include "phydm_precomp.h"\r
+\r
+//======================================================\r
+// when antenna test utility is on or some testing need to disable antenna diversity\r
+// call this function to disable all ODM related mechanisms which will switch antenna.\r
+//======================================================\r
+VOID\r
+ODM_StopAntennaSwitchDm(\r
+       IN      PDM_ODM_T       pDM_Odm\r
+       )\r
+{\r
+       // disable ODM antenna diversity\r
+       pDM_Odm->SupportAbility &= ~ODM_BB_ANT_DIV;\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("STOP Antenna Diversity \n"));\r
+}\r
+\r
+VOID\r
+ODM_SetAntConfig(\r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       IN      u1Byte          antSetting      // 0=A, 1=B, 2=C, ....\r
+       )\r
+{\r
+       if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+       {\r
+               if(antSetting == 0)             // ant A\r
+                       ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000000);\r
+               else if(antSetting == 1)\r
+                       ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);\r
+       }\r
+}\r
+\r
+//======================================================\r
+\r
+\r
+VOID
+ODM_SwAntDivRestAfterLink(
+       IN              PDM_ODM_T               pDM_Odm
+       )
+{
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+       pFAT_T          pDM_FatTable = &pDM_Odm->DM_FatTable;
+       u4Byte             i;
+
+       if(pDM_Odm->SupportICType == ODM_RTL8723A)
+       {
+           pDM_SWAT_Table->RSSI_cnt_A = 0;
+           pDM_SWAT_Table->RSSI_cnt_B = 0;
+           pDM_Odm->RSSI_test = FALSE;
+           pDM_SWAT_Table->try_flag = 0xff;
+           pDM_SWAT_Table->RSSI_Trying = 0;
+           pDM_SWAT_Table->SelectAntennaMap=0xAA;
+       
+       }
+       else if(pDM_Odm->SupportICType & (ODM_RTL8723B|ODM_RTL8821))
+       {
+               pDM_Odm->RSSI_test = FALSE;
+               pDM_SWAT_Table->try_flag = 0xff;
+               pDM_SWAT_Table->RSSI_Trying = 0;
+               pDM_SWAT_Table->Double_chk_flag= 0;
+               
+               pDM_FatTable->RxIdleAnt=MAIN_ANT;
+               
+               for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
+               {
+                       pDM_FatTable->MainAnt_Sum[i] = 0;
+                       pDM_FatTable->AuxAnt_Sum[i] = 0;
+                       pDM_FatTable->MainAnt_Cnt[i] = 0;
+                       pDM_FatTable->AuxAnt_Cnt[i] = 0;
+               }
+
+       }
+}
+\r
+\r
+#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))\r
+VOID\r
+odm_AntDiv_on_off( IN PDM_ODM_T        pDM_Odm ,IN u1Byte swch)\r
+{\r
+       if(pDM_Odm->AntDivType==S0S1_SW_ANTDIV || pDM_Odm->AntDivType==CGCS_RX_SW_ANTDIV) \r
+               return;\r
+\r
+       if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("(( Turn %s )) N-Series HW-AntDiv block\n",(swch==ANTDIV_ON)?"ON" : "OFF"));\r
+               ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, swch); //OFDM AntDiv function block enable\r
+               if( pDM_Odm->AntDivType != S0S1_SW_ANTDIV)\r
+                       ODM_SetBBReg(pDM_Odm, 0xa00 , BIT15, swch); //CCK AntDiv function block enable\r
+       }\r
+       else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("(( Turn %s )) AC-Series HW-AntDiv block\n",(swch==ANTDIV_ON)?"ON" : "OFF"));\r
+               if(pDM_Odm->SupportICType == ODM_RTL8812)\r
+               {\r
+                       ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, swch); //OFDM AntDiv function block enable\r
+                       //ODM_SetBBReg(pDM_Odm, 0xa00 , BIT15, swch); //CCK AntDiv function block enable\r
+               }\r
+               else\r
+               {\r
+               ODM_SetBBReg(pDM_Odm, 0x8D4 , BIT24, swch); //OFDM AntDiv function block enable\r
+                       \r
+                       if( (pDM_Odm->CutVersion >= ODM_CUT_C) && (pDM_Odm->SupportICType == ODM_RTL8821) && ( pDM_Odm->AntDivType != S0S1_SW_ANTDIV))\r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("(( Turn %s )) CCK HW-AntDiv block\n",(swch==ANTDIV_ON)?"ON" : "OFF"));\r
+                               ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, swch); \r
+                               ODM_SetBBReg(pDM_Odm, 0xA00 , BIT15, swch); //CCK AntDiv function block enable\r
+                       }\r
+               }\r
+         }\r
+}\r
+\r
+VOID\r
+ODM_UpdateRxIdleAnt(IN PDM_ODM_T pDM_Odm, IN u1Byte Ant)\r
+{\r
+       pFAT_T  pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+       u4Byte  DefaultAnt, OptionalAnt,value32;\r
+\r
+       //#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\r
+       //PADAPTER              pAdapter = pDM_Odm->Adapter;\r
+       //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);\r
+       //#endif\r
+\r
+       if(pDM_FatTable->RxIdleAnt != Ant)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-Ant ] RxIdleAnt =%s\n",(Ant==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));\r
+\r
+               if(!(pDM_Odm->SupportICType & ODM_RTL8723B))\r
+                       pDM_FatTable->RxIdleAnt = Ant;\r
+\r
+               if(Ant == MAIN_ANT)\r
+               {\r
+                       DefaultAnt   =  ANT1_2G; \r
+                       OptionalAnt =  ANT2_2G; \r
+               }\r
+               else\r
+               {\r
+                       DefaultAnt  =   ANT2_2G;\r
+                       OptionalAnt =  ANT1_2G;\r
+               }\r
+       \r
+               if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT)\r
+               {\r
+                       if(pDM_Odm->SupportICType==ODM_RTL8192E)\r
+                       {\r
+                               ODM_SetBBReg(pDM_Odm, 0xB38 , BIT5|BIT4|BIT3, DefaultAnt); //Default RX\r
+                               ODM_SetBBReg(pDM_Odm, 0xB38 , BIT8|BIT7|BIT6, OptionalAnt);//Optional RX\r
+                               ODM_SetBBReg(pDM_Odm, 0x860, BIT14|BIT13|BIT12, DefaultAnt);//Default TX        \r
+                       }\r
+                       else if(pDM_Odm->SupportICType==ODM_RTL8723B)\r
+                       {\r
+                               value32 = ODM_GetBBReg(pDM_Odm, 0x948, 0xFFF);\r
+                               \r
+                               if (value32 !=0x280)\r
+                                       ODM_UpdateRxIdleAnt_8723B(pDM_Odm, Ant, DefaultAnt, OptionalAnt);\r
+                               else\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-Ant ] 8723B: Fail to set RX antenna due to 0x948 = 0x280\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               ODM_SetBBReg(pDM_Odm, 0x864 , BIT5|BIT4|BIT3, DefaultAnt);      //Default RX\r
+                               ODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, OptionalAnt);     //Optional RX\r
+                               ODM_SetBBReg(pDM_Odm, 0x860, BIT14|BIT13|BIT12, DefaultAnt);            //Default TX    \r
+                       }\r
+               }\r
+               else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT)\r
+               {\r
+                       u2Byte  value16 = ODM_Read2Byte(pDM_Odm, ODM_REG_TRMUX_11AC+2);\r
+                       //\r
+                       // 2014/01/14 MH/Luke.Lee Add direct write for register 0xc0a to prevnt \r
+                       // incorrect 0xc08 bit0-15 .We still not know why it is changed.\r
+                       //\r
+                       value16 &= ~(BIT11|BIT10|BIT9|BIT8|BIT7|BIT6|BIT5|BIT4|BIT3);\r
+                       value16 |= ((u2Byte)DefaultAnt <<3);\r
+                       value16 |= ((u2Byte)OptionalAnt <<6);\r
+                       value16 |= ((u2Byte)DefaultAnt <<9);\r
+                       ODM_Write2Byte(pDM_Odm, ODM_REG_TRMUX_11AC+2, value16);\r
+                       /*\r
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC , BIT21|BIT20|BIT19, DefaultAnt);       //Default RX\r
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC , BIT24|BIT23|BIT22, OptionalAnt);//Optional RX\r
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC , BIT27|BIT26|BIT25, DefaultAnt);       //Default TX\r
+                       */\r
+               }\r
+               \r
+               if(pDM_Odm->SupportICType==ODM_RTL8188E)\r
+               {               \r
+                       ODM_SetMACReg(pDM_Odm, 0x6D8 , BIT7|BIT6, DefaultAnt);  //\14PathA Resp Tx\r
+               }\r
+               else\r
+               {\r
+                       ODM_SetMACReg(pDM_Odm, 0x6D8 , BIT10|BIT9|BIT8, DefaultAnt);    //\14PathA Resp Tx\r
+               }       \r
+               \r
+       }\r
+       else// pDM_FatTable->RxIdleAnt == Ant\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Stay in Ori-Ant ]  RxIdleAnt =%s\n",(Ant==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));\r
+               pDM_FatTable->RxIdleAnt = Ant;\r
+       }\r
+}\r
+\r
+\r
+VOID\r
+odm_UpdateTxAnt(IN PDM_ODM_T pDM_Odm, IN u1Byte Ant, IN u4Byte MacId)\r
+{\r
+       pFAT_T  pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+       u1Byte  TxAnt;\r
+\r
+       if(Ant == MAIN_ANT)\r
+               TxAnt = ANT1_2G;\r
+       else\r
+               TxAnt = ANT2_2G;\r
+       \r
+       pDM_FatTable->antsel_a[MacId] = TxAnt&BIT0;\r
+       pDM_FatTable->antsel_b[MacId] = (TxAnt&BIT1)>>1;\r
+       pDM_FatTable->antsel_c[MacId] = (TxAnt&BIT2)>>2;\r
+        #if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+       if (pDM_Odm->antdiv_rssi)\r
+        {\r
+               //panic_printk("[Tx from TxInfo]: MacID:(( %d )),  TxAnt = (( %s ))\n",MacId,(Ant==MAIN_ANT)?"MAIN_ANT":"AUX_ANT");\r
+               //panic_printk("antsel_tr_mux=(( 3'b%d%d%d ))\n",       pDM_FatTable->antsel_c[MacId] , pDM_FatTable->antsel_b[MacId] , pDM_FatTable->antsel_a[MacId] );\r
+       }\r
+        #endif\r
+       //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Tx from TxInfo]: MacID:(( %d )),  TxAnt = (( %s ))\n", \r
+       //                                      MacId,(Ant==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));\r
+       //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=(( 3'b%d%d%d ))\n",\r
+                                                       //pDM_FatTable->antsel_c[MacId] , pDM_FatTable->antsel_b[MacId] , pDM_FatTable->antsel_a[MacId] ));\r
+       \r
+}\r
+\r
+\r
+\r
+#if (RTL8188E_SUPPORT == 1)\r
+\r
+\r
+VOID\r
+odm_RX_HWAntDiv_Init_88E(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+       u4Byte  value32;\r
+\r
+       pDM_Odm->AntType = ODM_AUTO_ANT;\r
+\r
+       if(pDM_Odm->mp_mode == TRUE)\r
+       {\r
+               pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_IGI_A_11N , BIT7, 0); // disable HW AntDiv \r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT31, 1);  // 1:CG, 0:CS\r
+               return;\r
+       }\r
+       \r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init =>  AntDivType=[CGCS_RX_HW_ANTDIV]\n"));\r
+       \r
+       //MAC Setting\r
+       value32 = ODM_GetMACReg(pDM_Odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord);\r
+       ODM_SetMACReg(pDM_Odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord, value32|(BIT23|BIT25)); //Reg4C[25]=1, Reg4C[23]=1 for pin output\r
+       //Pin Settings\r
+       ODM_SetBBReg(pDM_Odm, ODM_REG_PIN_CTRL_11N , BIT9|BIT8, 0);//Reg870[8]=1'b0, Reg870[9]=1'b0             //antsel antselb by HW\r
+       ODM_SetBBReg(pDM_Odm, ODM_REG_RX_ANT_CTRL_11N , BIT10, 0);      //Reg864[10]=1'b0       //antsel2 by HW\r
+       ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT22, 1);       //Regb2c[22]=1'b0       //disable CS/CG switch\r
+       ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT31, 1);       //Regb2c[31]=1'b1       //output at CG only\r
+       //OFDM Settings\r
+       ODM_SetBBReg(pDM_Odm, ODM_REG_ANTDIV_PARA1_11N , bMaskDWord, 0x000000a0);\r
+       //CCK Settings\r
+       ODM_SetBBReg(pDM_Odm, ODM_REG_BB_PWR_SAV4_11N , BIT7, 1); //Fix CCK PHY status report issue\r
+       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_ANTDIV_PARA2_11N , BIT4, 1); //CCK complete HW AntDiv within 64 samples       \r
+       \r
+       ODM_SetBBReg(pDM_Odm, ODM_REG_ANT_MAPPING1_11N , 0xFFFF, 0x0001);       //antenna mapping table\r
+}\r
+\r
+VOID\r
+odm_TRX_HWAntDiv_Init_88E(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+       u4Byte  value32;\r
+       \r
+       if(pDM_Odm->mp_mode == TRUE)\r
+       {\r
+               pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_IGI_A_11N , BIT7, 0); // disable HW AntDiv \r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_RX_ANT_CTRL_11N , BIT5|BIT4|BIT3, 0); //Default RX   (0/1)\r
+               return;\r
+       }\r
+\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init =>  AntDivType=[CG_TRX_HW_ANTDIV (SPDT)]\n"));\r
+       \r
+       //MAC Setting\r
+       value32 = ODM_GetMACReg(pDM_Odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord);\r
+       ODM_SetMACReg(pDM_Odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord, value32|(BIT23|BIT25)); //Reg4C[25]=1, Reg4C[23]=1 for pin output\r
+       //Pin Settings\r
+       ODM_SetBBReg(pDM_Odm, ODM_REG_PIN_CTRL_11N , BIT9|BIT8, 0);//Reg870[8]=1'b0, Reg870[9]=1'b0             //antsel antselb by HW\r
+       ODM_SetBBReg(pDM_Odm, ODM_REG_RX_ANT_CTRL_11N , BIT10, 0);      //Reg864[10]=1'b0       //antsel2 by HW\r
+       ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT22, 0);       //Regb2c[22]=1'b0       //disable CS/CG switch\r
+       ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT31, 1);       //Regb2c[31]=1'b1       //output at CG only\r
+       //OFDM Settings\r
+       ODM_SetBBReg(pDM_Odm, ODM_REG_ANTDIV_PARA1_11N , bMaskDWord, 0x000000a0);\r
+       //CCK Settings\r
+       ODM_SetBBReg(pDM_Odm, ODM_REG_BB_PWR_SAV4_11N , BIT7, 1); //Fix CCK PHY status report issue\r
+       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_ANTDIV_PARA2_11N , BIT4, 1); //CCK complete HW AntDiv within 64 samples\r
+\r
+       //antenna mapping table\r
+       if(!pDM_Odm->bIsMPChip) //testchip\r
+       {\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_RX_DEFUALT_A_11N , BIT10|BIT9|BIT8, 1);   //Reg858[10:8]=3'b001\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_RX_DEFUALT_A_11N , BIT13|BIT12|BIT11, 2); //Reg858[13:11]=3'b010\r
+       }\r
+       else //MPchip\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_ANT_MAPPING1_11N , bMaskDWord, 0x0001);   //Reg914=3'b010, Reg915=3'b001\r
+}\r
+\r
+VOID\r
+odm_Smart_HWAntDiv_Init_88E(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+       u4Byte  value32, i;\r
+       pFAT_T  pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+       u4Byte  AntCombination = 2;\r
+\r
+    ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init =>  AntDivType=[CG_TRX_SMART_ANTDIV]\n"));\r
+    \r
+       if(pDM_Odm->mp_mode == TRUE)\r
+       {\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("pDM_Odm->AntDivType: %d\n", pDM_Odm->AntDivType));\r
+    return;\r
+       }\r
+\r
+       for(i=0; i<6; i++)\r
+       {\r
+               pDM_FatTable->Bssid[i] = 0;\r
+               pDM_FatTable->antSumRSSI[i] = 0;\r
+               pDM_FatTable->antRSSIcnt[i] = 0;\r
+               pDM_FatTable->antAveRSSI[i] = 0;\r
+       }\r
+       pDM_FatTable->TrainIdx = 0;\r
+       pDM_FatTable->FAT_State = FAT_NORMAL_STATE;\r
+\r
+       //MAC Setting\r
+       value32 = ODM_GetMACReg(pDM_Odm, 0x4c, bMaskDWord);\r
+       ODM_SetMACReg(pDM_Odm, 0x4c, bMaskDWord, value32|(BIT23|BIT25)); //Reg4C[25]=1, Reg4C[23]=1 for pin output\r
+       value32 = ODM_GetMACReg(pDM_Odm,  0x7B4, bMaskDWord);\r
+       ODM_SetMACReg(pDM_Odm, 0x7b4, bMaskDWord, value32|(BIT16|BIT17)); //Reg7B4[16]=1 enable antenna training, Reg7B4[17]=1 enable A2 match\r
+       //value32 = PlatformEFIORead4Byte(Adapter, 0x7B4);\r
+       //PlatformEFIOWrite4Byte(Adapter, 0x7b4, value32|BIT18);        //append MACID in reponse packet\r
+\r
+       //Match MAC ADDR\r
+       ODM_SetMACReg(pDM_Odm, 0x7b4, 0xFFFF, 0);\r
+       ODM_SetMACReg(pDM_Odm, 0x7b0, bMaskDWord, 0);\r
+       \r
+       ODM_SetBBReg(pDM_Odm, 0x870 , BIT9|BIT8, 0);//Reg870[8]=1'b0, Reg870[9]=1'b0            //antsel antselb by HW\r
+       ODM_SetBBReg(pDM_Odm, 0x864 , BIT10, 0);        //Reg864[10]=1'b0       //antsel2 by HW\r
+       ODM_SetBBReg(pDM_Odm, 0xb2c , BIT22, 0);        //Regb2c[22]=1'b0       //disable CS/CG switch\r
+       ODM_SetBBReg(pDM_Odm, 0xb2c , BIT31, 1);        //Regb2c[31]=1'b1       //output at CG only\r
+       ODM_SetBBReg(pDM_Odm, 0xca4 , bMaskDWord, 0x000000a0);\r
+       \r
+       //antenna mapping table\r
+       if(AntCombination == 2)\r
+       {\r
+               if(!pDM_Odm->bIsMPChip) //testchip\r
+               {\r
+                       ODM_SetBBReg(pDM_Odm, 0x858 , BIT10|BIT9|BIT8, 1);      //Reg858[10:8]=3'b001\r
+                       ODM_SetBBReg(pDM_Odm, 0x858 , BIT13|BIT12|BIT11, 2);    //Reg858[13:11]=3'b010\r
+               }\r
+               else //MPchip\r
+               {\r
+                       ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 1);\r
+                       ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 2);\r
+               }\r
+       }\r
+       else if(AntCombination == 7)\r
+       {\r
+               if(!pDM_Odm->bIsMPChip) //testchip\r
+               {\r
+                       ODM_SetBBReg(pDM_Odm, 0x858 , BIT10|BIT9|BIT8, 0);      //Reg858[10:8]=3'b000\r
+                       ODM_SetBBReg(pDM_Odm, 0x858 , BIT13|BIT12|BIT11, 1);    //Reg858[13:11]=3'b001\r
+                       ODM_SetBBReg(pDM_Odm, 0x878 , BIT16, 0);\r
+                       ODM_SetBBReg(pDM_Odm, 0x858 , BIT15|BIT14, 2);  //(Reg878[0],Reg858[14:15])=3'b010\r
+                       ODM_SetBBReg(pDM_Odm, 0x878 , BIT19|BIT18|BIT17, 3);//Reg878[3:1]=3b'011\r
+                       ODM_SetBBReg(pDM_Odm, 0x878 , BIT22|BIT21|BIT20, 4);//Reg878[6:4]=3b'100\r
+                       ODM_SetBBReg(pDM_Odm, 0x878 , BIT25|BIT24|BIT23, 5);//Reg878[9:7]=3b'101 \r
+                       ODM_SetBBReg(pDM_Odm, 0x878 , BIT28|BIT27|BIT26, 6);//Reg878[12:10]=3b'110 \r
+                       ODM_SetBBReg(pDM_Odm, 0x878 , BIT31|BIT30|BIT29, 7);//Reg878[15:13]=3b'111\r
+               }\r
+               else //MPchip\r
+               {\r
+                       ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 0);\r
+                       ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 1);   \r
+                       ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte2, 2);\r
+                       ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte3, 3);\r
+                       ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte0, 4);\r
+                       ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte1, 5);\r
+                       ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte2, 6);\r
+                       ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte3, 7);\r
+               }\r
+       }\r
+\r
+       //Default Ant Setting when no fast training\r
+       ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1); //Reg80c[21]=1'b1              //from TX Info\r
+       ODM_SetBBReg(pDM_Odm, 0x864 , BIT5|BIT4|BIT3, 0);       //Default RX\r
+       ODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, 1);       //Optional RX\r
+       //ODM_SetBBReg(pDM_Odm, 0x860 , BIT14|BIT13|BIT12, 1);  //Default TX\r
+\r
+       //Enter Traing state\r
+       ODM_SetBBReg(pDM_Odm, 0x864 , BIT2|BIT1|BIT0, (AntCombination-1));      //Reg864[2:0]=3'd6      //ant combination=reg864[2:0]+1\r
+       //ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 0); //RegC50[7]=1'b0              //disable HW AntDiv\r
+       //ODM_SetBBReg(pDM_Odm,  0xe08 , BIT16, 0); //RegE08[16]=1'b0           //disable fast training\r
+       //ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 1);      //RegE08[16]=1'b1               //enable fast training\r
+       ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 1); //RegC50[7]=1'b1                //enable HW AntDiv\r
+\r
+       //SW Control\r
+       //PHY_SetBBReg(Adapter, 0x864 , BIT10, 1);\r
+       //PHY_SetBBReg(Adapter, 0x870 , BIT9, 1);\r
+       //PHY_SetBBReg(Adapter, 0x870 , BIT8, 1);\r
+       //PHY_SetBBReg(Adapter, 0x864 , BIT11, 1);\r
+       //PHY_SetBBReg(Adapter, 0x860 , BIT9, 0);\r
+       //PHY_SetBBReg(Adapter, 0x860 , BIT8, 0);\r
+}\r
+#endif //#if (RTL8188E_SUPPORT == 1)\r
+\r
+\r
+#if (RTL8192E_SUPPORT == 1)\r
+VOID\r
+odm_RX_HWAntDiv_Init_92E(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+       \r
+       if(pDM_Odm->mp_mode == TRUE)\r
+       {\r
+        //pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;\r
+       odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\r
+        ODM_SetBBReg(pDM_Odm, 0xc50 , BIT8, 0); //r_rxdiv_enable_anta  Regc50[8]=1'b0  0: control by c50[9]\r
+        ODM_SetBBReg(pDM_Odm, 0xc50 , BIT9, 1);  // 1:CG, 0:CS\r
+        return;\r
+       }\r
+       \r
+        ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8192E AntDiv_Init =>  AntDivType=[CGCS_RX_HW_ANTDIV]\n"));\r
+       \r
+        //Pin Settings\r
+        ODM_SetBBReg(pDM_Odm, 0x870 , BIT8, 0);//Reg870[8]=1'b0,    // "antsel" is controled by HWs\r
+        ODM_SetBBReg(pDM_Odm, 0xc50 , BIT8, 1); //Regc50[8]=1'b1  //" CS/CG switching" is controled by HWs\r
+\r
+        //Mapping table\r
+        ODM_SetBBReg(pDM_Odm, 0x914 , 0xFFFF, 0x0100); //antenna mapping table\r
+         \r
+        //OFDM Settings\r
+        ODM_SetBBReg(pDM_Odm, 0xca4 , 0x7FF, 0xA0); //thershold\r
+        ODM_SetBBReg(pDM_Odm, 0xca4 , 0x7FF000, 0x0); //bias\r
+        \r
+        //CCK Settings\r
+        ODM_SetBBReg(pDM_Odm, 0xa04 , 0xF000000, 0); //Select which path to receive for CCK_1 & CCK_2\r
+        ODM_SetBBReg(pDM_Odm, 0xb34 , BIT30, 1); //(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0\r
+        ODM_SetBBReg(pDM_Odm, 0xa74 , BIT7, 1); //Fix CCK PHY status report issue\r
+        ODM_SetBBReg(pDM_Odm, 0xa0c , BIT4, 1); //CCK complete HW AntDiv within 64 samples      \r
+}\r
+\r
+VOID\r
+odm_TRX_HWAntDiv_Init_92E(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+       \r
+       if(pDM_Odm->mp_mode == TRUE)\r
+       {\r
+        //pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;\r
+       odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\r
+        ODM_SetBBReg(pDM_Odm, 0xc50 , BIT8, 0); //r_rxdiv_enable_anta  Regc50[8]=1'b0  0: control by c50[9]\r
+        ODM_SetBBReg(pDM_Odm, 0xc50 , BIT9, 1);  // 1:CG, 0:CS\r
+        return;\r
+       }\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+        pDM_Odm->antdiv_rssi=0;\r
+#endif\r
+\r
+        ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8192E AntDiv_Init =>  AntDivType=[CG_TRX_HW_ANTDIV]\n"));\r
+       \r
+       //3 --RFE pin setting---------\r
+       //[MAC]\r
+       ODM_SetMACReg(pDM_Odm, 0x38, BIT11, 1);            //DBG PAD Driving control (GPIO 8)\r
+       ODM_SetMACReg(pDM_Odm, 0x4c, BIT23, 0);            //path-A , RFE_CTRL_3 & RFE_CTRL_4\r
+       //[BB]\r
+       ODM_SetBBReg(pDM_Odm, 0x944 , BIT4|BIT3, 0x3);     //RFE_buffer\r
+       ODM_SetBBReg(pDM_Odm, 0x940 , BIT7|BIT6, 0x0); // r_rfe_path_sel_   (RFE_CTRL_3)\r
+       ODM_SetBBReg(pDM_Odm, 0x940 , BIT9|BIT8, 0x0); // r_rfe_path_sel_   (RFE_CTRL_4)\r
+       ODM_SetBBReg(pDM_Odm, 0x944 , BIT31, 0);     //RFE_buffer\r
+       ODM_SetBBReg(pDM_Odm, 0x92C , BIT3, 0);     //rfe_inv  (RFE_CTRL_3)\r
+       ODM_SetBBReg(pDM_Odm, 0x92C , BIT4, 1);     //rfe_inv  (RFE_CTRL_4)\r
+       ODM_SetBBReg(pDM_Odm, 0x930 , 0xFF000, 0x88);           //path-A , RFE_CTRL_3 & 4=> ANTSEL[0]\r
+       //3 -------------------------\r
+       \r
+        //Pin Settings\r
+       ODM_SetBBReg(pDM_Odm, 0xC50 , BIT8, 0);    //path-A     //disable CS/CG switch\r
+       ODM_SetBBReg(pDM_Odm, 0xC50 , BIT9, 1);    //path-A     //output at CG only\r
+       ODM_SetBBReg(pDM_Odm, 0x870 , BIT9|BIT8, 0);  //path-A          //antsel antselb by HW\r
+       ODM_SetBBReg(pDM_Odm, 0xB38 , BIT10, 0);           //path-A     //antsel2 by HW \r
\r
+       //Mapping table\r
+        ODM_SetBBReg(pDM_Odm, 0x914 , 0xFFFF, 0x0100); //antenna mapping table\r
+         \r
+        //OFDM Settings\r
+        ODM_SetBBReg(pDM_Odm, 0xca4 , 0x7FF, 0xA0); //thershold\r
+        ODM_SetBBReg(pDM_Odm, 0xca4 , 0x7FF000, 0x0); //bias\r
+        \r
+        //CCK Settings\r
+        ODM_SetBBReg(pDM_Odm, 0xa04 , 0xF000000, 0); //Select which path to receive for CCK_1 & CCK_2\r
+        ODM_SetBBReg(pDM_Odm, 0xb34 , BIT30, 1); //(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0\r
+        ODM_SetBBReg(pDM_Odm, 0xa74 , BIT7, 1); //Fix CCK PHY status report issue\r
+        ODM_SetBBReg(pDM_Odm, 0xa0c , BIT4, 1); //CCK complete HW AntDiv within 64 samples \r
+\r
+        //Timming issue\r
+        ODM_SetBBReg(pDM_Odm, 0xE20 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)\r
+}\r
+\r
+VOID\r
+odm_Smart_HWAntDiv_Init_92E(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+    ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init =>  AntDivType=[CG_TRX_SMART_ANTDIV]\n"));\r
+}\r
+#endif //#if (RTL8192E_SUPPORT == 1)\r
+\r
+\r
+#if (RTL8723B_SUPPORT == 1)\r
+VOID\r
+odm_TRX_HWAntDiv_Init_8723B(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8723B AntDiv_Init =>  AntDivType=[CG_TRX_HW_ANTDIV(DPDT)]\n"));\r
+      \r
+       //Mapping Table\r
+       ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 0);\r
+       ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 1);\r
+       \r
+       //OFDM HW AntDiv Parameters\r
+       ODM_SetBBReg(pDM_Odm, 0xCA4 , 0x7FF, 0xa0); //thershold\r
+       ODM_SetBBReg(pDM_Odm, 0xCA4 , 0x7FF000, 0x00); //bias\r
+               \r
+       //CCK HW AntDiv Parameters\r
+       ODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M\r
+       ODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples\r
+       \r
+       //BT Coexistence\r
+       ODM_SetBBReg(pDM_Odm, 0x864, BIT12, 0); //keep antsel_map when GNT_BT = 1\r
+       ODM_SetBBReg(pDM_Odm, 0x874 , BIT23, 0); //Disable hw antsw & fast_train.antsw when GNT_BT=1\r
+\r
+        //Output Pin Settings\r
+       ODM_SetBBReg(pDM_Odm, 0x870 , BIT8, 0); //\r
+               \r
+       ODM_SetBBReg(pDM_Odm, 0x948 , BIT6, 0); //WL_BB_SEL_BTG_TRXG_anta,  (1: HW CTRL  0: SW CTRL)\r
+       ODM_SetBBReg(pDM_Odm, 0x948 , BIT7, 0);\r
+               \r
+       ODM_SetMACReg(pDM_Odm, 0x40 , BIT3, 1);\r
+       ODM_SetMACReg(pDM_Odm, 0x38 , BIT11, 1);\r
+       ODM_SetMACReg(pDM_Odm, 0x4C ,  BIT24|BIT23, 2); //select DPDT_P and DPDT_N as output pin\r
+               \r
+       ODM_SetBBReg(pDM_Odm, 0x944 , BIT0|BIT1, 3); //in/out\r
+       ODM_SetBBReg(pDM_Odm, 0x944 , BIT31, 0); //\r
+\r
+       ODM_SetBBReg(pDM_Odm, 0x92C , BIT1, 0); //DPDT_P non-inverse\r
+       ODM_SetBBReg(pDM_Odm, 0x92C , BIT0, 1); //DPDT_N inverse\r
+\r
+       ODM_SetBBReg(pDM_Odm, 0x930 , 0xF0, 8); // DPDT_P = ANTSEL[0]\r
+       ODM_SetBBReg(pDM_Odm, 0x930 , 0xF, 8); // DPDT_N = ANTSEL[0]\r
+\r
+       //Timming issue\r
+       ODM_SetBBReg(pDM_Odm, 0xE20 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)\r
+\r
+       //2 [--For HW Bug Setting]\r
+       if(pDM_Odm->AntType == ODM_AUTO_ANT)\r
+               ODM_SetBBReg(pDM_Odm, 0xA00 , BIT15, 0); //CCK AntDiv function block enable\r
+\r
+       //ODM_SetBBReg(pDM_Odm, 0x80C , BIT21, 0); //TX Ant  by Reg\r
+\r
+\r
+}\r
+\r
+       \r
+\r
+VOID\r
+odm_S0S1_SWAntDiv_Init_8723B(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
+       pFAT_T          pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8723B AntDiv_Init => AntDivType=[ S0S1_SW_AntDiv] \n"));\r
+\r
+       //Mapping Table\r
+       ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 0);\r
+       ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 1);\r
+       \r
+       //Output Pin Settings\r
+       //ODM_SetBBReg(pDM_Odm, 0x948 , BIT6, 0x1); \r
+       ODM_SetBBReg(pDM_Odm, 0x870 , BIT9|BIT8, 0); \r
+\r
+       pDM_FatTable->bBecomeLinked  =FALSE;\r
+       pDM_SWAT_Table->try_flag = 0xff;        \r
+       pDM_SWAT_Table->Double_chk_flag = 0;\r
+       pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;\r
+\r
+       //Timming issue\r
+       ODM_SetBBReg(pDM_Odm, 0xE20 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)\r
+       \r
+       //2 [--For HW Bug Setting]\r
+       ODM_SetBBReg(pDM_Odm, 0x80C , BIT21, 0); //TX Ant  by Reg\r
+\r
+}\r
+\r
+VOID\r
+odm_S0S1_SWAntDiv_Reset_8723B(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
+       pFAT_T                  pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+    \r
+       pDM_FatTable->bBecomeLinked  =FALSE;\r
+       pDM_SWAT_Table->try_flag = 0xff;        \r
+       pDM_SWAT_Table->Double_chk_flag = 0;\r
+       pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;\r
+\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_S0S1_SWAntDiv_Reset_8723B(): pDM_FatTable->bBecomeLinked = %d\n", pDM_FatTable->bBecomeLinked));\r
+}\r
+\r
+VOID\r
+ODM_UpdateRxIdleAnt_8723B(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              u1Byte                  Ant,\r
+       IN              u4Byte                  DefaultAnt, \r
+       IN              u4Byte                  OptionalAnt\r
+)\r
+{\r
+       pFAT_T                  pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+       PADAPTER                pAdapter = pDM_Odm->Adapter;\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
+       u1Byte                  count=0;\r
+       u1Byte                  u1Temp;\r
+       u1Byte                  H2C_Parameter;\r
+       u4Byte                  value32;\r
+       \r
+       if(!pDM_Odm->bLinked)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-Ant ] 8723B: Fail to set RX antenna due to no link\n"));\r
+               return;\r
+       }\r
+\r
+       // Send H2C command to FW\r
+       // Enable wifi calibration\r
+       H2C_Parameter = TRUE;\r
+       ODM_FillH2CCmd(pDM_Odm, ODM_H2C_WIFI_CALIBRATION, 1, &H2C_Parameter);\r
+\r
+       // Check if H2C command sucess or not (0x1e6)\r
+       u1Temp = ODM_Read1Byte(pDM_Odm, 0x1e6);\r
+       while((u1Temp != 0x1) && (count < 100))\r
+       {\r
+               ODM_delay_us(10);       \r
+               u1Temp = ODM_Read1Byte(pDM_Odm, 0x1e6);\r
+               count++;\r
+       }\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-Ant ] 8723B: H2C command status = %d, count = %d\n", u1Temp, count));\r
+\r
+       if(u1Temp == 0x1)\r
+       {\r
+               // Check if BT is doing IQK (0x1e7)\r
+               count = 0;\r
+               u1Temp = ODM_Read1Byte(pDM_Odm, 0x1e7);\r
+               while((!(u1Temp & BIT0))  && (count < 100))\r
+               {\r
+                       ODM_delay_us(50);       \r
+                       u1Temp = ODM_Read1Byte(pDM_Odm, 0x1e7);\r
+                       count++;\r
+               }\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-Ant ] 8723B: BT IQK status = %d, count = %d\n", u1Temp, count));\r
+\r
+               if(u1Temp & BIT0)\r
+               {\r
+                       ODM_SetBBReg(pDM_Odm, 0x948 , BIT6, 0x1);\r
+                       ODM_SetBBReg(pDM_Odm, 0x948 , BIT9, DefaultAnt);        \r
+                       ODM_SetBBReg(pDM_Odm, 0x864 , BIT5|BIT4|BIT3, DefaultAnt);      //Default RX\r
+                       ODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, OptionalAnt);     //Optional RX\r
+                       ODM_SetBBReg(pDM_Odm, 0x860, BIT14|BIT13|BIT12, DefaultAnt); //Default TX       \r
+                       pDM_FatTable->RxIdleAnt = Ant;\r
+\r
+                       // Set TX AGC by S0/S1\r
+                       // Need to consider Linux driver\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+                        pAdapter->HalFunc.SetTxPowerLevelHandler(pAdapter, pHalData->CurrentChannel);\r
+#elif(DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+                       rtw_hal_set_tx_power_level(pAdapter, pHalData->CurrentChannel);\r
+#endif\r
+\r
+                       // Set IQC by S0/S1\r
+                       ODM_SetIQCbyRFpath(pDM_Odm,DefaultAnt);\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-Ant ] 8723B: Sucess to set RX antenna\n"));\r
+               }\r
+               else\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-Ant ] 8723B: Fail to set RX antenna due to BT IQK\n"));\r
+       }\r
+       else\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-Ant ] 8723B: Fail to set RX antenna due to H2C command fail\n"));\r
+\r
+       // Send H2C command to FW\r
+       // Disable wifi calibration\r
+       H2C_Parameter = FALSE;\r
+       ODM_FillH2CCmd(pDM_Odm, ODM_H2C_WIFI_CALIBRATION, 1, &H2C_Parameter);\r
+\r
+}\r
+\r
+#endif //#if (RTL8723B_SUPPORT == 1)\r
+\r
+#if (RTL8821A_SUPPORT == 1)\r
+VOID\r
+odm_TRX_HWAntDiv_Init_8821A(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+       \r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)   \r
+\r
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;\r
+       pAdapter->HalFunc.GetHalDefVarHandler(pAdapter, HAL_DEF_5G_ANT_SELECT, (pu1Byte)(&pDM_Odm->AntType));   \r
+#else\r
+       pDM_Odm->AntType = ODM_AUTO_ANT;\r
+#endif\r
+       pAdapter->HalFunc.GetHalDefVarHandler(pAdapter, HAL_DEF_5G_ANT_SELECT, (pu1Byte)(&pDM_Odm->AntType));   \r
+\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8821A AntDiv_Init => AntDivType=[ CG_TRX_HW_ANTDIV (DPDT)] \n"));\r
+\r
+       //Output Pin Settings\r
+       ODM_SetMACReg(pDM_Odm, 0x4C , BIT25, 0);\r
+\r
+       ODM_SetMACReg(pDM_Odm, 0x64 , BIT29, 1); //PAPE by WLAN control\r
+       ODM_SetMACReg(pDM_Odm, 0x64 , BIT28, 1); //LNAON by WLAN control\r
+\r
+       ODM_SetBBReg(pDM_Odm, 0xCB0 , bMaskDWord, 0x77775745);\r
+       ODM_SetBBReg(pDM_Odm, 0xCB8 , BIT16, 0);\r
+       \r
+       ODM_SetMACReg(pDM_Odm, 0x4C , BIT23, 0); //select DPDT_P and DPDT_N as output pin\r
+       ODM_SetMACReg(pDM_Odm, 0x4C , BIT24, 1); //by WLAN control\r
+       ODM_SetBBReg(pDM_Odm, 0xCB4 , 0xF, 8); // DPDT_P = ANTSEL[0]\r
+       ODM_SetBBReg(pDM_Odm, 0xCB4 , 0xF0, 8); // DPDT_N = ANTSEL[0]\r
+       ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT29, 0); //DPDT_P non-inverse\r
+       ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT28, 1); //DPDT_N inverse\r
+\r
+       //Mapping Table\r
+       ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0);\r
+       ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1);\r
+\r
+       //Set ANT1_8821A as MAIN_ANT\r
+       if((pDM_Odm->AntType == ODM_FIX_MAIN_ANT) || (pDM_Odm->AntType == ODM_AUTO_ANT))\r
+               ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\r
+       else\r
+               ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);\r
+\r
+       //OFDM HW AntDiv Parameters\r
+       ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold\r
+       ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x10); //bias\r
+               \r
+       //CCK HW AntDiv Parameters\r
+       ODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M\r
+       ODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples\r
+\r
+       ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //ANTSEL_CCK sent to the smart_antenna circuit\r
+       ODM_SetBBReg(pDM_Odm, 0xA00 , BIT15, 0); //CCK AntDiv function block enable\r
+\r
+       //BT Coexistence\r
+       ODM_SetBBReg(pDM_Odm, 0xCAC , BIT9, 1); //keep antsel_map when GNT_BT = 1\r
+       ODM_SetBBReg(pDM_Odm, 0x804 , BIT4, 1); //Disable hw antsw & fast_train.antsw when GNT_BT=1\r
+\r
+       //Timming issue\r
+       ODM_SetBBReg(pDM_Odm, 0x818 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)\r
+       ODM_SetBBReg(pDM_Odm, 0x8CC , BIT20|BIT19|BIT18, 3); //settling time of antdiv by RF LNA = 100ns\r
+\r
+       //response TX ant by RX ant\r
+       ODM_SetMACReg(pDM_Odm, 0x668 , BIT3, 1);\r
+       \r
+\r
+                       \r
+}\r
+\r
+VOID\r
+odm_S0S1_SWAntDiv_Init_8821A(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
+       pFAT_T          pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+\r
+\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)   \r
+\r
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;\r
+       pAdapter->HalFunc.GetHalDefVarHandler(pAdapter, HAL_DEF_5G_ANT_SELECT, (pu1Byte)(&pDM_Odm->AntType));   \r
+#else\r
+       pDM_Odm->AntType = ODM_AUTO_ANT;\r
+#endif\r
+\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8821A AntDiv_Init => AntDivType=[ S0S1_SW_AntDiv] \n"));\r
+\r
+       //Output Pin Settings\r
+       ODM_SetMACReg(pDM_Odm, 0x4C , BIT25, 0);\r
+\r
+       ODM_SetMACReg(pDM_Odm, 0x64 , BIT29, 1); //PAPE by WLAN control\r
+       ODM_SetMACReg(pDM_Odm, 0x64 , BIT28, 1); //LNAON by WLAN control\r
+\r
+       ODM_SetBBReg(pDM_Odm, 0xCB0 , bMaskDWord, 0x77775745);\r
+       ODM_SetBBReg(pDM_Odm, 0xCB8 , BIT16, 0);\r
+       \r
+       ODM_SetMACReg(pDM_Odm, 0x4C , BIT23, 0); //select DPDT_P and DPDT_N as output pin\r
+       ODM_SetMACReg(pDM_Odm, 0x4C , BIT24, 1); //by WLAN control\r
+       ODM_SetBBReg(pDM_Odm, 0xCB4 , 0xF, 8); // DPDT_P = ANTSEL[0]\r
+       ODM_SetBBReg(pDM_Odm, 0xCB4 , 0xF0, 8); // DPDT_N = ANTSEL[0]\r
+       ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT29, 0); //DPDT_P non-inverse\r
+       ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT28, 1); //DPDT_N inverse\r
+\r
+       //Mapping Table\r
+       ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0);\r
+       ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1);\r
+\r
+       //Set ANT1_8821A as MAIN_ANT\r
+       if((pDM_Odm->AntType == ODM_FIX_MAIN_ANT) || (pDM_Odm->AntType == ODM_AUTO_ANT))\r
+               ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\r
+       else\r
+               ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);\r
+\r
+       //OFDM HW AntDiv Parameters\r
+       ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold\r
+       ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x10); //bias\r
+               \r
+       //CCK HW AntDiv Parameters\r
+       ODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M\r
+       ODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples\r
+\r
+       ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //ANTSEL_CCK sent to the smart_antenna circuit\r
+       ODM_SetBBReg(pDM_Odm, 0xA00 , BIT15, 0); //CCK AntDiv function block enable\r
+\r
+       //BT Coexistence\r
+       ODM_SetBBReg(pDM_Odm, 0xCAC , BIT9, 1); //keep antsel_map when GNT_BT = 1\r
+       ODM_SetBBReg(pDM_Odm, 0x804 , BIT4, 1); //Disable hw antsw & fast_train.antsw when GNT_BT=1\r
+\r
+       //Timming issue\r
+       ODM_SetBBReg(pDM_Odm, 0x818 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)\r
+       ODM_SetBBReg(pDM_Odm, 0x8CC , BIT20|BIT19|BIT18, 3); //settling time of antdiv by RF LNA = 100ns\r
+\r
+       //response TX ant by RX ant\r
+       ODM_SetMACReg(pDM_Odm, 0x668 , BIT3, 1);\r
+       \r
+               \r
+       ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); \r
+       \r
+       pDM_SWAT_Table->try_flag = 0xff;        \r
+       pDM_SWAT_Table->Double_chk_flag = 0;\r
+       pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;\r
+       pDM_SWAT_Table->CurAntenna = MAIN_ANT;\r
+       pDM_SWAT_Table->PreAntenna = MAIN_ANT;\r
+       pDM_SWAT_Table->SWAS_NoLink_State = 0;\r
+\r
+}\r
+#endif //#if (RTL8821A_SUPPORT == 1)\r
+\r
+#if (RTL8881A_SUPPORT == 1)\r
+VOID\r
+odm_RX_HWAntDiv_Init_8881A(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8881A AntDiv_Init => AntDivType=[ CGCS_RX_HW_ANTDIV] \n"));\r
+\r
+}\r
+\r
+VOID\r
+odm_TRX_HWAntDiv_Init_8881A(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8881A AntDiv_Init => AntDivType=[ CG_TRX_HW_ANTDIV (SPDT)] \n"));\r
+\r
+       //Output Pin Settings\r
+       // [SPDT related]\r
+       ODM_SetMACReg(pDM_Odm, 0x4C , BIT25, 0);\r
+       ODM_SetMACReg(pDM_Odm, 0x4C , BIT26, 0);\r
+       ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT31, 0); //delay buffer\r
+       ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT22, 0); \r
+       ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT24, 1);\r
+       ODM_SetBBReg(pDM_Odm, 0xCB0 , 0xF00, 8); // DPDT_P = ANTSEL[0]\r
+       ODM_SetBBReg(pDM_Odm, 0xCB0 , 0xF0000, 8); // DPDT_N = ANTSEL[0]        \r
+       \r
+       //Mapping Table\r
+       ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0);\r
+       ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1);\r
+\r
+       //OFDM HW AntDiv Parameters\r
+       ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold\r
+       ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x0); //bias\r
+       ODM_SetBBReg(pDM_Odm, 0x8CC , BIT20|BIT19|BIT18, 3); //settling time of antdiv by RF LNA = 100ns\r
+       \r
+       //CCK HW AntDiv Parameters\r
+       ODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M\r
+       ODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples\r
+\r
+       //Timming issue\r
+       ODM_SetBBReg(pDM_Odm, 0x818 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)\r
+\r
+       //2 [--For HW Bug Setting]\r
+\r
+       ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); //TX Ant  by Reg //  A-cut bug\r
+}\r
+\r
+#endif //#if (RTL8881A_SUPPORT == 1)\r
+\r
+\r
+#if (RTL8812A_SUPPORT == 1)\r
+VOID\r
+odm_TRX_HWAntDiv_Init_8812A(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+        ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8812A AntDiv_Init => AntDivType=[ CG_TRX_HW_ANTDIV (SPDT)] \n"));\r
+\r
+       //3 //3 --RFE pin setting---------\r
+       //[BB]\r
+       ODM_SetBBReg(pDM_Odm, 0x900 , BIT10|BIT9|BIT8, 0x0);      //disable SW switch\r
+       ODM_SetBBReg(pDM_Odm, 0x900 , BIT17|BIT16, 0x0);         \r
+       ODM_SetBBReg(pDM_Odm, 0x974 , BIT7|BIT6, 0x3);     // in/out\r
+       ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT31, 0); //delay buffer\r
+       ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT26, 0); \r
+       ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT27, 1);\r
+       ODM_SetBBReg(pDM_Odm, 0xCB0 , 0xF000000, 8); // DPDT_P = ANTSEL[0]\r
+       ODM_SetBBReg(pDM_Odm, 0xCB0 , 0xF0000000, 8); // DPDT_N = ANTSEL[0]\r
+       //3 -------------------------\r
+\r
+       //Mapping Table\r
+       ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0);\r
+       ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1);\r
+\r
+       //OFDM HW AntDiv Parameters\r
+       ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold\r
+       ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x0); //bias\r
+       ODM_SetBBReg(pDM_Odm, 0x8CC , BIT20|BIT19|BIT18, 3); //settling time of antdiv by RF LNA = 100ns\r
+       \r
+       //CCK HW AntDiv Parameters\r
+       ODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M\r
+       ODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples\r
+\r
+       //Timming issue\r
+       ODM_SetBBReg(pDM_Odm, 0x818 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)\r
+\r
+       //2 [--For HW Bug Setting]\r
+\r
+       ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); //TX Ant  by Reg //  A-cut bug\r
+       \r
+}\r
+\r
+#endif //#if (RTL8812A_SUPPORT == 1)\r
+\r
+VOID\r
+odm_HW_AntDiv(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+       u4Byte  i,MinMaxRSSI=0xFF, AntDivMaxRSSI=0, MaxRSSI=0, LocalMaxRSSI;\r
+       u4Byte  Main_RSSI, Aux_RSSI, pkt_ratio_m=0, pkt_ratio_a=0,pkt_threshold=10;\r
+       u1Byte  RxIdleAnt=0, TargetAnt=7;\r
+       pFAT_T  pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+       pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
+       PSTA_INFO_T     pEntry;\r
+\r
+       if(!pDM_Odm->bLinked) //bLinked==False\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[No Link!!!]\n"));\r
+       \r
+               #if(DM_ODM_SUPPORT_TYPE  == ODM_AP)\r
+                       if (pDM_Odm->antdiv_rssi)\r
+                               panic_printk("[No Link!!!]\n");\r
+               #endif\r
+       \r
+               if(pDM_FatTable->bBecomeLinked == TRUE)\r
+               {\r
+                       odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\r
+                       ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\r
+\r
+                       pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;\r
+               }\r
+               return;\r
+       }       \r
+       else\r
+       {\r
+               if(pDM_FatTable->bBecomeLinked ==FALSE)\r
+               {\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Linked !!!]\n"));\r
+                       odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON);\r
+                       //if(pDM_Odm->SupportICType == ODM_RTL8821 )\r
+                               //ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function disable\r
+                               \r
+                       //#if(DM_ODM_SUPPORT_TYPE  == ODM_AP)\r
+                       //else if(pDM_Odm->SupportICType == ODM_RTL8881 )\r
+                       //      ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function disable\r
+                       //#endif\r
+                       \r
+                       //else if(pDM_Odm->SupportICType == ODM_RTL8723B ||pDM_Odm->SupportICType == ODM_RTL8812)\r
+                               //ODM_SetBBReg(pDM_Odm, 0xA00 , BIT15, 0); //CCK AntDiv function disable\r
+                       \r
+                       pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;\r
+\r
+                       if(pDM_Odm->SupportICType==ODM_RTL8723B && pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)\r
+                       {\r
+                               ODM_SetBBReg(pDM_Odm, 0x930 , 0xF0, 8); // DPDT_P = ANTSEL[0]   // for 8723B AntDiv function patch.  BB  Dino  130412   \r
+                               ODM_SetBBReg(pDM_Odm, 0x930 , 0xF, 8); // DPDT_N = ANTSEL[0]\r
+                       }\r
+               }       \r
+       }       \r
+\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n[HW AntDiv] Start =>\n"));\r
+          \r
+       for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\r
+       {\r
+               pEntry = pDM_Odm->pODM_StaInfo[i];\r
+               if(IS_STA_VALID(pEntry))\r
+               {\r
+                       //2 Caculate RSSI per Antenna\r
+                       Main_RSSI = (pDM_FatTable->MainAnt_Cnt[i]!=0)?(pDM_FatTable->MainAnt_Sum[i]/pDM_FatTable->MainAnt_Cnt[i]):0;\r
+                       Aux_RSSI = (pDM_FatTable->AuxAnt_Cnt[i]!=0)?(pDM_FatTable->AuxAnt_Sum[i]/pDM_FatTable->AuxAnt_Cnt[i]):0;\r
+                       TargetAnt = (Main_RSSI==Aux_RSSI)?pDM_FatTable->RxIdleAnt:((Main_RSSI>=Aux_RSSI)?MAIN_ANT:AUX_ANT);\r
+                       /*\r
+                       if( pDM_FatTable->MainAnt_Cnt[i]!=0 && pDM_FatTable->AuxAnt_Cnt[i]!=0 )\r
+                       {\r
+                       pkt_ratio_m=( pDM_FatTable->MainAnt_Cnt[i] / pDM_FatTable->AuxAnt_Cnt[i] );\r
+                       pkt_ratio_a=( pDM_FatTable->AuxAnt_Cnt[i] / pDM_FatTable->MainAnt_Cnt[i] );\r
+                               \r
+                               if (pkt_ratio_m >= pkt_threshold)\r
+                                       TargetAnt=MAIN_ANT;\r
+                               \r
+                               else if(pkt_ratio_a >= pkt_threshold)\r
+                                       TargetAnt=AUX_ANT;\r
+                       }\r
+                       */                      \r
+                       //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("*** SupportICType=[%lu] \n",pDM_Odm->SupportICType));\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***  Main_Cnt = (( %d ))  , Main_RSSI= ((  %d )) \n", pDM_FatTable->MainAnt_Cnt[i], Main_RSSI));\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***  Aux_Cnt   = (( %d ))  , Aux_RSSI = ((  %d )) \n", pDM_FatTable->AuxAnt_Cnt[i]  , Aux_RSSI ));\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** MAC ID:[ %d ] , TargetAnt = (( %s )) \n", i ,( TargetAnt ==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));\r
+\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("*** Phy_AntSel_A=[ %d, %d, %d] \n",((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT2)>>2,\r
+                                                                                                             ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT1) >>1, ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT0)));\r
+                       #if(DM_ODM_SUPPORT_TYPE  == ODM_AP)\r
+                       if (pDM_Odm->antdiv_rssi)\r
+                       {\r
+                               panic_printk("*** SupportICType=[%lu] \n",pDM_Odm->SupportICType);\r
+                               //panic_printk("*** Phy_AntSel_A=[ %d, %d, %d] \n",((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT2)>>2,\r
+                               //      ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT1) >>1, ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT0));\r
+                               //panic_printk("*** Phy_AntSel_B=[ %d, %d, %d] \n",((pDM_Odm->DM_FatTable.antsel_rx_keep_1)&BIT2)>>2,\r
+                               //      ((pDM_Odm->DM_FatTable.antsel_rx_keep_1)&BIT1) >>1, ((pDM_Odm->DM_FatTable.antsel_rx_keep_1)&BIT0))\r
+                               panic_printk("*** Client[ %lu ] , Main_Cnt = (( %lu ))  , Main_RSSI= ((  %lu )) \n",i, pDM_FatTable->MainAnt_Cnt[i], Main_RSSI);\r
+                               panic_printk("*** Client[ %lu ] , Aux_Cnt   = (( %lu ))  , Aux_RSSI = ((  %lu )) \n" ,i, pDM_FatTable->AuxAnt_Cnt[i] , Aux_RSSI);\r
+                       }\r
+                       #endif\r
+\r
+\r
+                       LocalMaxRSSI = (Main_RSSI>Aux_RSSI)?Main_RSSI:Aux_RSSI;\r
+                       //2 Select MaxRSSI for DIG\r
+                       if((LocalMaxRSSI > AntDivMaxRSSI) && (LocalMaxRSSI < 40))\r
+                               AntDivMaxRSSI = LocalMaxRSSI;\r
+                       if(LocalMaxRSSI > MaxRSSI)\r
+                               MaxRSSI = LocalMaxRSSI;\r
+\r
+                       //2 Select RX Idle Antenna\r
+                       if ( (LocalMaxRSSI != 0) &&  (LocalMaxRSSI < MinMaxRSSI) )\r
+                       {\r
+                               RxIdleAnt = TargetAnt;\r
+                               MinMaxRSSI = LocalMaxRSSI;\r
+                       }\r
+                       /*\r
+                       if((pDM_FatTable->RxIdleAnt == MAIN_ANT) && (Main_RSSI == 0))\r
+                               Main_RSSI = Aux_RSSI;\r
+                       else if((pDM_FatTable->RxIdleAnt == AUX_ANT) && (Aux_RSSI == 0))\r
+                               Aux_RSSI = Main_RSSI;\r
+               \r
+                       LocalMinRSSI = (Main_RSSI>Aux_RSSI)?Aux_RSSI:Main_RSSI;\r
+                       if(LocalMinRSSI < MinRSSI)\r
+                       {\r
+                               MinRSSI = LocalMinRSSI;\r
+                               RxIdleAnt = TargetAnt;\r
+                       }       \r
+                       */\r
+                       //2 Select TX Antenna\r
+\r
+                       #if TX_BY_REG\r
+                       \r
+                       #else\r
+                               if(pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV)\r
+                                       odm_UpdateTxAnt(pDM_Odm, TargetAnt, i);\r
+                       #endif\r
+\r
+               }\r
+               pDM_FatTable->MainAnt_Sum[i] = 0;\r
+               pDM_FatTable->AuxAnt_Sum[i] = 0;\r
+               pDM_FatTable->MainAnt_Cnt[i] = 0;\r
+               pDM_FatTable->AuxAnt_Cnt[i] = 0;\r
+       }\r
+       \r
+       //2 Set RX Idle Antenna\r
+       ODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt);\r
+\r
+       #if(DM_ODM_SUPPORT_TYPE  == ODM_AP)\r
+               if (pDM_Odm->antdiv_rssi)\r
+                       panic_printk("*** RxIdleAnt = (( %s )) \n \n", ( RxIdleAnt ==MAIN_ANT)?"MAIN_ANT":"AUX_ANT");\r
+       #endif\r
+       \r
+       if(AntDivMaxRSSI == 0)\r
+               pDM_DigTable->AntDiv_RSSI_max = pDM_Odm->RSSI_Min;\r
+       else\r
+               pDM_DigTable->AntDiv_RSSI_max = AntDivMaxRSSI;\r
+       pDM_DigTable->RSSI_max = MaxRSSI;\r
+}\r
+\r
+\r
+\r
+#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)\r
+VOID\r
+odm_S0S1_SwAntDiv(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              u1Byte                  Step\r
+       )\r
+{\r
+       u4Byte                  i,MinMaxRSSI=0xFF, LocalMaxRSSI,LocalMinRSSI;\r
+       u4Byte                  Main_RSSI, Aux_RSSI;\r
+       u1Byte                  reset_period=10, SWAntDiv_threshold=35;\r
+       u1Byte                  HighTraffic_TrainTime_U=0x32,HighTraffic_TrainTime_L=0,Train_time_temp;\r
+       u1Byte                  LowTraffic_TrainTime_U=200,LowTraffic_TrainTime_L=0;\r
+       pSWAT_T                 pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
+       pFAT_T                  pDM_FatTable = &pDM_Odm->DM_FatTable;   \r
+       u1Byte                  RxIdleAnt = pDM_SWAT_Table->PreAntenna, TargetAnt, nextAnt=0;\r
+       PSTA_INFO_T             pEntry=NULL;\r
+       //static u1Byte         reset_idx;\r
+       u4Byte                  value32;\r
+       PADAPTER                Adapter  =  pDM_Odm->Adapter;\r
+       u8Byte                  curTxOkCnt=0, curRxOkCnt=0,TxCntOffset, RxCntOffset;\r
+       \r
+       if(!pDM_Odm->bLinked) //bLinked==False\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[No Link!!!]\n"));\r
+               if(pDM_FatTable->bBecomeLinked == TRUE)\r
+               {\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Set REG 948[9:6]=0x0 \n"));\r
+                       if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+                               ODM_SetBBReg(pDM_Odm, 0x948 , BIT9|BIT8|BIT7|BIT6, 0x0); \r
+                       \r
+                       pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;\r
+               }\r
+               return;\r
+       }\r
+       else\r
+       {\r
+               if(pDM_FatTable->bBecomeLinked ==FALSE)\r
+               {\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Linked !!!]\n"));\r
+                       \r
+                       if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+                       {\r
+                               value32 = ODM_GetBBReg(pDM_Odm, 0x864, BIT5|BIT4|BIT3);\r
+                               \r
+                               if (value32==0x0)\r
+                                       ODM_UpdateRxIdleAnt_8723B(pDM_Odm, MAIN_ANT, ANT1_2G, ANT2_2G);\r
+                               else if (value32==0x1)\r
+                                       ODM_UpdateRxIdleAnt_8723B(pDM_Odm, AUX_ANT, ANT2_2G, ANT1_2G);\r
+                               \r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("8723B: First link! Force antenna to  %s\n",(value32 == 0x0?"MAIN":"AUX") ));\r
+                       }\r
+\r
+                       pDM_SWAT_Table->lastTxOkCnt = 0; \r
+                       pDM_SWAT_Table->lastRxOkCnt =0; \r
+                       TxCntOffset = *(pDM_Odm->pNumTxBytesUnicast);\r
+                       RxCntOffset = *(pDM_Odm->pNumRxBytesUnicast);\r
+                       \r
+                       pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;\r
+               }\r
+               else\r
+               {\r
+                       TxCntOffset = 0;\r
+                       RxCntOffset = 0;\r
+               }\r
+       }\r
+       \r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[%d] { try_flag=(( %d )), Step=(( %d )), Double_chk_flag = (( %d )) }\n",\r
+               __LINE__,pDM_SWAT_Table->try_flag,Step,pDM_SWAT_Table->Double_chk_flag));\r
+\r
+       // Handling step mismatch condition.\r
+       // Peak step is not finished at last time. Recover the variable and check again.\r
+       if(     Step != pDM_SWAT_Table->try_flag        )\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Step != try_flag]    Need to Reset After Link\n"));\r
+               ODM_SwAntDivRestAfterLink(pDM_Odm);\r
+       }\r
+\r
+       if(pDM_SWAT_Table->try_flag == 0xff) \r
+       {       \r
+               pDM_SWAT_Table->try_flag = 0;\r
+               pDM_SWAT_Table->Train_time_flag=0;\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[set try_flag = 0]  Prepare for peak!\n\n"));\r
+               return;\r
+       }       \r
+       else//if( try_flag != 0xff ) \r
+       {\r
+               //1 Normal State (Begin Trying)\r
+               if(pDM_SWAT_Table->try_flag == 0) \r
+               {\r
+               \r
+                       //---trafic decision---\r
+                       curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - pDM_SWAT_Table->lastTxOkCnt - TxCntOffset;\r
+                       curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - pDM_SWAT_Table->lastRxOkCnt - RxCntOffset;\r
+                       pDM_SWAT_Table->lastTxOkCnt =  *(pDM_Odm->pNumTxBytesUnicast);\r
+                       pDM_SWAT_Table->lastRxOkCnt =  *(pDM_Odm->pNumRxBytesUnicast);\r
+                       \r
+                       if (curTxOkCnt > 1875000 || curRxOkCnt > 1875000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)  ( 1.875M * 8bit ) / 2= 7.5M bits /sec )\r
+                       {\r
+                               pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH;\r
+                               Train_time_temp=pDM_SWAT_Table->Train_time ;\r
+                               \r
+                               if(pDM_SWAT_Table->Train_time_flag==3)\r
+                               {\r
+                                       HighTraffic_TrainTime_L=0xa;\r
+                                       \r
+                                       if(Train_time_temp<=16)\r
+                                               Train_time_temp=HighTraffic_TrainTime_L;\r
+                                       else\r
+                                               Train_time_temp-=16;\r
+                                       \r
+                               }                               \r
+                               else if(pDM_SWAT_Table->Train_time_flag==2)\r
+                               {\r
+                                       Train_time_temp-=8;\r
+                                       HighTraffic_TrainTime_L=0xf;\r
+                               }       \r
+                               else if(pDM_SWAT_Table->Train_time_flag==1)\r
+                               {\r
+                                       Train_time_temp-=4;\r
+                                       HighTraffic_TrainTime_L=0x1e;\r
+                               }\r
+                               else if(pDM_SWAT_Table->Train_time_flag==0)\r
+                               {\r
+                                       Train_time_temp+=8;\r
+                                       HighTraffic_TrainTime_L=0x28;\r
+                               }\r
+\r
+                               \r
+                               //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Train_time_temp = ((%d))\n",Train_time_temp));\r
+\r
+                               //--\r
+                               if(Train_time_temp > HighTraffic_TrainTime_U)\r
+                                       Train_time_temp=HighTraffic_TrainTime_U;\r
+                               \r
+                               else if(Train_time_temp < HighTraffic_TrainTime_L)\r
+                                       Train_time_temp=HighTraffic_TrainTime_L;\r
+\r
+                               pDM_SWAT_Table->Train_time = Train_time_temp; //50ms~10ms\r
+                               \r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("  Train_time_flag=((%d)) , Train_time=((%d)) \n",pDM_SWAT_Table->Train_time_flag, pDM_SWAT_Table->Train_time));\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("  [HIGH Traffic]  \n" ));\r
+                       }\r
+                       else if (curTxOkCnt > 125000 || curRxOkCnt > 125000) // ( 0.125M * 8bit ) / 2 =  0.5M bits /sec )\r
+                       {\r
+                               pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;\r
+                               Train_time_temp=pDM_SWAT_Table->Train_time ;\r
+\r
+                               if(pDM_SWAT_Table->Train_time_flag==3)\r
+                               {\r
+                                       LowTraffic_TrainTime_L=10;\r
+                                       if(Train_time_temp<50)\r
+                                               Train_time_temp=LowTraffic_TrainTime_L;\r
+                                       else\r
+                                               Train_time_temp-=50;\r
+                               }                               \r
+                               else if(pDM_SWAT_Table->Train_time_flag==2)\r
+                               {\r
+                                       Train_time_temp-=30;\r
+                                       LowTraffic_TrainTime_L=36;\r
+                               }       \r
+                               else if(pDM_SWAT_Table->Train_time_flag==1)\r
+                               {\r
+                                       Train_time_temp-=10;\r
+                                       LowTraffic_TrainTime_L=40;\r
+                               }\r
+                               else\r
+                                       Train_time_temp+=10;    \r
+\r
+                               //--\r
+                               if(Train_time_temp >= LowTraffic_TrainTime_U)\r
+                                       Train_time_temp=LowTraffic_TrainTime_U;\r
+                               \r
+                               else if(Train_time_temp <= LowTraffic_TrainTime_L)\r
+                                       Train_time_temp=LowTraffic_TrainTime_L;\r
+\r
+                               pDM_SWAT_Table->Train_time = Train_time_temp; //50ms~20ms\r
+\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("  Train_time_flag=((%d)) , Train_time=((%d)) \n",pDM_SWAT_Table->Train_time_flag, pDM_SWAT_Table->Train_time));\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("  [Low Traffic]  \n" ));\r
+                       }\r
+                       else\r
+                       {\r
+                               pDM_SWAT_Table->TrafficLoad = TRAFFIC_UltraLOW;\r
+                               pDM_SWAT_Table->Train_time = 0xc8; //200ms\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("  [Ultra-Low Traffic]  \n" ));\r
+                       }\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TxOkCnt=(( %llu )), RxOkCnt=(( %llu )) \n", \r
+                               curTxOkCnt ,curRxOkCnt ));\r
+                               \r
+                       //-----------------\r
+               \r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" Current MinMaxRSSI is ((%d)) \n",pDM_FatTable->MinMaxRSSI));\r
+\r
+                        //---reset index---\r
+                       if(pDM_SWAT_Table->reset_idx>=reset_period)\r
+                       {\r
+                               pDM_FatTable->MinMaxRSSI=0; //\r
+                               pDM_SWAT_Table->reset_idx=0;\r
+                       }\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("reset_idx = (( %d )) \n",pDM_SWAT_Table->reset_idx ));\r
+                       //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("reset_idx=%d\n",pDM_SWAT_Table->reset_idx));\r
+                       pDM_SWAT_Table->reset_idx++;\r
+\r
+                       //---double check flag---\r
+                       if(pDM_FatTable->MinMaxRSSI > SWAntDiv_threshold && pDM_SWAT_Table->Double_chk_flag== 0)\r
+                       {                       \r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" MinMaxRSSI is ((%d)), and > %d \n",\r
+                                       pDM_FatTable->MinMaxRSSI,SWAntDiv_threshold));\r
+\r
+                               pDM_SWAT_Table->Double_chk_flag =1;\r
+                               pDM_SWAT_Table->try_flag = 1; \r
+                               pDM_SWAT_Table->RSSI_Trying = 0;\r
+\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" Test the current Ant for (( %d )) ms again \n", pDM_SWAT_Table->Train_time));\r
+                               ODM_UpdateRxIdleAnt(pDM_Odm, pDM_FatTable->RxIdleAnt);  \r
+                               ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer_8723B, pDM_SWAT_Table->Train_time ); //ms    \r
+                               return;\r
+                       }\r
+                       \r
+                       nextAnt = (pDM_FatTable->RxIdleAnt == MAIN_ANT)? AUX_ANT : MAIN_ANT;\r
+\r
+                       pDM_SWAT_Table->try_flag = 1;\r
+                       \r
+                       if(pDM_SWAT_Table->reset_idx<=1)\r
+                               pDM_SWAT_Table->RSSI_Trying = 2;\r
+                       else\r
+                               pDM_SWAT_Table->RSSI_Trying = 1;\r
+                       \r
+                       odm_S0S1_SwAntDivByCtrlFrame(pDM_Odm, SWAW_STEP_PEAK);\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[set try_flag=1]  Normal State:  Begin Trying!! \n"));\r
+               }\r
+       \r
+               else if(pDM_SWAT_Table->try_flag == 1 && pDM_SWAT_Table->Double_chk_flag== 0)\r
+               {       \r
+                       nextAnt = (pDM_FatTable->RxIdleAnt  == MAIN_ANT)? AUX_ANT : MAIN_ANT;           \r
+                       pDM_SWAT_Table->RSSI_Trying--;\r
+               }\r
+               \r
+               //1 Decision State\r
+               if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0) )\r
+               {\r
+                       BOOLEAN bByCtrlFrame = FALSE;\r
+                       u8Byte  pkt_cnt_total = 0;\r
+                       \r
+                       for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\r
+                       {\r
+                               pEntry = pDM_Odm->pODM_StaInfo[i];\r
+                               if(IS_STA_VALID(pEntry))\r
+                               {\r
+                                       //2 Caculate RSSI per Antenna\r
+                                       Main_RSSI = (pDM_FatTable->MainAnt_Cnt[i]!=0)?(pDM_FatTable->MainAnt_Sum[i]/pDM_FatTable->MainAnt_Cnt[i]):0;\r
+                                       Aux_RSSI = (pDM_FatTable->AuxAnt_Cnt[i]!=0)?(pDM_FatTable->AuxAnt_Sum[i]/pDM_FatTable->AuxAnt_Cnt[i]):0;\r
+                                       \r
+                                       if(pDM_FatTable->MainAnt_Cnt[i]<=1 && pDM_FatTable->CCK_counter_main>=1)\r
+                                               Main_RSSI=0;    \r
+                                       \r
+                                       if(pDM_FatTable->AuxAnt_Cnt[i]<=1 && pDM_FatTable->CCK_counter_aux>=1)\r
+                                               Aux_RSSI=0;\r
+\r
+                                       TargetAnt = (Main_RSSI==Aux_RSSI)?pDM_SWAT_Table->PreAntenna:((Main_RSSI>=Aux_RSSI)?MAIN_ANT:AUX_ANT);\r
+                                       LocalMaxRSSI = (Main_RSSI>=Aux_RSSI) ? Main_RSSI : Aux_RSSI;\r
+                                       LocalMinRSSI = (Main_RSSI>=Aux_RSSI) ? Aux_RSSI : Main_RSSI;\r
+                                       \r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***  CCK_counter_main = (( %d ))  , CCK_counter_aux= ((  %d )) \n", pDM_FatTable->CCK_counter_main, pDM_FatTable->CCK_counter_aux));\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***  OFDM_counter_main = (( %d ))  , OFDM_counter_aux= ((  %d )) \n", pDM_FatTable->OFDM_counter_main, pDM_FatTable->OFDM_counter_aux));\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***  Main_Cnt = (( %d ))  , Main_RSSI= ((  %d )) \n", pDM_FatTable->MainAnt_Cnt[i], Main_RSSI));\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***  Aux_Cnt   = (( %d ))  , Aux_RSSI = ((  %d )) \n", pDM_FatTable->AuxAnt_Cnt[i]  , Aux_RSSI ));\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** MAC ID:[ %d ] , TargetAnt = (( %s )) \n", i ,( TargetAnt ==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));\r
+                                       \r
+                                       //2 Select RX Idle Antenna\r
+                                       \r
+                                       if (LocalMaxRSSI != 0 && LocalMaxRSSI < MinMaxRSSI)\r
+                                       {\r
+                                                       RxIdleAnt = TargetAnt;\r
+                                                       MinMaxRSSI = LocalMaxRSSI;\r
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** LocalMaxRSSI-LocalMinRSSI = ((%d))\n",(LocalMaxRSSI-LocalMinRSSI)));\r
+                                       \r
+                                                       if((LocalMaxRSSI-LocalMinRSSI)>8)\r
+                                                       {\r
+                                                               if(LocalMinRSSI != 0)\r
+                                                                       pDM_SWAT_Table->Train_time_flag=3;\r
+                                                               else\r
+                                                               {\r
+                                                                       if(MinMaxRSSI > SWAntDiv_threshold)\r
+                                                                               pDM_SWAT_Table->Train_time_flag=0;\r
+                                                                       else\r
+                                                                               pDM_SWAT_Table->Train_time_flag=3;\r
+                                                               }\r
+                                                       }\r
+                                                       else if((LocalMaxRSSI-LocalMinRSSI)>5)\r
+                                                               pDM_SWAT_Table->Train_time_flag=2;\r
+                                                       else if((LocalMaxRSSI-LocalMinRSSI)>2)\r
+                                                               pDM_SWAT_Table->Train_time_flag=1;\r
+                                                       else\r
+                                                               pDM_SWAT_Table->Train_time_flag=0;\r
+                                                       \r
+                                       }\r
+                                       \r
+                                       //2 Select TX Antenna\r
+                                       if(TargetAnt == MAIN_ANT)\r
+                                               pDM_FatTable->antsel_a[i] = ANT1_2G;\r
+                                       else\r
+                                               pDM_FatTable->antsel_a[i] = ANT2_2G;\r
+                       \r
+                               }\r
+                                       pDM_FatTable->MainAnt_Sum[i] = 0;\r
+                                       pDM_FatTable->AuxAnt_Sum[i] = 0;\r
+                                       pDM_FatTable->MainAnt_Cnt[i] = 0;\r
+                                       pDM_FatTable->AuxAnt_Cnt[i] = 0;\r
+                       }\r
+\r
+                       if(pDM_SWAT_Table->bSWAntDivByCtrlFrame)\r
+                       {\r
+                               odm_S0S1_SwAntDivByCtrlFrame(pDM_Odm, SWAW_STEP_DETERMINE);\r
+                               bByCtrlFrame = TRUE;\r
+                       }\r
+\r
+                       pkt_cnt_total = pDM_FatTable->CCK_counter_main + pDM_FatTable->CCK_counter_aux + \r
+                       pDM_FatTable->OFDM_counter_main + pDM_FatTable->OFDM_counter_aux;\r
+                       pDM_FatTable->CCK_counter_main=0;\r
+                       pDM_FatTable->CCK_counter_aux=0;\r
+                       pDM_FatTable->OFDM_counter_main=0;\r
+                       pDM_FatTable->OFDM_counter_aux=0;\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Control frame packet counter = %d, Data frame packet counter = %llu\n", \r
+                               pDM_SWAT_Table->PktCnt_SWAntDivByCtrlFrame, pkt_cnt_total));\r
+\r
+                       if(MinMaxRSSI == 0xff || ((pkt_cnt_total < (pDM_SWAT_Table->PktCnt_SWAntDivByCtrlFrame >> 1)) && pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 2))\r
+                       {       \r
+                               MinMaxRSSI = 0;\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Check RSSI of control frame because MinMaxRSSI == 0xff\n"));\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("bByCtrlFrame = %d\n", bByCtrlFrame));\r
+                               \r
+                               if(bByCtrlFrame)\r
+                               {\r
+                                       Main_RSSI = (pDM_FatTable->MainAnt_CtrlFrame_Cnt!=0)?(pDM_FatTable->MainAnt_CtrlFrame_Sum/pDM_FatTable->MainAnt_CtrlFrame_Cnt):0;\r
+                                       Aux_RSSI = (pDM_FatTable->AuxAnt_CtrlFrame_Cnt!=0)?(pDM_FatTable->AuxAnt_CtrlFrame_Sum/pDM_FatTable->AuxAnt_CtrlFrame_Cnt):0;\r
+                                       \r
+                                       if(pDM_FatTable->MainAnt_CtrlFrame_Cnt<=1 && pDM_FatTable->CCK_CtrlFrame_Cnt_main>=1)\r
+                                               Main_RSSI=0;    \r
+                                       \r
+                                       if(pDM_FatTable->AuxAnt_CtrlFrame_Cnt<=1 && pDM_FatTable->CCK_CtrlFrame_Cnt_aux>=1)\r
+                                               Aux_RSSI=0;\r
+\r
+                                       if (Main_RSSI != 0 || Aux_RSSI != 0)\r
+                                       {\r
+                                               RxIdleAnt = (Main_RSSI==Aux_RSSI)?pDM_SWAT_Table->PreAntenna:((Main_RSSI>=Aux_RSSI)?MAIN_ANT:AUX_ANT);\r
+                                               LocalMaxRSSI = (Main_RSSI>=Aux_RSSI) ? Main_RSSI : Aux_RSSI;\r
+                                               LocalMinRSSI = (Main_RSSI>=Aux_RSSI) ? Aux_RSSI : Main_RSSI;\r
+               \r
+                                               if((LocalMaxRSSI-LocalMinRSSI)>8)\r
+                                                       pDM_SWAT_Table->Train_time_flag=3;\r
+                                               else if((LocalMaxRSSI-LocalMinRSSI)>5)\r
+                                                       pDM_SWAT_Table->Train_time_flag=2;\r
+                                               else if((LocalMaxRSSI-LocalMinRSSI)>2)\r
+                                                       pDM_SWAT_Table->Train_time_flag=1;\r
+                                               else\r
+                                                       pDM_SWAT_Table->Train_time_flag=0;\r
+\r
+                                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Control frame: Main_RSSI = %d, Aux_RSSI = %d\n", Main_RSSI, Aux_RSSI));\r
+                                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("RxIdleAnt decided by control frame = %s\n", (RxIdleAnt == MAIN_ANT?"MAIN":"AUX")));\r
+                                       }\r
+                               }\r
+                       }\r
+                       \r
+                       pDM_FatTable->MinMaxRSSI=MinMaxRSSI;\r
+                       pDM_SWAT_Table->try_flag = 0;\r
+                                               \r
+                       if( pDM_SWAT_Table->Double_chk_flag==1)\r
+                       {\r
+                               pDM_SWAT_Table->Double_chk_flag=0;\r
+                               if(pDM_FatTable->MinMaxRSSI > SWAntDiv_threshold)\r
+                               {\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" [Double check] MinMaxRSSI ((%d)) > %d again!! \n",\r
+                                               pDM_FatTable->MinMaxRSSI,SWAntDiv_threshold));\r
+                                       \r
+                                       ODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt);        \r
+                                       \r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[reset try_flag = 0] Training accomplished !!!] \n\n\n"));\r
+                                       return;\r
+                               }\r
+                               else\r
+                               {\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" [Double check] MinMaxRSSI ((%d)) <= %d !! \n",\r
+                                               pDM_FatTable->MinMaxRSSI,SWAntDiv_threshold));\r
+\r
+                                       nextAnt = (pDM_FatTable->RxIdleAnt  == MAIN_ANT)? AUX_ANT : MAIN_ANT;\r
+                                       pDM_SWAT_Table->try_flag = 0; \r
+                                       pDM_SWAT_Table->reset_idx=reset_period;\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[set try_flag=0]  Normal State:  Need to tryg again!! \n\n\n"));\r
+                                       return;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if(pDM_FatTable->MinMaxRSSI < SWAntDiv_threshold)\r
+                                       pDM_SWAT_Table->reset_idx=reset_period;\r
+                               \r
+                               pDM_SWAT_Table->PreAntenna =RxIdleAnt;\r
+                               ODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt );\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[reset try_flag = 0] Training accomplished !!!] \n\n\n"));\r
+                               return;\r
+                       }\r
+                       \r
+               }\r
+\r
+       }\r
+\r
+       //1 4.Change TRX antenna\r
+\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("RSSI_Trying = (( %d )),    Ant: (( %s )) >>> (( %s )) \n",\r
+               pDM_SWAT_Table->RSSI_Trying, (pDM_FatTable->RxIdleAnt  == MAIN_ANT?"MAIN":"AUX"),(nextAnt == MAIN_ANT?"MAIN":"AUX")));\r
+               \r
+       ODM_UpdateRxIdleAnt(pDM_Odm, nextAnt);\r
+\r
+       //1 5.Reset Statistics\r
+\r
+       pDM_FatTable->RxIdleAnt  = nextAnt;\r
+\r
+       //1 6.Set next timer   (Trying State)\r
+       \r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" Test ((%s)) Ant for (( %d )) ms \n", (nextAnt == MAIN_ANT?"MAIN":"AUX"), pDM_SWAT_Table->Train_time));\r
+       ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer_8723B, pDM_SWAT_Table->Train_time ); //ms\r
+}\r
+\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+VOID\r
+ODM_SW_AntDiv_Callback(\r
+       PRT_TIMER               pTimer\r
+)\r
+{\r
+       PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
+       pSWAT_T                 pDM_SWAT_Table = &pHalData->DM_OutSrc.DM_SWAT_Table;\r
+\r
+       #if DEV_BUS_TYPE==RT_PCI_INTERFACE\r
+               #if USE_WORKITEM\r
+                       ODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem_8723B);\r
+               #else\r
+                       {\r
+                       //DbgPrint("SW_antdiv_Callback");\r
+                       odm_S0S1_SwAntDiv(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);\r
+                       }\r
+               #endif\r
+       #else\r
+       ODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem_8723B);\r
+       #endif\r
+}\r
+VOID\r
+ODM_SW_AntDiv_WorkitemCallback(\r
+    IN PVOID            pContext\r
+    )\r
+{\r
+       PADAPTER                pAdapter = (PADAPTER)pContext;\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
+       \r
+       //DbgPrint("SW_antdiv_Workitem_Callback");\r
+       odm_S0S1_SwAntDiv(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);\r
+}\r
+\r
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+\r
+VOID\r
+ODM_SW_AntDiv_WorkitemCallback(\r
+    IN PVOID            pContext\r
+    )\r
+{\r
+       PADAPTER                pAdapter = (PADAPTER)pContext;\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
+\r
+       //DbgPrint("SW_antdiv_Workitem_Callback");\r
+       odm_S0S1_SwAntDiv(&pHalData->odmpriv, SWAW_STEP_DETERMINE);\r
+}\r
+\r
+VOID\r
+ODM_SW_AntDiv_Callback(void *FunctionContext)\r
+{\r
+       PDM_ODM_T       pDM_Odm= (PDM_ODM_T)FunctionContext;\r
+       PADAPTER        padapter = pDM_Odm->Adapter;\r
+\r
+\r
+       if(padapter->net_closed == _TRUE)\r
+           return;\r
+\r
+#if 0 // Can't do I/O in timer callback\r
+       odm_S0S1_SwAntDiv(pDM_Odm, SWAW_STEP_DETERMINE);\r
+#else\r
+       rtw_run_in_thread_cmd(padapter, ODM_SW_AntDiv_WorkitemCallback, padapter);\r
+#endif\r
+}\r
+\r
+#endif\r
+\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+VOID\r
+odm_S0S1_SwAntDivByCtrlFrame(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              u1Byte                  Step\r
+       )\r
+{\r
+       pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
+       pFAT_T          pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+       \r
+       switch(Step)\r
+       {\r
+               case SWAW_STEP_PEAK:\r
+                       pDM_SWAT_Table->PktCnt_SWAntDivByCtrlFrame = 0;\r
+                       pDM_SWAT_Table->bSWAntDivByCtrlFrame = TRUE;\r
+                       pDM_FatTable->MainAnt_CtrlFrame_Cnt = 0;\r
+                       pDM_FatTable->AuxAnt_CtrlFrame_Cnt = 0;\r
+                       pDM_FatTable->MainAnt_CtrlFrame_Sum = 0;\r
+                       pDM_FatTable->AuxAnt_CtrlFrame_Sum = 0;\r
+                       pDM_FatTable->CCK_CtrlFrame_Cnt_main = 0;\r
+                       pDM_FatTable->CCK_CtrlFrame_Cnt_aux = 0;\r
+                       pDM_FatTable->OFDM_CtrlFrame_Cnt_main = 0;\r
+                       pDM_FatTable->OFDM_CtrlFrame_Cnt_aux = 0;\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("odm_S0S1_SwAntDivForAPMode(): Start peak and reset counter\n"));\r
+                       break;\r
+               case SWAW_STEP_DETERMINE:\r
+                       pDM_SWAT_Table->bSWAntDivByCtrlFrame = FALSE;\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("odm_S0S1_SwAntDivForAPMode(): Stop peak\n"));\r
+                       break;\r
+               default:\r
+                       pDM_SWAT_Table->bSWAntDivByCtrlFrame = FALSE;\r
+                       break;\r
+       }                       \r
+}\r
+\r
+VOID\r
+odm_AntselStatisticsOfCtrlFrame(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              u1Byte                  antsel_tr_mux,\r
+       IN              u4Byte                  RxPWDBAll\r
+)\r
+{\r
+       pFAT_T  pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+\r
+       if(antsel_tr_mux == ANT1_2G)\r
+       {\r
+               pDM_FatTable->MainAnt_CtrlFrame_Sum+=RxPWDBAll;\r
+               pDM_FatTable->MainAnt_CtrlFrame_Cnt++;\r
+       }\r
+       else\r
+       {\r
+               pDM_FatTable->AuxAnt_CtrlFrame_Sum+=RxPWDBAll;\r
+               pDM_FatTable->AuxAnt_CtrlFrame_Cnt++;\r
+       }\r
+}\r
+\r
+VOID\r
+odm_S0S1_SwAntDivByCtrlFrame_ProcessRSSI(\r
+       IN              PDM_ODM_T                               pDM_Odm,\r
+       IN              PODM_PHY_INFO_T         pPhyInfo,\r
+       IN              PODM_PACKET_INFO_T              pPktinfo\r
+       )\r
+{\r
+       pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
+       pFAT_T          pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+       BOOLEAN         isCCKrate;\r
+\r
+       if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))\r
+               return;\r
+\r
+       if(pDM_Odm->AntDivType != S0S1_SW_ANTDIV)\r
+               return;\r
+\r
+       // In try state\r
+       if(!pDM_SWAT_Table->bSWAntDivByCtrlFrame)\r
+               return;\r
+\r
+       // No HW error and match receiver address\r
+       if(!pPktinfo->bToSelf)\r
+               return;\r
+       \r
+       pDM_SWAT_Table->PktCnt_SWAntDivByCtrlFrame++;\r
+       isCCKrate = ((pPktinfo->DataRate >= DESC_RATE1M ) && (pPktinfo->DataRate <= DESC_RATE11M ))?TRUE :FALSE;\r
+\r
+       if(isCCKrate)\r
+       {\r
+               pDM_FatTable->antsel_rx_keep_0 = (pDM_FatTable->RxIdleAnt == MAIN_ANT) ? ANT1_2G : ANT2_2G;\r
+\r
+               if(pDM_FatTable->antsel_rx_keep_0==ANT1_2G)\r
+                       pDM_FatTable->CCK_CtrlFrame_Cnt_main++;\r
+               else\r
+                       pDM_FatTable->CCK_CtrlFrame_Cnt_aux++;\r
+\r
+               odm_AntselStatisticsOfCtrlFrame(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]);\r
+       }\r
+       else\r
+       {\r
+               if(pDM_FatTable->antsel_rx_keep_0==ANT1_2G)\r
+                       pDM_FatTable->OFDM_CtrlFrame_Cnt_main++;\r
+               else\r
+                       pDM_FatTable->OFDM_CtrlFrame_Cnt_aux++;\r
+\r
+               odm_AntselStatisticsOfCtrlFrame(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPhyInfo->RxPWDBAll);\r
+       }\r
+}\r
+#endif  //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+\r
+\r
+\r
+#endif //#if (RTL8723B_SUPPORT == 1)\r
+\r
+\r
+#if(RTL8188E_SUPPORT == 1  || RTL8192E_SUPPORT == 1)\r
+#if (!(DM_ODM_SUPPORT_TYPE == ODM_CE))\r
+VOID\r
+odm_SetNextMACAddrTarget(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+       pFAT_T  pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+       PSTA_INFO_T     pEntry;\r
+       //u1Byte        Bssid[6];\r
+       u4Byte  value32, i;\r
+\r
+       //\r
+       //2012.03.26 LukeLee: The MAC address is changed according to MACID in turn\r
+       //\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SetNextMACAddrTarget() ==>\n"));\r
+       if(pDM_Odm->bLinked)\r
+       {\r
+               for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\r
+               {\r
+                       if((pDM_FatTable->TrainIdx+1) == ODM_ASSOCIATE_ENTRY_NUM)\r
+                               pDM_FatTable->TrainIdx = 0;\r
+                       else\r
+                               pDM_FatTable->TrainIdx++;\r
+                       \r
+                       pEntry = pDM_Odm->pODM_StaInfo[pDM_FatTable->TrainIdx];\r
+                       if(IS_STA_VALID(pEntry))\r
+                       {\r
+                               //Match MAC ADDR\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+                               value32 = (pEntry->hwaddr[5]<<8)|pEntry->hwaddr[4];\r
+#else\r
+                               value32 = (pEntry->MacAddr[5]<<8)|pEntry->MacAddr[4];\r
+#endif\r
+                               ODM_SetMACReg(pDM_Odm, 0x7b4, 0xFFFF, value32);\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+                               value32 = (pEntry->hwaddr[3]<<24)|(pEntry->hwaddr[2]<<16) |(pEntry->hwaddr[1]<<8) |pEntry->hwaddr[0];\r
+#else\r
+                               value32 = (pEntry->MacAddr[3]<<24)|(pEntry->MacAddr[2]<<16) |(pEntry->MacAddr[1]<<8) |pEntry->MacAddr[0];\r
+#endif\r
+                               ODM_SetMACReg(pDM_Odm, 0x7b0, bMaskDWord, value32);\r
+\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_FatTable->TrainIdx=%lu\n",pDM_FatTable->TrainIdx));\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Training MAC Addr = %x:%x:%x:%x:%x:%x\n",\r
+                                       pEntry->hwaddr[5],pEntry->hwaddr[4],pEntry->hwaddr[3],pEntry->hwaddr[2],pEntry->hwaddr[1],pEntry->hwaddr[0]));\r
+#else\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Training MAC Addr = %x:%x:%x:%x:%x:%x\n",\r
+                                       pEntry->MacAddr[5],pEntry->MacAddr[4],pEntry->MacAddr[3],pEntry->MacAddr[2],pEntry->MacAddr[1],pEntry->MacAddr[0]));\r
+#endif\r
+\r
+                               break;\r
+                       }\r
+               }\r
+               \r
+       }\r
+\r
+#if 0\r
+       //\r
+       //2012.03.26 LukeLee: This should be removed later, the MAC address is changed according to MACID in turn\r
+       //\r
+       #if( DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       {               \r
+               PADAPTER        Adapter =  pDM_Odm->Adapter;\r
+               PMGNT_INFO      pMgntInfo = &Adapter->MgntInfo;\r
+\r
+               for (i=0; i<6; i++)\r
+               {\r
+                       Bssid[i] = pMgntInfo->Bssid[i];\r
+                       //DbgPrint("Bssid[%d]=%x\n", i, Bssid[i]);\r
+               }\r
+       }\r
+       #endif\r
+\r
+       //odm_SetNextMACAddrTarget(pDM_Odm);\r
+       \r
+       //1 Select MAC Address Filter\r
+       for (i=0; i<6; i++)\r
+       {\r
+               if(Bssid[i] != pDM_FatTable->Bssid[i])\r
+               {\r
+                       bMatchBSSID = FALSE;\r
+                       break;\r
+               }\r
+       }\r
+       if(bMatchBSSID == FALSE)\r
+       {\r
+               //Match MAC ADDR\r
+               value32 = (Bssid[5]<<8)|Bssid[4];\r
+               ODM_SetMACReg(pDM_Odm, 0x7b4, 0xFFFF, value32);\r
+               value32 = (Bssid[3]<<24)|(Bssid[2]<<16) |(Bssid[1]<<8) |Bssid[0];\r
+               ODM_SetMACReg(pDM_Odm, 0x7b0, bMaskDWord, value32);\r
+       }\r
+\r
+       return bMatchBSSID;\r
+#endif\r
+                               \r
+}\r
+\r
+VOID\r
+odm_FastAntTraining(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+       u4Byte  i, MaxRSSI=0;\r
+       u1Byte  TargetAnt=2;\r
+       pFAT_T  pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+       BOOLEAN bPktFilterMacth = FALSE;\r
+\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("==>odm_FastAntTraining()\n"));\r
+\r
+       //1 TRAINING STATE\r
+       if(pDM_FatTable->FAT_State == FAT_TRAINING_STATE)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Enter FAT_TRAINING_STATE\n"));\r
+               //2 Caculate RSSI per Antenna\r
+               for (i=0; i<7; i++)\r
+               {\r
+                       if(pDM_FatTable->antRSSIcnt[i] == 0)\r
+                               pDM_FatTable->antAveRSSI[i] = 0;\r
+                       else\r
+                       {\r
+                       pDM_FatTable->antAveRSSI[i] = pDM_FatTable->antSumRSSI[i] /pDM_FatTable->antRSSIcnt[i];\r
+                               bPktFilterMacth = TRUE;\r
+                       }\r
+                       if(pDM_FatTable->antAveRSSI[i] > MaxRSSI)\r
+                       {\r
+                               MaxRSSI = pDM_FatTable->antAveRSSI[i];\r
+                               TargetAnt = (u1Byte) i;\r
+                       }\r
+\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_FatTable->antAveRSSI[%lu] = %lu, pDM_FatTable->antRSSIcnt[%lu] = %lu\n",\r
+                               i, pDM_FatTable->antAveRSSI[i], i, pDM_FatTable->antRSSIcnt[i]));\r
+               }\r
+\r
+               //2 Select TRX Antenna\r
+               if(bPktFilterMacth == FALSE)\r
+               {\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("None Packet is matched\n"));\r
+\r
+                       ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 0);        //RegE08[16]=1'b0               //disable fast training\r
+                       ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 0);         //RegC50[7]=1'b0                //disable HW AntDiv\r
+               }\r
+               else\r
+               {\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TargetAnt=%d, MaxRSSI=%lu\n",TargetAnt,MaxRSSI));\r
+\r
+                       ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 0);        //RegE08[16]=1'b0               //disable fast training\r
+                       //ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 0);               //RegC50[7]=1'b0                //disable HW AntDiv\r
+                       ODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, TargetAnt);       //Default RX is Omni, Optional RX is the best decision by FAT\r
+                       //ODM_SetBBReg(pDM_Odm, 0x860 , BIT14|BIT13|BIT12, TargetAnt);  //Default TX\r
+                       ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1); //Reg80c[21]=1'b1              //from TX Info\r
+\r
+#if 0\r
+                       pEntry = pDM_Odm->pODM_StaInfo[pDM_FatTable->TrainIdx];\r
+\r
+                       if(IS_STA_VALID(pEntry))\r
+                       {\r
+                               pEntry->antsel_a = TargetAnt&BIT0;\r
+                               pEntry->antsel_b = (TargetAnt&BIT1)>>1;\r
+                               pEntry->antsel_c = (TargetAnt&BIT2)>>2;\r
+                       }\r
+#else\r
+                       pDM_FatTable->antsel_a[pDM_FatTable->TrainIdx] = TargetAnt&BIT0;\r
+                       pDM_FatTable->antsel_b[pDM_FatTable->TrainIdx] = (TargetAnt&BIT1)>>1;\r
+                       pDM_FatTable->antsel_c[pDM_FatTable->TrainIdx] = (TargetAnt&BIT2)>>2;\r
+#endif\r
+\r
+\r
+                       if(TargetAnt == 0)\r
+                               ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 0);         //RegC50[7]=1'b0                //disable HW AntDiv\r
+\r
+               }\r
+\r
+               //2 Reset Counter\r
+               for(i=0; i<7; i++)\r
+               {\r
+                       pDM_FatTable->antSumRSSI[i] = 0;\r
+                       pDM_FatTable->antRSSIcnt[i] = 0;\r
+               }\r
+               \r
+               pDM_FatTable->FAT_State = FAT_NORMAL_STATE;\r
+               return;\r
+       }\r
+\r
+       //1 NORMAL STATE\r
+       if(pDM_FatTable->FAT_State == FAT_NORMAL_STATE)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Enter FAT_NORMAL_STATE\n"));\r
+\r
+               odm_SetNextMACAddrTarget(pDM_Odm);\r
+\r
+#if 0\r
+                               pEntry = pDM_Odm->pODM_StaInfo[pDM_FatTable->TrainIdx];\r
+                               if(IS_STA_VALID(pEntry))\r
+                               {\r
+                                       pEntry->antsel_a = TargetAnt&BIT0;\r
+                                       pEntry->antsel_b = (TargetAnt&BIT1)>>1;\r
+                                       pEntry->antsel_c = (TargetAnt&BIT2)>>2;\r
+                               }\r
+#endif\r
+\r
+               //2 Prepare Training\r
+               pDM_FatTable->FAT_State = FAT_TRAINING_STATE;\r
+               ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 1);        //RegE08[16]=1'b1               //enable fast training\r
+               ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 1); //RegC50[7]=1'b1                //enable HW AntDiv\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Start FAT_TRAINING_STATE\n"));\r
+               ODM_SetTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer, 500 ); //ms\r
+               \r
+       }\r
+               \r
+}\r
+\r
+VOID\r
+odm_FastAntTrainingCallback(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+       PADAPTER        padapter = pDM_Odm->Adapter;\r
+       if(padapter->net_closed == _TRUE)\r
+           return;\r
+       //if(*pDM_Odm->pbNet_closed == TRUE)\r
+          // return;\r
+#endif\r
+\r
+#if USE_WORKITEM\r
+       ODM_ScheduleWorkItem(&pDM_Odm->FastAntTrainingWorkitem);\r
+#else\r
+       odm_FastAntTraining(pDM_Odm);\r
+#endif\r
+}\r
+\r
+VOID\r
+odm_FastAntTrainingWorkItemCallback(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+       odm_FastAntTraining(pDM_Odm);\r
+}\r
+#endif\r
+\r
+#endif\r
+\r
+VOID\r
+ODM_AntDivReset(\r
+       IN PDM_ODM_T    pDM_Odm \r
+       )\r
+{\r
+       //2 [--8723B---]\r
+#if (RTL8723B_SUPPORT == 1)\r
+       if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+               odm_S0S1_SWAntDiv_Reset_8723B(pDM_Odm);\r
+#endif\r
+}\r
+\r
+VOID\r
+ODM_AntDivInit(\r
+       IN PDM_ODM_T    pDM_Odm \r
+       )\r
+{\r
+       pFAT_T                  pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+       pSWAT_T                 pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
+\r
+\r
+       if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!]   Not Support Antenna Diversity Function\n"));\r
+               return;\r
+       }\r
+        //---\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+       if(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_2G)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[2G AntDiv Init]: Only Support 2G Antenna Diversity Function\n"));\r
+               if(!(pDM_Odm->SupportICType & ODM_ANTDIV_2G_SUPPORT_IC))\r
+                       return;\r
+       }\r
+       else    if(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_5G)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[5G AntDiv Init]: Only Support 5G Antenna Diversity Function\n"));\r
+               if(!(pDM_Odm->SupportICType & ODM_ANTDIV_5G_SUPPORT_IC))\r
+                       return;\r
+       }\r
+       else    if(pDM_FatTable->AntDiv_2G_5G == (ODM_ANTDIV_2G|ODM_ANTDIV_5G))\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[2G & 5G AntDiv Init]:Support Both 2G & 5G Antenna Diversity Function\n"));\r
+       }\r
+\r
+        pDM_Odm->antdiv_rssi=0;\r
+\r
+#endif \r
+       //---\r
+       \r
+       //2 [--General---]\r
+       pDM_Odm->antdiv_period=0;\r
+       pDM_Odm->antdiv_select=0;\r
+       pDM_SWAT_Table->Ant5G = MAIN_ANT;\r
+       pDM_SWAT_Table->Ant2G = MAIN_ANT;\r
+       pDM_FatTable->CCK_counter_main=0;\r
+       pDM_FatTable->CCK_counter_aux=0;\r
+       pDM_FatTable->OFDM_counter_main=0;\r
+       pDM_FatTable->OFDM_counter_aux=0;\r
+       \r
+       //3 [Set MAIN_ANT as default antenna if Auto-Ant enable]\r
+       if (pDM_Odm->antdiv_select==1)\r
+               pDM_Odm->AntType = ODM_FIX_MAIN_ANT;\r
+       else if (pDM_Odm->antdiv_select==2)\r
+               pDM_Odm->AntType = ODM_FIX_AUX_ANT;\r
+       else if(pDM_Odm->antdiv_select==0)\r
+               pDM_Odm->AntType = ODM_AUTO_ANT;\r
+       \r
+       if(pDM_Odm->AntType == ODM_AUTO_ANT)\r
+       {\r
+               odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\r
+               ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\r
+       }\r
+       else\r
+       {\r
+               odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\r
+               \r
+               if(pDM_Odm->AntType == ODM_FIX_MAIN_ANT)\r
+               {\r
+                       ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\r
+                       return;\r
+               }\r
+               else if(pDM_Odm->AntType == ODM_FIX_AUX_ANT)\r
+               {\r
+                       ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);\r
+                       return;\r
+               }\r
+       }\r
+       //---\r
+       if(pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV)\r
+       {\r
+               if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT)\r
+               {\r
+                       #if TX_BY_REG\r
+                       ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 0); //Reg80c[21]=1'b0              //from Reg\r
+                       #else\r
+                       ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1);\r
+                       #endif\r
+               }       \r
+               else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT)\r
+               {\r
+                       #if TX_BY_REG\r
+                       ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); \r
+                       #else\r
+                       ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 1); \r
+                       #endif\r
+               }\r
+       }\r
+               \r
+       //2 [--88E---]\r
+       if(pDM_Odm->SupportICType == ODM_RTL8188E)\r
+       {\r
+       #if (RTL8188E_SUPPORT == 1)\r
+               //pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;\r
+               //pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\r
+               //pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;\r
+\r
+               if( (pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV)  && (pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV) && (pDM_Odm->AntDivType != CG_TRX_SMART_ANTDIV))\r
+               {\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!]  88E Not Supprrt This AntDiv Type\n"));\r
+                       pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\r
+                       return;\r
+               }\r
+               \r
+               if(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV)\r
+                       odm_RX_HWAntDiv_Init_88E(pDM_Odm);\r
+               else if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)\r
+                       odm_TRX_HWAntDiv_Init_88E(pDM_Odm);\r
+               else if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV)\r
+                       odm_Smart_HWAntDiv_Init_88E(pDM_Odm);\r
+       #endif  \r
+       }\r
+       \r
+       //2 [--92E---]\r
+       #if (RTL8192E_SUPPORT == 1)\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8192E)\r
+       {       \r
+               //pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;\r
+               //pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\r
+               //pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;\r
+\r
+               if( (pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV) && (pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV)   && (pDM_Odm->AntDivType != CG_TRX_SMART_ANTDIV))\r
+               {\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!]  8192E Not Supprrt This AntDiv Type\n"));\r
+                       pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\r
+                       return;\r
+               }\r
+               \r
+               if(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV)\r
+                       odm_RX_HWAntDiv_Init_92E(pDM_Odm);\r
+               else if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)\r
+                       odm_TRX_HWAntDiv_Init_92E(pDM_Odm);\r
+               else if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV)\r
+                       odm_Smart_HWAntDiv_Init_92E(pDM_Odm);\r
+       \r
+       }\r
+       #endif  \r
+       \r
+       //2 [--8723B---]\r
+       #if (RTL8723B_SUPPORT == 1)\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+       {               \r
+               //pDM_Odm->AntDivType = S0S1_SW_ANTDIV;\r
+               //pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\r
+\r
+               if(pDM_Odm->AntDivType != S0S1_SW_ANTDIV && pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV)\r
+               {\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] 8723B  Not Supprrt This AntDiv Type\n"));\r
+                       pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\r
+                       return;\r
+               }\r
+                       \r
+               if( pDM_Odm->AntDivType==S0S1_SW_ANTDIV)\r
+                       odm_S0S1_SWAntDiv_Init_8723B(pDM_Odm);\r
+               else if(pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV)\r
+                       odm_TRX_HWAntDiv_Init_8723B(pDM_Odm);           \r
+       }\r
+       #endif\r
+       \r
+       //2 [--8811A 8821A---]\r
+       #if (RTL8821A_SUPPORT == 1)\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8821)\r
+       {\r
+               //pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\r
+               pDM_Odm->AntDivType = S0S1_SW_ANTDIV;\r
+                       \r
+               if( pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV && pDM_Odm->AntDivType != S0S1_SW_ANTDIV)\r
+               {\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] 8821A & 8811A  Not Supprrt This AntDiv Type\n"));\r
+                       pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\r
+                       return;\r
+               }\r
+               if(pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV)       \r
+                       odm_TRX_HWAntDiv_Init_8821A(pDM_Odm);\r
+               else if( pDM_Odm->AntDivType==S0S1_SW_ANTDIV)\r
+                       odm_S0S1_SWAntDiv_Init_8821A(pDM_Odm);\r
+       }\r
+       #endif\r
+       \r
+       //2 [--8881A---]\r
+       #if (RTL8881A_SUPPORT == 1)\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8881A)\r
+       {\r
+                       //pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;\r
+                       //pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\r
+                       \r
+                       if(pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV && pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV)\r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] 8881A  Not Supprrt This AntDiv Type\n"));\r
+                               pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\r
+                               return;\r
+                       }\r
+                       if(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV)\r
+                               odm_RX_HWAntDiv_Init_8881A(pDM_Odm);\r
+                       else if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)\r
+                               odm_TRX_HWAntDiv_Init_8881A(pDM_Odm);   \r
+       }\r
+       #endif\r
+       \r
+       //2 [--8812---]\r
+       #if (RTL8812A_SUPPORT == 1)\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8812)\r
+       {       \r
+                       //pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\r
+                       \r
+                       if( pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV)\r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] 8812A  Not Supprrt This AntDiv Type\n"));\r
+                               pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\r
+                               return;\r
+                       }\r
+                       odm_TRX_HWAntDiv_Init_8812A(pDM_Odm);\r
+       }\r
+       #endif\r
+       //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("*** SupportICType=[%lu] \n",pDM_Odm->SupportICType));\r
+       //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("*** AntDiv SupportAbility=[%lu] \n",(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)>>6));\r
+       //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("*** AntDiv Type=[%d] \n",pDM_Odm->AntDivType));\r
+\r
+}\r
+\r
+VOID\r
+ODM_AntDiv(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{      \r
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;\r
+       pFAT_T                  pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+\r
+//#if (DM_ODM_SUPPORT_TYPE == ODM_AP)  \r
+       if(*pDM_Odm->pBandType == ODM_BAND_5G )\r
+       {\r
+               if(pDM_FatTable->idx_AntDiv_counter_5G <  pDM_Odm->antdiv_period )\r
+               {\r
+                       pDM_FatTable->idx_AntDiv_counter_5G++;\r
+                       return;\r
+               }\r
+               else\r
+                       pDM_FatTable->idx_AntDiv_counter_5G=0;\r
+       }\r
+       else    if(*pDM_Odm->pBandType == ODM_BAND_2_4G )\r
+       {\r
+               if(pDM_FatTable->idx_AntDiv_counter_2G <  pDM_Odm->antdiv_period )\r
+               {\r
+                       pDM_FatTable->idx_AntDiv_counter_2G++;\r
+                       return;\r
+               }\r
+               else\r
+                       pDM_FatTable->idx_AntDiv_counter_2G=0;\r
+       }\r
+//#endif       \r
+       //----------\r
+       if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!]   Not Support Antenna Diversity Function\n"));\r
+               return;\r
+       }\r
+\r
+       //----------\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       if(pAdapter->MgntInfo.AntennaTest)\r
+               return;\r
+       \r
+        {\r
+       #if (BEAMFORMING_SUPPORT == 1)                  \r
+               BEAMFORMING_CAP         BeamformCap = (pDM_Odm->BeamformingInfo.BeamformCap);\r
+\r
+               if( BeamformCap & BEAMFORMEE_CAP ) //  BFmee On  &&   Div On ->  Div Off\r
+               {       \r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ AntDiv : OFF ]   BFmee ==1 \n"));\r
+                       if(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)\r
+                       {\r
+                               odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\r
+                               pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\r
+                               return;\r
+                       }\r
+               }\r
+               else // BFmee Off   &&   Div Off ->  Div On\r
+       #endif\r
+               {\r
+                       if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)  &&  pDM_Odm->bLinked) \r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ AntDiv : ON ]   BFmee ==0 \n"));\r
+                               if((pDM_Odm->AntDivType!=S0S1_SW_ANTDIV) )\r
+                                       odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON);\r
+                               \r
+                               pDM_Odm->SupportAbility |= (ODM_BB_ANT_DIV);\r
+                       }\r
+               }\r
+        }\r
+#endif\r
+\r
+       //----------\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+       if(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_2G)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 2G AntDiv Running ]\n"));\r
+               if(!(pDM_Odm->SupportICType & ODM_ANTDIV_2G_SUPPORT_IC))\r
+                       return;\r
+       }\r
+       else if(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_5G)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 5G AntDiv Running ]\n"));\r
+               if(!(pDM_Odm->SupportICType & ODM_ANTDIV_5G_SUPPORT_IC))\r
+               return;\r
+       }\r
+       else if(pDM_FatTable->AntDiv_2G_5G == (ODM_ANTDIV_2G|ODM_ANTDIV_5G))\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 2G & 5G AntDiv Running ]\n"));\r
+       }\r
+#endif\r
+\r
+       //----------\r
+\r
+       if (pDM_Odm->antdiv_select==1)\r
+               pDM_Odm->AntType = ODM_FIX_MAIN_ANT;\r
+       else if (pDM_Odm->antdiv_select==2)\r
+               pDM_Odm->AntType = ODM_FIX_AUX_ANT;\r
+       else  if (pDM_Odm->antdiv_select==0)\r
+               pDM_Odm->AntType = ODM_AUTO_ANT;\r
+\r
+       //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("AntType= (( %d )) , pre_AntType= (( %d ))  \n",pDM_Odm->AntType,pDM_Odm->pre_AntType));\r
+       \r
+       if(pDM_Odm->AntType != ODM_AUTO_ANT)\r
+       {\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Fix Antenna at (( %s ))\n",(pDM_Odm->AntType == ODM_FIX_MAIN_ANT)?"MAIN":"AUX"));\r
+                       \r
+               if(pDM_Odm->AntType != pDM_Odm->pre_AntType)\r
+               {\r
+                       odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\r
+\r
+                       if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT)\r
+                               ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 0);\r
+                       else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT)\r
+                               ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); \r
+                                               \r
+                       if(pDM_Odm->AntType == ODM_FIX_MAIN_ANT)\r
+                               ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\r
+                       else if(pDM_Odm->AntType == ODM_FIX_AUX_ANT)\r
+                               ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);\r
+               }\r
+               pDM_Odm->pre_AntType=pDM_Odm->AntType; \r
+               return;\r
+       }\r
+       else\r
+       {\r
+               if(pDM_Odm->AntType != pDM_Odm->pre_AntType)\r
+               {\r
+                       odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON);\r
+                        if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT)\r
+                               ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1);\r
+                       else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT)\r
+                               ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 1); \r
+               }\r
+               pDM_Odm->pre_AntType=pDM_Odm->AntType;\r
+       }\r
+        \r
+       \r
+       //3 -----------------------------------------------------------------------------------------------------------\r
+       //2 [--88E---]\r
+       if(pDM_Odm->SupportICType == ODM_RTL8188E)\r
+       {\r
+               #if (RTL8188E_SUPPORT == 1)\r
+               if(pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV ||pDM_Odm->AntDivType==CGCS_RX_HW_ANTDIV)\r
+                       odm_HW_AntDiv(pDM_Odm);\r
+               #if (!(DM_ODM_SUPPORT_TYPE == ODM_CE))\r
+               else if (pDM_Odm->AntDivType==CG_TRX_SMART_ANTDIV)\r
+                       odm_FastAntTraining(pDM_Odm);   \r
+               #endif\r
+               #endif\r
+       }\r
+       //2 [--92E---]  \r
+       #if (RTL8192E_SUPPORT == 1)\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8192E)\r
+       {\r
+               if(pDM_Odm->AntDivType==CGCS_RX_HW_ANTDIV)\r
+                       odm_HW_AntDiv(pDM_Odm);\r
+               #if (!(DM_ODM_SUPPORT_TYPE == ODM_CE))\r
+               else if (pDM_Odm->AntDivType==CG_TRX_SMART_ANTDIV)\r
+                       odm_FastAntTraining(pDM_Odm);   \r
+               #endif\r
+       }\r
+       #endif\r
+\r
+       #if (RTL8723B_SUPPORT == 1)     \r
+       //2 [--8723B---]\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+       {\r
+               if (pDM_Odm->AntDivType==S0S1_SW_ANTDIV)\r
+                       odm_S0S1_SwAntDiv(pDM_Odm, SWAW_STEP_PEAK);\r
+               else if (pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV)\r
+                       odm_HW_AntDiv(pDM_Odm);\r
+       }\r
+       #endif\r
+       \r
+       //2 [--8821A---]\r
+       #if (RTL8821A_SUPPORT == 1)\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8821)\r
+       {\r
+               if(!pDM_Odm->bBtEnabled)  //BT disabled\r
+               {\r
+                       if(pDM_Odm->AntDivType == S0S1_SW_ANTDIV)\r
+                       {\r
+                       pDM_Odm->AntDivType=CG_TRX_HW_ANTDIV;\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(" [S0S1_SW_ANTDIV]  ->  [CG_TRX_HW_ANTDIV]\n"));\r
+                               //ODM_SetBBReg(pDM_Odm, 0x8D4 , BIT24, 1); \r
+                               if(pDM_FatTable->bBecomeLinked ==TRUE)\r
+                                       odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON);\r
+                       }\r
+               }       \r
+               else //BT enabled\r
+               {\r
+                       if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)\r
+                       {\r
+                       pDM_Odm->AntDivType=S0S1_SW_ANTDIV;\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(" [CG_TRX_HW_ANTDIV]  ->  [S0S1_SW_ANTDIV]\n"));\r
+                               //ODM_SetBBReg(pDM_Odm, 0x8D4 , BIT24, 0);\r
+                               odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\r
+                       }       \r
+               }       \r
+       \r
+               if (pDM_Odm->AntDivType==S0S1_SW_ANTDIV)\r
+                       odm_S0S1_SwAntDiv(pDM_Odm, SWAW_STEP_PEAK);\r
+               else if (pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV)\r
+               odm_HW_AntDiv(pDM_Odm);\r
+       }\r
+       #endif\r
+       //2 [--8881A---]\r
+       #if (RTL8881A_SUPPORT == 1)\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8881A)         \r
+               odm_HW_AntDiv(pDM_Odm);\r
+       #endif\r
+       //2 [--8812A---]\r
+       #if (RTL8812A_SUPPORT == 1)\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8812)\r
+               odm_HW_AntDiv(pDM_Odm);\r
+       #endif\r
+}\r
+\r
+\r
+VOID\r
+odm_AntselStatistics(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              u1Byte                  antsel_tr_mux,\r
+       IN              u4Byte                  MacId,\r
+       IN              u4Byte                  RxPWDBAll\r
+)\r
+{\r
+       pFAT_T  pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+\r
+       if(antsel_tr_mux == ANT1_2G)\r
+       {\r
+               pDM_FatTable->MainAnt_Sum[MacId]+=RxPWDBAll;\r
+               pDM_FatTable->MainAnt_Cnt[MacId]++;\r
+       }\r
+       else\r
+       {\r
+               pDM_FatTable->AuxAnt_Sum[MacId]+=RxPWDBAll;\r
+               pDM_FatTable->AuxAnt_Cnt[MacId]++;\r
+       }\r
+}\r
+\r
+\r
+VOID\r
+ODM_Process_RSSIForAntDiv(     \r
+       IN OUT  PDM_ODM_T                                       pDM_Odm,\r
+       IN              PODM_PHY_INFO_T                         pPhyInfo,\r
+       IN              PODM_PACKET_INFO_T                      pPktinfo\r
+       )\r
+{\r
+u1Byte                 isCCKrate=0,CCKMaxRate=DESC_RATE11M;\r
+pFAT_T                 pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+\r
+#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN))\r
+       u4Byte                  RxPower_Ant0, RxPower_Ant1;     \r
+#else\r
+       u1Byte                  RxPower_Ant0, RxPower_Ant1;     \r
+#endif\r
+\r
+       if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT)\r
+               CCKMaxRate=DESC_RATE11M;\r
+       else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT)\r
+               CCKMaxRate=DESC_RATE11M;\r
+       isCCKrate = (pPktinfo->DataRate <= CCKMaxRate)?TRUE:FALSE;\r
+\r
+#if ((RTL8192C_SUPPORT == 1) ||(RTL8192D_SUPPORT == 1))\r
+               if(pDM_Odm->SupportICType & ODM_RTL8192C|ODM_RTL8192D)\r
+               {\r
+                               if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon)\r
+                               {\r
+                                       //if(pPktinfo->bPacketBeacon)\r
+                                       //{\r
+                                       //      DbgPrint("This is beacon, isCCKrate=%d\n", isCCKrate);\r
+                                       //}\r
+                                       ODM_AntselStatistics_88C(pDM_Odm, pPktinfo->StationID,  pPhyInfo->RxPWDBAll, isCCKrate);\r
+                               }\r
+               }\r
+#endif\r
+               \r
+       if(  (pDM_Odm->SupportICType == ODM_RTL8192E||pDM_Odm->SupportICType == ODM_RTL8812)   && (pPktinfo->DataRate > CCKMaxRate) )\r
+       {\r
+               RxPower_Ant0 = pPhyInfo->RxMIMOSignalStrength[0];\r
+               RxPower_Ant1= pPhyInfo->RxMIMOSignalStrength[1];\r
+       }\r
+       else\r
+               RxPower_Ant0=pPhyInfo->RxPWDBAll;\r
+       \r
+       if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV)\r
+       {\r
+               if( (pDM_Odm->SupportICType & ODM_SMART_ANT_SUPPORT) &&  pPktinfo->bPacketToSelf   && pDM_FatTable->FAT_State == FAT_TRAINING_STATE )//(pPktinfo->bPacketMatchBSSID && (!pPktinfo->bPacketBeacon))\r
+               {\r
+                       u1Byte  antsel_tr_mux;\r
+                       antsel_tr_mux = (pDM_FatTable->antsel_rx_keep_2<<2) |(pDM_FatTable->antsel_rx_keep_1 <<1) |pDM_FatTable->antsel_rx_keep_0;\r
+                       pDM_FatTable->antSumRSSI[antsel_tr_mux] += RxPower_Ant0;\r
+                       pDM_FatTable->antRSSIcnt[antsel_tr_mux]++;\r
+               }\r
+       }\r
+       else //AntDivType != CG_TRX_SMART_ANTDIV \r
+       {\r
+               if(  ( pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT ) &&  (pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID)  )\r
+               {\r
+                        if(pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E)\r
+                               odm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID,RxPower_Ant0);\r
+                       else// SupportICType == ODM_RTL8821 and ODM_RTL8723B and ODM_RTL8812)\r
+                       {\r
+                               if(isCCKrate && (pDM_Odm->AntDivType == S0S1_SW_ANTDIV))\r
+                               {\r
+                                       pDM_FatTable->antsel_rx_keep_0 = (pDM_FatTable->RxIdleAnt == MAIN_ANT) ? ANT1_2G : ANT2_2G;\r
+\r
+\r
+                                               if(pDM_FatTable->antsel_rx_keep_0==ANT1_2G)\r
+                                                       pDM_FatTable->CCK_counter_main++;\r
+                                               else// if(pDM_FatTable->antsel_rx_keep_0==ANT2_2G)\r
+                                                       pDM_FatTable->CCK_counter_aux++;\r
+\r
+                                       odm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, RxPower_Ant0);\r
+                               }\r
+                               else\r
+                               {\r
+                                       if(pDM_FatTable->antsel_rx_keep_0==ANT1_2G)\r
+                                               pDM_FatTable->OFDM_counter_main++;\r
+                                       else// if(pDM_FatTable->antsel_rx_keep_0==ANT2_2G)\r
+                                               pDM_FatTable->OFDM_counter_aux++;\r
+                                       odm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, RxPower_Ant0);\r
+                       }\r
+               }\r
+       }\r
+       }\r
+       //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("isCCKrate=%d, PWDB_ALL=%d\n",isCCKrate, pPhyInfo->RxPWDBAll));\r
+       //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=3'b%d%d%d\n",pDM_FatTable->antsel_rx_keep_2, pDM_FatTable->antsel_rx_keep_1, pDM_FatTable->antsel_rx_keep_0));\r
+}\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+VOID\r
+ODM_SetTxAntByTxInfo(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              pu1Byte                 pDesc,\r
+       IN              u1Byte                  macId   \r
+)\r
+{\r
+       pFAT_T  pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+\r
+       if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))\r
+               return;\r
+\r
+       if(pDM_Odm->AntDivType==CGCS_RX_HW_ANTDIV)\r
+               return;\r
+\r
+\r
+       if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+       {\r
+               #if (RTL8723B_SUPPORT == 1)\r
+               SET_TX_DESC_ANTSEL_A_8723B(pDesc, pDM_FatTable->antsel_a[macId]);\r
+               //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[8723B] SetTxAntByTxInfo_WIN: MacID=%d, antsel_tr_mux=3'b%d%d%d\n", \r
+                       //macId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId]));\r
+               #endif\r
+       }\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8821)\r
+       {\r
+               #if (RTL8821A_SUPPORT == 1)\r
+               SET_TX_DESC_ANTSEL_A_8812(pDesc, pDM_FatTable->antsel_a[macId]);\r
+               //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[8821A] SetTxAntByTxInfo_WIN: MacID=%d, antsel_tr_mux=3'b%d%d%d\n", \r
+                       //macId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId]));\r
+               #endif\r
+       }\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8188E)\r
+       {\r
+               #if (RTL8188E_SUPPORT == 1)\r
+               SET_TX_DESC_ANTSEL_A_88E(pDesc, pDM_FatTable->antsel_a[macId]);\r
+               SET_TX_DESC_ANTSEL_B_88E(pDesc, pDM_FatTable->antsel_b[macId]);\r
+               SET_TX_DESC_ANTSEL_C_88E(pDesc, pDM_FatTable->antsel_c[macId]);\r
+               //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[8188E] SetTxAntByTxInfo_WIN: MacID=%d, antsel_tr_mux=3'b%d%d%d\n", \r
+                       //macId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId]));\r
+               #endif\r
+       }\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8192E)\r
+       {\r
+\r
+       \r
+       }\r
+}\r
+#else// (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+\r
+VOID\r
+ODM_SetTxAntByTxInfo(\r
+       //IN            PDM_ODM_T               pDM_Odm,\r
+       struct  rtl8192cd_priv          *priv,\r
+       struct  tx_desc                 *pdesc,\r
+       struct  tx_insn                 *txcfg,\r
+       unsigned short                  aid     \r
+)\r
+{\r
+       pFAT_T          pDM_FatTable = &priv->pshare->_dmODM.DM_FatTable;\r
+       u4Byte          SupportICType=priv->pshare->_dmODM.SupportICType;\r
+\r
+       if(SupportICType == ODM_RTL8881A)\r
+       {\r
+               //panic_printk("[%s] [%d]   ******ODM_SetTxAntByTxInfo_8881E******   \n",__FUNCTION__,__LINE__);        \r
+               pdesc->Dword6 &= set_desc(~ (BIT(18)|BIT(17)|BIT(16))); \r
+               pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_a[aid]<<16);\r
+       }\r
+       else if(SupportICType == ODM_RTL8192E)\r
+       {\r
+               //panic_printk("[%s] [%d]   ******ODM_SetTxAntByTxInfo_8192E******   \n",__FUNCTION__,__LINE__);        \r
+               pdesc->Dword6 &= set_desc(~ (BIT(18)|BIT(17)|BIT(16))); \r
+               pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_a[aid]<<16);\r
+       }\r
+       else if(SupportICType == ODM_RTL8812)\r
+       {\r
+               //3 [path-A]\r
+               //panic_printk("[%s] [%d]   ******ODM_SetTxAntByTxInfo_8881E******   \n",__FUNCTION__,__LINE__);\r
+                       \r
+               pdesc->Dword6 &= set_desc(~ BIT(16));\r
+               pdesc->Dword6 &= set_desc(~ BIT(17));\r
+               pdesc->Dword6 &= set_desc(~ BIT(18));\r
+               if(txcfg->pstat)\r
+               {\r
+                       pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_a[aid]<<16);\r
+                       pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_b[aid]<<17);\r
+                       pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_c[aid]<<18);\r
+               }\r
+       }\r
+}\r
+#endif\r
+\r
+\r
+VOID\r
+ODM_AntDiv_Config(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+       pFAT_T                  pDM_FatTable = &pDM_Odm->DM_FatTable;\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("WIN Config Antenna Diversity\n"));\r
+               if(pDM_Odm->SupportICType==ODM_RTL8723B)\r
+               {\r
+                       if((!pDM_Odm->DM_SWAT_Table.ANTA_ON || !pDM_Odm->DM_SWAT_Table.ANTB_ON))\r
+                               pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\r
+               }\r
+#elif (DM_ODM_SUPPORT_TYPE & (ODM_CE))\r
+\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("CE Config Antenna Diversity\n"));\r
+               //if(pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT)\r
+               //{\r
+                       //pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;\r
+               //}\r
+               \r
+               if(pDM_Odm->SupportICType==ODM_RTL8723B)\r
+               {\r
+                       pDM_Odm->AntDivType = S0S1_SW_ANTDIV;\r
+               }       \r
+\r
+#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))\r
+\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("AP Config Antenna Diversity\n"));\r
+\r
+       //2 [ NOT_SUPPORT_ANTDIV ]\r
+       #if(defined(CONFIG_NOT_SUPPORT_ANTDIV)) \r
+               pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Disable AntDiv function] : Not Support 2.4G & 5G Antenna Diversity\n"));\r
+               \r
+               //2 [ 2G&5G_SUPPORT_ANTDIV ]\r
+       #elif(defined(CONFIG_2G5G_SUPPORT_ANTDIV))\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Enable AntDiv function] : 2.4G & 5G Support Antenna Diversity Simultaneously \n"));\r
+               pDM_FatTable->AntDiv_2G_5G = (ODM_ANTDIV_2G|ODM_ANTDIV_5G);\r
+\r
+               if(pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT)\r
+                       pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;\r
+               if(*pDM_Odm->pBandType == ODM_BAND_5G )\r
+               {\r
+                               #if ( defined(CONFIG_5G_CGCS_RX_DIVERSITY) )\r
+                                       pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV; \r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n"));\r
+                                       panic_printk("[ 5G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n");\r
+                               #elif( defined(CONFIG_5G_CG_TRX_DIVERSITY) )\r
+                                       pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CG_TRX_HW_ANTDIV\n"));                             \r
+                                       panic_printk("[ 5G] : AntDiv Type = CG_TRX_HW_ANTDIV\n");\r
+                               #elif( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) )\r
+                                       pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CG_SMART_ANTDIV\n"));\r
+                               #elif( defined(CONFIG_5G_S0S1_SW_ANT_DIVERSITY) )\r
+                                       pDM_Odm->AntDivType = S0S1_SW_ANTDIV;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = S0S1_SW_ANTDIV\n"));\r
+                               #endif\r
+               }               \r
+               else if(*pDM_Odm->pBandType == ODM_BAND_2_4G )\r
+                {\r
+                               #if ( defined(CONFIG_2G_CGCS_RX_DIVERSITY) )\r
+                                               pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;\r
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n"));          \r
+                               #elif( defined(CONFIG_2G_CG_TRX_DIVERSITY) )\r
+                                               pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\r
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CG_TRX_HW_ANTDIV\n"));\r
+                               #elif( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )\r
+                                               pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;\r
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CG_SMART_ANTDIV\n"));\r
+                               #elif( defined(CONFIG_2G_S0S1_SW_ANT_DIVERSITY) )\r
+                                       pDM_Odm->AntDivType = S0S1_SW_ANTDIV;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = S0S1_SW_ANTDIV\n"));\r
+                               #endif\r
+               }\r
+               \r
+               //2 [ 5G_SUPPORT_ANTDIV ]\r
+       #elif(defined(CONFIG_5G_SUPPORT_ANTDIV))\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Enable AntDiv function] : Only 5G Support Antenna Diversity\n"));\r
+               panic_printk("[ Enable AntDiv function] : Only 5G Support Antenna Diversity\n");\r
+               pDM_FatTable->AntDiv_2G_5G = (ODM_ANTDIV_5G);\r
+               if(*pDM_Odm->pBandType == ODM_BAND_5G )\r
+               {\r
+                               if(pDM_Odm->SupportICType & ODM_ANTDIV_5G_SUPPORT_IC)\r
+                               pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;      \r
+                               #if ( defined(CONFIG_5G_CGCS_RX_DIVERSITY) )\r
+                                       pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n"));\r
+                                       panic_printk("[ 5G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n");\r
+                               #elif( defined(CONFIG_5G_CG_TRX_DIVERSITY) )\r
+                                       pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\r
+                                       panic_printk("[ 5G] : AntDiv Type = CG_TRX_HW_ANTDIV\n");\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CG_TRX_HW_ANTDIV\n"));\r
+                               #elif( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) )\r
+                                       pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CG_SMART_ANTDIV\n"));\r
+                               #elif( defined(CONFIG_5G_S0S1_SW_ANT_DIVERSITY) )\r
+                                       pDM_Odm->AntDivType = S0S1_SW_ANTDIV;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = S0S1_SW_ANTDIV\n"));\r
+                               #endif\r
+               }\r
+               else if(*pDM_Odm->pBandType == ODM_BAND_2_4G )\r
+               {\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Not Support 2G AntDivType\n"));\r
+                               pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\r
+               }\r
+               \r
+               //2 [ 2G_SUPPORT_ANTDIV ]\r
+       #elif(defined(CONFIG_2G_SUPPORT_ANTDIV)) \r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Enable AntDiv function] : Only 2.4G Support Antenna Diversity\n"));\r
+               pDM_FatTable->AntDiv_2G_5G = (ODM_ANTDIV_2G);\r
+               if(*pDM_Odm->pBandType == ODM_BAND_2_4G )\r
+               {\r
+                               if(pDM_Odm->SupportICType & ODM_ANTDIV_2G_SUPPORT_IC)\r
+                                       pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;\r
+                               #if ( defined(CONFIG_2G_CGCS_RX_DIVERSITY) )\r
+                                       pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n"));          \r
+                               #elif( defined(CONFIG_2G_CG_TRX_DIVERSITY) )\r
+                                       pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CG_TRX_HW_ANTDIV\n"));\r
+                               #elif( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )\r
+                                       pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CG_SMART_ANTDIV\n"));\r
+                               #elif( defined(CONFIG_2G_S0S1_SW_ANT_DIVERSITY) )\r
+                                       pDM_Odm->AntDivType = S0S1_SW_ANTDIV;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = S0S1_SW_ANTDIV\n"));\r
+                               #endif\r
+               }\r
+               else if(*pDM_Odm->pBandType == ODM_BAND_5G )\r
+               {\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Not Support 5G AntDivType\n"));\r
+                               pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\r
+               }\r
+       #endif          \r
+#endif\r
+\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SupportAbility = (( %x ))\n", pDM_Odm->SupportAbility ));\r
+\r
+}\r
+\r
+\r
+VOID\r
+ODM_AntDivTimers(\r
+       IN PDM_ODM_T    pDM_Odm,\r
+       IN u1Byte                       state\r
+       )\r
+{\r
+       if(state==INIT_ANTDIV_TIMMER)\r
+       {\r
+               #if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)\r
+                       ODM_InitializeTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B,\r
+                       (RT_TIMER_CALL_BACK)ODM_SW_AntDiv_Callback, NULL, "SwAntennaSwitchTimer_8723B");\r
+               #elif (RTL8188E_SUPPORT == 1)\r
+                       #if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+                       ODM_InitializeTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer,\r
+                       (RT_TIMER_CALL_BACK)odm_FastAntTrainingCallback, NULL, "FastAntTrainingTimer");\r
+                       #endif\r
+               #endif\r
+       }\r
+       else if(state==CANCEL_ANTDIV_TIMMER)\r
+       {\r
+               #if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)\r
+                       ODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B);\r
+               #elif (RTL8188E_SUPPORT == 1)\r
+                       #if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+                       ODM_CancelTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer);\r
+                       #endif\r
+               #endif\r
+       }\r
+       else if(state==RELEASE_ANTDIV_TIMMER)\r
+       {\r
+               #if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)\r
+                       ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B);\r
+               #elif (RTL8188E_SUPPORT == 1)\r
+                       #if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+                       ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer);\r
+                       #endif\r
+               #endif\r
+       }\r
+\r
+}\r
+\r
+#endif //#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))\r
+\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDiv.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_AntDiv.h
new file mode 100755 (executable)
index 0000000..1e88e11
--- /dev/null
@@ -0,0 +1,217 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __PHYDMANTDIV_H__\r
+#define    __PHYDMANTDIV_H__\r
+\r
+#define ANTDIV_VERSION "1.0"\r
+\r
+#define ANT1_2G 0 // = ANT2_5G\r
+#define ANT2_2G 1 // = ANT1_5G\r
+\r
+//Antenna Diversty Control Type\r
+#define        ODM_AUTO_ANT    0\r
+#define        ODM_FIX_MAIN_ANT        1\r
+#define        ODM_FIX_AUX_ANT 2\r
+\r
+#define        TX_BY_REG       0\r
+\r
+#if (DM_ODM_SUPPORT_TYPE != ODM_AP)\r
+#define ODM_RTL8881A 0   //Just for windows driver to jointly use ODM-driver\r
+#endif\r
+\r
+#define ODM_ANTDIV_SUPPORT             (ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8821|ODM_RTL8881A|ODM_RTL8812)\r
+#define ODM_N_ANTDIV_SUPPORT           (ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B)\r
+#define ODM_AC_ANTDIV_SUPPORT          (ODM_RTL8821|ODM_RTL8881A|ODM_RTL8812)\r
+#define ODM_SMART_ANT_SUPPORT          (ODM_RTL8188E|ODM_RTL8192E)\r
+\r
+#define ODM_OLD_IC_ANTDIV_SUPPORT              (ODM_RTL8723A|ODM_RTL8192C|ODM_RTL8192D)\r
+\r
+#define ODM_ANTDIV_2G_SUPPORT_IC                       (ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8881A)\r
+#define ODM_ANTDIV_5G_SUPPORT_IC                       (ODM_RTL8821|ODM_RTL8881A|ODM_RTL8812)\r
+#define ODM_ANTDIV_2G  BIT0\r
+#define ODM_ANTDIV_5G  BIT1\r
+\r
+#define ANTDIV_ON 1\r
+#define ANTDIV_OFF 0\r
+\r
+#define INIT_ANTDIV_TIMMER 0\r
+#define CANCEL_ANTDIV_TIMMER 1\r
+#define RELEASE_ANTDIV_TIMMER 2\r
+\r
+VOID\r
+ODM_StopAntennaSwitchDm(\r
+       IN      PDM_ODM_T       pDM_Odm\r
+       );\r
+VOID\r
+ODM_SetAntConfig(\r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       IN      u1Byte          antSetting      // 0=A, 1=B, 2=C, ....\r
+       );\r
+\r
+\r
+\r
+#define SwAntDivRestAfterLink  ODM_SwAntDivRestAfterLink\r
+VOID ODM_SwAntDivRestAfterLink(        IN      PDM_ODM_T       pDM_Odm);\r
+\r
+#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))\r
+\r
+VOID\r
+ODM_UpdateRxIdleAnt(\r
+       IN              PDM_ODM_T               pDM_Odm, \r
+       IN               u1Byte                 Ant\r
+);\r
+\r
+VOID\r
+odm_AntselStatistics(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              u1Byte                  antsel_tr_mux,\r
+       IN              u4Byte                  MacId,\r
+       IN              u4Byte                  RxPWDBAll\r
+);\r
+\r
+#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+VOID\r
+ODM_SW_AntDiv_Callback(\r
+       IN      PRT_TIMER                       pTimer\r
+);\r
+\r
+VOID\r
+ODM_SW_AntDiv_WorkitemCallback(\r
+    IN PVOID            pContext\r
+    );\r
+\r
+\r
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+\r
+VOID\r
+ODM_SW_AntDiv_Callback(void *FunctionContext);\r
+\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+VOID\r
+odm_S0S1_SwAntDivByCtrlFrame(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              u1Byte                  Step\r
+       );\r
+\r
+VOID\r
+odm_AntselStatisticsOfCtrlFrame(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              u1Byte                  antsel_tr_mux,\r
+       IN              u4Byte                  RxPWDBAll\r
+);\r
+\r
+VOID\r
+odm_S0S1_SwAntDivByCtrlFrame_ProcessRSSI(\r
+       IN              PDM_ODM_T                               pDM_Odm,\r
+       IN              PODM_PHY_INFO_T         pPhyInfo,\r
+       IN              PODM_PACKET_INFO_T              pPktinfo\r
+       );\r
+\r
+#endif  //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+#endif\r
+\r
+#if(RTL8188E_SUPPORT == 1  || RTL8192E_SUPPORT == 1)\r
+#if ( !(DM_ODM_SUPPORT_TYPE == ODM_CE))\r
+VOID\r
+odm_FastAntTraining(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+);\r
+\r
+VOID\r
+odm_FastAntTrainingCallback(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+);\r
+\r
+VOID\r
+odm_FastAntTrainingWorkItemCallback(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+);\r
+#endif\r
+#endif\r
+\r
+VOID\r
+ODM_AntDivInit(\r
+       IN               PDM_ODM_T              pDM_Odm \r
+);\r
+\r
+VOID\r
+ODM_AntDivReset(\r
+       IN              PDM_ODM_T               pDM_Odm \r
+);\r
+\r
+VOID\r
+ODM_AntDiv(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+);\r
+\r
+VOID\r
+ODM_Process_RSSIForAntDiv(     \r
+       IN OUT  PDM_ODM_T                                       pDM_Odm,\r
+       IN              PODM_PHY_INFO_T                         pPhyInfo,\r
+       IN              PODM_PACKET_INFO_T                      pPktinfo\r
+);\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+VOID\r
+ODM_SetTxAntByTxInfo(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              pu1Byte                 pDesc,\r
+       IN              u1Byte                  macId   \r
+);\r
+\r
+#else// (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+VOID\r
+ODM_SetTxAntByTxInfo(\r
+       //IN            PDM_ODM_T               pDM_Odm,\r
+       struct  rtl8192cd_priv          *priv,\r
+       struct  tx_desc                 *pdesc,\r
+       struct  tx_insn                 *txcfg,\r
+       unsigned short                  aid     \r
+);\r
+\r
+#endif\r
+\r
+\r
+VOID\r
+ODM_AntDiv_Config(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+);\r
+\r
+\r
+VOID\r
+ODM_UpdateRxIdleAnt_8723B(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              u1Byte                  Ant,\r
+       IN              u4Byte                  DefaultAnt, \r
+       IN              u4Byte                  OptionalAnt\r
+);\r
+\r
+VOID\r
+ODM_AntDivTimers(\r
+       IN PDM_ODM_T    pDM_Odm,\r
+       IN u1Byte                       state\r
+);\r
+\r
+#endif //#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))\r
+#endif //#ifndef       __ODMANTDIV_H__\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_CfoTracking.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_CfoTracking.c
new file mode 100755 (executable)
index 0000000..489bc49
--- /dev/null
@@ -0,0 +1,357 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *                                        
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+#include "Mp_Precomp.h"
+#include "phydm_precomp.h"
+
+VOID
+odm_SetCrystalCap(
+       IN              PVOID                                   pDM_VOID,
+       IN              u1Byte                                  CrystalCap
+)
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PCFO_TRACKING                           pCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);
+       BOOLEAN                                         bEEPROMCheck;
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       PADAPTER                                        Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE                           *pHalData = GET_HAL_DATA(Adapter);
+
+       bEEPROMCheck = (pHalData->EEPROMVersion >= 0x01)?TRUE:FALSE;
+#else
+       bEEPROMCheck = TRUE;
+#endif
+
+       if(pCfoTrack->CrystalCap == CrystalCap)
+               return;
+
+       pCfoTrack->CrystalCap = CrystalCap;
+
+       if(pDM_Odm->SupportICType & ODM_RTL8192D)
+       {
+               ODM_SetBBReg(pDM_Odm, REG_AFE_XTAL_CTRL, 0x000000F0, CrystalCap & 0x0F);
+               ODM_SetBBReg(pDM_Odm, REG_AFE_PLL_CTRL, 0xF0000000, ((CrystalCap & 0xF0) >> 4));
+       }
+       else if(pDM_Odm->SupportICType & ODM_RTL8188E)
+       {
+               // write 0x24[22:17] = 0x24[16:11] = CrystalCap
+               CrystalCap = CrystalCap & 0x3F;
+               ODM_SetBBReg(pDM_Odm, REG_AFE_XTAL_CTRL, 0x007ff800, (CrystalCap | (CrystalCap << 6)));
+       }
+       else if(pDM_Odm->SupportICType & ODM_RTL8812)
+       {
+               // write 0x2C[30:25] = 0x2C[24:19] = CrystalCap
+               CrystalCap = CrystalCap & 0x3F;
+               ODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0x7FF80000, (CrystalCap | (CrystalCap << 6)));
+       }       
+       else if (((pDM_Odm->SupportICType & ODM_RTL8723A) && bEEPROMCheck) ||
+               (pDM_Odm->SupportICType & ODM_RTL8723B) ||(pDM_Odm->SupportICType & ODM_RTL8192E) ||
+               (pDM_Odm->SupportICType & ODM_RTL8821))
+       {
+               // 0x2C[23:18] = 0x2C[17:12] = CrystalCap
+               CrystalCap = CrystalCap & 0x3F;
+               ODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0x00FFF000, (CrystalCap | (CrystalCap << 6)));  
+       }
+       else if(pDM_Odm->SupportICType & ODM_RTL8821B)
+       {
+               // write 0x28[6:1] = 0x24[30:25] = CrystalCap
+               CrystalCap = CrystalCap & 0x3F;
+               ODM_SetBBReg(pDM_Odm, REG_AFE_XTAL_CTRL, 0x7E000000, CrystalCap);
+               ODM_SetBBReg(pDM_Odm, REG_AFE_PLL_CTRL, 0x7E, CrystalCap);      
+       }
+       else if(pDM_Odm->SupportICType & ODM_RTL8814A)
+       {
+               // write 0x2C[26:21] = 0x2C[20:15] = CrystalCap
+               CrystalCap = CrystalCap & 0x3F;
+               ODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0x07FF8000, (CrystalCap | (CrystalCap << 6)));
+       }
+       else 
+       {
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("odm_SetCrystalCap(): Use default setting.\n"));
+               ODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6)));
+       }
+
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("odm_SetCrystalCap(): CrystalCap = 0x%x\n", CrystalCap));
+}
+
+u1Byte
+odm_GetDefaultCrytaltalCap(
+       IN              PVOID                                   pDM_VOID
+)
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       u1Byte                                          CrystalCap = 0x20;
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       PADAPTER                                        Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE                           *pHalData = GET_HAL_DATA(Adapter);
+
+       CrystalCap = pHalData->CrystalCap;
+#else
+       prtl8192cd_priv priv            = pDM_Odm->priv;
+
+       if(priv->pmib->dot11RFEntry.xcap > 0)
+               CrystalCap = priv->pmib->dot11RFEntry.xcap;
+#endif
+
+       CrystalCap = CrystalCap & 0x3f;
+
+       return CrystalCap;
+}
+
+VOID
+odm_SetATCStatus(
+       IN              PVOID                                   pDM_VOID,
+       IN              BOOLEAN                                 ATCStatus
+)
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PCFO_TRACKING                           pCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);
+
+       if(pCfoTrack->bATCStatus == ATCStatus)
+               return;
+       
+       ODM_SetBBReg(pDM_Odm, ODM_REG(BB_ATC,pDM_Odm), ODM_BIT(BB_ATC,pDM_Odm), ATCStatus);
+       pCfoTrack->bATCStatus = ATCStatus;
+}
+
+BOOLEAN
+odm_GetATCStatus(
+       IN              PVOID                                   pDM_VOID
+)
+{
+       BOOLEAN                                         ATCStatus;
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+
+       ATCStatus = (BOOLEAN)ODM_GetBBReg(pDM_Odm, ODM_REG(BB_ATC,pDM_Odm), ODM_BIT(BB_ATC,pDM_Odm));
+       return ATCStatus;
+}
+
+VOID
+ODM_CfoTrackingReset(
+       IN              PVOID                                   pDM_VOID
+)
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PCFO_TRACKING                           pCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);
+       u1Byte                                          CrystalCap;
+
+       pCfoTrack->DefXCap = odm_GetDefaultCrytaltalCap(pDM_Odm);
+       pCfoTrack->bAdjust = TRUE;
+       
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       odm_SetCrystalCap(pDM_Odm, pCfoTrack->DefXCap);
+       odm_SetATCStatus(pDM_Odm, TRUE);
+#else
+       if(pCfoTrack->CrystalCap > pCfoTrack->DefXCap)
+       {
+               for(CrystalCap = pCfoTrack->CrystalCap; CrystalCap >= pCfoTrack->DefXCap; CrystalCap--)
+                       odm_SetCrystalCap(pDM_Odm, CrystalCap);
+       }
+       else
+       {
+               for(CrystalCap = pCfoTrack->CrystalCap; CrystalCap <= pCfoTrack->DefXCap; CrystalCap++)
+                       odm_SetCrystalCap(pDM_Odm, CrystalCap);
+       }
+#endif
+}
+
+VOID
+ODM_CfoTrackingInit(
+       IN              PVOID                                   pDM_VOID
+)
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PCFO_TRACKING                           pCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);
+      
+       pCfoTrack->DefXCap = pCfoTrack->CrystalCap = odm_GetDefaultCrytaltalCap(pDM_Odm);
+       pCfoTrack->bATCStatus = odm_GetATCStatus(pDM_Odm);
+       pCfoTrack->bAdjust = TRUE;
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking_init()=========> \n"));
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking_init(): bATCStatus = %d, CrystalCap = 0x%x \n",pCfoTrack->bATCStatus, pCfoTrack->DefXCap));
+}
+
+VOID
+ODM_CfoTracking(
+       IN              PVOID                                   pDM_VOID
+)
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PCFO_TRACKING                           pCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);
+       int                                                     CFO_kHz_A, CFO_kHz_B, CFO_ave = 0;
+       int                                                     CFO_ave_diff;
+       int                                                     CrystalCap = (int)pCfoTrack->CrystalCap;
+       u1Byte                                          Adjust_Xtal = 1;
+
+       //4 Support ability
+       if(!(pDM_Odm->SupportAbility & ODM_BB_CFO_TRACKING))
+       {
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Return: SupportAbility ODM_BB_CFO_TRACKING is disabled\n"));
+               return;
+       }
+
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking()=========> \n"));
+
+       if(!pDM_Odm->bLinked || !pDM_Odm->bOneEntryOnly)
+       {       
+               //4 No link or more than one entry
+               ODM_CfoTrackingReset(pDM_Odm);
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Reset: bLinked = %d, bOneEntryOnly = %d\n", 
+                       pDM_Odm->bLinked, pDM_Odm->bOneEntryOnly));
+       }
+       else
+       {
+               //3 1. CFO Tracking
+               //4 1.1 No new packet
+               if(pCfoTrack->packetCount == pCfoTrack->packetCount_pre)
+               {
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): packet counter doesn't change\n"));
+                       return;
+               }
+               pCfoTrack->packetCount_pre = pCfoTrack->packetCount;
+       
+               //4 1.2 Calculate CFO
+               CFO_kHz_A =  (int)(pCfoTrack->CFO_tail[0] * 3125)  / 1280;
+               CFO_kHz_B =  (int)(pCfoTrack->CFO_tail[1] * 3125)  / 1280;
+               
+               if(pDM_Odm->RFType < ODM_2T2R)
+                       CFO_ave = CFO_kHz_A;
+               else
+                       CFO_ave = (int)(CFO_kHz_A + CFO_kHz_B) >> 1;
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): CFO_kHz_A = %dkHz, CFO_kHz_B = %dkHz, CFO_ave = %dkHz\n", 
+                                               CFO_kHz_A, CFO_kHz_B, CFO_ave));
+
+               //4 1.3 Avoid abnormal large CFO
+               CFO_ave_diff = (pCfoTrack->CFO_ave_pre >= CFO_ave)?(pCfoTrack->CFO_ave_pre - CFO_ave):(CFO_ave - pCfoTrack->CFO_ave_pre);
+               if(CFO_ave_diff > 20 && pCfoTrack->largeCFOHit == 0 && !pCfoTrack->bAdjust)
+               {
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): first large CFO hit\n"));
+                       pCfoTrack->largeCFOHit = 1;
+                       return;
+               }
+               else
+                       pCfoTrack->largeCFOHit = 0;
+               pCfoTrack->CFO_ave_pre = CFO_ave;
+
+               //4 1.4 Dynamic Xtal threshold
+               if(pCfoTrack->bAdjust == FALSE)
+               {
+                       if(CFO_ave > CFO_TH_XTAL_HIGH || CFO_ave < (-CFO_TH_XTAL_HIGH))
+                               pCfoTrack->bAdjust = TRUE;
+               }
+               else
+               {
+                       if(CFO_ave < CFO_TH_XTAL_LOW && CFO_ave > (-CFO_TH_XTAL_LOW))
+                               pCfoTrack->bAdjust = FALSE;
+               }
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+               //4 1.5 BT case: Disable CFO tracking
+               if(pDM_Odm->bBtEnabled)
+               {
+                       pCfoTrack->bAdjust = FALSE;
+                       odm_SetCrystalCap(pDM_Odm, pCfoTrack->DefXCap);
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Disable CFO tracking for BT!!\n"));
+               }
+
+               //4 1.6 Big jump 
+               if(pCfoTrack->bAdjust)
+               {
+                       if(CFO_ave > CFO_TH_XTAL_LOW)
+                               Adjust_Xtal =  Adjust_Xtal + ((CFO_ave - CFO_TH_XTAL_LOW) >> 2);
+                       else if(CFO_ave < (-CFO_TH_XTAL_LOW))
+                               Adjust_Xtal =  Adjust_Xtal + ((CFO_TH_XTAL_LOW - CFO_ave) >> 2);
+
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Crystal cap offset = %d\n", Adjust_Xtal));
+               }
+#endif
+
+               //4 1.7 Adjust Crystal Cap.
+               if(pCfoTrack->bAdjust)
+               {
+                       if(CFO_ave > CFO_TH_XTAL_LOW)
+                               CrystalCap = CrystalCap + Adjust_Xtal;
+                       else if(CFO_ave < (-CFO_TH_XTAL_LOW))
+                               CrystalCap = CrystalCap - Adjust_Xtal;
+
+                       if(CrystalCap > 0x3f)
+                               CrystalCap = 0x3f;
+                       else if (CrystalCap < 0)
+                               CrystalCap = 0;
+
+                       odm_SetCrystalCap(pDM_Odm, (u1Byte)CrystalCap);
+               }
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Crystal cap = 0x%x, Default Crystal cap = 0x%x\n", 
+                       pCfoTrack->CrystalCap, pCfoTrack->DefXCap));
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+               if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+                       return;
+               
+               //3 2. Dynamic ATC switch
+               if(CFO_ave < CFO_TH_ATC && CFO_ave > -CFO_TH_ATC)
+               {
+                       odm_SetATCStatus(pDM_Odm, FALSE);
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Disable ATC!!\n"));
+               }
+               else
+               {
+                       odm_SetATCStatus(pDM_Odm, TRUE);
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Enable ATC!!\n"));
+               }
+#endif
+       }
+}
+
+VOID
+ODM_ParsingCFO(
+       IN              PVOID                   pDM_VOID,
+       IN              PVOID                   pPktinfo_VOID,
+       IN              s1Byte*                         pcfotail
+       )
+{
+       PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PODM_PACKET_INFO_T              pPktinfo = (PODM_PACKET_INFO_T)pPktinfo_VOID;
+       PCFO_TRACKING                   pCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);
+       u1Byte                                  i;
+
+       if(!(pDM_Odm->SupportAbility & ODM_BB_CFO_TRACKING))
+               return;
+
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       if(pPktinfo->bPacketMatchBSSID)
+#else
+       if(pPktinfo->StationID != 0)
+#endif
+       {                               
+               //3 Update CFO report for path-A & path-B
+               // Only paht-A and path-B have CFO tail and short CFO
+               for(i = ODM_RF_PATH_A; i <= ODM_RF_PATH_B; i++)   
+               {
+                       pCfoTrack->CFO_tail[i] = (int)pcfotail[i];
+               }
+
+               //3 Update packet counter
+               if(pCfoTrack->packetCount == 0xffffffff)
+                       pCfoTrack->packetCount = 0;
+               else
+                       pCfoTrack->packetCount++;
+       }
+}
+
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_CfoTracking.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_CfoTracking.h
new file mode 100755 (executable)
index 0000000..77e0a4b
--- /dev/null
@@ -0,0 +1,68 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *                                        
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+#ifndef        __PHYDMCFOTRACK_H__
+#define    __PHYDMCFOTRACK_H__
+
+#define CFO_TRACKING_VERSION   "1.0"
+
+#define                CFO_TH_XTAL_HIGH                        20                      // kHz
+#define                CFO_TH_XTAL_LOW                 10                      // kHz
+#define                CFO_TH_ATC                                      80                      // kHz
+
+typedef struct _CFO_TRACKING_
+{
+       BOOLEAN                 bATCStatus;
+       BOOLEAN                 largeCFOHit;
+       BOOLEAN                 bAdjust;
+       u1Byte                  CrystalCap;
+       u1Byte                  DefXCap;
+       int                             CFO_tail[2];
+       int                             CFO_ave_pre;
+       u4Byte                  packetCount;
+       u4Byte                  packetCount_pre;
+
+       BOOLEAN                 bForceXtalCap;
+       BOOLEAN                 bReset;
+}CFO_TRACKING, *PCFO_TRACKING;
+
+VOID
+ODM_CfoTrackingReset(
+       IN              PVOID                                   pDM_VOID
+);
+
+VOID
+ODM_CfoTrackingInit(
+       IN              PVOID                                   pDM_VOID
+);
+
+VOID
+ODM_CfoTracking(
+       IN              PVOID                                   pDM_VOID
+);
+
+VOID
+ODM_ParsingCFO(
+       IN              PVOID                                   pDM_VOID,
+       IN              PVOID                                   pPktinfo_VOID,
+       IN      s1Byte*                                         pcfotail
+);
+
+#endif
\ No newline at end of file
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DIG.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DIG.c
new file mode 100755 (executable)
index 0000000..4e6304f
--- /dev/null
@@ -0,0 +1,2023 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *                                        
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+//============================================================
+// include files
+//============================================================
+#include "Mp_Precomp.h"
+#include "phydm_precomp.h"
+
+
+VOID
+ODM_ChangeDynamicInitGainThresh(
+       IN      PVOID           pDM_VOID,
+       IN      u4Byte          DM_Type,
+       IN      u4Byte          DM_Value
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                  pDM_DigTable = &pDM_Odm->DM_DigTable;
+
+       if (DM_Type == DIG_TYPE_THRESH_HIGH)
+       {
+               pDM_DigTable->RssiHighThresh = DM_Value;                
+       }
+       else if (DM_Type == DIG_TYPE_THRESH_LOW)
+       {
+               pDM_DigTable->RssiLowThresh = DM_Value;
+       }
+       else if (DM_Type == DIG_TYPE_ENABLE)
+       {
+               pDM_DigTable->Dig_Enable_Flag   = TRUE;
+       }       
+       else if (DM_Type == DIG_TYPE_DISABLE)
+       {
+               pDM_DigTable->Dig_Enable_Flag = FALSE;
+       }       
+       else if (DM_Type == DIG_TYPE_BACKOFF)
+       {
+               if(DM_Value > 30)
+                       DM_Value = 30;
+               pDM_DigTable->BackoffVal = (u1Byte)DM_Value;
+       }
+       else if(DM_Type == DIG_TYPE_RX_GAIN_MIN)
+       {
+               if(DM_Value == 0)
+                       DM_Value = 0x1;
+               pDM_DigTable->rx_gain_range_min = (u1Byte)DM_Value;
+       }
+       else if(DM_Type == DIG_TYPE_RX_GAIN_MAX)
+       {
+               if(DM_Value > 0x50)
+                       DM_Value = 0x50;
+               pDM_DigTable->rx_gain_range_max = (u1Byte)DM_Value;
+       }
+}      // DM_ChangeDynamicInitGainThresh //
+
+int 
+getIGIForDiff(int value_IGI)
+{
+       #define ONERCCA_LOW_TH          0x30
+       #define ONERCCA_LOW_DIFF        8
+
+       if (value_IGI < ONERCCA_LOW_TH) {
+               if ((ONERCCA_LOW_TH - value_IGI) < ONERCCA_LOW_DIFF)
+                       return ONERCCA_LOW_TH;
+               else
+                       return value_IGI + ONERCCA_LOW_DIFF;
+       } else {
+               return value_IGI;
+       }
+}
+
+VOID
+odm_FAThresholdCheck(
+       IN              PVOID                   pDM_VOID,
+       IN              BOOLEAN                 bDFSBand,
+       IN              BOOLEAN                 bPerformance,
+       IN              u4Byte                  RxTp,
+       IN              u4Byte                  TxTp,
+       OUT             u4Byte*                 dm_FA_thres
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       
+       if(pDM_Odm->bLinked && (bPerformance||bDFSBand))
+       {
+               if(pDM_Odm->SupportICType == ODM_RTL8192D)
+               {
+                       // 8192D special case
+                       dm_FA_thres[0] = DM_DIG_FA_TH0_92D;
+                       dm_FA_thres[1] = DM_DIG_FA_TH1_92D;
+                       dm_FA_thres[2] = DM_DIG_FA_TH2_92D;
+               }
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+               else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
+               {
+                       // For AP
+                       if((RxTp>>2) > TxTp && RxTp < 10000 && RxTp > 500)                      // 10Mbps & 0.5Mbps
+                       {
+                               dm_FA_thres[0] = 0x080;
+                               dm_FA_thres[1] = 0x100;
+                               dm_FA_thres[2] = 0x200;                 
+                       }
+                       else
+                       {
+                               dm_FA_thres[0] = 0x100;
+                               dm_FA_thres[1] = 0x200;
+                               dm_FA_thres[2] = 0x300; 
+                       }
+               }
+#else
+               else if(pDM_Odm->SupportICType == ODM_RTL8723A && pDM_Odm->bBtLimitedDig)
+               {
+                       // 8723A BT special case
+                       dm_FA_thres[0] = DM_DIG_FA_TH0;
+                       dm_FA_thres[1] = 0x250;
+                       dm_FA_thres[2] = 0x300;
+               }
+#endif
+               else
+               {
+                       // For NIC
+                       dm_FA_thres[0] = DM_DIG_FA_TH0;
+                       dm_FA_thres[1] = DM_DIG_FA_TH1;
+                       dm_FA_thres[2] = DM_DIG_FA_TH2;
+               }
+       }
+       else
+       {
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+               if(bDFSBand)
+               {
+                       // For DFS band and no link
+                       dm_FA_thres[0] = 250;
+                       dm_FA_thres[1] = 1000;
+                       dm_FA_thres[2] = 2000;
+               }
+               else
+#endif
+               {
+                       dm_FA_thres[0] = 2000;
+                       dm_FA_thres[1] = 4000;
+                       dm_FA_thres[2] = 5000;
+               }
+       }
+       return;
+}
+
+u1Byte
+odm_ForbiddenIGICheck(
+       IN              PVOID                   pDM_VOID,
+       IN              u1Byte                  DIG_Dynamic_MIN,
+       IN              u1Byte                  CurrentIGI
+       )
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+       PFALSE_ALARM_STATISTICS         pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
+       u1Byte                                          rx_gain_range_min = pDM_DigTable->rx_gain_range_min;
+
+       if(pFalseAlmCnt->Cnt_all > 10000)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormally false alarm case. \n"));
+
+               if(pDM_DigTable->LargeFAHit != 3)
+                       pDM_DigTable->LargeFAHit++;
+               
+               if(pDM_DigTable->ForbiddenIGI < CurrentIGI)//if(pDM_DigTable->ForbiddenIGI < pDM_DigTable->CurIGValue)
+               {
+                       pDM_DigTable->ForbiddenIGI = CurrentIGI;//pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue;
+                       pDM_DigTable->LargeFAHit = 1;
+               }
+
+               if(pDM_DigTable->LargeFAHit >= 3)
+               {
+                       if((pDM_DigTable->ForbiddenIGI + 2) > pDM_DigTable->rx_gain_range_max)
+                               rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
+                       else
+                               rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2);
+                       pDM_DigTable->Recover_cnt = 1800;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormally false alarm case: Recover_cnt = %d \n", pDM_DigTable->Recover_cnt));
+               }
+       }
+       else
+       {
+               if(pDM_DigTable->Recover_cnt != 0)
+               {
+                       pDM_DigTable->Recover_cnt --;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Recover_cnt = %d \n", pDM_DigTable->Recover_cnt));
+               }
+               else
+               {
+                       if(pDM_DigTable->LargeFAHit < 3)
+                       {
+                               if((pDM_DigTable->ForbiddenIGI - 2) < DIG_Dynamic_MIN) //DM_DIG_MIN)
+                               {
+                                       pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; //DM_DIG_MIN;
+                                       rx_gain_range_min = DIG_Dynamic_MIN; //DM_DIG_MIN;
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: At Lower Bound\n"));
+                               }
+                               else
+                               {
+                                       pDM_DigTable->ForbiddenIGI -= 2;
+                                       rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2);
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Approach Lower Bound\n"));
+                               }
+                       }
+                       else
+                       {
+                               pDM_DigTable->LargeFAHit = 0;
+                       }
+               }
+       }
+       
+       return rx_gain_range_min;
+
+}
+
+VOID
+odm_InbandNoiseCalculate (     
+       IN              PVOID           pDM_VOID
+       )
+{
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+       u1Byte                          IGIBackup, TimeCnt = 0, ValidCnt = 0;
+       BOOLEAN                         bTimeout = TRUE;
+       s1Byte                          sNoise_A, sNoise_B;
+       s4Byte                          NoiseRpt_A = 0,NoiseRpt_B = 0;
+       u4Byte                          tmp = 0;
+       static  u1Byte          failCnt = 0;
+
+       if(!(pDM_Odm->SupportICType & (ODM_RTL8192E)))
+               return;
+
+       if(pDM_Odm->RFType == ODM_1T1R || *(pDM_Odm->pOnePathCCA) != ODM_CCA_2R)
+               return;
+
+       if(!pDM_DigTable->bNoiseEst)
+               return;
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_InbandNoiseEstimate()========>\n"));
+       
+       //1 Set initial gain.
+       IGIBackup = pDM_DigTable->CurIGValue;
+       pDM_DigTable->IGIOffset_A = 0;
+       pDM_DigTable->IGIOffset_B = 0;
+       ODM_Write_DIG(pDM_Odm, 0x24);
+
+       //1 Update idle time power report       
+       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+               ODM_SetBBReg(pDM_Odm, ODM_REG_TX_ANT_CTRL_11N, BIT25, 0x0);
+
+       delay_ms(2);
+
+       //1 Get noise power level
+       while(1)
+       {
+               //2 Read Noise Floor Report
+               if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+                       tmp = ODM_GetBBReg(pDM_Odm, 0x8f8, bMaskLWord);
+
+               sNoise_A = (s1Byte)(tmp & 0xff);
+               sNoise_B = (s1Byte)((tmp & 0xff00)>>8);
+
+               //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("sNoise_A = %d, sNoise_B = %d\n",sNoise_A, sNoise_B));
+
+               if((sNoise_A < 20 && sNoise_A >= -70) && (sNoise_B < 20 && sNoise_B >= -70))
+               {
+                       ValidCnt++;
+                       NoiseRpt_A += sNoise_A;
+                       NoiseRpt_B += sNoise_B;
+                       //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("sNoise_A = %d, sNoise_B = %d\n",sNoise_A, sNoise_B));
+               }
+
+               TimeCnt++;
+               bTimeout = (TimeCnt >= 150)?TRUE:FALSE;
+               
+               if(ValidCnt == 20 || bTimeout)
+                       break;
+
+               delay_ms(2);
+               
+       }
+
+       //1 Keep idle time power report 
+       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+               ODM_SetBBReg(pDM_Odm, ODM_REG_TX_ANT_CTRL_11N, BIT25, 0x1);
+
+       //1 Recover IGI
+       ODM_Write_DIG(pDM_Odm, IGIBackup);
+       
+       //1 Calculate Noise Floor
+       if(ValidCnt != 0)
+       {
+               NoiseRpt_A  /= (ValidCnt<<1);
+               NoiseRpt_B  /= (ValidCnt<<1);
+       }
+       
+       if(bTimeout)
+       {
+               NoiseRpt_A = 0;
+               NoiseRpt_B = 0;
+
+               failCnt ++;
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Noise estimate fail time = %d\n", failCnt));
+               
+               if(failCnt == 3)
+               {
+                       failCnt = 0;
+                       pDM_DigTable->bNoiseEst = FALSE;
+               }
+       }
+       else
+       {
+               NoiseRpt_A = -110 + 0x24 + NoiseRpt_A -6;
+               NoiseRpt_B = -110 + 0x24 + NoiseRpt_B -6;
+               pDM_DigTable->bNoiseEst = FALSE;
+               failCnt = 0;
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("NoiseRpt_A = %d, NoiseRpt_B = %d\n", NoiseRpt_A, NoiseRpt_B));
+       }
+
+       //1 Calculate IGI Offset
+       if(NoiseRpt_A > NoiseRpt_B)
+       {
+               pDM_DigTable->IGIOffset_A = NoiseRpt_A - NoiseRpt_B;
+               pDM_DigTable->IGIOffset_B = 0;
+       }
+       else
+       {
+               pDM_DigTable->IGIOffset_A = 0;
+               pDM_DigTable->IGIOffset_B = NoiseRpt_B - NoiseRpt_A;
+       }
+
+#endif
+       return;
+}
+
+VOID
+odm_DigForBtHsMode(
+       IN              PVOID           pDM_VOID
+       )
+{
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                                  pDM_DigTable=&pDM_Odm->DM_DigTable;
+       u1Byte                                  digForBtHs=0;
+       u1Byte                                  digUpBound=0x5a;
+       
+       if(pDM_Odm->bBtConnectProcess)
+       {
+               if(pDM_Odm->SupportICType&(ODM_RTL8723A))
+                       digForBtHs = 0x28;
+               else
+                       digForBtHs = 0x22;
+       }
+       else
+       {
+               //
+               // Decide DIG value by BT HS RSSI.
+               //
+               digForBtHs = pDM_Odm->btHsRssi+4;
+               
+               //DIG Bound
+               if(pDM_Odm->SupportICType&(ODM_RTL8723A))
+                       digUpBound = 0x3e;
+               
+               if(digForBtHs > digUpBound)
+                       digForBtHs = digUpBound;
+               if(digForBtHs < 0x1c)
+                       digForBtHs = 0x1c;
+
+               // update Current IGI
+               pDM_DigTable->BT30_CurIGI = digForBtHs;
+       }
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DigForBtHsMode() : set DigValue=0x%x\n", digForBtHs));
+#endif
+}
+
+VOID
+ODM_Write_DIG(
+       IN      PVOID                   pDM_VOID,
+       IN      u1Byte                  CurrentIGI
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                  pDM_DigTable = &pDM_Odm->DM_DigTable;
+
+       if(pDM_DigTable->bStopDIG)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Stop Writing IGI\n"));
+               return;
+       }
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_TRACE, ("ODM_REG(IGI_A,pDM_Odm)=0x%x, ODM_BIT(IGI,pDM_Odm)=0x%x \n",
+               ODM_REG(IGI_A,pDM_Odm),ODM_BIT(IGI,pDM_Odm)));
+
+       if(pDM_DigTable->CurIGValue != CurrentIGI)
+       {
+               //1 Check initial gain by upper bound           
+               if(!pDM_DigTable->bPSDInProgress)
+               {
+                       if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
+                       {
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_TRACE, ("CurrentIGI(0x%02x) is larger than upper bound !!\n",CurrentIGI));
+                               CurrentIGI = pDM_DigTable->rx_gain_range_max;
+                       }
+
+               }
+
+               //1 Set IGI value
+               if(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE))
+               { 
+                       ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+
+                       if(pDM_Odm->RFType > ODM_1T1R)
+                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+
+                       if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
+                       {
+                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+                       }
+               }
+               else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
+               {
+                       switch(*(pDM_Odm->pOnePathCCA))
+                       {
+                               case ODM_CCA_2R:
+                                       ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+
+                                       if(pDM_Odm->RFType > ODM_1T1R)
+                                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+                                       
+                                       if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
+                                       {
+                                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+                                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+                                       }
+                                       break;
+                               case ODM_CCA_1R_A:
+                                       ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+                                       if(pDM_Odm->RFType != ODM_1T1R)
+                                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
+                                       break;
+                               case ODM_CCA_1R_B:
+                                       ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
+                                       if(pDM_Odm->RFType != ODM_1T1R)
+                                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+                                       break;
+                       }
+               }
+               pDM_DigTable->CurIGValue = CurrentIGI;
+       }
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_TRACE, ("CurrentIGI(0x%02x). \n",CurrentIGI));
+       
+}
+
+VOID
+odm_PauseDIG(
+       IN              PVOID                                   pDM_VOID,
+       IN              ODM_Pause_DIG_TYPE              PauseType,
+       IN              u1Byte                                  IGIValue
+)
+{
+       PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG()=========>\n"));
+
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)    
+       if(*pDM_DigTable->pbP2pLinkInProgress)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): P2P in progress !!\n"));
+               return;
+       }
+#endif
+
+       if(!pDM_DigTable->bPauseDIG && (!(pDM_Odm->SupportAbility & ODM_BB_DIG) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Return: SupportAbility ODM_BB_DIG or ODM_BB_FA_CNT is disabled\n"));
+               return;
+       }
+       
+       switch(PauseType)
+       {
+               //1 Pause DIG
+               case ODM_PAUSE_DIG:
+                       //2 Disable DIG
+                       ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_DIG));
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Pause DIG !!\n"));
+
+                       //2 Backup IGI value
+                       if(!pDM_DigTable->bPauseDIG)
+                       {
+                               pDM_DigTable->IGIBackup = pDM_DigTable->CurIGValue;
+                               pDM_DigTable->bPauseDIG = TRUE;
+                       }
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Backup IGI  = 0x%x\n", pDM_DigTable->IGIBackup));
+
+                       //2 Write new IGI value
+                       ODM_Write_DIG(pDM_Odm, IGIValue);
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write new IGI = 0x%x\n", IGIValue));
+                       break;
+
+               //1 Resume DIG
+               case ODM_RESUME_DIG:
+                       if(pDM_DigTable->bPauseDIG)
+                       {
+                               //2 Write backup IGI value
+                               ODM_Write_DIG(pDM_Odm, pDM_DigTable->IGIBackup);
+                               pDM_DigTable->bPauseDIG = FALSE;
+                               pDM_DigTable->bIgnoreDIG = TRUE;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write original IGI = 0x%x\n", pDM_DigTable->IGIBackup));
+
+                               //2 Enable DIG
+                               ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_DIG);  
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Resume DIG !!\n"));
+                       }
+                       break;
+
+               default:
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Wrong  type !!\n"));
+                       break;
+       }
+}
+
+BOOLEAN 
+odm_DigAbort(
+       IN              PVOID                   pDM_VOID
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                  pDM_DigTable = &pDM_Odm->DM_DigTable;
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       prtl8192cd_priv priv = pDM_Odm->priv;
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;
+       pRXHP_T                 pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;
+#endif
+
+       //SupportAbility
+       if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_FA_CNT is disabled\n"));
+               return  TRUE;
+       }
+
+       //SupportAbility
+       if(!(pDM_Odm->SupportAbility & ODM_BB_DIG))
+       {       
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_DIG is disabled\n"));
+               return  TRUE;
+       }
+
+       //ScanInProcess
+       if(*(pDM_Odm->pbScanInProcess))
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In Scan Progress \n"));
+               return  TRUE;
+       }
+
+       if(pDM_DigTable->bIgnoreDIG)
+       {
+               pDM_DigTable->bIgnoreDIG = FALSE;
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Ignore DIG \n"));
+               return  TRUE;
+       }
+
+       //add by Neil Chen to avoid PSD is processing
+       if(pDM_Odm->bDMInitialGainEnable == FALSE)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: PSD is Processing \n"));
+               return  TRUE;
+       }
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       #if OS_WIN_FROM_WIN7(OS_VERSION)
+       if(IsAPModeExist( pAdapter) && pAdapter->bInHctTest)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Is AP mode or In HCT Test \n"));
+               return  TRUE;
+       }
+       #endif
+
+       if(pDM_Odm->bBtHsOperation)
+       {
+               odm_DigForBtHsMode(pDM_Odm);
+       }       
+
+       if(!(pDM_Odm->SupportICType &(ODM_RTL8723A|ODM_RTL8188E)))
+       {
+               if(pRX_HP_Table->RXHP_flag == 1)
+               {
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In RXHP Operation \n"));
+                       return  TRUE;   
+               }
+       }
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+       #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV      
+       if((pDM_Odm->bLinked) && (pDM_Odm->Adapter->registrypriv.force_igi !=0))
+       {       
+               printk("pDM_Odm->RSSI_Min=%d \n",pDM_Odm->RSSI_Min);
+               ODM_Write_DIG(pDM_Odm,pDM_Odm->Adapter->registrypriv.force_igi);
+               return  TRUE;
+       }
+       #endif
+#else
+       if (!(priv->up_time > 5))
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Not In DIG Operation Period \n"));
+               return  TRUE;
+       }
+#endif
+
+       return  FALSE;
+}
+
+VOID
+odm_DIGInit(
+       IN              PVOID           pDM_VOID
+       )
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       PFALSE_ALARM_STATISTICS         FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
+#endif
+
+       pDM_DigTable->bStopDIG = FALSE;
+       pDM_DigTable->bPauseDIG = FALSE;
+       pDM_DigTable->bIgnoreDIG = FALSE;
+       pDM_DigTable->bPSDInProgress = FALSE;
+       pDM_DigTable->CurIGValue = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm));
+       pDM_DigTable->RssiLowThresh     = DM_DIG_THRESH_LOW;
+       pDM_DigTable->RssiHighThresh    = DM_DIG_THRESH_HIGH;
+       pDM_DigTable->FALowThresh       = DM_FALSEALARM_THRESH_LOW;
+       pDM_DigTable->FAHighThresh      = DM_FALSEALARM_THRESH_HIGH;
+       pDM_DigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT;
+       pDM_DigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX;
+       pDM_DigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN;
+       pDM_DigTable->PreCCK_CCAThres = 0xFF;
+       pDM_DigTable->CurCCK_CCAThres = 0x83;
+       pDM_DigTable->ForbiddenIGI = DM_DIG_MIN_NIC;
+       pDM_DigTable->LargeFAHit = 0;
+       pDM_DigTable->Recover_cnt = 0;
+       pDM_DigTable->bMediaConnect_0 = FALSE;
+       pDM_DigTable->bMediaConnect_1 = FALSE;
+
+       //To Initialize pDM_Odm->bDMInitialGainEnable == FALSE to avoid DIG error
+       pDM_Odm->bDMInitialGainEnable = TRUE;
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       pDM_DigTable->DIG_Dynamic_MIN_0 = 0x25;
+       pDM_DigTable->DIG_Dynamic_MIN_1 = 0x25;
+
+       // For AP\ ADSL modified DIG
+       pDM_DigTable->bTpTarget = FALSE;
+       pDM_DigTable->bNoiseEst = TRUE;
+       pDM_DigTable->IGIOffset_A = 0;
+       pDM_DigTable->IGIOffset_B = 0;
+       pDM_DigTable->TpTrainTH_min = 0;
+
+       // For RTL8881A
+       FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;
+
+       //Dyanmic EDCCA
+       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+       {
+               ODM_SetBBReg(pDM_Odm, 0xC50, 0xFFFF0000, 0xfafd);
+       }
+#else
+       pDM_DigTable->DIG_Dynamic_MIN_0 = DM_DIG_MIN_NIC;
+       pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC;
+
+       //To Initi BT30 IGI
+       pDM_DigTable->BT30_CurIGI=0x32;
+
+       #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       *pDM_DigTable->pbP2pLinkInProgress= FALSE;
+       #endif
+#endif
+
+       if(pDM_Odm->BoardType & (ODM_BOARD_EXT_PA|ODM_BOARD_EXT_LNA))
+       {
+               pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
+               pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
+       }
+       else
+       {
+               pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
+               pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
+       }
+       
+}
+
+
+VOID 
+odm_DIG(
+       IN              PVOID           pDM_VOID
+       )
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PADAPTER                                        pAdapter        = pDM_Odm->Adapter;
+       HAL_DATA_TYPE                           *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
+#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       prtl8192cd_priv                         priv = pDM_Odm->priv;
+       PSTA_INFO_T                             pEntry;
+#endif
+
+       // Common parameters
+       pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+       PFALSE_ALARM_STATISTICS         pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
+       BOOLEAN                                         FirstConnect,FirstDisConnect;
+       u1Byte                                          DIG_MaxOfMin, DIG_Dynamic_MIN;
+       u1Byte                                          dm_dig_max, dm_dig_min;
+       u1Byte                                          CurrentIGI = pDM_DigTable->CurIGValue;
+       u1Byte                                          offset;
+       u4Byte                                          dm_FA_thres[3];
+       u1Byte                                          Adap_IGI_Upper = 0;
+       u4Byte                                          TxTp = 0, RxTp = 0;
+       BOOLEAN                                         bDFSBand = FALSE;
+       BOOLEAN                                         bPerformance = TRUE, bFirstTpTarget = FALSE, bFirstCoverage = FALSE;
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       u4Byte                                          TpTrainTH_MIN = DM_DIG_TP_Target_TH0;
+       static          u1Byte                  TimeCnt = 0;
+       u1Byte                                          i;
+#endif
+
+       if(odm_DigAbort(pDM_Odm) == TRUE)
+               return;
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG()===========================>\n\n"));
+
+       if(pDM_Odm->adaptivity_flag == TRUE)
+               Adap_IGI_Upper = pDM_Odm->Adaptivity_IGI_upper;
+       
+
+       //1 Update status
+#if (RTL8192D_SUPPORT==1) 
+       if(pDM_Odm->SupportICType == ODM_RTL8192D)
+       {
+               if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
+               {
+                       if(*(pDM_Odm->pbMasterOfDMSP))
+                       {
+                               DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
+                               FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
+                               FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
+                       }
+                       else
+                       {
+                               DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
+                               FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
+                               FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
+                       }
+               }
+               else
+               {
+                       if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
+                       {
+                               DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
+                               FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
+                               FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
+                       }
+                       else
+                       {
+                               DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
+                               FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
+                               FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
+                       }
+               }
+       }
+       else
+#endif
+       {       
+               DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
+               FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
+               FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
+       }
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       //1 Noise Floor Estimate
+       //pDM_DigTable->bNoiseEst = (FirstConnect)?TRUE:pDM_DigTable->bNoiseEst;
+       //odm_InbandNoiseCalculate (pDM_Odm);
+       
+       //1 Mode decision
+       if(pDM_Odm->bLinked)
+       {
+               //2 Calculate total TP
+               for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
+               {
+                       pEntry = pDM_Odm->pODM_StaInfo[i];
+                       if(IS_STA_VALID(pEntry))
+                       {
+                               RxTp += (u4Byte)(pEntry->rx_byte_cnt_LowMAW>>7);
+                               TxTp += (u4Byte)(pEntry->tx_byte_cnt_LowMAW>>7);                        //Kbps
+                       }
+               }
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TX TP = %dkbps, RX TP = %dkbps\n", TxTp, RxTp));
+       }
+
+       switch(pDM_Odm->priv->pshare->rf_ft_var.dig_cov_enable)
+       {
+               case 0:
+               {
+                       bPerformance = TRUE;
+                       break;
+               }
+               case 1:
+               {
+                       bPerformance = FALSE;
+                       break;
+               }
+               case 2:
+               {
+                       if(pDM_Odm->bLinked)
+                       {
+                               if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH0)
+                                       TpTrainTH_MIN = pDM_DigTable->TpTrainTH_min;
+
+                               if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH1)
+                                       TpTrainTH_MIN = DM_DIG_TP_Target_TH1;
+
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TP training mode lower bound = %dkbps\n", TpTrainTH_MIN));
+
+                               //2 Decide DIG mode by total TP
+                               if((TxTp + RxTp) > DM_DIG_TP_Target_TH1)                        // change to performance mode
+                               {
+                                       bFirstTpTarget = (!pDM_DigTable->bTpTarget)?TRUE:FALSE;
+                                       pDM_DigTable->bTpTarget = TRUE;
+                                       bPerformance = TRUE;
+                               }
+                               else if((TxTp + RxTp) < TpTrainTH_MIN)  // change to coverage mode
+                               {
+                                       bFirstCoverage = (pDM_DigTable->bTpTarget)?TRUE:FALSE;
+                                       
+                                       if(TimeCnt < DM_DIG_TP_Training_Period)
+                                       {
+                                               pDM_DigTable->bTpTarget = FALSE;
+                                               bPerformance = FALSE;
+                                               TimeCnt++;
+                                       }
+                                       else
+                                       {
+                                               pDM_DigTable->bTpTarget = TRUE;
+                                               bPerformance = TRUE;
+                                               bFirstTpTarget = TRUE;
+                                               TimeCnt = 0;
+                                       }
+                               }
+                               else                                                                            // remain previous mode
+                               {
+                                       bPerformance = pDM_DigTable->bTpTarget;
+
+                                       if(!bPerformance)
+                                       {
+                                               if(TimeCnt < DM_DIG_TP_Training_Period)
+                                                       TimeCnt++;
+                                               else
+                                               {
+                                                       pDM_DigTable->bTpTarget = TRUE;
+                                                       bPerformance = TRUE;
+                                                       bFirstTpTarget = TRUE;
+                                                       TimeCnt = 0;
+                                               }
+                                       }
+                               }
+
+                               if(!bPerformance)
+                                       pDM_DigTable->TpTrainTH_min = RxTp + TxTp;
+
+                       }
+                       else
+                       {
+                               bPerformance = FALSE;
+                               pDM_DigTable->TpTrainTH_min = 0;
+                       }
+                       break;
+               }
+               default:
+                       bPerformance = TRUE;
+       }
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("====== DIG mode = %d  ======\n", pDM_Odm->priv->pshare->rf_ft_var.dig_cov_enable));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("====== bPerformance = %d ======\n", bPerformance));
+#endif
+
+       //1 Boundary Decision
+#if (RTL8192C_SUPPORT==1) 
+       if((pDM_Odm->SupportICType & ODM_RTL8192C) && (pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)))
+       {
+               //2 High power case
+               if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
+               {
+                       dm_dig_max = DM_DIG_MAX_AP_HP;
+                       dm_dig_min = DM_DIG_MIN_AP_HP;
+               }
+               else
+               {
+                       dm_dig_max = DM_DIG_MAX_NIC_HP;
+                       dm_dig_min = DM_DIG_MIN_NIC_HP;
+               }
+               DIG_MaxOfMin = DM_DIG_MAX_AP_HP;
+       }
+       else
+#endif
+       {
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+               //2 For AP\ADSL
+               if(!bPerformance)
+               {
+                       dm_dig_max = DM_DIG_MAX_AP_COVERAGR;
+                       dm_dig_min = DM_DIG_MIN_AP_COVERAGE;
+                       DIG_MaxOfMin = DM_DIG_MAX_OF_MIN_COVERAGE;
+               }
+               else
+               {
+                       dm_dig_max = DM_DIG_MAX_AP;
+                       dm_dig_min = DM_DIG_MIN_AP;
+                       DIG_MaxOfMin = DM_DIG_MAX_OF_MIN;
+               }
+
+               //4 DFS band
+               if (((*pDM_Odm->pChannel>= 52) &&(*pDM_Odm->pChannel <= 64)) ||
+                       ((*pDM_Odm->pChannel >= 100) && (*pDM_Odm->pChannel <= 140)))
+               {
+                       bDFSBand = TRUE;
+                       dm_dig_min = DM_DIG_MIN_AP_DFS;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): ====== In DFS band ======\n"));
+               }
+               
+               //4 TX2path
+               if (priv->pmib->dot11RFEntry.tx2path && !bDFSBand && (*(pDM_Odm->pWirelessMode) == ODM_WM_B))
+                               dm_dig_max = 0x2A;
+
+#if RTL8192E_SUPPORT
+#ifdef HIGH_POWER_EXT_LNA
+               if ((pDM_Odm->SupportICType & (ODM_RTL8192E)) && (pDM_Odm->ExtLNA))
+                       dm_dig_max = 0x42;                                              
+#endif
+#endif
+
+#else
+               //2 For WIN\CE
+               if(pDM_Odm->SupportICType >= ODM_RTL8188E)
+                       dm_dig_max = 0x5A;
+               else
+                       dm_dig_max = DM_DIG_MAX_NIC;
+               
+               if(pDM_Odm->SupportICType != ODM_RTL8821)
+                       dm_dig_min = DM_DIG_MIN_NIC;
+               else
+                       dm_dig_min = 0x1C;
+
+               DIG_MaxOfMin = DM_DIG_MAX_AP;
+#endif 
+       }
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Absolutly upper bound = 0x%x, lower bound = 0x%x\n",dm_dig_max, dm_dig_min));
+
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       // for P2P case
+       if(0 < *pDM_Odm->pu1ForcedIgiLb)
+       {
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): P2P case: Force IGI lb to: %u !!!!!!\n", *pDM_Odm->pu1ForcedIgiLb));
+               dm_dig_min = *pDM_Odm->pu1ForcedIgiLb;
+               dm_dig_max = (dm_dig_min <= dm_dig_max) ? (dm_dig_max) : (dm_dig_min + 1);
+       }
+#endif
+
+       //1 Adjust boundary by RSSI
+       if(pDM_Odm->bLinked && bPerformance)
+       {
+               //2 Modify DIG upper bound
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+               offset = 15;
+#else
+               //4 Modify DIG upper bound for 92E, 8723A\B, 8821 & 8812 BT
+               if((pDM_Odm->SupportICType & (ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8812|ODM_RTL8821|ODM_RTL8723A)) && (pDM_Odm->bBtLimitedDig==1))
+               {
+                       offset = 10;
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Coex. case: Force upper bound to RSSI + %d !!!!!!\n", offset));          
+               }
+               else
+                       offset = 15;
+#endif
+
+               if((pDM_Odm->RSSI_Min + offset) > dm_dig_max )
+                       pDM_DigTable->rx_gain_range_max = dm_dig_max;
+               else if((pDM_Odm->RSSI_Min + offset) < dm_dig_min )
+                       pDM_DigTable->rx_gain_range_max = dm_dig_min;
+               else
+                       pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + offset;
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+               //2 Modify DIG lower bound
+               //if(pDM_Odm->bOneEntryOnly)
+               {
+                       if(pDM_Odm->RSSI_Min < dm_dig_min)
+                               DIG_Dynamic_MIN = dm_dig_min;
+                       else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)
+                               DIG_Dynamic_MIN = DIG_MaxOfMin;
+                       else
+                               DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;
+               }
+#else
+               {
+                       //4 For AP
+#ifdef __ECOS
+                       HAL_REORDER_BARRIER();
+#else
+                       rmb();
+#endif
+                       if (bDFSBand)
+                       {
+                               DIG_Dynamic_MIN = dm_dig_min;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: Force lower bound to 0x%x after link !!!!!!\n", dm_dig_min));
+                       }
+                       else 
+                       {
+                               if(pDM_Odm->RSSI_Min < dm_dig_min)
+                                       DIG_Dynamic_MIN = dm_dig_min;
+                               else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)
+                                       DIG_Dynamic_MIN = DIG_MaxOfMin;
+                               else
+                                       DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;
+                       }
+               }
+#endif
+       }
+       else
+       {
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+               if(bPerformance && bDFSBand)
+               {
+                       pDM_DigTable->rx_gain_range_max = 0x28;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: Force upper bound to 0x%x before link !!!!!!\n", pDM_DigTable->rx_gain_range_max));
+               }
+               else
+#endif
+               {
+                       pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_OF_MIN;
+               }
+               DIG_Dynamic_MIN = dm_dig_min;
+       }
+       
+       //1 Force Lower Bound for AntDiv
+       if(pDM_Odm->bLinked && !pDM_Odm->bOneEntryOnly)
+       {
+               if((pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) && (pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
+               {
+                       if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV || pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV ||pDM_Odm->AntDivType == S0S1_SW_ANTDIV)
+                       {
+                               if(pDM_DigTable->AntDiv_RSSI_max > DIG_MaxOfMin)
+                                       DIG_Dynamic_MIN = DIG_MaxOfMin;
+                               else
+                                       DIG_Dynamic_MIN = (u1Byte) pDM_DigTable->AntDiv_RSSI_max;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_DIG(): Antenna diversity case: Force lower bound to 0x%x !!!!!!\n", DIG_Dynamic_MIN));
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_DIG(): Antenna diversity case: RSSI_max = 0x%x !!!!!!\n", pDM_DigTable->AntDiv_RSSI_max));
+                       }
+               }
+       }
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust boundary by RSSI Upper bound = 0x%x, Lower bound = 0x%x\n",
+               pDM_DigTable->rx_gain_range_max, DIG_Dynamic_MIN));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Link status: bLinked = %d, RSSI = %d, bFirstConnect = %d, bFirsrDisConnect = %d\n\n",
+               pDM_Odm->bLinked, pDM_Odm->RSSI_Min, FirstConnect, FirstDisConnect));
+
+       //1 Modify DIG lower bound, deal with abnormal case
+       //2 Abnormal false alarm case
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       if(bDFSBand)
+       {
+               pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;
+       }
+       else
+#endif
+       {
+               if(!pDM_Odm->bLinked)
+               {
+                       pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;
+
+                       if(FirstDisConnect)
+                       pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN;
+               }
+               else
+                       pDM_DigTable->rx_gain_range_min = odm_ForbiddenIGICheck(pDM_Odm, DIG_Dynamic_MIN, CurrentIGI);
+       }
+
+       //2 Abnormal # beacon case
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       if(pDM_Odm->bLinked && !FirstConnect)
+       {
+               if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pDM_Odm->bsta_state))
+               {
+                       pDM_DigTable->rx_gain_range_min = dm_dig_min;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnrormal #beacon (%d) case in STA mode: Force lower bound to 0x%x !!!!!!\n\n",
+                               pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, pDM_DigTable->rx_gain_range_min));
+               }
+       }
+#endif
+
+       //2 Abnormal lower bound case
+       if(pDM_DigTable->rx_gain_range_min > pDM_DigTable->rx_gain_range_max)
+       {
+               pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnrormal lower bound case: Force lower bound to 0x%x !!!!!!\n\n",pDM_DigTable->rx_gain_range_min));
+       }
+
+       
+       //1 False alarm threshold decision
+       odm_FAThresholdCheck(pDM_Odm, bDFSBand, bPerformance, RxTp, TxTp, dm_FA_thres);
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): False alarm threshold = %d, %d, %d \n\n", dm_FA_thres[0], dm_FA_thres[1], dm_FA_thres[2]));
+
+       //1 Adjust initial gain by false alarm
+       if(pDM_Odm->bLinked && bPerformance)
+       {
+               //2 After link
+               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI after link\n"));
+
+               if(bFirstTpTarget || (FirstConnect && bPerformance))
+               {       
+                       pDM_DigTable->LargeFAHit = 0;
+                       
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+                       if(bDFSBand)
+                       {
+                               if(pDM_Odm->RSSI_Min > 0x28)
+                                       CurrentIGI = 0x28;
+                               else
+                                       CurrentIGI = pDM_Odm->RSSI_Min;
+                               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: One-shot to 0x28 upmost!!!!!!\n"));
+                       }
+                       else
+#endif
+                       {
+                               if(pDM_Odm->RSSI_Min < DIG_MaxOfMin)
+                               {
+                                       if(CurrentIGI < pDM_Odm->RSSI_Min)
+                                               CurrentIGI = pDM_Odm->RSSI_Min;
+                               }
+                               else
+                               {
+                                       if(CurrentIGI < DIG_MaxOfMin)
+                                               CurrentIGI = DIG_MaxOfMin;
+                               }
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+#if (RTL8812A_SUPPORT==1) 
+                               if(pDM_Odm->SupportICType == ODM_RTL8812)
+                                       ODM_ConfigBBWithHeaderFile(pDM_Odm, CONFIG_BB_AGC_TAB_DIFF);
+#endif
+#endif
+                       }
+
+                       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First connect case: IGI does on-shot to 0x%x\n", CurrentIGI));
+
+               }
+               else
+               {
+                       if(pFalseAlmCnt->Cnt_all > dm_FA_thres[2])
+                               CurrentIGI = CurrentIGI + 4;
+                       else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])
+                               CurrentIGI = CurrentIGI + 2;
+                       else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])
+                               CurrentIGI = CurrentIGI - 2;
+
+                       //4 Abnormal # beacon case
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+                       if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) && (pDM_Odm->bsta_state))
+                       {                                               
+                               CurrentIGI = pDM_DigTable->rx_gain_range_min;
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormal #beacon (%d) case: IGI does one-shot to 0x%x\n", 
+                                       pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, CurrentIGI));
+                       }
+#endif
+               }
+       }       
+       else
+       {
+               //2 Before link
+               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI before link\n"));
+               
+               if(FirstDisConnect || bFirstCoverage)
+               {
+                       CurrentIGI = dm_dig_min;
+                       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First disconnect case: IGI does on-shot to lower bound\n"));
+               }
+               else
+               {
+                       if(pFalseAlmCnt->Cnt_all > dm_FA_thres[2])
+                               CurrentIGI = CurrentIGI + 4;
+                       else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])
+                               CurrentIGI = CurrentIGI + 2;
+                       else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])
+                               CurrentIGI = CurrentIGI - 2;
+               }
+       }
+
+       //1 Check initial gain by upper/lower bound
+       if(CurrentIGI < pDM_DigTable->rx_gain_range_min)
+               CurrentIGI = pDM_DigTable->rx_gain_range_min;
+       
+       if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
+               CurrentIGI = pDM_DigTable->rx_gain_range_max;
+
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue=0x%x, TotalFA = %d\n\n", CurrentIGI, pFalseAlmCnt->Cnt_all));
+
+       //1 Force upper bound and lower bound for adaptivity
+       if(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY && pDM_Odm->adaptivity_flag == TRUE)
+       {
+               if(CurrentIGI > Adap_IGI_Upper)
+                       CurrentIGI = Adap_IGI_Upper;
+               
+               if(pDM_Odm->IGI_LowerBound != 0)
+               {
+                       if(CurrentIGI < pDM_Odm->IGI_LowerBound)
+                               CurrentIGI = pDM_Odm->IGI_LowerBound;
+               }
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adaptivity case: Force upper bound to 0x%x !!!!!!\n", Adap_IGI_Upper));
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adaptivity case: Force lower bound to 0x%x !!!!!!\n\n", pDM_Odm->IGI_LowerBound));
+       }
+       
+
+       //1 High power RSSI threshold
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       if((pDM_Odm->SupportICType == ODM_RTL8723A)&& (pHalData->UndecoratedSmoothedPWDB > DM_DIG_HIGH_PWR_THRESHOLD))
+       {
+               // High power IGI lower bound
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): UndecoratedSmoothedPWDB(%#x)\n", pHalData->UndecoratedSmoothedPWDB));
+               if(CurrentIGI < DM_DIG_HIGH_PWR_IGI_LOWER_BOUND)
+               {
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue(%#x)\n", pDM_DigTable->CurIGValue));
+                       //pDM_DigTable->CurIGValue = DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;
+                       CurrentIGI=DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;
+               }
+       }
+       if((pDM_Odm->SupportICType & ODM_RTL8723A) && IS_WIRELESS_MODE_G(pAdapter))
+       {
+               if(pHalData->UndecoratedSmoothedPWDB > 0x28)
+               {
+                       if(CurrentIGI < DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND)
+                       {
+                               //pDM_DigTable->CurIGValue = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
+                               CurrentIGI = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
+                       }       
+               } 
+       }
+#endif
+
+       //1 Update status
+#if (RTL8192D_SUPPORT==1) 
+       if(pDM_Odm->SupportICType == ODM_RTL8192D)
+       {
+               //sherry  delete DualMacSmartConncurrent 20110517
+               if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
+               {
+                       ODM_Write_DIG_DMSP(pDM_Odm, CurrentIGI);//ODM_Write_DIG_DMSP(pDM_Odm, pDM_DigTable->CurIGValue);
+                       if(*(pDM_Odm->pbMasterOfDMSP))
+                       {
+                               pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
+                               pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
+                       }
+                       else
+                       {
+                               pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
+                               pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
+                       }
+               }
+               else
+               {
+                       ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
+                       if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
+                       {
+                               pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
+                               pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
+                       }
+                       else
+                       {
+                               pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
+                               pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
+                       }
+               }
+       }
+       else
+#endif
+       {
+#if ((DM_ODM_SUPPORT_TYPE & ODM_WIN) || ((DM_ODM_SUPPORT_TYPE & ODM_CE) && (ODM_CONFIG_BT_COEXIST == 1)))
+               if(pDM_Odm->bBtHsOperation)
+               {
+                       if(pDM_Odm->bLinked)
+                       {
+                               if(pDM_DigTable->BT30_CurIGI > (CurrentIGI))
+                                       ODM_Write_DIG(pDM_Odm, CurrentIGI);
+                               else
+                                       ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);
+                                       
+                               pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
+                               pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
+                       }
+                       else
+                       {
+                               if(pDM_Odm->bLinkInProcess)
+                                       ODM_Write_DIG(pDM_Odm, 0x1c);
+                               else if(pDM_Odm->bBtConnectProcess)
+                                       ODM_Write_DIG(pDM_Odm, 0x28);
+                               else
+                                       ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);   
+                       }
+               }
+               else            // BT is not using
+#endif
+               {
+                       ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
+                       pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
+                       pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
+               }
+       }
+}
+
+VOID
+odm_DIGbyRSSI_LPS(
+       IN              PVOID           pDM_VOID
+       )
+{
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PFALSE_ALARM_STATISTICS         pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
+
+#if (DM_ODM_SUPPORT_TYPE & ODM_CE)
+#if 0          //and 2.3.5 coding rule
+       struct mlme_priv        *pmlmepriv = &(pAdapter->mlmepriv);
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);     
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+#endif
+#endif
+
+       u1Byte  RSSI_Lower=DM_DIG_MIN_NIC;   //0x1E or 0x1C
+       u1Byte  CurrentIGI=pDM_Odm->RSSI_Min;
+
+       if(odm_DigAbort(pDM_Odm) == TRUE)
+               return;
+
+       CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG;
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS()==>\n"));
+
+       // Using FW PS mode to make IGI
+       //Adjust by  FA in LPS MODE
+       if(pFalseAlmCnt->Cnt_all> DM_DIG_FA_TH2_LPS)
+               CurrentIGI = CurrentIGI+4;
+       else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS)
+               CurrentIGI = CurrentIGI+2;
+       else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS)
+               CurrentIGI = CurrentIGI-2;      
+
+
+       //Lower bound checking
+
+       //RSSI Lower bound check
+       if((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC)
+               RSSI_Lower =(pDM_Odm->RSSI_Min-10);
+       else
+               RSSI_Lower =DM_DIG_MIN_NIC;
+
+       //Upper and Lower Bound checking
+        if(CurrentIGI > DM_DIG_MAX_NIC)
+               CurrentIGI=DM_DIG_MAX_NIC;
+        else if(CurrentIGI < RSSI_Lower)
+               CurrentIGI =RSSI_Lower;
+
+       
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): pFalseAlmCnt->Cnt_all = %d\n",pFalseAlmCnt->Cnt_all));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): pDM_Odm->RSSI_Min = %d\n",pDM_Odm->RSSI_Min));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): CurrentIGI = 0x%x\n",CurrentIGI));
+
+       ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
+#endif
+}
+
+//3============================================================
+//3 FASLE ALARM CHECK
+//3============================================================
+
+VOID 
+odm_FalseAlarmCounterStatistics(
+       IN              PVOID           pDM_VOID
+       )
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PFALSE_ALARM_STATISTICS         FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
+       u4Byte                                          ret_value;
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
+//Mark there, and check this in odm_DMWatchDog
+#if 0 //(DM_ODM_SUPPORT_TYPE == ODM_AP)
+       prtl8192cd_priv priv            = pDM_Odm->priv;
+       if( (priv->auto_channel != 0) && (priv->auto_channel != 2) )
+               return;
+#endif
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       if((pDM_Odm->SupportICType == ODM_RTL8192D) &&
+               (*(pDM_Odm->pMacPhyMode)==ODM_DMSP)&&    ////modify by Guo.Mingzhi 2011-12-29
+               (!(*(pDM_Odm->pbMasterOfDMSP))))
+       {
+               odm_FalseAlarmCounterStatistics_ForSlaveOfDMSP(pDM_Odm);
+               return;
+       }
+#endif         
+
+       if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
+               return;
+
+#if (ODM_IC_11N_SERIES_SUPPORT == 1) 
+       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+       {
+
+               //hold ofdm counter
+               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 1); //hold page C counter
+               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 1); //hold page D counter
+       
+               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord);
+               FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff);
+               FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16);         
+
+               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord);
+               FalseAlmCnt->Cnt_OFDM_CCA = (ret_value&0xffff); 
+               FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);    
+
+               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord);
+               FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);
+               FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);
+
+               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord);
+               FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);
+
+               FalseAlmCnt->Cnt_Ofdm_fail =    FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal +
+                                                               FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail +
+                                                               FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail;
+
+#if (RTL8188E_SUPPORT==1)
+               if(pDM_Odm->SupportICType == ODM_RTL8188E)
+               {
+                       ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_SC_CNT_11N, bMaskDWord);
+                       FalseAlmCnt->Cnt_BW_LSC = (ret_value&0xffff);
+                       FalseAlmCnt->Cnt_BW_USC = ((ret_value&0xffff0000)>>16);
+               }
+#endif
+
+#if (RTL8192D_SUPPORT==1) 
+               if(pDM_Odm->SupportICType == ODM_RTL8192D)
+               {
+                       odm_GetCCKFalseAlarm_92D(pDM_Odm);
+               }
+               else
+#endif
+               {
+                       //hold cck counter
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT12, 1); 
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT14, 1); 
+               
+                       ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_LSB_11N, bMaskByte0);
+                       FalseAlmCnt->Cnt_Cck_fail = ret_value;
+
+                       ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_MSB_11N, bMaskByte3);
+                       FalseAlmCnt->Cnt_Cck_fail +=  (ret_value& 0xff)<<8;
+
+                       ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord);
+                       FalseAlmCnt->Cnt_CCK_CCA = ((ret_value&0xFF)<<8) |((ret_value&0xFF00)>>8);
+               }
+       
+               FalseAlmCnt->Cnt_all = (        FalseAlmCnt->Cnt_Fast_Fsync + 
+                                                       FalseAlmCnt->Cnt_SB_Search_fail +
+                                                       FalseAlmCnt->Cnt_Parity_Fail +
+                                                       FalseAlmCnt->Cnt_Rate_Illegal +
+                                                       FalseAlmCnt->Cnt_Crc8_fail +
+                                                       FalseAlmCnt->Cnt_Mcs_fail +
+                                                       FalseAlmCnt->Cnt_Cck_fail);     
+
+               FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA;
+
+#if (RTL8192C_SUPPORT==1)
+               if(pDM_Odm->SupportICType == ODM_RTL8192C)
+                       odm_ResetFACounter_92C(pDM_Odm);
+#endif
+
+#if (RTL8192D_SUPPORT==1)
+               if(pDM_Odm->SupportICType == ODM_RTL8192D)
+                       odm_ResetFACounter_92D(pDM_Odm);
+#endif
+
+               if(pDM_Odm->SupportICType >=ODM_RTL8723A)
+               {
+                       //reset false alarm counter registers
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 1);
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 0);
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 1);
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 0);
+
+                       //update ofdm counter
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 0); //update page C counter
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 0); //update page D counter
+
+                       //reset CCK CCA counter
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 0); 
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 2); 
+                       //reset CCK FA counter
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 0); 
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 2); 
+               }
+               
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Enter odm_FalseAlarmCounterStatistics\n"));
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Fast_Fsync=%d, Cnt_SB_Search_fail=%d\n",
+                       FalseAlmCnt->Cnt_Fast_Fsync, FalseAlmCnt->Cnt_SB_Search_fail));
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Parity_Fail=%d, Cnt_Rate_Illegal=%d\n",
+                       FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal));
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Crc8_fail=%d, Cnt_Mcs_fail=%d\n",
+               FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail));
+       }
+#endif
+
+#if (ODM_IC_11AC_SERIES_SUPPORT == 1) 
+       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+       {
+               u4Byte CCKenable;
+               
+               //read OFDM FA counter
+               FalseAlmCnt->Cnt_Ofdm_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_11AC, bMaskLWord);
+               FalseAlmCnt->Cnt_Cck_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_11AC, bMaskLWord);
+
+               //read CCK/OFDM CCA counter
+               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11AC, bMaskDWord);
+               FalseAlmCnt->Cnt_OFDM_CCA = (ret_value & 0xffff0000) >> 16;
+               FalseAlmCnt->Cnt_CCK_CCA = ret_value & 0xffff;
+
+#if (RTL8881A_SUPPORT==1) 
+               // For 8881A
+               if(pDM_Odm->SupportICType == ODM_RTL8881A)
+               {
+                       u4Byte Cnt_Ofdm_fail_temp = 0;
+               
+                       if(FalseAlmCnt->Cnt_Ofdm_fail >= FalseAlmCnt->Cnt_Ofdm_fail_pre)
+                       {
+                               Cnt_Ofdm_fail_temp = FalseAlmCnt->Cnt_Ofdm_fail_pre;
+                               FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;
+                               FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Ofdm_fail - Cnt_Ofdm_fail_temp;
+                       }
+                       else
+                               FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n",      FalseAlmCnt->Cnt_Ofdm_fail_pre));
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail_pre=%d\n",  Cnt_Ofdm_fail_temp));
+                       
+                       // Reset FA counter by enable/disable OFDM
+                       if(FalseAlmCnt->Cnt_Ofdm_fail_pre >= 0x7fff)
+                       {
+                               // reset OFDM
+                               ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,0);
+                               ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,1);
+                               FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Reset false alarm counter\n"));
+                       }
+               }
+#endif
+
+               // reset OFDM FA coutner
+               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 1);
+               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 0);
+
+               // reset CCK FA counter
+               ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 0);
+               ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 1);
+
+               // reset CCA counter
+               ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 1);
+               ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 0);
+
+               CCKenable =  ODM_GetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT28);
+               if(CCKenable)//if(*pDM_Odm->pBandType == ODM_BAND_2_4G)
+               {
+                       FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail + FalseAlmCnt->Cnt_Cck_fail;
+                       FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_CCK_CCA + FalseAlmCnt->Cnt_OFDM_CCA;
+               }
+               else
+               {
+                       FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail;
+                       FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA;
+               }
+
+       }
+#endif
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_OFDM_CCA=%d\n",       FalseAlmCnt->Cnt_OFDM_CCA));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_CCK_CCA=%d\n",        FalseAlmCnt->Cnt_CCK_CCA));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_CCA_all=%d\n",        FalseAlmCnt->Cnt_CCA_all));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n",      FalseAlmCnt->Cnt_Ofdm_fail));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Cck_fail=%d\n",       FalseAlmCnt->Cnt_Cck_fail));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n",      FalseAlmCnt->Cnt_Ofdm_fail));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Total False Alarm=%d\n",  FalseAlmCnt->Cnt_all));
+}
+
+//3============================================================
+//3 CCK Packet Detect Threshold
+//3============================================================
+
+VOID
+odm_PauseCCKPacketDetection(
+       IN              PVOID                                   pDM_VOID,
+       IN              ODM_Pause_CCKPD_TYPE    PauseType,
+       IN              u1Byte                                  CCKPDThreshold
+)
+{
+       PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+       static  BOOLEAN         bPaused = FALSE;
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection()=========>\n"));
+
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)    
+       if(*pDM_DigTable->pbP2pLinkInProgress)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("P2P in progress !!\n"));
+               return;
+       }
+#endif
+
+       if(!bPaused && (!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Return: SupportAbility ODM_BB_CCK_PD or ODM_BB_FA_CNT is disabled\n"));
+               return;
+       }
+
+       switch(PauseType)
+       {
+               //1 Pause CCK Packet Detection Threshold
+               case ODM_PAUSE_CCKPD:
+                       //2 Disable DIG
+                       ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_CCK_PD));
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Pause CCK packet detection threshold !!\n"));
+
+                       //2 Backup CCK Packet Detection Threshold value
+                       if(!bPaused)
+                       {
+                               pDM_DigTable->CCKPDBackup = pDM_DigTable->CurCCK_CCAThres;
+                               bPaused = TRUE;
+                       }
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Backup CCK packet detection tgreshold  = %d\n", pDM_DigTable->CCKPDBackup));
+
+                       //2 Write new CCK Packet Detection Threshold value
+                       ODM_Write_CCK_CCA_Thres(pDM_Odm, CCKPDThreshold);
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Write new CCK packet detection tgreshold = %d\n", CCKPDThreshold));
+                       break;
+                       
+               //1 Resume CCK Packet Detection Threshold
+               case ODM_RESUME_CCKPD:
+                       if(bPaused)
+                       {
+                               //2 Write backup CCK Packet Detection Threshold value
+                               ODM_Write_CCK_CCA_Thres(pDM_Odm, pDM_DigTable->CCKPDBackup);
+                               bPaused = FALSE;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Write original CCK packet detection tgreshold = %d\n", pDM_DigTable->CCKPDBackup));
+
+                               //2 Enable CCK Packet Detection Threshold
+                               ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_CCK_PD);               
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Resume CCK packet detection threshold  !!\n"));
+                       }
+                       break;
+                       
+               default:
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Wrong  type !!\n"));
+                       break;
+       }       
+       return;
+}
+
+
+VOID 
+odm_CCKPacketDetectionThresh(
+       IN              PVOID           pDM_VOID
+       )
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PFALSE_ALARM_STATISTICS         FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
+       u1Byte                                          CurCCK_CCAThres;
+
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+//modify by Guo.Mingzhi 2011-12-29
+       if (pDM_Odm->bDualMacSmartConcurrent == TRUE)
+//     if (pDM_Odm->bDualMacSmartConcurrent == FALSE)
+               return;
+       if(pDM_Odm->bBtHsOperation)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() write 0xcd for BT HS mode!!\n"));
+               ODM_Write_CCK_CCA_Thres(pDM_Odm, 0xcd);
+               return;
+       }
+#endif
+
+       if((!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD)) ||(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh()  return==========\n"));
+               return;
+       }
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       if(pDM_Odm->ExtLNA)
+               return;
+#endif
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh()  ==========>\n"));
+
+       if(pDM_Odm->bLinked)
+       {
+               if(pDM_Odm->RSSI_Min > 25)
+                       CurCCK_CCAThres = 0xcd;
+               else if((pDM_Odm->RSSI_Min <= 25) && (pDM_Odm->RSSI_Min > 10))
+                       CurCCK_CCAThres = 0x83;
+               else
+               {
+                       if(FalseAlmCnt->Cnt_Cck_fail > 1000)
+                               CurCCK_CCAThres = 0x83;
+                       else
+                               CurCCK_CCAThres = 0x40;
+               }
+       }
+       else
+       {
+               if(FalseAlmCnt->Cnt_Cck_fail > 1000)
+                       CurCCK_CCAThres = 0x83;
+               else
+                       CurCCK_CCAThres = 0x40;
+       }
+       
+#if (RTL8192D_SUPPORT==1) 
+       if((pDM_Odm->SupportICType == ODM_RTL8192D) && (*pDM_Odm->pBandType == ODM_BAND_2_4G))
+               ODM_Write_CCK_CCA_Thres_92D(pDM_Odm, CurCCK_CCAThres);
+       else
+#endif
+               ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres);
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh()  CurCCK_CCAThres = 0x%x\n",CurCCK_CCAThres));
+}
+
+VOID
+ODM_Write_CCK_CCA_Thres(
+       IN      PVOID                   pDM_VOID,
+       IN      u1Byte                  CurCCK_CCAThres
+       )
+{
+       PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+
+       if(pDM_DigTable->CurCCK_CCAThres!=CurCCK_CCAThres)              //modify by Guo.Mingzhi 2012-01-03
+       {
+               ODM_Write1Byte(pDM_Odm, ODM_REG(CCK_CCA,pDM_Odm), CurCCK_CCAThres);
+       }
+       pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres;
+       pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres;
+}
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+// <20130108, Kordan> E.g., With LNA used, we make the Rx power smaller to have a better EVM. (Asked by Willis)
+VOID
+odm_RFEControl(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN  u8Byte              RSSIVal
+       )
+{
+       PADAPTER                Adapter = (PADAPTER)pDM_Odm->Adapter;
+    HAL_DATA_TYPE      *pHalData = GET_HAL_DATA(Adapter);
+       static u1Byte   TRSW_HighPwr = 0;
+        
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("===> odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X, pHalData->RFEType = %d\n",
+                        RSSIVal, TRSW_HighPwr, pHalData->RFEType ));
+
+    if (pHalData->RFEType == 3) {         
+               
+        pDM_Odm->RSSI_TRSW = RSSIVal;
+
+        if (pDM_Odm->RSSI_TRSW >= pDM_Odm->RSSI_TRSW_H) 
+               {                                
+            TRSW_HighPwr = 1; // Switch to
+            PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1);  // Set ANTSW=1/ANTSWB=0  for SW control
+            PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x3);  // Set ANTSW=1/ANTSWB=0  for SW control
+            
+        } 
+               else if (pDM_Odm->RSSI_TRSW <= pDM_Odm->RSSI_TRSW_L) 
+        {        
+            TRSW_HighPwr = 0; // Switched back
+            PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1);  // Set ANTSW=1/ANTSWB=0  for SW control
+            PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x0);  // Set ANTSW=1/ANTSWB=0  for SW control
+
+        }
+    }  
+
+       
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("(pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L) = (%d, %d)\n", pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L));           
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("(RSSIVal, RSSIVal, pDM_Odm->RSSI_TRSW_iso) = (%d, %d, %d)\n", 
+                                RSSIVal, pDM_Odm->RSSI_TRSW_iso, pDM_Odm->RSSI_TRSW));
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("<=== odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X\n", RSSIVal, TRSW_HighPwr));    
+}
+
+VOID
+odm_MPT_DIGWorkItemCallback(
+    IN PVOID            pContext
+    )
+{
+       PADAPTER        Adapter = (PADAPTER)pContext;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+
+       ODM_MPT_DIG(pDM_Odm);
+}
+
+VOID
+odm_MPT_DIGCallback(
+       PRT_TIMER               pTimer
+)
+{
+       PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+         PDM_ODM_T             pDM_Odm = &pHalData->DM_OutSrc;
+
+
+       #if DEV_BUS_TYPE==RT_PCI_INTERFACE
+               #if USE_WORKITEM
+                       PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
+               #else
+                       ODM_MPT_DIG(pDM_Odm);
+               #endif
+       #else
+               PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
+       #endif
+
+}
+
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+VOID
+odm_MPT_DIGCallback(
+       IN              PVOID                                   pDM_VOID
+)
+{
+       PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+#if USE_WORKITEM
+       PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
+#else
+       ODM_MPT_DIG(pDM_Odm);
+#endif
+}
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE != ODM_CE)
+VOID
+odm_MPT_Write_DIG(
+       IN              PVOID                                   pDM_VOID,
+       IN              u1Byte                                  CurIGValue
+)
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+
+       ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), CurIGValue);
+
+       if(pDM_Odm->RFType > ODM_1T1R)
+               ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), CurIGValue);
+
+       if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
+       {
+               ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_C,pDM_Odm), CurIGValue);
+               ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_D,pDM_Odm), CurIGValue);   
+       }
+
+       pDM_DigTable->CurIGValue = CurIGValue;
+       
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurIGValue = 0x%x\n", CurIGValue));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("pDM_Odm->RFType = 0x%x\n", pDM_Odm->RFType));
+}
+
+VOID
+ODM_MPT_DIG(
+       IN              PVOID                                   pDM_VOID
+       )
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+       PFALSE_ALARM_STATISTICS         pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
+       u1Byte                                          CurrentIGI = pDM_DigTable->CurIGValue;
+       u1Byte                                          DIG_Upper = 0x40, DIG_Lower = 0x20;
+       u4Byte                                          RXOK_cal;
+       u4Byte                                          RxPWDBAve_final;
+       u1Byte                                          IGI_A = 0x20, IGI_B = 0x20;
+       
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+       #if ODM_FIX_2G_DIG
+       IGI_A = 0x22;
+       IGI_B = 0x24;           
+       #endif
+       
+#else
+       if (!(pDM_Odm->priv->pshare->rf_ft_var.mp_specific && pDM_Odm->priv->pshare->mp_dig_on))
+               return;
+
+       if (*pDM_Odm->pBandType == ODM_BAND_5G)
+               DIG_Lower = 0x22;
+#endif
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> ODM_MPT_DIG, pBandType = %d\n", *pDM_Odm->pBandType));
+       
+#if (ODM_FIX_2G_DIG || (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)))
+       if (*pDM_Odm->pBandType == ODM_BAND_5G || (pDM_Odm->SupportICType & ODM_RTL8814A)) // for 5G or 8814
+#else
+       if (1) // for both 2G/5G
+#endif
+               {
+               odm_FalseAlarmCounterStatistics(pDM_Odm);
+
+               RXOK_cal = pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM;
+               RxPWDBAve_final = (RXOK_cal != 0)?pDM_Odm->RxPWDBAve/RXOK_cal:0;
+
+               pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;
+               pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;
+               pDM_Odm->RxPWDBAve = 0;
+               pDM_Odm->MPDIG_2G = FALSE;
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+               pDM_Odm->Times_2G = 0;
+#endif
+
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RX OK = %d\n", RXOK_cal));
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RSSI = %d\n", RxPWDBAve_final));
+       
+               if (RXOK_cal >= 70 && RxPWDBAve_final <= 40)
+               {
+                       if (CurrentIGI > 0x24)
+                               odm_MPT_Write_DIG(pDM_Odm, 0x24);
+               }
+               else
+               {
+                       if(pFalseAlmCnt->Cnt_all > 1000){
+                               CurrentIGI = CurrentIGI + 8;
+                       }
+                       else if(pFalseAlmCnt->Cnt_all > 200){
+                               CurrentIGI = CurrentIGI + 4;
+                       }
+                       else if (pFalseAlmCnt->Cnt_all > 50){
+                               CurrentIGI = CurrentIGI + 2;
+                       }
+                       else if (pFalseAlmCnt->Cnt_all < 2){
+                               CurrentIGI = CurrentIGI - 2;
+                       }
+                       
+                       if (CurrentIGI < DIG_Lower ){
+                               CurrentIGI = DIG_Lower;
+                       }
+
+                       if(CurrentIGI > DIG_Upper){
+                               CurrentIGI = DIG_Upper;
+                       }
+
+                       odm_MPT_Write_DIG(pDM_Odm, CurrentIGI);
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("DIG = 0x%x, Cnt_all = %d, Cnt_Ofdm_fail = %d, Cnt_Cck_fail = %d\n", 
+                               CurrentIGI, pFalseAlmCnt->Cnt_all, pFalseAlmCnt->Cnt_Ofdm_fail, pFalseAlmCnt->Cnt_Cck_fail));
+               }
+       }
+       else
+       {
+               if(pDM_Odm->MPDIG_2G == FALSE)
+               {
+                       if((pDM_Odm->SupportPlatform & ODM_WIN) && !(pDM_Odm->SupportICType & ODM_RTL8814A))
+                       {
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> Fix IGI\n"));
+                               ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), IGI_A);
+                               ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), IGI_B);
+                               pDM_DigTable->CurIGValue = IGI_B;
+                       }
+                       else
+                               odm_MPT_Write_DIG(pDM_Odm, IGI_A);
+               }
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+               pDM_Odm->Times_2G++;
+
+               if (pDM_Odm->Times_2G == 3)
+#endif
+               {
+                       pDM_Odm->MPDIG_2G = TRUE;
+               }
+       }
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       if (pDM_Odm->SupportICType == ODM_RTL8812)
+               odm_RFEControl(pDM_Odm, RxPWDBAve_final);
+#endif
+
+       ODM_SetTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 700);
+}
+#endif
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DIG.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DIG.h
new file mode 100755 (executable)
index 0000000..54e74d7
--- /dev/null
@@ -0,0 +1,309 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __PHYDMDIG_H__\r
+#define    __PHYDMDIG_H__\r
+\r
+#define DIG_VERSION    "1.1"\r
+\r
+typedef struct _Dynamic_Initial_Gain_Threshold_\r
+{\r
+       BOOLEAN         bStopDIG;               // for debug\r
+       BOOLEAN         bPauseDIG;\r
+       BOOLEAN         bIgnoreDIG;\r
+       BOOLEAN         bPSDInProgress;\r
+\r
+       u1Byte          Dig_Enable_Flag;\r
+       u1Byte          Dig_Ext_Port_Stage;\r
+       \r
+       int                     RssiLowThresh;\r
+       int                     RssiHighThresh;\r
+\r
+       u4Byte          FALowThresh;\r
+       u4Byte          FAHighThresh;\r
+\r
+       u1Byte          CurSTAConnectState;\r
+       u1Byte          PreSTAConnectState;\r
+       u1Byte          CurMultiSTAConnectState;\r
+\r
+       u1Byte          PreIGValue;\r
+       u1Byte          CurIGValue;\r
+       u1Byte          BackupIGValue;          //MP DIG\r
+       u1Byte          BT30_CurIGI;\r
+       u1Byte          IGIBackup;\r
+\r
+       s1Byte          BackoffVal;\r
+       s1Byte          BackoffVal_range_max;\r
+       s1Byte          BackoffVal_range_min;\r
+       u1Byte          rx_gain_range_max;\r
+       u1Byte          rx_gain_range_min;\r
+       u1Byte          Rssi_val_min;\r
+\r
+       u1Byte          PreCCK_CCAThres;\r
+       u1Byte          CurCCK_CCAThres;\r
+       u1Byte          PreCCKPDState;\r
+       u1Byte          CurCCKPDState;\r
+       u1Byte          CCKPDBackup;\r
+\r
+       u1Byte          LargeFAHit;\r
+       u1Byte          ForbiddenIGI;\r
+       u4Byte          Recover_cnt;\r
+\r
+       u1Byte          DIG_Dynamic_MIN_0;\r
+       u1Byte          DIG_Dynamic_MIN_1;\r
+       BOOLEAN         bMediaConnect_0;\r
+       BOOLEAN         bMediaConnect_1;\r
+\r
+       u4Byte          AntDiv_RSSI_max;\r
+       u4Byte          RSSI_max;\r
+\r
+       u1Byte          *pbP2pLinkInProgress;\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       BOOLEAN         bTpTarget;\r
+       BOOLEAN         bNoiseEst;\r
+       u4Byte          TpTrainTH_min;\r
+       u1Byte          IGIOffset_A;\r
+       u1Byte          IGIOffset_B;\r
+#endif\r
+}DIG_T,*pDIG_T;\r
+\r
+typedef struct _FALSE_ALARM_STATISTICS{\r
+       u4Byte  Cnt_Parity_Fail;\r
+       u4Byte  Cnt_Rate_Illegal;\r
+       u4Byte  Cnt_Crc8_fail;\r
+       u4Byte  Cnt_Mcs_fail;\r
+       u4Byte  Cnt_Ofdm_fail;\r
+       u4Byte  Cnt_Ofdm_fail_pre;      //For RTL8881A\r
+       u4Byte  Cnt_Cck_fail;\r
+       u4Byte  Cnt_all;\r
+       u4Byte  Cnt_Fast_Fsync;\r
+       u4Byte  Cnt_SB_Search_fail;\r
+       u4Byte  Cnt_OFDM_CCA;\r
+       u4Byte  Cnt_CCK_CCA;\r
+       u4Byte  Cnt_CCA_all;\r
+       u4Byte  Cnt_BW_USC;     //Gary\r
+       u4Byte  Cnt_BW_LSC;     //Gary\r
+}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS;\r
+\r
+typedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition\r
+{\r
+       DIG_TYPE_THRESH_HIGH    = 0,\r
+       DIG_TYPE_THRESH_LOW     = 1,\r
+       DIG_TYPE_BACKOFF                = 2,\r
+       DIG_TYPE_RX_GAIN_MIN    = 3,\r
+       DIG_TYPE_RX_GAIN_MAX    = 4,\r
+       DIG_TYPE_ENABLE                 = 5,\r
+       DIG_TYPE_DISABLE                = 6,    \r
+       DIG_OP_TYPE_MAX\r
+}DM_DIG_OP_E;\r
+\r
+typedef enum tag_ODM_PauseDIG_Type {\r
+       ODM_PAUSE_DIG                   =       BIT0,\r
+       ODM_RESUME_DIG                  =       BIT1\r
+} ODM_Pause_DIG_TYPE;\r
+\r
+typedef enum tag_ODM_PauseCCKPD_Type {\r
+       ODM_PAUSE_CCKPD         =       BIT0,\r
+       ODM_RESUME_CCKPD        =       BIT1\r
+} ODM_Pause_CCKPD_TYPE;\r
+\r
+/*\r
+typedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition\r
+{\r
+       CCK_PD_STAGE_LowRssi = 0,\r
+       CCK_PD_STAGE_HighRssi = 1,\r
+       CCK_PD_STAGE_MAX = 3,\r
+}DM_CCK_PDTH_E;\r
+\r
+typedef enum tag_DIG_EXT_PORT_ALGO_Definition\r
+{\r
+       DIG_EXT_PORT_STAGE_0 = 0,\r
+       DIG_EXT_PORT_STAGE_1 = 1,\r
+       DIG_EXT_PORT_STAGE_2 = 2,\r
+       DIG_EXT_PORT_STAGE_3 = 3,\r
+       DIG_EXT_PORT_STAGE_MAX = 4,\r
+}DM_DIG_EXT_PORT_ALG_E;\r
+\r
+typedef enum tag_DIG_Connect_Definition\r
+{\r
+       DIG_STA_DISCONNECT = 0, \r
+       DIG_STA_CONNECT = 1,\r
+       DIG_STA_BEFORE_CONNECT = 2,\r
+       DIG_MultiSTA_DISCONNECT = 3,\r
+       DIG_MultiSTA_CONNECT = 4,\r
+       DIG_CONNECT_MAX\r
+}DM_DIG_CONNECT_E;\r
+\r
+\r
+#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;}\r
+\r
+#define DM_MultiSTA_InitGainChangeNotify_CONNECT(_ADAPTER)     \\r
+       DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_CONNECT)\r
+\r
+#define DM_MultiSTA_InitGainChangeNotify_DISCONNECT(_ADAPTER)  \\r
+       DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_DISCONNECT)\r
+*/\r
+#define                DM_DIG_THRESH_HIGH                      40\r
+#define                DM_DIG_THRESH_LOW                       35\r
+\r
+#define                DM_FALSEALARM_THRESH_LOW        400\r
+#define                DM_FALSEALARM_THRESH_HIGH       1000\r
+\r
+#define                DM_DIG_MAX_NIC                          0x3e\r
+#define                DM_DIG_MIN_NIC                          0x1e //0x22//0x1c\r
+#define                DM_DIG_MAX_OF_MIN_NIC           0x3e\r
+\r
+#define                DM_DIG_MAX_AP                                   0x3e\r
+#define                DM_DIG_MIN_AP                                   0x1c\r
+#define                DM_DIG_MAX_OF_MIN                       0x2A    //0x32\r
+#define                DM_DIG_MIN_AP_DFS                               0x20\r
+\r
+#define                DM_DIG_MAX_NIC_HP                       0x46\r
+#define                DM_DIG_MIN_NIC_HP                               0x2e\r
+\r
+#define                DM_DIG_MAX_AP_HP                                0x42\r
+#define                DM_DIG_MIN_AP_HP                                0x30\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+#define                DM_DIG_MAX_AP_COVERAGR          0x26\r
+#define                DM_DIG_MIN_AP_COVERAGE          0x1c\r
+#define                DM_DIG_MAX_OF_MIN_COVERAGE      0x22\r
+\r
+#define                DM_DIG_TP_Target_TH0                    500\r
+#define                DM_DIG_TP_Target_TH1                    1000\r
+#define                DM_DIG_TP_Training_Period               10\r
+#endif\r
+\r
+//vivi 92c&92d has different definition, 20110504\r
+//this is for 92c\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV\r
+       #define         DM_DIG_FA_TH0                           0x80//0x20\r
+       #else\r
+       #define         DM_DIG_FA_TH0                           0x200//0x20\r
+       #endif\r
+#else\r
+       #define         DM_DIG_FA_TH0                           0x200//0x20\r
+#endif\r
+\r
+#define                DM_DIG_FA_TH1                                   0x300\r
+#define                DM_DIG_FA_TH2                                   0x400\r
+//this is for 92d\r
+#define                DM_DIG_FA_TH0_92D                               0x100\r
+#define                DM_DIG_FA_TH1_92D                               0x400\r
+#define                DM_DIG_FA_TH2_92D                               0x600\r
+\r
+#define                DM_DIG_BACKOFF_MAX                      12\r
+#define                DM_DIG_BACKOFF_MIN                      -4\r
+#define                DM_DIG_BACKOFF_DEFAULT          10\r
+\r
+#define                DM_DIG_FA_TH0_LPS                               4 //-> 4 in lps\r
+#define                DM_DIG_FA_TH1_LPS                               15 //-> 15 lps\r
+#define                DM_DIG_FA_TH2_LPS                               30 //-> 30 lps\r
+#define                RSSI_OFFSET_DIG                         0x05\r
+\r
+VOID\r
+ODM_ChangeDynamicInitGainThresh(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN              u4Byte                                          DM_Type,\r
+       IN              u4Byte                                  DM_Value\r
+       );\r
+\r
+VOID\r
+ODM_Write_DIG(\r
+       IN              PVOID                                   pDM_VOID,       \r
+       IN              u1Byte                                  CurrentIGI\r
+       );\r
+\r
+VOID\r
+odm_PauseDIG(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN              ODM_Pause_DIG_TYPE              PauseType,\r
+       IN              u1Byte                                  IGIValue\r
+       );\r
+\r
+VOID\r
+odm_DIGInit(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+VOID   \r
+odm_DIG(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+VOID\r
+odm_DIGbyRSSI_LPS(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+VOID 
+odm_FalseAlarmCounterStatistics(\r
+       IN              PVOID                                   pDM_VOID\r
+       );
+\r
+VOID\r
+odm_PauseCCKPacketDetection(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN              ODM_Pause_CCKPD_TYPE    PauseType,\r
+       IN              u1Byte                                  CCKPDThreshold\r
+       );\r
+
+VOID 
+odm_CCKPacketDetectionThresh(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+VOID \r
+ODM_Write_CCK_CCA_Thres(\r
+       IN              PVOID                                   pDM_VOID, \r
+       IN              u1Byte                                  CurCCK_CCAThres\r
+       );\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+VOID
+odm_MPT_DIGCallback(
+       PRT_TIMER                                               pTimer\r
+);
+
+VOID
+odm_MPT_DIGWorkItemCallback(
+    IN                 PVOID                                   pContext\r
+    );
+\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+VOID\r
+odm_MPT_DIGCallback(\r
+       IN              PVOID                                   pDM_VOID\r
+);\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE != ODM_CE)\r
+VOID\r
+ODM_MPT_DIG(\r
+       IN              PVOID                                   pDM_VOID\r
+);\r
+#endif\r
+\r
+\r
+#endif\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicBBPowerSaving.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicBBPowerSaving.c
new file mode 100755 (executable)
index 0000000..a9099ad
--- /dev/null
@@ -0,0 +1,218 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+#include "Mp_Precomp.h"
+#include "phydm_precomp.h"\r
+\r
+VOID \r
+odm_DynamicBBPowerSavingInit(
+       IN              PVOID                                   pDM_VOID\r
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       pPS_T   pDM_PSTable = &pDM_Odm->DM_PSTable;\r
+
+       pDM_PSTable->PreCCAState = CCA_MAX;
+       pDM_PSTable->CurCCAState = CCA_MAX;
+       pDM_PSTable->PreRFState = RF_MAX;
+       pDM_PSTable->CurRFState = RF_MAX;
+       pDM_PSTable->Rssi_val_min = 0;
+       pDM_PSTable->initialize = 0;
+}
+
+
+VOID
+odm_DynamicBBPowerSaving(
+       IN              PVOID                                   pDM_VOID\r
+       )
+{      
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+
+       if (pDM_Odm->SupportICType != ODM_RTL8723A)
+               return;
+       if(!(pDM_Odm->SupportAbility & ODM_BB_PWR_SAVE))
+               return;
+       if(!(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE)))
+               return;
+       
+       //1 2.Power Saving for 92C
+       if((pDM_Odm->SupportICType == ODM_RTL8192C) &&(pDM_Odm->RFType == ODM_2T2R))
+       {
+               odm_1R_CCA(pDM_Odm);
+       }
+       
+       // 20100628 Joseph: Turn off BB power save for 88CE because it makesthroughput unstable.
+       // 20100831 Joseph: Turn ON BB power save again after modifying AGC delay from 900ns ot 600ns.
+       //1 3.Power Saving for 88C
+       else
+       {
+               ODM_RF_Saving(pDM_Odm, FALSE);
+       }
+#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       
+}
+
+VOID
+odm_1R_CCA(
+       IN              PVOID                                   pDM_VOID\r
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       pPS_T   pDM_PSTable = &pDM_Odm->DM_PSTable;\r
+
+       if(pDM_Odm->RSSI_Min!= 0xFF)
+       {
+                
+               if(pDM_PSTable->PreCCAState == CCA_2R)
+               {
+                       if(pDM_Odm->RSSI_Min >= 35)
+                               pDM_PSTable->CurCCAState = CCA_1R;
+                       else
+                               pDM_PSTable->CurCCAState = CCA_2R;
+                       
+               }
+               else{
+                       if(pDM_Odm->RSSI_Min <= 30)
+                               pDM_PSTable->CurCCAState = CCA_2R;
+                       else
+                               pDM_PSTable->CurCCAState = CCA_1R;
+               }
+       }
+       else{
+               pDM_PSTable->CurCCAState=CCA_MAX;
+       }
+       
+       if(pDM_PSTable->PreCCAState != pDM_PSTable->CurCCAState)
+       {
+               if(pDM_PSTable->CurCCAState == CCA_1R)
+               {
+                       if(  pDM_Odm->RFType ==ODM_2T2R )
+                       {
+                               ODM_SetBBReg(pDM_Odm, 0xc04  , bMaskByte0, 0x13);
+                               //PHY_SetBBReg(pAdapter, 0xe70, bMaskByte3, 0x20);
+                       }
+                       else
+                       {
+                               ODM_SetBBReg(pDM_Odm, 0xc04  , bMaskByte0, 0x23);
+                               //PHY_SetBBReg(pAdapter, 0xe70, 0x7fc00000, 0x10c); // Set RegE70[30:22] = 9b'100001100
+                       }
+               }
+               else
+               {
+                       ODM_SetBBReg(pDM_Odm, 0xc04  , bMaskByte0, 0x33);
+                       //PHY_SetBBReg(pAdapter,0xe70, bMaskByte3, 0x63);
+               }
+               pDM_PSTable->PreCCAState = pDM_PSTable->CurCCAState;
+       }
+}
+
+void
+ODM_RF_Saving(
+       IN              PVOID                                   pDM_VOID,\r
+       IN      u1Byte          bForceInNormal 
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE != ODM_AP)\r
+       pPS_T   pDM_PSTable = &pDM_Odm->DM_PSTable;
+       u1Byte  Rssi_Up_bound = 30 ;
+       u1Byte  Rssi_Low_bound = 25;
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+       if(pDM_Odm->PatchID == 40 ) //RT_CID_819x_FUNAI_TV
+       {
+               Rssi_Up_bound = 50 ;
+               Rssi_Low_bound = 45;
+       }
+#endif\r
+       if(pDM_PSTable->initialize == 0){
+               
+               pDM_PSTable->Reg874 = (ODM_GetBBReg(pDM_Odm, 0x874, bMaskDWord)&0x1CC000)>>14;
+               pDM_PSTable->RegC70 = (ODM_GetBBReg(pDM_Odm, 0xc70, bMaskDWord)&BIT3)>>3;
+               pDM_PSTable->Reg85C = (ODM_GetBBReg(pDM_Odm, 0x85c, bMaskDWord)&0xFF000000)>>24;
+               pDM_PSTable->RegA74 = (ODM_GetBBReg(pDM_Odm, 0xa74, bMaskDWord)&0xF000)>>12;
+               //Reg818 = PHY_QueryBBReg(pAdapter, 0x818, bMaskDWord);
+               pDM_PSTable->initialize = 1;
+       }
+
+       if(!bForceInNormal)
+       {
+               if(pDM_Odm->RSSI_Min != 0xFF)
+               {                        
+                       if(pDM_PSTable->PreRFState == RF_Normal)
+                       {
+                               if(pDM_Odm->RSSI_Min >= Rssi_Up_bound)
+                                       pDM_PSTable->CurRFState = RF_Save;
+                               else
+                                       pDM_PSTable->CurRFState = RF_Normal;
+                       }
+                       else{
+                               if(pDM_Odm->RSSI_Min <= Rssi_Low_bound)
+                                       pDM_PSTable->CurRFState = RF_Normal;
+                               else
+                                       pDM_PSTable->CurRFState = RF_Save;
+                       }
+               }
+               else
+                       pDM_PSTable->CurRFState=RF_MAX;
+       }
+       else
+       {
+               pDM_PSTable->CurRFState = RF_Normal;
+       }
+       
+       if(pDM_PSTable->PreRFState != pDM_PSTable->CurRFState)
+       {
+               if(pDM_PSTable->CurRFState == RF_Save)
+               {
+                       // <tynli_note> 8723 RSSI report will be wrong. Set 0x874[5]=1 when enter BB power saving mode.
+                       // Suggested by SD3 Yu-Nan. 2011.01.20.
+                       if(pDM_Odm->SupportICType == ODM_RTL8723A)
+                       {
+                               ODM_SetBBReg(pDM_Odm, 0x874  , BIT5, 0x1); //Reg874[5]=1b'1
+                       }
+                       ODM_SetBBReg(pDM_Odm, 0x874  , 0x1C0000, 0x2); //Reg874[20:18]=3'b010
+                       ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, 0); //RegC70[3]=1'b0
+                       ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, 0x63); //Reg85C[31:24]=0x63
+                       ODM_SetBBReg(pDM_Odm, 0x874, 0xC000, 0x2); //Reg874[15:14]=2'b10
+                       ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, 0x3); //RegA75[7:4]=0x3
+                       ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0); //Reg818[28]=1'b0
+                       ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x1); //Reg818[28]=1'b1
+               }
+               else
+               {
+                       ODM_SetBBReg(pDM_Odm, 0x874  , 0x1CC000, pDM_PSTable->Reg874); 
+                       ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, pDM_PSTable->RegC70); 
+                       ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, pDM_PSTable->Reg85C);
+                       ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, pDM_PSTable->RegA74); 
+                       ODM_SetBBReg(pDM_Odm,0x818, BIT28, 0x0);  
+
+                       if(pDM_Odm->SupportICType == ODM_RTL8723A)
+                       {
+                               ODM_SetBBReg(pDM_Odm,0x874  , BIT5, 0x0); //Reg874[5]=1b'0
+                       }
+               }
+               pDM_PSTable->PreRFState =pDM_PSTable->CurRFState;
+       }
+#endif 
+}
\ No newline at end of file
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicBBPowerSaving.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicBBPowerSaving.h
new file mode 100755 (executable)
index 0000000..ef04509
--- /dev/null
@@ -0,0 +1,63 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __PHYDMDYNAMICBBPOWERSAVING_H__\r
+#define    __PHYDMDYNAMICBBPOWERSAVING_H__\r
+\r
+#define DYNAMIC_BBPWRSAV_VERSION       "1.0"\r
+\r
+typedef struct _Dynamic_Power_Saving_\r
+{\r
+       u1Byte          PreCCAState;\r
+       u1Byte          CurCCAState;\r
+\r
+       u1Byte          PreRFState;\r
+       u1Byte          CurRFState;\r
+\r
+       int                 Rssi_val_min;\r
+       \r
+       u1Byte          initialize;\r
+       u4Byte          Reg874,RegC70,Reg85C,RegA74;\r
+       \r
+}PS_T,*pPS_T;\r
+\r
+#define dm_RF_Saving   ODM_RF_Saving\r
+\r
+void ODM_RF_Saving(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN      u1Byte          bForceInNormal \r
+       );\r
+\r
+VOID 
+odm_DynamicBBPowerSavingInit(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+VOID 
+odm_DynamicBBPowerSaving(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+VOID
+odm_1R_CCA(
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+#endif
\ No newline at end of file
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicTxPower.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicTxPower.c
new file mode 100755 (executable)
index 0000000..5a6d2a9
--- /dev/null
@@ -0,0 +1,882 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+#include "Mp_Precomp.h"
+#include "phydm_precomp.h"\r
+\r
+VOID \r
+odm_DynamicTxPowerInit(
+       IN              PVOID                                   pDM_VOID        \r
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       PADAPTER        Adapter = pDM_Odm->Adapter;
+       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+
+       #if DEV_BUS_TYPE==RT_USB_INTERFACE                                      
+       if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power)
+       {
+               odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
+               pMgntInfo->bDynamicTxPowerEnable = TRUE;
+       }               
+       else    
+       #else
+       //so 92c pci do not need dynamic tx power? vivi check it later
+       if(IS_HARDWARE_TYPE_8192D(Adapter))
+               pMgntInfo->bDynamicTxPowerEnable = TRUE;
+       else
+               pMgntInfo->bDynamicTxPowerEnable = FALSE;
+       #endif
+       
+
+       pHalData->LastDTPLvl = TxHighPwrLevel_Normal;
+       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+       PADAPTER        Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+       pdmpriv->bDynamicTxPowerEnable = _FALSE;
+
+       #if (RTL8192C_SUPPORT==1) 
+       #ifdef CONFIG_USB_HCI
+
+       #ifdef CONFIG_INTEL_PROXIM
+       if((pHalData->BoardType == BOARD_USB_High_PA)||(Adapter->proximity.proxim_support==_TRUE))
+       #else
+       if(pHalData->BoardType == BOARD_USB_High_PA)
+       #endif
+
+       {
+               //odm_SavePowerIndex(Adapter);
+               odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
+               pdmpriv->bDynamicTxPowerEnable = _TRUE;
+       }               
+       else    
+       #else
+               pdmpriv->bDynamicTxPowerEnable = _FALSE;
+       #endif
+       #endif
+       
+       pdmpriv->LastDTPLvl = TxHighPwrLevel_Normal;
+       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal; 
+       
+#endif
+       
+}
+
+VOID
+odm_DynamicTxPowerSavePowerIndex(
+       IN              PVOID                                   pDM_VOID        \r
+       )
+{      
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;
+#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
+       u1Byte          index;
+       u4Byte          Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};\r
+       
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)   
+       PADAPTER        Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);      
+       for(index = 0; index< 6; index++)
+               pHalData->PowerIndex_backup[index] = PlatformEFIORead1Byte(Adapter, Power_Index_REG[index]);
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)  
+       PADAPTER        Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+       for(index = 0; index< 6; index++)
+               pdmpriv->PowerIndex_backup[index] = rtw_read8(Adapter, Power_Index_REG[index]);
+#endif
+#endif
+}
+
+VOID
+odm_DynamicTxPowerRestorePowerIndex(
+       IN              PVOID                                   pDM_VOID\r
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
+       u1Byte                  index;
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       u4Byte                  Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       for(index = 0; index< 6; index++)
+               PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], pHalData->PowerIndex_backup[index]);
+#elif(DM_ODM_SUPPORT_TYPE == ODM_CE)   
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+       for(index = 0; index< 6; index++)
+               rtw_write8(Adapter, Power_Index_REG[index], pdmpriv->PowerIndex_backup[index]);
+#endif
+#endif
+}
+
+VOID
+odm_DynamicTxPowerWritePowerIndex(
+       IN              PVOID                                   pDM_VOID, \r
+       IN      u1Byte          Value)
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       u1Byte                  index;\r
+       u4Byte                  Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
+       
+       for(index = 0; index< 6; index++)
+               //PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], Value);
+               ODM_Write1Byte(pDM_Odm, Power_Index_REG[index], Value);
+
+}
+
+
+VOID 
+odm_DynamicTxPower(
+       IN              PVOID                                   pDM_VOID\r
+       )
+{
+       // 
+       // For AP/ADSL use prtl8192cd_priv
+       // For CE/NIC use PADAPTER
+       //
+       //PADAPTER              pAdapter = pDM_Odm->Adapter;
+//     prtl8192cd_priv priv            = pDM_Odm->priv;
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
+               return;
+       //
+       // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
+       // at the same time. In the stage2/3, we need to prive universal interface and merge all
+       // HW dynamic mechanism.
+       //
+       switch  (pDM_Odm->SupportPlatform)
+       {
+               case    ODM_WIN:
+               case    ODM_CE:
+                       odm_DynamicTxPowerNIC(pDM_Odm);
+                       break;  
+               case    ODM_AP:
+                       odm_DynamicTxPowerAP(pDM_Odm);
+                       break;          
+
+               case    ODM_ADSL:
+                       //odm_DIGAP(pDM_Odm);
+                       break;  
+       }
+
+       
+}
+
+
+VOID 
+odm_DynamicTxPowerNIC(
+       IN              PVOID                                   pDM_VOID\r
+       )
+{      
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       
+       if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))\r
+               return;
+       
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+
+       if(pDM_Odm->SupportICType == ODM_RTL8192C)      
+       {
+               odm_DynamicTxPower_92C(pDM_Odm);
+       }
+       else if(pDM_Odm->SupportICType == ODM_RTL8192D)
+       {
+               odm_DynamicTxPower_92D(pDM_Odm);
+       }
+       else if (pDM_Odm->SupportICType == ODM_RTL8821)
+       {
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
+               PADAPTER                Adapter  =  pDM_Odm->Adapter;
+               PMGNT_INFO              pMgntInfo = GetDefaultMgntInfo(Adapter);
+
+               if (pMgntInfo->RegRspPwr == 1)
+               {
+                       if(pDM_Odm->RSSI_Min > 60)
+                       {
+                               ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 1); // Resp TXAGC offset = -3dB
+
+                       }
+                       else if(pDM_Odm->RSSI_Min < 55)
+                       {
+                               ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 0); // Resp TXAGC offset = 0dB
+                       }
+               }
+#endif
+       }
+#endif 
+}
+
+VOID 
+odm_DynamicTxPowerAP(
+       IN              PVOID                                   pDM_VOID\r
+
+       )
+{      \r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
+
+//#if ((RTL8192C_SUPPORT==1) || (RTL8192D_SUPPORT==1) || (RTL8188E_SUPPORT==1) || (RTL8812E_SUPPORT==1))
+
+
+       prtl8192cd_priv priv            = pDM_Odm->priv;
+       s4Byte i;
+       s2Byte pwr_thd = TX_POWER_NEAR_FIELD_THRESH_AP;
+
+       if(!priv->pshare->rf_ft_var.tx_pwr_ctrl)
+               return;
+       
+#if ((RTL8812E_SUPPORT==1) || (RTL8881A_SUPPORT==1))
+       if (pDM_Odm->SupportICType & (ODM_RTL8812 | ODM_RTL8881A))
+               pwr_thd = TX_POWER_NEAR_FIELD_THRESH_8812;
+#endif
+
+#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)
+       if(CHIP_VER_92X_SERIES(priv))
+       {
+#ifdef HIGH_POWER_EXT_PA
+       if(pDM_Odm->ExtPA)
+               tx_power_control(priv);
+#endif         
+       }
+#endif 
+       /*
+        *      Check if station is near by to use lower tx power
+        */
+
+       if ((priv->up_time % 3) == 0 )  {
+               int disable_pwr_ctrl = ((pDM_Odm->FalseAlmCnt.Cnt_all > 1000 ) || ((pDM_Odm->FalseAlmCnt.Cnt_all > 300 ) && ((RTL_R8(0xc50) & 0x7f) >= 0x32))) ? 1 : 0;
+                       
+               for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++){
+                       PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];
+                       if(IS_STA_VALID(pstat) ) {
+                                       if(disable_pwr_ctrl)
+                                               pstat->hp_level = 0;
+                                        else if ((pstat->hp_level == 0) && (pstat->rssi > pwr_thd))
+                                       pstat->hp_level = 1;
+                                               else if ((pstat->hp_level == 1) && (pstat->rssi < (pwr_thd-8)))
+                                       pstat->hp_level = 0;
+                       }
+               }
+
+#if defined(CONFIG_WLAN_HAL_8192EE)
+               if (GET_CHIP_VER(priv) == VERSION_8192E) {
+                       if( !disable_pwr_ctrl && (pDM_Odm->RSSI_Min != 0xff) ) {
+                               if(pDM_Odm->RSSI_Min > pwr_thd)
+                                       RRSR_power_control_11n(priv,  1 );
+                               else if(pDM_Odm->RSSI_Min < (pwr_thd-8))
+                                       RRSR_power_control_11n(priv,  0 );
+                       } else {
+                                       RRSR_power_control_11n(priv,  0 );
+                       }
+               }
+#endif                 
+       }
+//#endif       
+
+#endif 
+}
+
+
+VOID 
+odm_DynamicTxPower_92C(
+       IN              PVOID                                   pDM_VOID\r
+       )
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       PADAPTER Adapter = pDM_Odm->Adapter;
+       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+       s4Byte                          UndecoratedSmoothedPWDB;
+
+       // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.
+       if (pDM_Odm->ExtPA == FALSE)
+               return;
+
+       // STA not connected and AP not connected
+       if((!pMgntInfo->bMediaConnect) &&       
+               (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("Not connected to any \n"));
+               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+
+               //the LastDTPlvl should reset when disconnect, 
+               //otherwise the tx power level wouldn't change when disconnect and connect again.
+               // Maddest 20091220.
+                pHalData->LastDTPLvl=TxHighPwrLevel_Normal;
+               return;
+       }
+
+#if (INTEL_PROXIMITY_SUPPORT == 1)
+       // Intel set fixed tx power 
+       if(pMgntInfo->IntelProximityModeInfo.PowerOutput > 0)
+       {
+               switch(pMgntInfo->IntelProximityModeInfo.PowerOutput){
+                       case 1:
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
+                               break;
+                       case 2:
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_70\n"));
+                               break;
+                       case 3:
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_50\n"));
+                               break;
+                       case 4:
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_35\n"));
+                               break;
+                       case 5:
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_15\n"));
+                               break;
+                       default:
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
+                               break;
+               }               
+       }
+       else
+#endif         
+       { 
+               if(     (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
+                       pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
+               {
+                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+               }
+               else
+               {
+                       if(pMgntInfo->bMediaConnect)    // Default port
+                       {
+                               if(ACTING_AS_AP(Adapter) || ACTING_AS_IBSS(Adapter))
+                               {
+                                       UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+                               }
+                               else
+                               {
+                                       UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+                               }
+                       }
+                       else // associated entry pwdb
+                       {       
+                               UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+                       }
+                               
+                       if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
+                       {
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
+                       }
+                       else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
+                               (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
+                       {
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+                       }
+                       else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
+                       {
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
+                       }
+               }
+       }
+       if( pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl )
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192C() Channel = %d \n" , pHalData->CurrentChannel));
+               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+               if(     (pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) &&
+                       (pHalData->LastDTPLvl == TxHighPwrLevel_Level1 || pHalData->LastDTPLvl == TxHighPwrLevel_Level2)) //TxHighPwrLevel_Normal
+                       odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
+               else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
+                       odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
+               else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
+                       odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
+       }
+       pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
+
+       
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+
+       #if (RTL8192C_SUPPORT==1) 
+       PADAPTER Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+       struct mlme_priv        *pmlmepriv = &(Adapter->mlmepriv);
+       struct mlme_ext_priv    *pmlmeext = &Adapter->mlmeextpriv;
+       int     UndecoratedSmoothedPWDB;
+
+       if(!pdmpriv->bDynamicTxPowerEnable)
+               return;
+
+#ifdef CONFIG_INTEL_PROXIM
+       if(Adapter->proximity.proxim_on== _TRUE){
+               struct proximity_priv *prox_priv=Adapter->proximity.proximity_priv;
+               // Intel set fixed tx power 
+               printk("\n %s  Adapter->proximity.proxim_on=%d prox_priv->proxim_modeinfo->power_output=%d \n",__FUNCTION__,Adapter->proximity.proxim_on,prox_priv->proxim_modeinfo->power_output);
+               if(prox_priv!=NULL){
+                       if(prox_priv->proxim_modeinfo->power_output> 0) 
+                       {
+                               switch(prox_priv->proxim_modeinfo->power_output)
+                               {
+                                       case 1:
+                                               pdmpriv->DynamicTxHighPowerLvl  = TxHighPwrLevel_100;
+                                               printk("TxHighPwrLevel_100\n");
+                                               break;
+                                       case 2:
+                                               pdmpriv->DynamicTxHighPowerLvl  = TxHighPwrLevel_70;
+                                               printk("TxHighPwrLevel_70\n");
+                                               break;
+                                       case 3:
+                                               pdmpriv->DynamicTxHighPowerLvl  = TxHighPwrLevel_50;
+                                               printk("TxHighPwrLevel_50\n");
+                                               break;
+                                       case 4:
+                                               pdmpriv->DynamicTxHighPowerLvl  = TxHighPwrLevel_35;
+                                               printk("TxHighPwrLevel_35\n");
+                                               break;
+                                       case 5:
+                                               pdmpriv->DynamicTxHighPowerLvl  = TxHighPwrLevel_15;
+                                               printk("TxHighPwrLevel_15\n");
+                                               break;
+                                       default:
+                                               pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
+                                               printk("TxHighPwrLevel_100\n");
+                                               break;
+                               }               
+                       }
+               }
+       }
+       else
+#endif 
+       {
+               // STA not connected and AP not connected
+               if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&   
+                       (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
+               {
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+
+                       //the LastDTPlvl should reset when disconnect, 
+                       //otherwise the tx power level wouldn't change when disconnect and connect again.
+                       // Maddest 20091220.
+                       pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
+                       return;
+               }
+               
+               if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)       // Default port
+               {
+               #if 0
+                       //todo: AP Mode
+                       if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
+                              (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
+                       {
+                               UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
+                               //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+                       }
+                       else
+                       {
+                               UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
+                               //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+                       }
+               #else
+               UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;     
+               #endif
+               }
+               else // associated entry pwdb
+               {       
+                       UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+               }
+                       
+               if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
+               }
+               else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
+                       (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+               }
+               else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
+               }
+       }
+       if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
+       {
+               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+               if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) // HP1 -> Normal  or HP2 -> Normal
+                       odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
+               else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
+                       odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
+               else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
+                       odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
+       }
+       pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
+       #endif
+#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+}
+
+
+VOID 
+odm_DynamicTxPower_92D(
+       IN              PVOID                                   pDM_VOID\r
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       PADAPTER Adapter = pDM_Odm->Adapter;
+       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+       s4Byte                          UndecoratedSmoothedPWDB;
+
+       PADAPTER        BuddyAdapter = Adapter->BuddyAdapter;
+       BOOLEAN         bGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(Adapter);
+       u1Byte          HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
+
+       // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.
+       if (pDM_Odm->ExtPA == FALSE)
+               return;
+
+       // If dynamic high power is disabled.
+       if( (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
+               pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
+       {
+               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+               return;
+       }
+
+       // STA not connected and AP not connected
+       if((!pMgntInfo->bMediaConnect) &&       
+               (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("Not connected to any \n"));
+               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+
+               //the LastDTPlvl should reset when disconnect, 
+               //otherwise the tx power level wouldn't change when disconnect and connect again.
+               // Maddest 20091220.
+                pHalData->LastDTPLvl=TxHighPwrLevel_Normal;
+               return;
+       }
+       
+       if(pMgntInfo->bMediaConnect)    // Default port
+       {
+               if(ACTING_AS_AP(Adapter) || pMgntInfo->mIbss)
+               {
+                       UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+               }
+               else
+               {
+                       UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+               }
+       }
+       else // associated entry pwdb
+       {       
+               UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+       }
+       
+       if(IS_HARDWARE_TYPE_8192D(Adapter) && GET_HAL_DATA(Adapter)->CurrentBandType == 1){
+               if(UndecoratedSmoothedPWDB >= 0x33)
+               {
+                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
+               }
+               else if((UndecoratedSmoothedPWDB <0x33) &&
+                       (UndecoratedSmoothedPWDB >= 0x2b) )
+               {
+                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+               }
+               else if(UndecoratedSmoothedPWDB < 0x2b)
+               {
+                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
+               }
+
+       }
+       else
+       
+       {
+               if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
+               {
+                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
+               }
+               else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
+                       (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
+               {
+                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+               }
+               else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
+               {
+                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
+               }
+
+       }
+
+//sherry  delete flag 20110517
+       if(bGetValueFromBuddyAdapter)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));
+               if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
+               {
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() change value \n"));
+                       HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
+                       pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
+                       PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+                       pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
+                       Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = FALSE;
+               }                                               
+       }
+
+       if( (pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl) )
+       {
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
+                       if(Adapter->DualMacSmartConcurrent == TRUE)
+                       {
+                               if(BuddyAdapter == NULL)
+                               {
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));
+                                       if(!Adapter->bSlaveOfDMSP)
+                                       {
+                                               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+                                       }
+                               }
+                               else
+                               {
+                                       if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
+                                       {
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
+                                               if(Adapter->bSlaveOfDMSP)
+                                               {
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() bslave case  \n"));
+                                                       BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = TRUE;
+                                                       BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
+                                               }
+                                               else
+                                               {
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() master case  \n"));                                  
+                                                       if(!bGetValueFromBuddyAdapter)
+                                                       {
+                                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));
+                                                               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+                                                       }
+                                               }
+                                       }
+                                       else
+                                       {
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
+                                               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+                       }
+
+               }
+       pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+#if (RTL8192D_SUPPORT==1) 
+       PADAPTER Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       struct mlme_priv        *pmlmepriv = &(Adapter->mlmepriv);
+
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+       DM_ODM_T                *podmpriv = &pHalData->odmpriv;
+       int     UndecoratedSmoothedPWDB;
+       #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
+       PADAPTER        BuddyAdapter = Adapter->BuddyAdapter;
+       BOOLEAN         bGetValueFromBuddyAdapter = DualMacGetParameterFromBuddyAdapter(Adapter);
+       u8              HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
+       #endif
+
+       // If dynamic high power is disabled.
+       if( (pdmpriv->bDynamicTxPowerEnable != _TRUE) ||
+               (!(podmpriv->SupportAbility& ODM_BB_DYNAMIC_TXPWR)) )
+       {
+               pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+               return;
+       }
+
+       // STA not connected and AP not connected
+       if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&   
+               (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
+       {
+               //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
+               pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+               //the LastDTPlvl should reset when disconnect, 
+               //otherwise the tx power level wouldn't change when disconnect and connect again.
+               // Maddest 20091220.
+               pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
+               return;
+       }
+               
+       if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)       // Default port
+       {
+       #if 0
+               //todo: AP Mode
+               if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
+              (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
+               {
+                       UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+               }
+               else
+               {
+                       UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+               }
+       #else
+       UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
+       #endif
+       }
+       else // associated entry pwdb
+       {       
+               UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
+               //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+       }
+#if TX_POWER_FOR_5G_BAND == 1
+       if(pHalData->CurrentBandType92D == BAND_ON_5G){
+               if(UndecoratedSmoothedPWDB >= 0x33)
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
+               }
+               else if((UndecoratedSmoothedPWDB <0x33) &&
+                       (UndecoratedSmoothedPWDB >= 0x2b) )
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+               }
+               else if(UndecoratedSmoothedPWDB < 0x2b)
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
+               }
+       }
+       else
+#endif
+       {
+               if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
+               }
+               else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
+                       (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+               }
+               else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
+               }
+       }
+#if (RTL8192D_EASY_SMART_CONCURRENT == 1)
+       if(bGetValueFromBuddyAdapter)
+       {
+               //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));
+               if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
+               {
+                       //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() change value \n"));
+                       HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
+                       pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
+                       PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
+                       pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
+                       Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _FALSE;
+               }                                               
+       }
+#endif
+
+       if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
+       {
+               //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
+#if (RTL8192D_EASY_SMART_CONCURRENT == 1)
+               if(BuddyAdapter == NULL)
+               {
+                       //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));
+                       if(!Adapter->bSlaveOfDMSP)
+                       {
+                               PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
+                       }
+               }
+               else
+               {
+                       if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
+                       {
+                               //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
+                               if(Adapter->bSlaveOfDMSP)
+                               {
+                                       //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() bslave case  \n"));
+                                       BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _TRUE;
+                                       BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
+                               }
+                               else
+                               {
+                                       //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() master case  \n"));                                     
+                                       if(!bGetValueFromBuddyAdapter)
+                                       {
+                                               //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));
+                                               PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
+                               PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
+                       }
+               }
+#else
+               PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
+#endif
+       }
+       pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
+#endif 
+#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+}
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicTxPower.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_DynamicTxPower.h
new file mode 100755 (executable)
index 0000000..508cd31
--- /dev/null
@@ -0,0 +1,89 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __PHYDMDYNAMICTXPOWER_H__\r
+#define    __PHYDMDYNAMICTXPOWER_H__\r
+\r
+#define DYNAMIC_TXPWR_VERSION  "1.0"\r
+\r
+#define                TX_POWER_NEAR_FIELD_THRESH_LVL2 74\r
+#define                TX_POWER_NEAR_FIELD_THRESH_LVL1 67\r
+#define                TX_POWER_NEAR_FIELD_THRESH_AP           0x3F\r
+#define                TX_POWER_NEAR_FIELD_THRESH_8812 60\r
+\r
+#define                TxHighPwrLevel_Normal           0       \r
+#define                TxHighPwrLevel_Level1           1\r
+#define                TxHighPwrLevel_Level2           2\r
+#define                TxHighPwrLevel_BT1                      3\r
+#define                TxHighPwrLevel_BT2                      4\r
+#define                TxHighPwrLevel_15                       5\r
+#define                TxHighPwrLevel_35                       6\r
+#define                TxHighPwrLevel_50                       7\r
+#define                TxHighPwrLevel_70                       8\r
+#define                TxHighPwrLevel_100                      9\r
+\r
+VOID 
+odm_DynamicTxPowerInit(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+VOID
+odm_DynamicTxPowerRestorePowerIndex(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+VOID 
+odm_DynamicTxPowerNIC(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+VOID
+odm_DynamicTxPowerSavePowerIndex(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+VOID
+odm_DynamicTxPowerWritePowerIndex(
+       IN              PVOID                                   pDM_VOID, \r
+       IN      u1Byte          Value);
+
+VOID 
+odm_DynamicTxPower_92C(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+VOID 
+odm_DynamicTxPower_92D(
+       IN              PVOID                                   pDM_VOID\r
+       );
+#endif
+\r
+VOID 
+odm_DynamicTxPower(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+VOID 
+odm_DynamicTxPowerAP(
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+#endif\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_EdcaTurboCheck.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_EdcaTurboCheck.c
new file mode 100755 (executable)
index 0000000..4793000
--- /dev/null
@@ -0,0 +1,1915 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+#include "Mp_Precomp.h"\r
+#include "phydm_precomp.h"\r
+\r
+VOID\r
+ODM_EdcaTurboInit(\r
+       IN      PVOID           pDM_VOID)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if ((DM_ODM_SUPPORT_TYPE == ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))\r
+       odm_EdcaParaInit(pDM_Odm);\r
+#elif (DM_ODM_SUPPORT_TYPE==ODM_WIN)\r
+       PADAPTER        Adapter = NULL;\r
+       HAL_DATA_TYPE   *pHalData = NULL;\r
+\r
+       if(pDM_Odm->Adapter==NULL)      {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EdcaTurboInit fail!!!\n"));\r
+               return;\r
+       }\r
+\r
+       Adapter=pDM_Odm->Adapter;\r
+       pHalData=GET_HAL_DATA(Adapter);\r
+\r
+       pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;       \r
+       pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;\r
+       pHalData->bIsAnyNonBEPkts = FALSE;\r
+       \r
+#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)\r
+       PADAPTER        Adapter = pDM_Odm->Adapter;     \r
+       pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;       \r
+       pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;\r
+       Adapter->recvpriv.bIsAnyNonBEPkts =FALSE;\r
+\r
+#endif \r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial VO PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_VO_PARAM)));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial VI PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_VI_PARAM)));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BE PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BE_PARAM)));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BK PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BK_PARAM)));\r
+\r
+       \r
+}      // ODM_InitEdcaTurbo\r
+\r
+VOID\r
+odm_EdcaTurboCheck(\r
+       IN      PVOID           pDM_VOID\r
+       )\r
+{\r
+       // \r
+       // For AP/ADSL use prtl8192cd_priv\r
+       // For CE/NIC use PADAPTER\r
+       //\r
+\r
+       //\r
+       // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\r
+       // at the same time. In the stage2/3, we need to prive universal interface and merge all\r
+       // HW dynamic mechanism.\r
+       //\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheck========================>\n"));\r
+       \r
+       if(!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))\r
+               return;\r
+\r
+       switch  (pDM_Odm->SupportPlatform)\r
+       {\r
+               case    ODM_WIN:\r
+\r
+#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)\r
+                       odm_EdcaTurboCheckMP(pDM_Odm);\r
+#endif\r
+                       break;\r
+\r
+               case    ODM_CE:\r
+#if(DM_ODM_SUPPORT_TYPE==ODM_CE)\r
+                       odm_EdcaTurboCheckCE(pDM_Odm);\r
+#endif\r
+                       break;\r
+\r
+               case    ODM_AP:\r
+               case    ODM_ADSL:\r
+\r
+#if ((DM_ODM_SUPPORT_TYPE == ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))\r
+               odm_IotEngine(pDM_Odm);\r
+#endif\r
+                       break;  \r
+       }\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("<========================odm_EdcaTurboCheck\n"));\r
+\r
+}      // odm_CheckEdcaTurbo\r
+\r
+#if(DM_ODM_SUPPORT_TYPE==ODM_CE)\r
+\r
+\r
+VOID\r
+odm_EdcaTurboCheckCE(\r
+       IN      PVOID           pDM_VOID\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                       Adapter = pDM_Odm->Adapter;\r
+       u32     EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_UL[pMgntInfo->IOTPeer];\r
+       u32     EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_DL[pMgntInfo->IOTPeer];\r
+       u32     ICType=pDM_Odm->SupportICType;\r
+       u32     IOTPeer=0;\r
+       u8      WirelessMode=0xFF;                   //invalid value\r
+       u32     trafficIndex;\r
+       u32     edca_param;\r
+       u64     cur_tx_bytes = 0;\r
+       u64     cur_rx_bytes = 0;\r
+       u8      bbtchange = _FALSE;\r
+       u8      bBiasOnRx = _FALSE;\r
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
+       struct dvobj_priv               *pdvobjpriv = adapter_to_dvobj(Adapter);\r
+       struct xmit_priv                *pxmitpriv = &(Adapter->xmitpriv);\r
+       struct recv_priv                *precvpriv = &(Adapter->recvpriv);\r
+       struct registry_priv    *pregpriv = &Adapter->registrypriv;\r
+       struct mlme_ext_priv    *pmlmeext = &(Adapter->mlmeextpriv);\r
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
+\r
+       if(pDM_Odm->bLinked != _TRUE)\r
+       {\r
+               precvpriv->bIsAnyNonBEPkts = _FALSE;\r
+               return;\r
+       }\r
+\r
+       if ((pregpriv->wifi_spec == 1) )//|| (pmlmeinfo->HT_enable == 0))\r
+       {\r
+               precvpriv->bIsAnyNonBEPkts = _FALSE;\r
+               return;\r
+       }\r
+\r
+       if(pDM_Odm->pWirelessMode!=NULL)\r
+               WirelessMode=*(pDM_Odm->pWirelessMode);\r
+\r
+       IOTPeer = pmlmeinfo->assoc_AP_vendor;\r
+\r
+       if (IOTPeer >=  HT_IOT_PEER_MAX)\r
+       {\r
+               precvpriv->bIsAnyNonBEPkts = _FALSE;\r
+               return;\r
+       }\r
+\r
+       if(     (pDM_Odm->SupportICType == ODM_RTL8192C) ||\r
+               (pDM_Odm->SupportICType == ODM_RTL8723A) ||\r
+               (pDM_Odm->SupportICType == ODM_RTL8188E))\r
+       {\r
+               if((IOTPeer == HT_IOT_PEER_RALINK)||(IOTPeer == HT_IOT_PEER_ATHEROS))\r
+                       bBiasOnRx = _TRUE;\r
+       }\r
+\r
+       // Check if the status needs to be changed.\r
+       if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) )\r
+       {\r
+               cur_tx_bytes = pdvobjpriv->traffic_stat.cur_tx_bytes;\r
+               cur_rx_bytes = pdvobjpriv->traffic_stat.cur_rx_bytes;\r
+\r
+               //traffic, TX or RX\r
+               if(bBiasOnRx)\r
+               {\r
+                       if (cur_tx_bytes > (cur_rx_bytes << 2))\r
+                       { // Uplink TP is present.\r
+                               trafficIndex = UP_LINK; \r
+                       }\r
+                       else\r
+                       { // Balance TP is present.\r
+                               trafficIndex = DOWN_LINK;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (cur_rx_bytes > (cur_tx_bytes << 2))\r
+                       { // Downlink TP is present.\r
+                               trafficIndex = DOWN_LINK;\r
+                       }\r
+                       else\r
+                       { // Balance TP is present.\r
+                               trafficIndex = UP_LINK;\r
+                       }\r
+               }\r
+\r
+               //if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA))\r
+               {\r
+                       if(ICType==ODM_RTL8192D)\r
+                       {      \r
+                               // Single PHY\r
+                               if(pDM_Odm->RFType==ODM_2T2R)\r
+                               {\r
+                                       EDCA_BE_UL = 0x60a42b;    //0x5ea42b;\r
+                                       EDCA_BE_DL = 0x60a42b;    //0x5ea42b;\r
+                               }\r
+                               else\r
+                               {\r
+                                       EDCA_BE_UL = 0x6ea42b;\r
+                                       EDCA_BE_DL = 0x6ea42b;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE) {\r
+                                       if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R)) {\r
+                                               EDCA_BE_UL = 0x60a42b;\r
+                                               EDCA_BE_DL = 0x60a42b;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               EDCA_BE_UL = 0x6ea42b;\r
+                                               EDCA_BE_DL = 0x6ea42b;\r
+                                       }\r
+                               }\r
+                       }\r
+               \r
+                       //92D txop can't be set to 0x3e for cisco1250\r
+                       if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))\r
+                       {\r
+                               EDCA_BE_DL = edca_setting_DL[IOTPeer];\r
+                               EDCA_BE_UL = edca_setting_UL[IOTPeer];\r
+                       }\r
+                       //merge from 92s_92c_merge temp brunch v2445    20120215 \r
+                       else if((IOTPeer == HT_IOT_PEER_CISCO) &&((WirelessMode==ODM_WM_G)||(WirelessMode==(ODM_WM_B|ODM_WM_G))||(WirelessMode==ODM_WM_A)||(WirelessMode==ODM_WM_B)))\r
+                       {\r
+                               EDCA_BE_DL = edca_setting_DL_GMode[IOTPeer];\r
+                       }\r
+                       else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))\r
+                       {\r
+                               EDCA_BE_DL = 0xa630;\r
+                       }\r
+                       else if(IOTPeer == HT_IOT_PEER_MARVELL)\r
+                       {\r
+                               EDCA_BE_DL = edca_setting_DL[IOTPeer];\r
+                               EDCA_BE_UL = edca_setting_UL[IOTPeer];\r
+                       }\r
+                       else if(IOTPeer == HT_IOT_PEER_ATHEROS)\r
+                       {\r
+                               // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue. \r
+                               EDCA_BE_DL = edca_setting_DL[IOTPeer];\r
+                       }\r
+\r
+                       if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8821)||(ICType==ODM_RTL8192E))           //add 8812AU/8812AE\r
+                       {\r
+                               EDCA_BE_UL = 0x5ea42b;\r
+                               EDCA_BE_DL = 0x5ea42b;\r
+\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8812A: EDCA_BE_UL=0x%x EDCA_BE_DL =0x%x",EDCA_BE_UL,EDCA_BE_DL));\r
+                       }\r
+\r
+                       if (trafficIndex == DOWN_LINK)\r
+                               edca_param = EDCA_BE_DL;\r
+                       else\r
+                               edca_param = EDCA_BE_UL;\r
+\r
+                       rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);\r
+\r
+                       pDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex;\r
+               }\r
+               \r
+               pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _TRUE;\r
+       }\r
+       else\r
+       {\r
+               //\r
+               // Turn Off EDCA turbo here.\r
+               // Restore original EDCA according to the declaration of AP.\r
+               //\r
+                if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)\r
+               {\r
+                       rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);\r
+                       pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;\r
+               }\r
+       }\r
+\r
+}\r
+\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE==ODM_WIN)\r
+VOID\r
+odm_EdcaTurboCheckMP(\r
+       IN      PVOID           pDM_VOID\r
+       )\r
+{\r
+\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                       Adapter = pDM_Odm->Adapter;\r
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
+\r
+       PADAPTER                        pDefaultAdapter = GetDefaultAdapter(Adapter);\r
+       PADAPTER                        pExtAdapter = GetFirstExtAdapter(Adapter);//NULL;\r
+       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;\r
+       PSTA_QOS                        pStaQos = Adapter->MgntInfo.pStaQos;\r
+       //[Win7 Count Tx/Rx statistic for Extension Port] odm_CheckEdcaTurbo's Adapter is always Default. 2009.08.20, by Bohn\r
+       u8Byte                          Ext_curTxOkCnt = 0;\r
+       u8Byte                          Ext_curRxOkCnt = 0;     \r
+       //For future Win7  Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.      \r
+       u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;\r
+\r
+       // Keep past Tx/Rx packet count for RT-to-RT EDCA turbo.\r
+       u8Byte                          curTxOkCnt = 0;\r
+       u8Byte                          curRxOkCnt = 0; \r
+       u4Byte                          EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_UL[pMgntInfo->IOTPeer];\r
+       u4Byte                          EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_DL[pMgntInfo->IOTPeer];\r
+       u4Byte                         EDCA_BE = 0x5ea42b;\r
+       u1Byte                         IOTPeer=0;\r
+       BOOLEAN                      *pbIsCurRDLState=NULL;\r
+       BOOLEAN                      bLastIsCurRDLState=FALSE;\r
+       BOOLEAN                          bBiasOnRx=FALSE;\r
+       BOOLEAN                         bEdcaTurboOn=FALSE;\r
+       u1Byte                          TxRate = 0xFF;\r
+       u8Byte                          value64;        \r
+\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheckMP========================>"));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BE PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BE_PARAM)));\r
+\r
+////===============================\r
+////list paramter for different platform\r
+////===============================\r
+       bLastIsCurRDLState=pDM_Odm->DM_EDCA_Table.bIsCurRDLState;\r
+       pbIsCurRDLState=&(pDM_Odm->DM_EDCA_Table.bIsCurRDLState);       \r
+\r
+       //2012/09/14 MH Add \r
+       if (pMgntInfo->NumNonBePkt > pMgntInfo->RegEdcaThresh && !Adapter->MgntInfo.bWiFiConfg)\r
+               pHalData->bIsAnyNonBEPkts = TRUE;\r
+\r
+       pMgntInfo->NumNonBePkt = 0;\r
+\r
+       // Caculate TX/RX TP:\r
+       //curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;\r
+       //curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;\r
+       curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pDM_Odm->lastTxOkCnt;\r
+       curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pDM_Odm->lastRxOkCnt;\r
+       pDM_Odm->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;\r
+       pDM_Odm->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;\r
+\r
+       if(pExtAdapter == NULL) \r
+               pExtAdapter = pDefaultAdapter;\r
+\r
+       Ext_curTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->Ext_lastTxOkCnt;\r
+       Ext_curRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->Ext_lastRxOkCnt;\r
+       GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);\r
+       //For future Win7  Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.\r
+       if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)\r
+       {\r
+               curTxOkCnt = Ext_curTxOkCnt ;\r
+               curRxOkCnt = Ext_curRxOkCnt ;\r
+       }\r
+       //\r
+       IOTPeer=pMgntInfo->IOTPeer;\r
+       bBiasOnRx=(pMgntInfo->IOTAction & HT_IOT_ACT_EDCA_BIAS_ON_RX)?TRUE:FALSE;\r
+       bEdcaTurboOn=((!pHalData->bIsAnyNonBEPkts))?TRUE:FALSE;\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bIsAnyNonBEPkts : 0x%lx  \n",pHalData->bIsAnyNonBEPkts));\r
+\r
+\r
+////===============================\r
+////check if edca turbo is disabled\r
+////===============================\r
+       if(odm_IsEdcaTurboDisable(pDM_Odm))\r
+       {\r
+               pHalData->bIsAnyNonBEPkts = FALSE;\r
+               pMgntInfo->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;\r
+               pMgntInfo->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;\r
+               pMgntInfo->Ext_lastTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast;\r
+               pMgntInfo->Ext_lastRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast;\r
+\r
+       }\r
+\r
+////===============================\r
+////remove iot case out\r
+////===============================\r
+       ODM_EdcaParaSelByIot(pDM_Odm, &EDCA_BE_UL, &EDCA_BE_DL);\r
+\r
+\r
+////===============================\r
+////Check if the status needs to be changed.\r
+////===============================\r
+       if(bEdcaTurboOn)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bEdcaTurboOn : 0x%x bBiasOnRx : 0x%x\n",bEdcaTurboOn,bBiasOnRx));\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curTxOkCnt : 0x%lx \n",curTxOkCnt));\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curRxOkCnt : 0x%lx \n",curRxOkCnt));\r
+               if(bBiasOnRx)\r
+                       odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt,   TRUE,  pbIsCurRDLState);\r
+               else\r
+                       odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt,   FALSE,  pbIsCurRDLState);\r
+\r
+//modify by Guo.Mingzhi 2011-12-29\r
+                       EDCA_BE=((*pbIsCurRDLState)==TRUE)?EDCA_BE_DL:EDCA_BE_UL;\r
+                       if(IS_HARDWARE_TYPE_8821U(Adapter))\r
+                       {\r
+                               if(pMgntInfo->RegTxDutyEnable)\r
+                               {\r
+                                       //2013.01.23 LukeLee: debug for 8811AU thermal issue (reduce Tx duty cycle)\r
+                                       if(!pMgntInfo->ForcedDataRate) //auto rate\r
+                                       {\r
+                                               if(pDM_Odm->TxRate != 0xFF)\r
+                                                       TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); \r
+                                       }\r
+                                       else //force rate\r
+                                       {\r
+                                               TxRate = (u1Byte) pMgntInfo->ForcedDataRate;\r
+                                       }\r
+\r
+                                       value64 = (curRxOkCnt<<2);\r
+                                       if(curTxOkCnt < value64) //Downlink\r
+                                               ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+                                       else //Uplink\r
+                                       {\r
+                                               //DbgPrint("pDM_Odm->RFCalibrateInfo.ThermalValue = 0x%X\n", pDM_Odm->RFCalibrateInfo.ThermalValue);\r
+                                               //if(pDM_Odm->RFCalibrateInfo.ThermalValue < pHalData->EEPROMThermalMeter)\r
+                                               if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))\r
+                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+                                               else\r
+                                               {\r
+                                                       switch (TxRate)\r
+                                                       {\r
+                                                               case MGN_VHT1SS_MCS6:\r
+                                                               case MGN_VHT1SS_MCS5:\r
+                                                               case MGN_MCS6:\r
+                                                               case MGN_MCS5:\r
+                                                               case MGN_48M:\r
+                                                               case MGN_54M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea42b);\r
+                                                               break;\r
+                                                               case MGN_VHT1SS_MCS4:\r
+                                                               case MGN_MCS4:\r
+                                                               case MGN_36M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa42b);\r
+                                                               break;\r
+                                                               case MGN_VHT1SS_MCS3:\r
+                                                               case MGN_MCS3:\r
+                                                               case MGN_24M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa47f);\r
+                                                               break;\r
+                                                               case MGN_VHT1SS_MCS2:\r
+                                                               case MGN_MCS2:\r
+                                                               case MGN_18M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa57f);\r
+                                                               break;\r
+                                                               case MGN_VHT1SS_MCS1:\r
+                                                               case MGN_MCS1:\r
+                                                               case MGN_9M:\r
+                                                               case MGN_12M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa77f);\r
+                                                               break;\r
+                                                               case MGN_VHT1SS_MCS0:\r
+                                                               case MGN_MCS0:\r
+                                                               case MGN_6M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);\r
+                                                               break;\r
+                                                               default:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       }                               \r
+                               }\r
+                               else\r
+                               {\r
+                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+                               }\r
+\r
+                       }\r
+                       else if (IS_HARDWARE_TYPE_8812AU(Adapter)){\r
+                               if(pMgntInfo->RegTxDutyEnable)\r
+                               {\r
+                                       //2013.07.26 Wilson: debug for 8812AU thermal issue (reduce Tx duty cycle)\r
+                                       // it;s the same issue as 8811AU\r
+                                       if(!pMgntInfo->ForcedDataRate) //auto rate\r
+                                       {\r
+                                               if(pDM_Odm->TxRate != 0xFF)\r
+                                                       TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); \r
+                                       }\r
+                                       else //force rate\r
+                                       {\r
+                                               TxRate = (u1Byte) pMgntInfo->ForcedDataRate;\r
+                                       }\r
+\r
+                                       value64 = (curRxOkCnt<<2);\r
+                                       if(curTxOkCnt < value64) //Downlink\r
+                                               ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+                                       else //Uplink\r
+                                       {\r
+                                               //DbgPrint("pDM_Odm->RFCalibrateInfo.ThermalValue = 0x%X\n", pDM_Odm->RFCalibrateInfo.ThermalValue);\r
+                                               //if(pDM_Odm->RFCalibrateInfo.ThermalValue < pHalData->EEPROMThermalMeter)\r
+                                               if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))\r
+                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+                                               else\r
+                                               {\r
+                                                       switch (TxRate)\r
+                                                       {\r
+                                                               case MGN_VHT2SS_MCS9:\r
+                                                               case MGN_VHT1SS_MCS9:                                                                   \r
+                                                               case MGN_VHT1SS_MCS8:\r
+                                                               case MGN_MCS15:\r
+                                                               case MGN_MCS7:                                                                  \r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea44f);                                                     \r
+                                                               case MGN_VHT2SS_MCS8:\r
+                                                               case MGN_VHT1SS_MCS7:\r
+                                                               case MGN_MCS14:\r
+                                                               case MGN_MCS6:\r
+                                                               case MGN_54M:                                                                   \r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa44f);\r
+                                                               case MGN_VHT2SS_MCS7:\r
+                                                               case MGN_VHT2SS_MCS6:\r
+                                                               case MGN_VHT1SS_MCS6:\r
+                                                               case MGN_VHT1SS_MCS5:\r
+                                                               case MGN_MCS13:\r
+                                                               case MGN_MCS5:\r
+                                                               case MGN_48M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa630);\r
+                                                               break;\r
+                                                               case MGN_VHT2SS_MCS5:\r
+                                                               case MGN_VHT2SS_MCS4:\r
+                                                               case MGN_VHT1SS_MCS4:\r
+                                                               case MGN_VHT1SS_MCS3:   \r
+                                                               case MGN_MCS12:\r
+                                                               case MGN_MCS4:  \r
+                                                               case MGN_MCS3:  \r
+                                                               case MGN_36M:\r
+                                                               case MGN_24M:   \r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa730);\r
+                                                               break;\r
+                                                               case MGN_VHT2SS_MCS3:\r
+                                                               case MGN_VHT2SS_MCS2:\r
+                                                               case MGN_VHT2SS_MCS1:\r
+                                                               case MGN_VHT1SS_MCS2:\r
+                                                               case MGN_VHT1SS_MCS1:   \r
+                                                               case MGN_MCS11: \r
+                                                               case MGN_MCS10: \r
+                                                               case MGN_MCS9:          \r
+                                                               case MGN_MCS2:  \r
+                                                               case MGN_MCS1:\r
+                                                               case MGN_18M:   \r
+                                                               case MGN_12M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa830);\r
+                                                               break;\r
+                                                               case MGN_VHT2SS_MCS0:\r
+                                                               case MGN_VHT1SS_MCS0:\r
+                                                               case MGN_MCS0:  \r
+                                                               case MGN_MCS8:\r
+                                                               case MGN_9M:    \r
+                                                               case MGN_6M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);\r
+                                                               break;\r
+                                                               default:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       }                               \r
+                               }\r
+                               else\r
+                               {\r
+                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+                               }\r
+                       }\r
+                       else\r
+                               ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA Turbo on: EDCA_BE:0x%lx\n",EDCA_BE));\r
+\r
+               pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = TRUE;\r
+               \r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA_BE_DL : 0x%lx  EDCA_BE_UL : 0x%lx  EDCA_BE : 0x%lx  \n",EDCA_BE_DL,EDCA_BE_UL,EDCA_BE));\r
+\r
+       }\r
+       else\r
+       {\r
+               // Turn Off EDCA turbo here.\r
+               // Restore original EDCA according to the declaration of AP.\r
+                if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)\r
+               {\r
+                       Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, GET_WMM_PARAM_ELE_SINGLE_AC_PARAM(pStaQos->WMMParamEle, AC0_BE) );\r
+\r
+                       pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Restore EDCA BE: 0x%lx  \n",pDM_Odm->WMMEDCA_BE));\r
+\r
+               }\r
+       }\r
+\r
+}\r
+\r
+\r
+//check if edca turbo is disabled\r
+BOOLEAN\r
+odm_IsEdcaTurboDisable(\r
+       IN      PVOID           pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                       Adapter = pDM_Odm->Adapter;\r
+       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;\r
+       u4Byte                          IOTPeer=pMgntInfo->IOTPeer;\r
+\r
+       if(pDM_Odm->bBtDisableEdcaTurbo)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable for BT!!\n"));\r
+               return TRUE;\r
+       }\r
+\r
+       if((!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))||\r
+               (pDM_Odm->bWIFITest)||\r
+               (IOTPeer>= HT_IOT_PEER_MAX))\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable\n"));\r
+               return TRUE;\r
+       }\r
+\r
+\r
+       // 1. We do not turn on EDCA turbo mode for some AP that has IOT issue\r
+       // 2. User may disable EDCA Turbo mode with OID settings.\r
+       if(pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO){\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("IOTAction:EdcaTurboDisable\n"));\r
+               return  TRUE;\r
+               }\r
+               \r
+       return  FALSE;\r
+       \r
+\r
+}\r
+\r
+//add iot case here: for MP/CE\r
+VOID \r
+ODM_EdcaParaSelByIot(\r
+       IN      PVOID           pDM_VOID,\r
+       OUT     u4Byte          *EDCA_BE_UL,\r
+       OUT u4Byte              *EDCA_BE_DL\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                       Adapter = pDM_Odm->Adapter;\r
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
+       u4Byte                         IOTPeer=0;\r
+       u4Byte                         ICType=pDM_Odm->SupportICType;\r
+       u1Byte                         WirelessMode=0xFF;                   //invalid value\r
+       u4Byte                          RFType=pDM_Odm->RFType;\r
+         u4Byte                         IOTPeerSubType=0;\r
+\r
+       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;\r
+       u1Byte                          TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;\r
+\r
+       if(pDM_Odm->pWirelessMode!=NULL)\r
+               WirelessMode=*(pDM_Odm->pWirelessMode);\r
+               \r
+///////////////////////////////////////////////////////////\r
+////list paramter for different platform\r
+\r
+       IOTPeer=pMgntInfo->IOTPeer;\r
+       IOTPeerSubType=pMgntInfo->IOTPeerSubtype;\r
+       GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);\r
+\r
+\r
+       if(ICType==ODM_RTL8192D)\r
+       {      \r
+               // Single PHY\r
+               if(pDM_Odm->RFType==ODM_2T2R)\r
+               {\r
+                       (*EDCA_BE_UL) = 0x60a42b;    //0x5ea42b;\r
+                       (*EDCA_BE_DL) = 0x60a42b;    //0x5ea42b;\r
+\r
+               }\r
+               else\r
+               {\r
+                       (*EDCA_BE_UL) = 0x6ea42b;\r
+                       (*EDCA_BE_DL) = 0x6ea42b;\r
+               }\r
+\r
+       }\r
+////============================\r
+/// IOT case for MP\r
+////============================       \r
+\r
+       else\r
+       {\r
+\r
+               if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE){\r
+                       if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R))                 {\r
+                               (*EDCA_BE_UL) = 0x60a42b;\r
+                               (*EDCA_BE_DL) = 0x60a42b;\r
+                       }\r
+                       else\r
+                       {\r
+                               (*EDCA_BE_UL) = 0x6ea42b;\r
+                               (*EDCA_BE_DL) = 0x6ea42b;\r
+                       }\r
+               }\r
+       }\r
\r
+       if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)\r
+       {\r
+               (*EDCA_BE_UL) = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_UL[ExtAdapter->MgntInfo.IOTPeer];\r
+               (*EDCA_BE_DL) = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_DL[ExtAdapter->MgntInfo.IOTPeer];\r
+       }\r
+     \r
+       #if (INTEL_PROXIMITY_SUPPORT == 1)\r
+       if(pMgntInfo->IntelClassModeInfo.bEnableCA == TRUE)\r
+       {\r
+               (*EDCA_BE_UL) = (*EDCA_BE_DL) = 0xa44f;\r
+       }\r
+       else\r
+       #endif          \r
+       {\r
+               if((pMgntInfo->IOTAction & (HT_IOT_ACT_FORCED_ENABLE_BE_TXOP|HT_IOT_ACT_AMSDU_ENABLE)))\r
+               {// To check whether we shall force turn on TXOP configuration.\r
+                       if(!((*EDCA_BE_UL) & 0xffff0000))\r
+                               (*EDCA_BE_UL) |= 0x005e0000; // Force TxOP limit to 0x005e for UL.\r
+                       if(!((*EDCA_BE_DL) & 0xffff0000))\r
+                               (*EDCA_BE_DL) |= 0x005e0000; // Force TxOP limit to 0x005e for DL.\r
+               }\r
+               \r
+               //92D txop can't be set to 0x3e for cisco1250\r
+               if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))\r
+               {\r
+                       (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\r
+                       (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];\r
+               }\r
+               //merge from 92s_92c_merge temp brunch v2445    20120215 \r
+               else if((IOTPeer == HT_IOT_PEER_CISCO) &&((WirelessMode==ODM_WM_G)||(WirelessMode==(ODM_WM_B|ODM_WM_G))||(WirelessMode==ODM_WM_A)||(WirelessMode==ODM_WM_B)))\r
+               {\r
+                       (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];\r
+               }\r
+               else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))\r
+               {\r
+                       (*EDCA_BE_DL) = 0xa630;\r
+               }\r
+\r
+               else if(IOTPeer == HT_IOT_PEER_MARVELL)\r
+               {\r
+                       (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\r
+                       (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];\r
+               }\r
+               else if(IOTPeer == HT_IOT_PEER_ATHEROS)\r
+               {\r
+                       // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue. \r
+                       if(WirelessMode==ODM_WM_G)\r
+                               (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];\r
+                       else\r
+                       (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\r
+                       \r
+                       if(ICType == ODM_RTL8821)\r
+                                (*EDCA_BE_DL) = 0x5ea630;\r
+                       \r
+               }\r
+       }\r
+\r
+       if((ICType == ODM_RTL8192D)&&(IOTPeerSubType == HT_IOT_PEER_LINKSYS_E4200_V1)&&((WirelessMode==ODM_WM_N5G)))\r
+       {\r
+               (*EDCA_BE_DL) = 0x432b;\r
+               (*EDCA_BE_UL) = 0x432b;\r
+       }               \r
+\r
+\r
+\r
+       if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8192E))           //add 8812AU/8812AE\r
+       {\r
+               (*EDCA_BE_UL) = 0x5ea42b;\r
+               (*EDCA_BE_DL) = 0x5ea42b;\r
+\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8812A: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx",(*EDCA_BE_UL),(*EDCA_BE_DL)));\r
+       }\r
+\r
+       // Revised for Atheros DIR-655 IOT issue to improve down link TP, added by Roger, 2013.03.22.\r
+       if((ICType == ODM_RTL8723A) && (IOTPeerSubType== HT_IOT_PEER_ATHEROS_DIR655) && \r
+               (pMgntInfo->dot11CurrentChannelNumber == 6))\r
+       {\r
+               (*EDCA_BE_DL) = 0xa92b;\r
+       }\r
+\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Special: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx",(*EDCA_BE_UL),(*EDCA_BE_DL)));\r
+\r
+}\r
+\r
+\r
+VOID\r
+odm_EdcaChooseTrafficIdx( \r
+       IN      PVOID           pDM_VOID,\r
+       IN      u8Byte                          cur_tx_bytes,  \r
+       IN      u8Byte                          cur_rx_bytes, \r
+       IN      BOOLEAN                 bBiasOnRx,\r
+       OUT BOOLEAN             *pbIsCurRDLState\r
+       )\r
+{      \r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       \r
+       if(bBiasOnRx)\r
+       {\r
+         \r
+               if(cur_tx_bytes>(cur_rx_bytes*4))\r
+               {\r
+                       *pbIsCurRDLState=FALSE;\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Uplink Traffic\n "));\r
+\r
+               }\r
+               else\r
+               {\r
+                       *pbIsCurRDLState=TRUE;\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));\r
+\r
+               }\r
+       }\r
+       else\r
+       {\r
+               if(cur_rx_bytes>(cur_tx_bytes*4))\r
+               {\r
+                       *pbIsCurRDLState=TRUE;\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Downlink        Traffic\n"));\r
+\r
+               }\r
+               else\r
+               {\r
+                       *pbIsCurRDLState=FALSE;\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));\r
+               }\r
+       }\r
+\r
+       return ;\r
+}\r
+\r
+#endif\r
+\r
+#if((DM_ODM_SUPPORT_TYPE==ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))\r
+\r
+void odm_EdcaParaInit(\r
+       IN      PVOID           pDM_VOID\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       prtl8192cd_priv priv            = pDM_Odm->priv;\r
+       int   mode=priv->pmib->dot11BssType.net_work_type;\r
+       \r
+       static unsigned int slot_time, sifs_time;\r
+       struct ParaRecord EDCA[4];\r
+\r
+        memset(EDCA, 0, 4*sizeof(struct ParaRecord));\r
+\r
+       sifs_time = 10;\r
+       slot_time = 20;\r
+\r
+       if (mode & (ODM_WM_N24G|ODM_WM_N5G))\r
+               sifs_time = 16;\r
+\r
+       if (mode & (ODM_WM_N24G|ODM_WM_N5G| ODM_WM_G|ODM_WM_A))\r
+               slot_time = 9;\r
+\r
+\r
+#ifdef RTK_AC_SUPPORT //for 11ac logo,  edit aifs time for cca test cases\r
+       if(AC_SIGMA_MODE != AC_SIGMA_NONE)\r
+               sifs_time = 10; \r
+#endif\r
+\r
+\r
+#if((defined(RTL_MANUAL_EDCA))&&(DM_ODM_SUPPORT_TYPE==ODM_AP))\r
+        if( priv->pmib->dot11QosEntry.ManualEDCA ) {\r
+                if( OPMODE & WIFI_AP_STATE )\r
+                        memcpy(EDCA, priv->pmib->dot11QosEntry.AP_manualEDCA, 4*sizeof(struct ParaRecord));\r
+                else\r
+                        memcpy(EDCA, priv->pmib->dot11QosEntry.STA_manualEDCA, 4*sizeof(struct ParaRecord));\r
+\r
+               #ifdef WIFI_WMM\r
+               if (QOS_ENABLE)\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[VI].TXOPlimit<< 16) | (EDCA[VI].ECWmax<< 12) | (EDCA[VI].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));\r
+               else\r
+               #endif\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[BE].TXOPlimit<< 16) | (EDCA[BE].ECWmax<< 12) | (EDCA[BE].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));\r
+\r
+       }else\r
+       #endif //RTL_MANUAL_EDCA\r
+       {\r
+\r
+                if(OPMODE & WIFI_AP_STATE)\r
+                {\r
+                       memcpy(EDCA, rtl_ap_EDCA, 2*sizeof(struct ParaRecord));\r
+\r
+                       if(mode & (ODM_WM_A|ODM_WM_G|ODM_WM_N24G|ODM_WM_N5G))\r
+                               memcpy(&EDCA[VI], &rtl_ap_EDCA[VI_AG], 2*sizeof(struct ParaRecord));\r
+                       else\r
+                               memcpy(&EDCA[VI], &rtl_ap_EDCA[VI], 2*sizeof(struct ParaRecord));\r
+                }\r
+                else\r
+                {\r
+                       memcpy(EDCA, rtl_sta_EDCA, 2*sizeof(struct ParaRecord));\r
+\r
+                       if(mode & (ODM_WM_A|ODM_WM_G|ODM_WM_N24G|ODM_WM_N5G))\r
+                               memcpy(&EDCA[VI], &rtl_sta_EDCA[VI_AG], 2*sizeof(struct ParaRecord));\r
+                       else\r
+                               memcpy(&EDCA[VI], &rtl_sta_EDCA[VI], 2*sizeof(struct ParaRecord));\r
+                }\r
+                \r
+       #ifdef WIFI_WMM\r
+               if (QOS_ENABLE)\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[VI].TXOPlimit<< 16) | (EDCA[VI].ECWmax<< 12) | (EDCA[VI].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));\r
+               else\r
+       #endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM,  (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));\r
+#elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM,  (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + 2* slot_time));\r
+#endif\r
+                       \r
+\r
+       }\r
+\r
+       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VO_PARAM, (EDCA[VO].TXOPlimit<< 16) | (EDCA[VO].ECWmax<< 12) | (EDCA[VO].ECWmin<< 8) | (sifs_time + EDCA[VO].AIFSN* slot_time));\r
+       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM,  (EDCA[BE].TXOPlimit<< 16) | (EDCA[BE].ECWmax<< 12) | (EDCA[BE].ECWmin<< 8) | (sifs_time + EDCA[BE].AIFSN* slot_time));\r
+       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, (EDCA[BK].TXOPlimit<< 16) | (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + EDCA[BK].AIFSN* slot_time));\r
+\r
+#if defined(RTK_AC_SUPPORT) && defined(RTL_MANUAL_EDCA) //for 11ac logo,  make BK worse to seperate with BE.\r
+       if((AC_SIGMA_MODE != AC_SIGMA_NONE) && (priv->pmib->dot11QosEntry.ManualEDCA))\r
+       {\r
+               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, (EDCA[BK].TXOPlimit<< 16) | (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | 0xa4 );\r
+       }\r
+#endif\r
+\r
+//     ODM_Write1Byte(pDM_Odm,ACMHWCTRL, 0x00);\r
+\r
+       priv->pshare->iot_mode_enable = 0;\r
+#if(DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+       if (priv->pshare->rf_ft_var.wifi_beq_iot)\r
+               priv->pshare->iot_mode_VI_exist = 0;\r
+       \r
+       #ifdef WMM_VIBE_PRI\r
+       priv->pshare->iot_mode_BE_exist = 0;\r
+       #endif\r
+       \r
+#ifdef WMM_BEBK_PRI\r
+       priv->pshare->iot_mode_BK_exist = 0;\r
+#endif\r
+       \r
+       #ifdef LOW_TP_TXOP\r
+       priv->pshare->BE_cwmax_enhance = 0;\r
+       #endif\r
+\r
+#elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)\r
+      priv->pshare->iot_mode_BE_exist = 0;   \r
+#endif\r
+       priv->pshare->iot_mode_VO_exist = 0;\r
+}\r
+\r
+BOOLEAN\r
+ODM_ChooseIotMainSTA(\r
+       IN      PVOID           pDM_VOID,\r
+       IN      PSTA_INFO_T             pstat\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       prtl8192cd_priv priv = pDM_Odm->priv;\r
+       BOOLEAN         bhighTP_found_pstat=FALSE;\r
+       \r
+       if ((GET_ROOT(priv)->up_time % 2) == 0) {\r
+               unsigned int tx_2s_avg = 0;\r
+               unsigned int rx_2s_avg = 0;\r
+               int i=0, aggReady=0;\r
+               unsigned long total_sum = (priv->pshare->current_tx_bytes+priv->pshare->current_rx_bytes);\r
+               int assoc_num = GET_ROOT(priv)->assoc_num;\r
+#ifdef MBSSID\r
+               if (GET_ROOT(priv)->pmib->miscEntry.vap_enable){\r
+                       for (i=0; i<RTL8192CD_NUM_VWLAN; ++i)\r
+                               assoc_num += GET_ROOT(priv)->pvap_priv[i]-> assoc_num;\r
+               }\r
+#endif \r
+#ifdef UNIVERSAL_REPEATER\r
+               if (IS_DRV_OPEN(GET_VXD_PRIV(GET_ROOT(priv))))\r
+                       assoc_num += GET_VXD_PRIV(GET_ROOT(priv))-> assoc_num;\r
+#endif\r
+#ifdef WDS\r
+                if(GET_ROOT(priv)->pmib->dot11WdsInfo.wdsEnabled)\r
+                       assoc_num ++;\r
+#endif\r
+\r
+\r
+               pstat->current_tx_bytes += pstat->tx_byte_cnt;\r
+               pstat->current_rx_bytes += pstat->rx_byte_cnt;\r
+\r
+               if (total_sum != 0) {\r
+                       if (total_sum <= 1000000) {\r
+                       tx_2s_avg = (unsigned int)((pstat->current_tx_bytes*100) / total_sum);\r
+                       rx_2s_avg = (unsigned int)((pstat->current_rx_bytes*100) / total_sum);\r
+                       } else {\r
+                               tx_2s_avg = (unsigned int)(pstat->current_tx_bytes / (total_sum / 100));\r
+                               rx_2s_avg = (unsigned int)(pstat->current_rx_bytes / (total_sum / 100));\r
+                       }\r
+\r
+               }\r
+\r
+#if(DM_ODM_SUPPORT_TYPE==ODM_ADSL)\r
+               if (pstat->ht_cap_len) {\r
+                       if ((tx_2s_avg + rx_2s_avg) >=25 ) {//50//\r
+\r
+                                       priv->pshare->highTP_found_pstat = pstat;\r
+                                       bhighTP_found_pstat=TRUE;\r
+                               }\r
+                       }\r
+#elif(DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+               for(i=0; i<8; i++)\r
+                       aggReady += (pstat->ADDBA_ready[i]);\r
+\r
+               if ((pstat->ht_cap_len && (\r
+#ifdef SUPPORT_TX_AMSDU                        \r
+                       AMSDU_ENABLE || \r
+#endif                 \r
+                       aggReady)) || (pstat->IOTPeer==HT_IOT_PEER_INTEL))\r
+               {\r
+                       if ((assoc_num==1) || (tx_2s_avg + rx_2s_avg >= 25)) {\r
+                               priv->pshare->highTP_found_pstat = pstat;\r
+                       }\r
+                       \r
+               #ifdef CLIENT_MODE\r
+                       if (OPMODE & WIFI_STATION_STATE) {\r
+                               if ((tx_2s_avg + rx_2s_avg) >= 20)\r
+                                       priv->pshare->highTP_found_pstat = pstat;\r
+               }\r
+               #endif                          \r
+       }\r
+#endif\r
+       } \r
+       else {\r
+               pstat->current_tx_bytes = pstat->tx_byte_cnt;\r
+               pstat->current_rx_bytes = pstat->rx_byte_cnt;\r
+       }\r
+\r
+       return bhighTP_found_pstat;\r
+}\r
+\r
+\r
+#ifdef WIFI_WMM\r
+VOID\r
+ODM_IotEdcaSwitch(\r
+       IN      PVOID           pDM_VOID,\r
+       IN      unsigned char           enable\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       prtl8192cd_priv priv    = pDM_Odm->priv;\r
+       int   mode=priv->pmib->dot11BssType.net_work_type;\r
+       unsigned int slot_time = 20, sifs_time = 10, BE_TXOP = 47, VI_TXOP = 94;\r
+       unsigned int vi_cw_max = 4, vi_cw_min = 3, vi_aifs;\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+       u32 be_edca, vi_edca;\r
+       u16 disable_cfe;\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+       if (!(!priv->pmib->dot11OperationEntry.wifi_specific ||\r
+               ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific))\r
+       #ifdef CLIENT_MODE\r
+               || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific))\r
+       #endif\r
+               ))\r
+               return;\r
+#endif\r
+\r
+#ifdef RTK_AC_SUPPORT //for 11ac logo, do not dynamic switch edca \r
+       if(AC_SIGMA_MODE != AC_SIGMA_NONE)\r
+               return;\r
+#endif\r
+\r
+       if ((mode & (ODM_WM_N24G|ODM_WM_N5G)) && (priv->pshare->ht_sta_num\r
+       #ifdef WDS\r
+               || ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum)\r
+       #endif\r
+               ))\r
+               sifs_time = 16;\r
+\r
+       if (mode & (ODM_WM_N24G|ODM_WM_N5G|ODM_WM_G|ODM_WM_A)) {\r
+               slot_time = 9;\r
+       } \r
+       else\r
+       {\r
+               BE_TXOP = 94;\r
+               VI_TXOP = 188;\r
+       }\r
+\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+       vi_edca = -1;\r
+       disable_cfe = -1;\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE==ODM_ADSL)\r
+       if (priv->pshare->iot_mode_VO_exist) {\r
+               // to separate AC_VI and AC_BE to avoid using the same EDCA settings\r
+               if (priv->pshare->iot_mode_BE_exist) {\r
+                       vi_cw_max = 5;\r
+                       vi_cw_min = 3;\r
+               } else {\r
+                       vi_cw_max = 6;\r
+                       vi_cw_min = 4;\r
+               }\r
+       }\r
+       vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);\r
+\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+       vi_edca = ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)| (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs;\r
+#else\r
+       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)| (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs);\r
+#endif\r
+       \r
+#elif (DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+       if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific) {\r
+               if (priv->pshare->iot_mode_VO_exist) {\r
+       #ifdef WMM_VIBE_PRI\r
+                       if (priv->pshare->iot_mode_BE_exist) \r
+                       {\r
+                               vi_cw_max = 5;\r
+                               vi_cw_min = 3;\r
+                               vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);\r
+                       }\r
+                       else \r
+       #endif\r
+                       {\r
+                       vi_cw_max = 6;\r
+                       vi_cw_min = 4;\r
+                       vi_aifs = 0x2b;\r
+                       }\r
+               } \r
+               else {\r
+                       vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);\r
+               }\r
+\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+               vi_edca = ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)\r
+                       | (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs;\r
+#else\r
+               ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)\r
+                       | (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs);\r
+#endif\r
+\r
+       #ifdef WMM_BEBK_PRI\r
+       #ifdef CONFIG_RTL_88E_SUPPORT\r
+               if ((GET_CHIP_VER(priv) == VERSION_8188E) && priv->pshare->iot_mode_BK_exist) {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                       be_edca = (10 << 12) | (6 << 8) | 0x4f;\r
+#else\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, (10 << 12) | (6 << 8) | 0x4f);\r
+#endif\r
+               }\r
+       #endif          \r
+       #endif\r
+#if defined(CONFIG_WLAN_HAL_8881A) \r
+               if (GET_CHIP_VER(priv) == VERSION_8881A) \r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM,  0xa64f);\r
+#endif         \r
+       }\r
+#endif\r
+\r
+\r
+\r
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+       if (priv->pshare->rf_ft_var.wifi_beq_iot && priv->pshare->iot_mode_VI_exist) {\r
+#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT)\r
+               if (GET_CHIP_VER(priv) == VERSION_8188E || GET_CHIP_VER(priv) == VERSION_8812E) {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                       be_edca = (10 << 12) | (6 << 8) | 0x4f;\r
+#else\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (10 << 12) | (6 << 8) | 0x4f);\r
+#endif\r
+               }\r
+               else\r
+#endif\r
+               {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                       be_edca = (10 << 12) | (4 << 8) | 0x4f;\r
+#else\r
+               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (10 << 12) | (4 << 8) | 0x4f);\r
+#endif\r
+               }\r
+       } else if(!enable)\r
+#elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)      \r
+       if(!enable)                                 //if iot is disable ,maintain original BEQ PARAM\r
+#endif\r
+       {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+               be_edca = (((OPMODE & WIFI_AP_STATE)?6:10) << 12) | (4 << 8)\r
+                       | (sifs_time + 3 * slot_time);\r
+               disable_cfe = 1;\r
+#else\r
+               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (((OPMODE & WIFI_AP_STATE)?6:10) << 12) | (4 << 8)\r
+                       | (sifs_time + 3 * slot_time));\r
+#endif\r
+#ifdef CONFIG_PCI_HCI\r
+//             ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) | (DIS_TXOP_CFE));\r
+#endif\r
+       }\r
+       else\r
+       {\r
+               int txop;\r
+               unsigned int cw_max;\r
+#ifdef LOW_TP_TXOP\r
+               unsigned int txop_close;\r
+#endif\r
+               \r
+       #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP))\r
+                       cw_max = ((priv->pshare->BE_cwmax_enhance) ? 10 : 6);\r
+                       txop_close = ((priv->pshare->rf_ft_var.low_tp_txop && priv->pshare->rf_ft_var.low_tp_txop_close) ? 1 : 0);\r
+\r
+                       if(priv->pshare->txop_enlarge == 0xe)   //if intel case\r
+                               txop = (txop_close ? 0 : (BE_TXOP*2));\r
+                       else                                                        //if other case\r
+                               txop = (txop_close ? 0: (BE_TXOP*priv->pshare->txop_enlarge));\r
+       #else\r
+                       cw_max=6;\r
+                       if((priv->pshare->txop_enlarge==0xe)||(priv->pshare->txop_enlarge==0xd))\r
+                               txop=BE_TXOP*2;\r
+                       else\r
+                               txop=BE_TXOP*priv->pshare->txop_enlarge;\r
+\r
+       #endif\r
+                           \r
+               if (priv->pshare->ht_sta_num\r
+       #ifdef WDS\r
+                       || ((OPMODE & WIFI_AP_STATE) && (mode & (ODM_WM_N24G|ODM_WM_N5G)) &&\r
+                       priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum)\r
+       #endif\r
+                       ) \r
+                       {\r
+\r
+                       if (priv->pshare->txop_enlarge == 0xe) {\r
+                               // is intel client, use a different edca value\r
+                               //ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop<< 16) | (cw_max<< 12) | (4 << 8) | 0x1f);\r
+                               if (pDM_Odm->RFType==ODM_1T1R) {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                                       be_edca = (txop << 16) | (5 << 12) | (3 << 8) | 0x1f;\r
+#else\r
+                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (5 << 12) | (3 << 8) | 0x1f);\r
+#endif\r
+                               }\r
+                               else {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                                       be_edca = (txop << 16) | (8 << 12) | (5 << 8) | 0x1f;\r
+#else\r
+                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (8 << 12) | (5 << 8) | 0x1f);\r
+#endif\r
+                               }\r
+                               \r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                               disable_cfe = 0;\r
+#endif\r
+#ifdef CONFIG_PCI_HCI\r
+//                             ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) & ~(DIS_TXOP_CFE));\r
+#endif\r
+                               priv->pshare->txop_enlarge = 2;\r
+                       } \r
+#if(DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+       #ifndef LOW_TP_TXOP\r
+                        else if (priv->pshare->txop_enlarge == 0xd) {\r
+                               // is intel ralink, use a different edca value\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                               be_edca = (txop << 16) | (6 << 12) | (5 << 8) | 0x2b;\r
+#else\r
+                               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (6 << 12) | (5 << 8) | 0x2b);\r
+#endif\r
+                               priv->pshare->txop_enlarge = 2;\r
+                       } \r
+       #endif\r
+#endif\r
+                       else \r
+                       {\r
+//                             if (txop == 0) {\r
+//#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+//                                     disable_cfe = 1;\r
+//#endif\r
+//#ifdef CONFIG_PCI_HCI\r
+//                                     ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) | (DIS_TXOP_CFE));\r
+//#endif\r
+//                             }\r
+                                       \r
+                               if (pDM_Odm->RFType==ODM_2T2R) {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                                       be_edca = (txop << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time);\r
+#else\r
+                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |\r
+                                               (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));\r
+#endif\r
+                               }\r
+                               else\r
+                               #if(DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP)\r
+                               {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                                       be_edca = (txop << 16) |\r
+                                               (((priv->pshare->BE_cwmax_enhance) ? 10 : 5) << 12) | (3 << 8) | (sifs_time + 2 * slot_time);\r
+#else\r
+                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |\r
+                                               (((priv->pshare->BE_cwmax_enhance) ? 10 : 5) << 12) | (3 << 8) | (sifs_time + 2 * slot_time));\r
+#endif\r
+                               }\r
+                               #else\r
+                               {\r
+                                       PSTA_INFO_T             pstat = priv->pshare->highTP_found_pstat;\r
+                                       if ((GET_CHIP_VER(priv)==VERSION_8881A) && pstat && (pstat->IOTPeer == HT_IOT_PEER_HTC))\r
+                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, 0x642b);\r
+                                       else {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                                       be_edca = (txop << 16) | (5 << 12) | (3 << 8) | (sifs_time + 2 * slot_time);\r
+                               #else\r
+                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |\r
+                                               (5 << 12) | (3 << 8) | (sifs_time + 2 * slot_time));\r
+#endif\r
+                                       }\r
+                               }\r
+                               #endif\r
+                       }\r
+               }\r
+              else \r
+              {\r
+ #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP))\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                        be_edca = (BE_TXOP << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time);\r
+#else\r
+                        ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (BE_TXOP << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));\r
+#endif\r
+ #else\r
+               #if defined(CONFIG_RTL_8196D) || defined(CONFIG_RTL_8197DL) || defined(CONFIG_RTL_8196E) || (defined(CONFIG_RTL_8197D) && !defined(CONFIG_PORT0_EXT_GIGA))\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                       be_edca = (BE_TXOP*2 << 16) | (cw_max << 12) | (5 << 8) | (sifs_time + 3 * slot_time);\r
+ #else\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM,  (BE_TXOP*2 << 16) | (cw_max << 12) | (5 << 8) | (sifs_time + 3 * slot_time));\r
+#endif\r
+               #else\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                       be_edca = (BE_TXOP*2 << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time);\r
+               #else\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM,  (BE_TXOP*2 << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));\r
+               #endif\r
+               #endif\r
+/*             \r
+               if (priv->pshare->txop_enlarge == 0xe) {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                       disable_cfe = 0;\r
+#endif\r
+       #ifdef CONFIG_PCI_HCI\r
+                       ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) & ~(DIS_TXOP_CFE));\r
+       #endif\r
+               } else {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                       disable_cfe = 1;\r
+#endif\r
+       #ifdef CONFIG_PCI_HCI\r
+                       ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) | (DIS_TXOP_CFE));\r
+       #endif\r
+               }\r
+*/                     \r
+ #endif\r
+              }\r
+\r
+       }\r
+       \r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+       notify_IOT_EDCA_switch(priv, be_edca, vi_edca, disable_cfe);\r
+#endif\r
+}\r
+#endif\r
+\r
+VOID \r
+odm_IotEngine(\r
+       IN      PVOID           pDM_VOID\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       struct rtl8192cd_priv *priv=pDM_Odm->priv;\r
+       PSTA_INFO_T pstat = NULL;\r
+       u4Byte i;\r
+       \r
+#ifdef WIFI_WMM\r
+       unsigned int switch_turbo = 0, avg_tp;\r
+#endif \r
+////////////////////////////////////////////////////////\r
+//  if EDCA Turbo function is not supported or Manual EDCA Setting\r
+//  then return\r
+////////////////////////////////////////////////////////\r
+       if(!(pDM_Odm->SupportAbility&ODM_MAC_EDCA_TURBO)){\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO NOT SUPPORTED\n"));\r
+               return;\r
+       }\r
+       \r
+#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined(RTL_MANUAL_EDCA) && defined(WIFI_WMM))\r
+       if(priv->pmib->dot11QosEntry.ManualEDCA){\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO OFF: MANUAL SETTING\n"));\r
+               return ;\r
+       }\r
+#endif \r
+\r
+#if !(DM_ODM_SUPPORT_TYPE &ODM_AP)\r
+ //////////////////////////////////////////////////////\r
+ //find high TP STA every 2s\r
+//////////////////////////////////////////////////////\r
+       if ((GET_ROOT(priv)->up_time % 2) == 0) \r
+               priv->pshare->highTP_found_pstat==NULL;\r
+\r
+#if 0\r
+       phead = &priv->asoc_list;\r
+       plist = phead->next;\r
+       while(plist != phead)   {\r
+               pstat = list_entry(plist, struct stat_info, asoc_list);\r
+\r
+               if(ODM_ChooseIotMainSTA(pDM_Odm, pstat));              //find the correct station\r
+                       break;\r
+               if (plist == plist->next)                                          //the last plist \r
+                       break;\r
+               plist = plist->next;\r
+       };\r
+#endif\r
+\r
+       //find highTP STA\r
+       for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {\r
+               pstat = pDM_Odm->pODM_StaInfo[i];\r
+               if(IS_STA_VALID(pstat) && (ODM_ChooseIotMainSTA(pDM_Odm, pstat)))        //find the correct station\r
+                               break;\r
+       }\r
+\r
+ //////////////////////////////////////////////////////\r
+ //if highTP STA is not found, then return\r
+ //////////////////////////////////////////////////////\r
+       if(priv->pshare->highTP_found_pstat==NULL)      {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO OFF: NO HT STA FOUND\n"));\r
+               return;\r
+       }\r
+#endif\r
+\r
+       pstat=priv->pshare->highTP_found_pstat;\r
+       if(pstat) {\r
+               if((pstat->tx_avarage + pstat->rx_avarage) < (1<<17))   // 1M bps\r
+                       pstat = NULL;\r
+       }\r
+\r
+#ifdef WIFI_WMM\r
+       if (QOS_ENABLE) {\r
+               if (!priv->pmib->dot11OperationEntry.wifi_specific \r
+               #if(DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+                       ||((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific))\r
+               #elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)\r
+                       || (priv->pmib->dot11OperationEntry.wifi_specific == 2)\r
+               #endif\r
+                       ) {\r
+                       if (priv->pshare->iot_mode_enable &&\r
+                               ((priv->pshare->phw->VO_pkt_count > 50) ||\r
+                                (priv->pshare->phw->VI_pkt_count > 50) ||\r
+                                (priv->pshare->phw->BK_pkt_count > 50))) {\r
+                               priv->pshare->iot_mode_enable = 0;\r
+                               switch_turbo++;\r
+#ifdef CONFIG_WLAN_HAL_8881A\r
+                               if (GET_CHIP_VER(priv) == VERSION_8881A) {\r
+                                       RTL_W32(0x460, 0x03086666);\r
+                               }\r
+#endif //CONFIG_WLAN_HAL_8881A\r
+                       } else if ((!priv->pshare->iot_mode_enable) &&\r
+                               ((priv->pshare->phw->VO_pkt_count < 50) &&\r
+                                (priv->pshare->phw->VI_pkt_count < 50) &&\r
+                                (priv->pshare->phw->BK_pkt_count < 50))) {\r
+                               priv->pshare->iot_mode_enable++;\r
+                               switch_turbo++;\r
+//#ifdef CONFIG_WLAN_HAL_8881A\r
+#if 0\r
+                               if (GET_CHIP_VER(priv) == VERSION_8881A) {\r
+                                       if (get_bonding_type_8881A()==BOND_8881AB) {\r
+                                               RTL_W32(0x460, 0x03086666);\r
+                                       }\r
+                                       else {\r
+                                               RTL_W32(0x460, 0x0320ffff);\r
+                                       }\r
+                               }\r
+#endif //CONFIG_WLAN_HAL_8881A\r
+                       }\r
+               }\r
+\r
+\r
+               #if(DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+               if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific)\r
+               #elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)\r
+               if (priv->pmib->dot11OperationEntry.wifi_specific) \r
+               #endif\r
+               {\r
+                       if (!priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count > 50)) {\r
+                               priv->pshare->iot_mode_VO_exist++;\r
+                               switch_turbo++;\r
+                       } else if (priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count < 50)) {\r
+                               priv->pshare->iot_mode_VO_exist = 0;\r
+                               switch_turbo++;\r
+                       }\r
+#if((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_VIBE_PRI)))\r
+                       if (priv->pshare->iot_mode_VO_exist) {\r
+                               //printk("[%s %d] BE_pkt_count=%d\n", __FUNCTION__, __LINE__, priv->pshare->phw->BE_pkt_count);\r
+                               if (!priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count > 250)) {\r
+                                       priv->pshare->iot_mode_BE_exist++;\r
+                                       switch_turbo++;\r
+                               } else if (priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count < 250)) {\r
+                                       priv->pshare->iot_mode_BE_exist = 0;\r
+                                       switch_turbo++;\r
+                               }\r
+                       }\r
+#endif\r
+\r
+#if((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_BEBK_PRI)))\r
+                       if (priv->pshare->phw->BE_pkt_count) {\r
+                               //printk("[%s %d] BK_pkt_count=%d\n", __FUNCTION__, __LINE__, priv->pshare->phw->BK_pkt_count);\r
+                               if (!priv->pshare->iot_mode_BK_exist && (priv->pshare->phw->BK_pkt_count > 250)) {\r
+                                       priv->pshare->iot_mode_BK_exist++;\r
+                                       switch_turbo++;\r
+                               } else if (priv->pshare->iot_mode_BK_exist && (priv->pshare->phw->BK_pkt_count < 250)) {\r
+                                       priv->pshare->iot_mode_BK_exist = 0;\r
+                                       switch_turbo++;\r
+                               }\r
+                       }\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+                       if (priv->pshare->rf_ft_var.wifi_beq_iot) \r
+                       {\r
+                               if (!priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count > 50)) {\r
+                                       priv->pshare->iot_mode_VI_exist++;\r
+                                       switch_turbo++;\r
+                               } else if (priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count < 50)) {\r
+                                       priv->pshare->iot_mode_VI_exist = 0;\r
+                                       switch_turbo++;\r
+                               }\r
+                       }\r
+#endif\r
+\r
+               }\r
+               else if (!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower) {\r
+                  if (priv->pshare->txop_enlarge) {\r
+                          priv->pshare->txop_enlarge = 0;\r
+                          if (priv->pshare->iot_mode_enable)\r
+                                       switch_turbo++;\r
+                               }\r
+               }\r
+\r
+#if(defined(CLIENT_MODE) && (DM_ODM_SUPPORT_TYPE==ODM_AP))\r
+        if ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific))\r
+        {\r
+            if (priv->pshare->iot_mode_enable &&\r
+                (((priv->pshare->phw->VO_pkt_count > 50) ||\r
+                 (priv->pshare->phw->VI_pkt_count > 50) ||\r
+                 (priv->pshare->phw->BK_pkt_count > 50)) ||\r
+                 (pstat && (!pstat->ADDBA_ready[0]) & (!pstat->ADDBA_ready[3]))))\r
+            {\r
+                priv->pshare->iot_mode_enable = 0;\r
+                switch_turbo++;\r
+            }\r
+            else if ((!priv->pshare->iot_mode_enable) &&\r
+                (((priv->pshare->phw->VO_pkt_count < 50) &&\r
+                 (priv->pshare->phw->VI_pkt_count < 50) &&\r
+                 (priv->pshare->phw->BK_pkt_count < 50)) &&\r
+                 (pstat && (pstat->ADDBA_ready[0] | pstat->ADDBA_ready[3]))))\r
+            {\r
+                priv->pshare->iot_mode_enable++;\r
+                switch_turbo++;\r
+            }\r
+        }\r
+#endif\r
+\r
+               priv->pshare->phw->VO_pkt_count = 0;\r
+               priv->pshare->phw->VI_pkt_count = 0;\r
+               priv->pshare->phw->BK_pkt_count = 0;\r
+\r
+       #if((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_VIBE_PRI)))\r
+               priv->pshare->phw->BE_pkt_count = 0;\r
+       #endif\r
+               \r
+       #if(DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+               if (priv->pshare->rf_ft_var.wifi_beq_iot)\r
+                       priv->pshare->phw->VI_rx_pkt_count = 0;\r
+               #endif\r
+\r
+       }\r
+#endif\r
+\r
+       if ((priv->up_time % 2) == 0) {\r
+               /*\r
+                * decide EDCA content for different chip vendor\r
+                */\r
+#ifdef WIFI_WMM\r
+       #if(DM_ODM_SUPPORT_TYPE==ODM_ADSL)\r
+               if (QOS_ENABLE && (!priv->pmib->dot11OperationEntry.wifi_specific || (priv->pmib->dot11OperationEntry.wifi_specific == 2)\r
+       \r
+       #elif(DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+               if (QOS_ENABLE && (!priv->pmib->dot11OperationEntry.wifi_specific || \r
+                       ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))\r
+               #ifdef CLIENT_MODE\r
+            || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))\r
+               #endif\r
+       #endif\r
+               ))\r
+       \r
+               {\r
+\r
+                       if (pstat && pstat->rssi >= priv->pshare->rf_ft_var.txop_enlarge_upper) {\r
+#ifdef LOW_TP_TXOP\r
+                               if (pstat->IOTPeer==HT_IOT_PEER_INTEL)\r
+                               {\r
+                                       if (priv->pshare->txop_enlarge != 0xe)\r
+                                       {\r
+                                               priv->pshare->txop_enlarge = 0xe;\r
+\r
+                                               if (priv->pshare->iot_mode_enable)\r
+                                                       switch_turbo++;\r
+                                       }\r
+                               } \r
+                               else if (priv->pshare->txop_enlarge != 2) \r
+                               {\r
+                                       priv->pshare->txop_enlarge = 2;\r
+                                       if (priv->pshare->iot_mode_enable)\r
+                                               switch_turbo++;\r
+                               }\r
+#else\r
+                               if (priv->pshare->txop_enlarge != 2)\r
+                               {\r
+                                       if (pstat->IOTPeer==HT_IOT_PEER_INTEL)\r
+                                               priv->pshare->txop_enlarge = 0xe;                                               \r
+                                       else if (pstat->IOTPeer==HT_IOT_PEER_RALINK)\r
+                                               priv->pshare->txop_enlarge = 0xd;                                               \r
+                                       else if (pstat->IOTPeer==HT_IOT_PEER_HTC)\r
+                                               priv->pshare->txop_enlarge = 0;         \r
+                                       else\r
+                                               priv->pshare->txop_enlarge = 2;\r
+\r
+                                       if (priv->pshare->iot_mode_enable)\r
+                                               switch_turbo++;\r
+                               }\r
+#endif\r
+                       }\r
+                       else if (!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower) \r
+                       {\r
+                               if (priv->pshare->txop_enlarge) {\r
+                                       priv->pshare->txop_enlarge = 0;\r
+                                       if (priv->pshare->iot_mode_enable)\r
+                                               switch_turbo++;\r
+                               }\r
+                       }\r
+\r
+#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&( defined LOW_TP_TXOP))\r
+                       // for Intel IOT, need to enlarge CW MAX from 6 to 10\r
+                       if (pstat && pstat->IOTPeer==HT_IOT_PEER_INTEL && (((pstat->tx_avarage+pstat->rx_avarage)>>10) < \r
+                                       priv->pshare->rf_ft_var.cwmax_enhance_thd)) \r
+                       {\r
+                               if (!priv->pshare->BE_cwmax_enhance && priv->pshare->iot_mode_enable)\r
+                               {\r
+                                       priv->pshare->BE_cwmax_enhance = 1;\r
+                                       switch_turbo++;\r
+                               }\r
+                       } else {\r
+                               if (priv->pshare->BE_cwmax_enhance) {\r
+                                       priv->pshare->BE_cwmax_enhance = 0;\r
+                                       switch_turbo++;\r
+                               }\r
+                       }\r
+#endif\r
+               }\r
+#endif\r
+               priv->pshare->current_tx_bytes = 0;\r
+               priv->pshare->current_rx_bytes = 0;\r
+       }else {\r
+               if ((GET_CHIP_VER(priv) == VERSION_8881A)||(GET_CHIP_VER(priv) == VERSION_8192E)|| (GET_CHIP_VER(priv) == VERSION_8188E) ){\r
+                       unsigned int uldl_tp = (priv->pshare->current_tx_bytes+priv->pshare->current_rx_bytes)>>17;\r
+                       if((uldl_tp > 40) && (priv->pshare->agg_to!= 1)) {\r
+                               RTL_W8(0x462, 0x08);\r
+                               priv->pshare->agg_to = 1;\r
+                       } else if((uldl_tp < 35) && (priv->pshare->agg_to !=0)) {\r
+                               RTL_W8(0x462, 0x02);\r
+                               priv->pshare->agg_to = 0;\r
+                       } \r
+               }\r
+       }\r
+       \r
+#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined( SW_TX_QUEUE))\r
+       if(AMPDU_ENABLE) {\r
+#ifdef TX_EARLY_MODE\r
+               if (GET_TX_EARLY_MODE) {\r
+                       if (!GET_EM_SWQ_ENABLE &&\r
+                               ((priv->assoc_num > 1) ||\r
+                               (pstat && pstat->IOTPeer != HT_IOT_PEER_UNKNOWN))) {\r
+                               if ((priv->pshare->em_tx_byte_cnt >> 17) > EM_TP_UP_BOUND) \r
+                                       priv->pshare->reach_tx_limit_cnt++;                             \r
+                               else                                    \r
+                                       priv->pshare->reach_tx_limit_cnt = 0;   \r
+\r
+                               if (priv->pshare->txop_enlarge && priv->pshare->reach_tx_limit_cnt) { //>= WAIT_TP_TIME//\r
+                                       GET_EM_SWQ_ENABLE = 1;                  \r
+                                       priv->pshare->reach_tx_limit_cnt = 0;\r
+\r
+                                       if (pstat->IOTPeer == HT_IOT_PEER_INTEL)\r
+                                               MAX_EM_QUE_NUM = 12;\r
+                                       else if (pstat->IOTPeer == HT_IOT_PEER_RALINK)\r
+                                               MAX_EM_QUE_NUM = 10;\r
+                                       \r
+                                       enable_em(priv);                        \r
+                               }\r
+                       }\r
+                       else if (GET_EM_SWQ_ENABLE) {\r
+                               if ((priv->pshare->em_tx_byte_cnt >> 17) < EM_TP_LOW_BOUND)\r
+                                       priv->pshare->reach_tx_limit_cnt++;                             \r
+                               else                                    \r
+                                       priv->pshare->reach_tx_limit_cnt = 0;   \r
+\r
+                               if (!priv->pshare->txop_enlarge || priv->pshare->reach_tx_limit_cnt >= WAIT_TP_TIME) {\r
+                                       GET_EM_SWQ_ENABLE = 0;\r
+                                       priv->pshare->reach_tx_limit_cnt = 0;\r
+                                       disable_em(priv);\r
+                               }\r
+                       }\r
+               }\r
+#endif\r
+\r
+#if defined(CONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8192EE) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8814AE)\r
+       if (pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8814A) {      \r
+               if (priv->assoc_num > 9)\r
+       {\r
+               if (priv->swq_txmac_chg >= priv->pshare->rf_ft_var.swq_en_highthd){\r
+                               if ((priv->swq_decision == 0)){\r
+                               switch_turbo++;\r
+                               if (priv->pshare->txop_enlarge == 0)\r
+                                       priv->pshare->txop_enlarge = 2;\r
+                                       priv->swq_decision = 1;\r
+                               }\r
+                       else\r
+                       {\r
+                               if ((switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0))\r
+                               {\r
+                                       priv->pshare->txop_enlarge = 2;\r
+                                       switch_turbo--;\r
+                               }\r
+                       }\r
+               }\r
+               else if(priv->swq_txmac_chg <= priv->pshare->rf_ft_var.swq_dis_lowthd){\r
+                               priv->swq_decision = 0;\r
+               }\r
+                       else if ((priv->swq_decision == 1) && (switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0))        {\r
+                       priv->pshare->txop_enlarge = 2;\r
+                       switch_turbo--;\r
+               }\r
+               } else {\r
+                       priv->swq_decision = 0;\r
+    }\r
+       } else if(CONFIG_WLAN_NOT_HAL_EXIST)\r
+#endif\r
+               {       \r
+               if (priv->assoc_num > 1)\r
+       {\r
+               if (priv->swq_txmac_chg >= priv->pshare->rf_ft_var.swq_en_highthd){\r
+                               if ((priv->swq_decision == 0)){\r
+                               switch_turbo++;\r
+                               if (priv->pshare->txop_enlarge == 0)\r
+                                       priv->pshare->txop_enlarge = 2;\r
+                                       priv->swq_decision = 1;\r
+                               }\r
+                       else\r
+                       {\r
+                               if ((switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0))\r
+                               {\r
+                                       priv->pshare->txop_enlarge = 2;\r
+                                       switch_turbo--;\r
+                               }\r
+                       }\r
+               }\r
+               else if(priv->swq_txmac_chg <= priv->pshare->rf_ft_var.swq_dis_lowthd){\r
+                               priv->swq_decision = 0;\r
+               }\r
+                       else if ((priv->swq_decision == 1) && (switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0))        {\r
+                       priv->pshare->txop_enlarge = 2;\r
+                       switch_turbo--;\r
+               }\r
+    }\r
+       //#if (defined CONFIG_RTL_819XD))\r
+               else if (priv->assoc_num == 1 && (priv->up_time % 2 == 0)\r
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP) && defined(TX_EARLY_MODE)\r
+                       && (!GET_TX_EARLY_MODE || !GET_EM_SWQ_ENABLE) \r
+#endif\r
+               ) {\r
+                       if ((pstat) && (pstat->ADDBA_ready[0] | pstat->ADDBA_ready[3])) {\r
+                               //int en_thd = 14417920>>(priv->up_time % 2);\r
+                               avg_tp = (pstat->current_tx_bytes >> 17);\r
+\r
+                               //if ((priv->swq_decision == 0) && (pstat->current_tx_bytes > en_thd) && (pstat->current_rx_bytes > en_thd) )  { //50Mbps\r
+                               if ((priv->swq_decision == 0) && (avg_tp  > TP_HIGH_WATER_MARK)) { //55Mbps\r
+                                       //printk("[%s:%d] swq_decision=1 current_tp: %d Mbps\n", __FUNCTION__, __LINE__, avg_tp);\r
+                                       priv->swq_decision = 1;\r
+                               }\r
+                               //else if ((priv->swq_decision == 1) && ((pstat->tx_avarage < 4587520) || (pstat->rx_avarage < 4587520))) { //35Mbps\r
+                               else if ((priv->swq_decision == 1) && (avg_tp < TP_LOW_WATER_MARK)) { //35Mbps\r
+                                       //printk("[%s:%d] swq_decision=0 current_tp: %d Mbps\n", __FUNCTION__, __LINE__, avg_tp);\r
+                                       priv->swq_decision = 0;\r
+                               }\r
+                       } else {\r
+                               priv->swq_decision = 0;\r
+            }\r
+            }\r
+        }\r
+               if( (priv->swq_decision == 1) \r
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP) && defined(TX_EARLY_MODE)            \r
+               || (GET_EM_SWQ_ENABLE == 1) \r
+#endif         \r
+               ) {\r
+                       priv->swq_en = 1;\r
+                       priv->swqen_keeptime = priv->up_time;\r
+               } else {\r
+            priv->swq_en = 0;\r
+                       priv->swqen_keeptime = 0;\r
+        }\r
+    }\r
+#endif\r
+\r
+#ifdef WIFI_WMM\r
+#ifdef LOW_TP_TXOP\r
+       if ((!priv->pmib->dot11OperationEntry.wifi_specific || (priv->pmib->dot11OperationEntry.wifi_specific == 2))\r
+               && QOS_ENABLE) {\r
+               if (switch_turbo || priv->pshare->rf_ft_var.low_tp_txop) {\r
+                       unsigned int thd_tp;\r
+                       unsigned char under_thd;\r
+                       unsigned int curr_tp;\r
+\r
+                       if (priv->pmib->dot11BssType.net_work_type & (ODM_WM_N24G|ODM_WM_N5G| ODM_WM_G))\r
+                       {\r
+                               // Determine the upper bound throughput threshold.\r
+                               if (priv->pmib->dot11BssType.net_work_type & (ODM_WM_N24G|ODM_WM_N5G)) {\r
+                                       if (priv->assoc_num && priv->assoc_num != priv->pshare->ht_sta_num)\r
+                                               thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g;\r
+                                       else\r
+                                               thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_n;\r
+                               }\r
+                               else\r
+                                       thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g;\r
+\r
+                               // Determine to close txop.\r
+#if defined(UNIVERSAL_REPEATER) || defined(MBSSID)\r
+                               if(IS_STA_VALID(pstat)) \r
+                               {       \r
+                                       struct rtl8192cd_priv *tmppriv;\r
+                                       struct aid_obj *aidarray;       \r
+                                       aidarray = container_of(pstat, struct aid_obj, station);\r
+                                       tmppriv = aidarray->priv;\r
+\r
+                                       curr_tp = (unsigned int)(tmppriv->ext_stats.tx_avarage>>17) + (unsigned int)(tmppriv->ext_stats.rx_avarage>>17);\r
+                               } \r
+                               else \r
+#endif\r
+                               curr_tp = (unsigned int)(priv->ext_stats.tx_avarage>>17) + (unsigned int)(priv->ext_stats.rx_avarage>>17);\r
+                               if (curr_tp <= thd_tp && curr_tp >= priv->pshare->rf_ft_var.low_tp_txop_thd_low)\r
+                                       under_thd = 1;\r
+                               else\r
+                                       under_thd = 0;\r
+                       }\r
+                       else\r
+                       {\r
+                               under_thd = 0;\r
+                       }\r
+\r
+                       if (switch_turbo) \r
+                       {\r
+                               priv->pshare->rf_ft_var.low_tp_txop_close = under_thd;\r
+                               priv->pshare->rf_ft_var.low_tp_txop_count = 0;\r
+                       }\r
+                       else if (priv->pshare->iot_mode_enable && (priv->pshare->rf_ft_var.low_tp_txop_close != under_thd)) {\r
+                               priv->pshare->rf_ft_var.low_tp_txop_count++;\r
+                               if (priv->pshare->rf_ft_var.low_tp_txop_close) {\r
+                                       priv->pshare->rf_ft_var.low_tp_txop_count = priv->pshare->rf_ft_var.low_tp_txop_delay;\r
+                               }\r
+                               if (priv->pshare->rf_ft_var.low_tp_txop_count ==priv->pshare->rf_ft_var.low_tp_txop_delay) \r
+\r
+                               {                                       \r
+                                       priv->pshare->rf_ft_var.low_tp_txop_count = 0;\r
+                                       priv->pshare->rf_ft_var.low_tp_txop_close = under_thd;\r
+                                       switch_turbo++;\r
+                               }\r
+                       } \r
+                       else \r
+                       {\r
+                               priv->pshare->rf_ft_var.low_tp_txop_count = 0;\r
+                       }\r
+               }\r
+       }\r
+#endif         \r
+\r
+#ifdef WMM_DSCP_C42\r
+       if (switch_turbo) {\r
+               if (!priv->pshare->iot_mode_enable && !priv->pshare->aggrmax_change) {\r
+                       RTL_W16(0x4ca, 0x0404);\r
+                       priv->pshare->aggrmax_change = 1;\r
+               }\r
+               else if (priv->pshare->iot_mode_enable && priv->pshare->aggrmax_change) {\r
+                       RTL_W16(0x4ca, priv->pshare->aggrmax_bak);\r
+                       priv->pshare->aggrmax_change = 0;\r
+               }\r
+       } \r
+#endif\r
+#ifdef TX_EARLY_MODE\r
+               unsigned int em_tp = ((priv->ext_stats.tx_avarage>>17) + (priv->ext_stats.rx_avarage>>17));\r
+               if (em_tp > 80)\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (0x5e << 16) | (4 << 12) | (3 << 8) | 0x19);\r
+               else //if (em_tp < 75)\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (0x5e << 16) | (6 << 12) | (5 << 8) | 0x2b);\r
+#endif\r
+       if (switch_turbo)\r
+               ODM_IotEdcaSwitch( pDM_Odm, priv->pshare->iot_mode_enable );\r
+#endif\r
+}\r
+#endif\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_EdcaTurboCheck.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_EdcaTurboCheck.h
new file mode 100755 (executable)
index 0000000..4557d15
--- /dev/null
@@ -0,0 +1,152 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __PHYDMEDCATURBOCHECK_H__\r
+#define    __PHYDMEDCATURBOCHECK_H__\r
+\r
+#define EDCATURBO_VERSION      "1.0"\r
+\r
+typedef struct _EDCA_TURBO_\r
+{\r
+       BOOLEAN bCurrentTurboEDCA;\r
+       BOOLEAN bIsCurRDLState;\r
+\r
+       #if(DM_ODM_SUPPORT_TYPE == ODM_CE       )\r
+       u4Byte  prv_traffic_idx; // edca turbo\r
+       #endif\r
+\r
+}EDCA_T,*pEDCA_T;\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+static u4Byte edca_setting_UL[HT_IOT_PEER_MAX] = \r
+// UNKNOWN             REALTEK_90      REALTEK_92SE    BROADCOM                RALINK          ATHEROS         CISCO           MERU        MARVELL     92U_AP          SELF_AP(DownLink/Tx)\r
+{ 0x5e4322,            0xa44f,                 0x5e4322,               0x5ea32b,               0x5ea422,       0x5ea322,       0x3ea430,       0x5ea42b, 0x5ea44f,     0x5e4322,       0x5e4322};\r
+\r
+\r
+static u4Byte edca_setting_DL[HT_IOT_PEER_MAX] = \r
+// UNKNOWN             REALTEK_90      REALTEK_92SE    BROADCOM                RALINK          ATHEROS         CISCO           MERU,       MARVELL     92U_AP          SELF_AP(UpLink/Rx)\r
+{ 0xa44f,              0x5ea44f,       0x5e4322,               0x5ea42b,               0xa44f,                 0xa630,                 0x5ea630,       0x5ea42b, 0xa44f,               0xa42b,         0xa42b};\r
+\r
+static u4Byte edca_setting_DL_GMode[HT_IOT_PEER_MAX] = \r
+// UNKNOWN             REALTEK_90      REALTEK_92SE    BROADCOM                RALINK          ATHEROS         CISCO           MERU,       MARVELL     92U_AP          SELF_AP\r
+{ 0x4322,              0xa44f,                 0x5e4322,               0xa42b,                         0x5e4322,       0x4322,                 0xa42b,         0x5ea42b, 0xa44f,               0x5e4322,       0x5ea42b};\r
+\r
+\r
+//============================================================\r
+// EDCA Paramter for AP/ADSL   by Mingzhi 2011-11-22\r
+//============================================================\r
+#elif (DM_ODM_SUPPORT_TYPE &ODM_ADSL)\r
+enum qos_prio { BK, BE, VI, VO, VI_AG, VO_AG };\r
+\r
+static const struct ParaRecord rtl_ap_EDCA[] =\r
+{\r
+//ACM,AIFSN, ECWmin, ECWmax, TXOplimit\r
+     {0,     7,      4,      10,     0},            //BK\r
+     {0,     3,      4,      6,      0},             //BE\r
+     {0,     1,      3,      4,      188},         //VI\r
+     {0,     1,      2,      3,      102},         //VO\r
+     {0,     1,      3,      4,      94},          //VI_AG\r
+     {0,     1,      2,      3,      47},          //VO_AG\r
+};\r
+\r
+static const struct ParaRecord rtl_sta_EDCA[] =\r
+{\r
+//ACM,AIFSN, ECWmin, ECWmax, TXOplimit\r
+     {0,     7,      4,      10,     0},\r
+     {0,     3,      4,      10,     0},\r
+     {0,     2,      3,      4,      188},\r
+     {0,     2,      2,      3,      102},\r
+     {0,     2,      3,      4,      94},\r
+     {0,     2,      2,      3,      47},\r
+};\r
+#endif\r
+\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+#ifdef WIFI_WMM\r
+VOID\r
+ODM_IotEdcaSwitch(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN      unsigned char           enable\r
+       );\r
+#endif\r
+\r
+BOOLEAN\r
+ODM_ChooseIotMainSTA(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN      PSTA_INFO_T             pstat\r
+       );\r
+#endif\r
+\r
+VOID\r
+odm_EdcaTurboCheck(\r
+       IN      PVOID           pDM_VOID\r
+       );\r
+VOID\r
+ODM_EdcaTurboInit(\r
+       IN      PVOID           pDM_VOID\r
+);\r
+\r
+#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)\r
+VOID\r
+odm_EdcaTurboCheckMP(\r
+       IN      PVOID           pDM_VOID\r
+       );\r
+\r
+//check if edca turbo is disabled\r
+BOOLEAN\r
+odm_IsEdcaTurboDisable(\r
+       IN      PVOID           pDM_VOID\r
+);\r
+//choose edca paramter for special IOT case\r
+VOID \r
+ODM_EdcaParaSelByIot(\r
+       IN              PVOID                                   pDM_VOID,\r
+       OUT     u4Byte          *EDCA_BE_UL,\r
+       OUT u4Byte              *EDCA_BE_DL\r
+       );\r
+//check if it is UL or DL\r
+VOID\r
+odm_EdcaChooseTrafficIdx( \r
+       IN      PVOID           pDM_VOID,\r
+       IN      u8Byte                          cur_tx_bytes,  \r
+       IN      u8Byte                          cur_rx_bytes, \r
+       IN      BOOLEAN                 bBiasOnRx,\r
+       OUT BOOLEAN             *pbIsCurRDLState\r
+       );\r
+\r
+#elif (DM_ODM_SUPPORT_TYPE==ODM_CE)\r
+VOID\r
+odm_EdcaTurboCheckCE(\r
+       IN      PVOID           pDM_VOID\r
+       );\r
+#else\r
+VOID \r
+odm_IotEngine(\r
+       IN      PVOID           pDM_VOID\r
+       );\r
+\r
+VOID\r
+odm_EdcaParaInit(\r
+       IN      PVOID           pDM_VOID\r
+       );\r
+#endif\r
+\r
+#endif\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_HWConfig.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_HWConfig.c
new file mode 100755 (executable)
index 0000000..e8dc0a6
--- /dev/null
@@ -0,0 +1,2362 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+\r
+#include "Mp_Precomp.h"\r
+#include "phydm_precomp.h"\r
+\r
+#define READ_AND_CONFIG_MP(ic, txt) (ODM_ReadAndConfig_MP_##ic##txt(pDM_Odm))\r
+#define READ_AND_CONFIG_TC(ic, txt) (ODM_ReadAndConfig_TC_##ic##txt(pDM_Odm))\r
+\r
+\r
+#if (TESTCHIP_SUPPORT == 1)\r
+#define READ_AND_CONFIG(ic, txt) do {\\r
+                                            if (pDM_Odm->bIsMPChip)\\r
+                                                   READ_AND_CONFIG_MP(ic,txt);\\r
+                                            else\\r
+                                                READ_AND_CONFIG_TC(ic,txt);\\r
+                                    } while(0)\r
+#else\r
+  #define READ_AND_CONFIG     READ_AND_CONFIG_MP\r
+#endif\r
+\r
+\r
+#define READ_FIRMWARE_MP(ic, txt)              (ODM_ReadFirmware_MP_##ic##txt(pDM_Odm, pFirmware, pSize))\r
+#define READ_FIRMWARE_TC(ic, txt)              (ODM_ReadFirmware_TC_##ic##txt(pDM_Odm, pFirmware, pSize))              \r
+\r
+#if (TESTCHIP_SUPPORT == 1)\r
+#define READ_FIRMWARE(ic, txt) do {\\r
+                                               if (pDM_Odm->bIsMPChip)\\r
+                                                       READ_FIRMWARE_MP(ic,txt);\\r
+                                               else\\r
+                                                       READ_FIRMWARE_TC(ic,txt);\\r
+                                       } while(0) \r
+#else\r
+#define READ_FIRMWARE     READ_FIRMWARE_MP\r
+#endif\r
+                                               \r
+#define GET_VERSION_MP(ic, txt)                (ODM_GetVersion_MP_##ic##txt())\r
+#define GET_VERSION_TC(ic, txt)                (ODM_GetVersion_TC_##ic##txt())\r
+#define GET_VERSION(ic, txt) (pDM_Odm->bIsMPChip?GET_VERSION_MP(ic,txt):GET_VERSION_TC(ic,txt))\r
+\r
+\r
+u1Byte\r
+odm_QueryRxPwrPercentage(\r
+       IN              s1Byte          AntPower\r
+       )\r
+{\r
+       if ((AntPower <= -100) || (AntPower >= 20))\r
+       {\r
+               return  0;\r
+       }\r
+       else if (AntPower >= 0)\r
+       {\r
+               return  100;\r
+       }\r
+       else\r
+       {\r
+               return  (100+AntPower);\r
+       }\r
+       \r
+}\r
+\r
+#if (DM_ODM_SUPPORT_TYPE != ODM_WIN)\r
+//\r
+// 2012/01/12 MH MOve some signal strength smooth method to MP HAL layer.\r
+// IF other SW team do not support the feature, remove this section.??\r
+//\r
+s4Byte\r
+odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Lenovo(     \r
+       IN OUT PDM_ODM_T pDM_Odm,\r
+       s4Byte CurrSig \r
+)\r
+{      \r
+       s4Byte RetSig = 0;\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       //if(pDM_Odm->SupportInterface  == ODM_ITRF_PCIE) \r
+       {\r
+               // Step 1. Scale mapping.\r
+               // 20100611 Joseph: Re-tunning RSSI presentation for Lenovo.\r
+               // 20100426 Joseph: Modify Signal strength mapping.\r
+               // This modification makes the RSSI indication similar to Intel solution.\r
+               // 20100414 Joseph: Tunning RSSI for Lenovo according to RTL8191SE.\r
+               if(CurrSig >= 54 && CurrSig <= 100)\r
+               {\r
+                       RetSig = 100;\r
+               }\r
+               else if(CurrSig>=42 && CurrSig <= 53 )\r
+               {\r
+                       RetSig = 95;\r
+               }\r
+               else if(CurrSig>=36 && CurrSig <= 41 )\r
+               {\r
+                       RetSig = 74 + ((CurrSig - 36) *20)/6;\r
+               }\r
+               else if(CurrSig>=33 && CurrSig <= 35 )\r
+               {\r
+                       RetSig = 65 + ((CurrSig - 33) *8)/2;\r
+               }\r
+               else if(CurrSig>=18 && CurrSig <= 32 )\r
+               {\r
+                       RetSig = 62 + ((CurrSig - 18) *2)/15;\r
+               }\r
+               else if(CurrSig>=15 && CurrSig <= 17 )\r
+               {\r
+                       RetSig = 33 + ((CurrSig - 15) *28)/2;\r
+               }\r
+               else if(CurrSig>=10 && CurrSig <= 14 )\r
+               {\r
+                       RetSig = 39;\r
+               }\r
+               else if(CurrSig>=8 && CurrSig <= 9 )\r
+               {\r
+                       RetSig = 33;\r
+               }\r
+               else if(CurrSig <= 8 )\r
+               {\r
+                       RetSig = 19;\r
+               }\r
+       }\r
+#endif //ENDIF (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       return RetSig;\r
+}\r
+\r
+s4Byte\r
+odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Netcore(    \r
+       IN OUT PDM_ODM_T pDM_Odm,\r
+       s4Byte CurrSig \r
+)\r
+{\r
+       s4Byte RetSig = 0;\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       //if(pDM_Odm->SupportInterface  == ODM_ITRF_USB)\r
+       {\r
+               // Netcore request this modification because 2009.04.13 SU driver use it. \r
+               if(CurrSig >= 31 && CurrSig <= 100)\r
+               {\r
+                       RetSig = 100;\r
+               }       \r
+               else if(CurrSig >= 21 && CurrSig <= 30)\r
+               {\r
+                       RetSig = 90 + ((CurrSig - 20) / 1);\r
+               }\r
+               else if(CurrSig >= 11 && CurrSig <= 20)\r
+               {\r
+                       RetSig = 80 + ((CurrSig - 10) / 1);\r
+               }\r
+               else if(CurrSig >= 7 && CurrSig <= 10)\r
+               {\r
+                       RetSig = 69 + (CurrSig - 7);\r
+               }\r
+               else if(CurrSig == 6)\r
+               {\r
+                       RetSig = 54;\r
+               }\r
+               else if(CurrSig == 5)\r
+               {\r
+                       RetSig = 45;\r
+               }\r
+               else if(CurrSig == 4)\r
+               {\r
+                       RetSig = 36;\r
+               }\r
+               else if(CurrSig == 3)\r
+               {\r
+                       RetSig = 27;\r
+               }\r
+               else if(CurrSig == 2)\r
+               {\r
+                       RetSig = 18;\r
+               }\r
+               else if(CurrSig == 1)\r
+               {\r
+                       RetSig = 9;\r
+               }\r
+               else\r
+               {\r
+                       RetSig = CurrSig;\r
+               }\r
+       }\r
+#endif //ENDIF (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       return RetSig;\r
+}\r
+\r
+\r
+s4Byte\r
+odm_SignalScaleMapping_92CSeries(      \r
+       IN OUT PDM_ODM_T pDM_Odm,\r
+       IN s4Byte CurrSig \r
+)\r
+{\r
+       s4Byte RetSig = 0; \r
+#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) \r
+       if(pDM_Odm->SupportInterface  == ODM_ITRF_PCIE) \r
+       {\r
+               // Step 1. Scale mapping.\r
+               if(CurrSig >= 61 && CurrSig <= 100)\r
+               {\r
+                       RetSig = 90 + ((CurrSig - 60) / 4);\r
+               }\r
+               else if(CurrSig >= 41 && CurrSig <= 60)\r
+               {\r
+                       RetSig = 78 + ((CurrSig - 40) / 2);\r
+               }\r
+               else if(CurrSig >= 31 && CurrSig <= 40)\r
+               {\r
+                       RetSig = 66 + (CurrSig - 30);\r
+               }\r
+               else if(CurrSig >= 21 && CurrSig <= 30)\r
+               {\r
+                       RetSig = 54 + (CurrSig - 20);\r
+               }\r
+               else if(CurrSig >= 5 && CurrSig <= 20)\r
+               {\r
+                       RetSig = 42 + (((CurrSig - 5) * 2) / 3);\r
+               }\r
+               else if(CurrSig == 4)\r
+               {\r
+                       RetSig = 36;\r
+               }\r
+               else if(CurrSig == 3)\r
+               {\r
+                       RetSig = 27;\r
+               }\r
+               else if(CurrSig == 2)\r
+               {\r
+                       RetSig = 18;\r
+               }\r
+               else if(CurrSig == 1)\r
+               {\r
+                       RetSig = 9;\r
+               }\r
+               else\r
+               {\r
+                       RetSig = CurrSig;\r
+               }\r
+       }\r
+#endif\r
+\r
+#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) ||(DEV_BUS_TYPE == RT_SDIO_INTERFACE))\r
+       if((pDM_Odm->SupportInterface  == ODM_ITRF_USB) || (pDM_Odm->SupportInterface  == ODM_ITRF_SDIO))\r
+       {\r
+               if(CurrSig >= 51 && CurrSig <= 100)\r
+               {\r
+                       RetSig = 100;\r
+               }\r
+               else if(CurrSig >= 41 && CurrSig <= 50)\r
+               {\r
+                       RetSig = 80 + ((CurrSig - 40)*2);\r
+               }\r
+               else if(CurrSig >= 31 && CurrSig <= 40)\r
+               {\r
+                       RetSig = 66 + (CurrSig - 30);\r
+               }\r
+               else if(CurrSig >= 21 && CurrSig <= 30)\r
+               {\r
+                       RetSig = 54 + (CurrSig - 20);\r
+               }\r
+               else if(CurrSig >= 10 && CurrSig <= 20)\r
+               {\r
+                       RetSig = 42 + (((CurrSig - 10) * 2) / 3);\r
+               }\r
+               else if(CurrSig >= 5 && CurrSig <= 9)\r
+               {\r
+                       RetSig = 22 + (((CurrSig - 5) * 3) / 2);\r
+               }\r
+               else if(CurrSig >= 1 && CurrSig <= 4)\r
+               {\r
+                       RetSig = 6 + (((CurrSig - 1) * 3) / 2);\r
+               }\r
+               else\r
+               {\r
+                       RetSig = CurrSig;\r
+               }\r
+       }\r
+\r
+#endif\r
+       return RetSig;\r
+}\r
+s4Byte\r
+odm_SignalScaleMapping(        \r
+       IN OUT PDM_ODM_T pDM_Odm,\r
+       IN      s4Byte CurrSig \r
+)\r
+{      \r
+       if(     (pDM_Odm->SupportPlatform == ODM_WIN) && \r
+               (pDM_Odm->SupportInterface  != ODM_ITRF_PCIE) && //USB & SDIO\r
+               (pDM_Odm->PatchID==10))//pMgntInfo->CustomerID == RT_CID_819x_Netcore\r
+       {\r
+               return odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Netcore(pDM_Odm,CurrSig);\r
+       }\r
+       else if(        (pDM_Odm->SupportPlatform == ODM_WIN) && \r
+                       (pDM_Odm->SupportInterface  == ODM_ITRF_PCIE) &&\r
+                       (pDM_Odm->PatchID==19))//pMgntInfo->CustomerID == RT_CID_819x_Lenovo)\r
+       {\r
+               return odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Lenovo(pDM_Odm, CurrSig);\r
+       }\r
+       else{           \r
+               return odm_SignalScaleMapping_92CSeries(pDM_Odm,CurrSig);\r
+       }\r
+       \r
+}\r
+#endif\r
+\r
+\r
+static u1Byte odm_SQ_process_patch_RT_CID_819x_Lenovo(\r
+       IN PDM_ODM_T    pDM_Odm,\r
+       IN u1Byte               isCCKrate,\r
+       IN u1Byte               PWDB_ALL,\r
+       IN u1Byte               path,\r
+       IN u1Byte               RSSI\r
+)\r
+{\r
+       u1Byte  SQ = 0;\r
+#if (DM_ODM_SUPPORT_TYPE &  ODM_WIN)                   \r
+\r
+       if(isCCKrate){\r
+               \r
+               if(IS_HARDWARE_TYPE_8723AE(pDM_Odm->Adapter))\r
+               {\r
+\r
+                       //\r
+                       // <Roger_Notes> Expected signal strength and bars indication at Lenovo lab. 2013.04.11\r
+                       // 802.11n, 802.11b, 802.11g only at channel 6\r
+                       //\r
+                       //              Attenuation (dB)        OS Signal Bars  RSSI by Xirrus (dBm)\r
+                       //                      50                              5                       -52\r
+                       //                      55                              5                       -54\r
+                       //                      60                              5                       -55\r
+                       //                      65                              5                       -59\r
+                       //                      70                              5                       -63\r
+                       //                      75                              5                       -66\r
+                       //                      80                              4                       -72\r
+                       //                      85                              3                       -75\r
+                       //                      90                              3                       -80\r
+                       //                      95                              2                       -85\r
+                       //                      100                             1                       -89\r
+                       //                      102                             1                       -90\r
+                       //                      104                             1                       -91\r
+                       //\r
+                       RT_TRACE(COMP_DBG, DBG_WARNING, ("odm_SQ_process_patch_RT_CID_819x_Lenovo\n"));\r
+                       \r
+#if OS_WIN_FROM_WIN8(OS_VERSION)       \r
+                       if(PWDB_ALL >= 50)\r
+                               SQ = 100;\r
+                       else if(PWDB_ALL >= 23 && PWDB_ALL < 50)                                \r
+                               SQ = 80;\r
+                       else if(PWDB_ALL >= 18 && PWDB_ALL < 23)\r
+                               SQ = 60;\r
+                       else if(PWDB_ALL >= 8 && PWDB_ALL < 18)\r
+                               SQ = 40;\r
+                       else\r
+                               SQ = 10;\r
+#else\r
+                       if(PWDB_ALL >= 34)\r
+                               SQ = 100;\r
+                       else if(PWDB_ALL >= 23 && PWDB_ALL < 34)                                \r
+                               SQ = 80;\r
+                       else if(PWDB_ALL >= 18 && PWDB_ALL < 23)\r
+                               SQ = 60;\r
+                       else if(PWDB_ALL >= 8 && PWDB_ALL < 18)\r
+                               SQ = 40;\r
+                       else\r
+                               SQ = 10;        \r
+\r
+                       if(PWDB_ALL == 0)// Abnormal case, do not indicate the value above 20 on Win7\r
+                               SQ = 20;\r
+#endif         \r
+\r
+               }\r
+               else if(IS_HARDWARE_TYPE_8192E(pDM_Odm->Adapter)){\r
+\r
+                       //\r
+                       // <Roger_Notes> Expected signal strength and bars indication at Lenovo lab. 2013.04.11\r
+                       // 802.11n, 802.11b, 802.11g only at channel 6\r
+                       //\r
+                       //              Attenuation (dB)        OS Signal Bars  RSSI by Xirrus (dBm)\r
+                       //                      50                              5                       -49\r
+                       //                      55                              5                       -49\r
+                       //                      60                              5                       -50\r
+                       //                      65                              5                       -51\r
+                       //                      70                              5                       -52\r
+                       //                      75                              5                       -54\r
+                       //                      80                              5                       -55\r
+                       //                      85                              4                       -60\r
+                       //                      90                              3                       -63\r
+                       //                      95                              3                       -65\r
+                       //                      100                             2                       -67\r
+                       //                      102                             2                       -67\r
+                       //                      104                             1                       -70\r
+                       //                      \r
+\r
+                       if(PWDB_ALL >= 50)\r
+                               SQ = 100;\r
+                       else if(PWDB_ALL >= 35 && PWDB_ALL < 50)                                \r
+                               SQ = 80;\r
+                       else if(PWDB_ALL >= 31 && PWDB_ALL < 35)\r
+                               SQ = 60;\r
+                       else if(PWDB_ALL >= 22 && PWDB_ALL < 31)\r
+                               SQ = 40;\r
+                       else if(PWDB_ALL >= 18 && PWDB_ALL < 22)\r
+                               SQ = 20;\r
+                       else\r
+                               SQ = 10;\r
+               }\r
+               else\r
+               {\r
+               if(PWDB_ALL >= 50)\r
+                       SQ = 100;\r
+               else if(PWDB_ALL >= 35 && PWDB_ALL < 50)                                \r
+                       SQ = 80;\r
+               else if(PWDB_ALL >= 22 && PWDB_ALL < 35)\r
+                       SQ = 60;\r
+               else if(PWDB_ALL >= 18 && PWDB_ALL < 22)\r
+                       SQ = 40;\r
+               else\r
+                               SQ = 10;\r
+               }\r
+               \r
+       }\r
+       else\r
+       {//OFDM rate            \r
+\r
+               if(IS_HARDWARE_TYPE_8723AE(pDM_Odm->Adapter) ||\r
+                       IS_HARDWARE_TYPE_8192E(pDM_Odm->Adapter))\r
+               {\r
+                       if(RSSI >= 45)\r
+                               SQ = 100;\r
+                       else if(RSSI >= 22 && RSSI < 45)\r
+                               SQ = 80;\r
+                       else if(RSSI >= 18 && RSSI < 22)\r
+                               SQ = 40;\r
+                       else\r
+                       SQ = 20;\r
+       }\r
+               else\r
+               {\r
+                       if(RSSI >= 45)\r
+                       SQ = 100;\r
+                       else if(RSSI >= 22 && RSSI < 45)\r
+                       SQ = 80;\r
+               else if(RSSI >= 18 && RSSI < 22)\r
+                       SQ = 40;\r
+               else\r
+                       SQ = 20;                        \r
+       }\r
+       }\r
+\r
+       RT_TRACE(COMP_DBG, DBG_TRACE, ("isCCKrate(%#d), PWDB_ALL(%#d), RSSI(%#d), SQ(%#d)\n", isCCKrate, PWDB_ALL, RSSI, SQ));\r
+       \r
+#endif\r
+       return SQ;\r
+}\r
+\r
+static u1Byte odm_SQ_process_patch_RT_CID_819x_Acer(\r
+       IN PDM_ODM_T    pDM_Odm,\r
+       IN u1Byte               isCCKrate,\r
+       IN u1Byte               PWDB_ALL,\r
+       IN u1Byte               path,\r
+       IN u1Byte               RSSI\r
+)\r
+{\r
+       u1Byte  SQ = 0;\r
+       \r
+#if (DM_ODM_SUPPORT_TYPE &  ODM_WIN)                   \r
+\r
+       if(isCCKrate){\r
+\r
+                       RT_TRACE(COMP_DBG, DBG_WARNING, ("odm_SQ_process_patch_RT_Acer\n"));\r
+                       \r
+#if OS_WIN_FROM_WIN8(OS_VERSION)       \r
+\r
+                       if(PWDB_ALL >= 50)\r
+                               SQ = 100;\r
+                       else if(PWDB_ALL >= 35 && PWDB_ALL < 50)                                \r
+                               SQ = 80;\r
+                       else if(PWDB_ALL >= 30 && PWDB_ALL < 35)\r
+                               SQ = 60;\r
+                       else if(PWDB_ALL >= 25 && PWDB_ALL < 30)\r
+                               SQ = 40;\r
+                       else if(PWDB_ALL >= 20 && PWDB_ALL < 25)\r
+                               SQ = 20;\r
+                       else\r
+                               SQ = 10;        \r
+#else\r
+                       if(PWDB_ALL >= 50)\r
+                               SQ = 100;\r
+                       else if(PWDB_ALL >= 35 && PWDB_ALL < 50)                                \r
+                               SQ = 80;\r
+                       else if(PWDB_ALL >= 30 && PWDB_ALL < 35)\r
+                               SQ = 60;\r
+                       else if(PWDB_ALL >= 25 && PWDB_ALL < 30)\r
+                               SQ = 40;\r
+                       else if(PWDB_ALL >= 20 && PWDB_ALL < 25)\r
+                               SQ = 20;\r
+                       else\r
+                               SQ = 10;        \r
+\r
+                       if(PWDB_ALL == 0)// Abnormal case, do not indicate the value above 20 on Win7\r
+                               SQ = 20;\r
+#endif         \r
+\r
+               \r
+               \r
+       }\r
+       else\r
+       {//OFDM rate            \r
+\r
+               if(IS_HARDWARE_TYPE_8723AE(pDM_Odm->Adapter) ||\r
+                       IS_HARDWARE_TYPE_8192E(pDM_Odm->Adapter))\r
+               {\r
+                       if(RSSI >= 45)\r
+                               SQ = 100;\r
+                       else if(RSSI >= 22 && RSSI < 45)\r
+                               SQ = 80;\r
+                       else if(RSSI >= 18 && RSSI < 22)\r
+                               SQ = 40;\r
+                       else\r
+                       SQ = 20;\r
+       }\r
+               else\r
+               {\r
+                       if(RSSI >= 35)\r
+                       SQ = 100;\r
+                       else if(RSSI >= 30 && RSSI < 35)\r
+                       SQ = 80;\r
+               else if(RSSI >= 25 && RSSI < 30)\r
+                       SQ = 40;\r
+               else\r
+                       SQ = 20;                        \r
+       }\r
+       }\r
+\r
+       RT_TRACE(COMP_DBG, DBG_LOUD, ("isCCKrate(%#d), PWDB_ALL(%#d), RSSI(%#d), SQ(%#d)\n", isCCKrate, PWDB_ALL, RSSI, SQ));\r
+       \r
+#endif\r
+       return SQ;\r
+}\r
+                       \r
+static u1Byte \r
+odm_EVMdbToPercentage(\r
+    IN         s1Byte Value\r
+    )\r
+{\r
+       //\r
+       // -33dB~0dB to 0%~99%\r
+       //\r
+       s1Byte ret_val;\r
+    \r
+       ret_val = Value;\r
+       ret_val /= 2;\r
+\r
+       //DbgPrint("Value=%d\n", Value);\r
+       //ODM_RT_DISP(FRX, RX_PHY_SQ, ("EVMdbToPercentage92C Value=%d / %x \n", ret_val, ret_val));\r
+               \r
+       if(ret_val >= 0)\r
+               ret_val = 0;\r
+       if(ret_val <= -33)\r
+               ret_val = -33;\r
+\r
+       ret_val = 0 - ret_val;\r
+       ret_val*=3;\r
+\r
+       if(ret_val == 99)\r
+               ret_val = 100;\r
+\r
+       return(ret_val);\r
+}\r
+                       \r
+static u1Byte \r
+odm_EVMdbm_JaguarSeries(\r
+       IN  s1Byte Value\r
+       )\r
+{\r
+       s1Byte ret_val = Value;\r
+       \r
+       // -33dB~0dB to 33dB ~ 0dB\r
+       if(ret_val == -128)\r
+               ret_val = 127;\r
+       else if (ret_val < 0)\r
+               ret_val = 0 - ret_val;\r
+       \r
+       ret_val  = ret_val >> 1;\r
+       return ret_val;\r
+}\r
+\r
+static u2Byte\r
+odm_Cfo(\r
+  IN s1Byte Value\r
+)\r
+{\r
+       s2Byte  ret_val;\r
+\r
+       if (Value < 0)\r
+       {\r
+               ret_val = 0 - Value;\r
+               ret_val = (ret_val << 1) + (ret_val >> 1) ;  //  *2.5~=312.5/2^7\r
+               ret_val = ret_val | BIT12;  // set bit12 as 1 for negative cfo\r
+       }\r
+       else\r
+       {\r
+               ret_val = Value;\r
+               ret_val = (ret_val << 1) + (ret_val>>1) ;  //  *2.5~=312.5/2^7\r
+       }\r
+       return ret_val;\r
+}\r
+\r
+#if(ODM_IC_11N_SERIES_SUPPORT == 1)\r
+VOID\r
+odm_RxPhyStatus92CSeries_Parsing(\r
+       IN OUT  PDM_ODM_T                                       pDM_Odm,\r
+       OUT             PODM_PHY_INFO_T                 pPhyInfo,               \r
+       IN              pu1Byte                                         pPhyStatus,\r
+       IN              PODM_PACKET_INFO_T                      pPktinfo\r
+       )\r
+{                                                      \r
+       SWAT_T                          *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
+       u1Byte                          i, Max_spatial_stream;\r
+       s1Byte                          rx_pwr[4], rx_pwr_all=0;\r
+       u1Byte                          EVM, PWDB_ALL = 0, PWDB_ALL_BT;\r
+       u1Byte                          RSSI, total_rssi=0;\r
+       BOOLEAN                         isCCKrate=FALSE;        \r
+       u1Byte                          rf_rx_num = 0;\r
+       u1Byte                          cck_highpwr = 0;\r
+       u1Byte                          LNA_idx, VGA_idx;\r
+       PPHY_STATUS_RPT_8192CD_T pPhyStaRpt = (PPHY_STATUS_RPT_8192CD_T)pPhyStatus;\r
+\r
+       isCCKrate = (pPktinfo->DataRate <= DESC_RATE11M)?TRUE :FALSE;\r
+       pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = -1;\r
+       pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1;\r
+\r
+\r
+       if(isCCKrate)\r
+       {\r
+               u1Byte report;\r
+               u1Byte cck_agc_rpt;\r
+               \r
+               pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK++;\r
+               // \r
+               // (1)Hardware does not provide RSSI for CCK\r
+               // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)\r
+               //\r
+\r
+               //if(pHalData->eRFPowerState == eRfOn)\r
+                       cck_highpwr = pDM_Odm->bCckHighPower;\r
+               //else\r
+               //      cck_highpwr = FALSE;\r
+\r
+               cck_agc_rpt =  pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a ;\r
+               \r
+               //2011.11.28 LukeLee: 88E use different LNA & VGA gain table\r
+               //The RSSI formula should be modified according to the gain table\r
+               //In 88E, cck_highpwr is always set to 1\r
+               if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B))\r
+               {\r
+                       LNA_idx = ((cck_agc_rpt & 0xE0) >>5);\r
+                       VGA_idx = (cck_agc_rpt & 0x1F); \r
+                       if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8192E))\r
+                       {\r
+                               switch(LNA_idx)\r
+                               {\r
+                                       case 7:\r
+                                               if(VGA_idx <= 27)\r
+                                                       rx_pwr_all = -100 + 2*(27-VGA_idx); //VGA_idx = 27~2\r
+                                               else\r
+                                                       rx_pwr_all = -100;\r
+                                               break;\r
+                                       case 6:\r
+                                                       rx_pwr_all = -48 + 2*(2-VGA_idx); //VGA_idx = 2~0\r
+                                               break;\r
+                                       case 5:\r
+                                                       rx_pwr_all = -42 + 2*(7-VGA_idx); //VGA_idx = 7~5\r
+                                               break;\r
+                                       case 4:\r
+                                                       rx_pwr_all = -36 + 2*(7-VGA_idx); //VGA_idx = 7~4\r
+                                               break;\r
+                                       case 3:\r
+                                                       //rx_pwr_all = -28 + 2*(7-VGA_idx); //VGA_idx = 7~0\r
+                                                       rx_pwr_all = -24 + 2*(7-VGA_idx); //VGA_idx = 7~0\r
+                                               break;\r
+                                       case 2:\r
+                                               if(cck_highpwr)\r
+                                                       rx_pwr_all = -12 + 2*(5-VGA_idx); //VGA_idx = 5~0\r
+                                               else\r
+                                                       rx_pwr_all = -6+ 2*(5-VGA_idx);\r
+                                               break;\r
+                                       case 1:\r
+                                                       rx_pwr_all = 8-2*VGA_idx;\r
+                                               break;\r
+                                       case 0:\r
+                                                       rx_pwr_all = 14-2*VGA_idx;\r
+                                               break;\r
+                                       default:\r
+                                               //DbgPrint("CCK Exception default\n");\r
+                                               break;\r
+                               }\r
+                               rx_pwr_all += 6;\r
+\r
+                               //2012.10.08 LukeLee: Modify for 92E CCK RSSI\r
+                               if(pDM_Odm->SupportICType == ODM_RTL8192E)\r
+                                       rx_pwr_all += 10;\r
+                               \r
+                               PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\r
+                               if(cck_highpwr == FALSE)\r
+                               {\r
+                                       if(PWDB_ALL >= 80)\r
+                                               PWDB_ALL = ((PWDB_ALL-80)<<1)+((PWDB_ALL-80)>>1)+80;\r
+                                       else if((PWDB_ALL <= 78) && (PWDB_ALL >= 20))\r
+                                               PWDB_ALL += 3;\r
+                                       if(PWDB_ALL>100)\r
+                                               PWDB_ALL = 100;\r
+                               }\r
+                       }\r
+                       else if(pDM_Odm->SupportICType & (ODM_RTL8723B))\r
+                       {\r
+#if (RTL8723B_SUPPORT == 1)                    \r
+                               rx_pwr_all = odm_CCKRSSI_8723B(LNA_idx,VGA_idx);\r
+                               PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\r
+                               if(PWDB_ALL>100)\r
+                                       PWDB_ALL = 100; \r
+#endif                         \r
+                       }\r
+               }               \r
+               else\r
+               {\r
+                       if(!cck_highpwr)\r
+                       {                       \r
+                               report =( cck_agc_rpt & 0xc0 )>>6;\r
+                               switch(report)\r
+                               {\r
+                                       // 03312009 modified by cosa\r
+                                       // Modify the RF RNA gain value to -40, -20, -2, 14 by Jenyu's suggestion\r
+                                       // Note: different RF with the different RNA gain.\r
+                                       case 0x3:\r
+                                               rx_pwr_all = -46 - (cck_agc_rpt & 0x3e);\r
+                                               break;\r
+                                       case 0x2:\r
+                                               rx_pwr_all = -26 - (cck_agc_rpt & 0x3e);\r
+                                               break;\r
+                                       case 0x1:\r
+                                               rx_pwr_all = -12 - (cck_agc_rpt & 0x3e);\r
+                                               break;\r
+                                       case 0x0:\r
+                                               rx_pwr_all = 16 - (cck_agc_rpt & 0x3e);\r
+                                               break;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               //report = pDrvInfo->cfosho[0] & 0x60;                  \r
+                               //report = pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a& 0x60;\r
+                               \r
+                               report = (cck_agc_rpt & 0x60)>>5;\r
+                               switch(report)\r
+                               {\r
+                                       case 0x3:\r
+                                               rx_pwr_all = -46 - ((cck_agc_rpt & 0x1f)<<1) ;\r
+                                               break;\r
+                                       case 0x2:\r
+                                               rx_pwr_all = -26 - ((cck_agc_rpt & 0x1f)<<1);\r
+                                               break;\r
+                                       case 0x1:\r
+                                               rx_pwr_all = -12 - ((cck_agc_rpt & 0x1f)<<1) ;\r
+                                               break;\r
+                                       case 0x0:\r
+                                               rx_pwr_all = 16 - ((cck_agc_rpt & 0x1f)<<1) ;\r
+                                               break;\r
+                               }\r
+                       }\r
+\r
+                       PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\r
+\r
+                       //Modification for ext-LNA board\r
+                       if(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA))\r
+                       {\r
+                               if((cck_agc_rpt>>7) == 0){\r
+                                       PWDB_ALL = (PWDB_ALL>94)?100:(PWDB_ALL +6);\r
+                               }\r
+                               else    \r
+                          {\r
+                                       if(PWDB_ALL > 38)\r
+                                               PWDB_ALL -= 16;\r
+                                       else\r
+                                               PWDB_ALL = (PWDB_ALL<=16)?(PWDB_ALL>>2):(PWDB_ALL -12);\r
+                               }             \r
+\r
+                               //CCK modification\r
+                               if(PWDB_ALL > 25 && PWDB_ALL <= 60)\r
+                                       PWDB_ALL += 6;\r
+                               //else if (PWDB_ALL <= 25)\r
+                               //      PWDB_ALL += 8;\r
+                       }\r
+                       else//Modification for int-LNA board\r
+                       {\r
+                               if(PWDB_ALL > 99)\r
+                                       PWDB_ALL -= 8;\r
+                               else if(PWDB_ALL > 50 && PWDB_ALL <= 68)\r
+                                       PWDB_ALL += 4;\r
+                       }\r
+               }\r
+       \r
+               pPhyInfo->RxPWDBAll = PWDB_ALL;\r
+#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\r
+               pPhyInfo->BTRxRSSIPercentage = PWDB_ALL;\r
+               pPhyInfo->RecvSignalPower = rx_pwr_all;\r
+#endif         \r
+               //\r
+               // (3) Get Signal Quality (EVM)\r
+               //\r
+               //if(pPktinfo->bPacketMatchBSSID)\r
+               {\r
+                       u1Byte  SQ,SQ_rpt;                      \r
+                       \r
+                       if((pDM_Odm->SupportPlatform == ODM_WIN) &&\r
+                               (pDM_Odm->PatchID==RT_CID_819x_Lenovo)){\r
+                               SQ = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,0,0);\r
+                       }\r
+                       else if((pDM_Odm->SupportPlatform == ODM_WIN) &&\r
+                               (pDM_Odm->PatchID==RT_CID_819x_Acer))\r
+                       {\r
+                               SQ = odm_SQ_process_patch_RT_CID_819x_Acer(pDM_Odm,isCCKrate,PWDB_ALL,0,0);\r
+                       }\r
+                       else if(pPhyInfo->RxPWDBAll > 40 && !pDM_Odm->bInHctTest){\r
+                               SQ = 100;\r
+                       }\r
+                       else{                                           \r
+                               SQ_rpt = pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all;\r
+                                       \r
+                               if(SQ_rpt > 64)\r
+                                       SQ = 0;\r
+                               else if (SQ_rpt < 20)\r
+                                       SQ = 100;\r
+                               else\r
+                                       SQ = ((64-SQ_rpt) * 100) / 44;\r
+                       \r
+                       }\r
+                       \r
+                       //DbgPrint("cck SQ = %d\n", SQ);\r
+                       pPhyInfo->SignalQuality = SQ;\r
+                       pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = SQ;\r
+                       pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1;\r
+               }\r
+       }\r
+       else //is OFDM rate\r
+       {\r
+               pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++;\r
+\r
+               // \r
+               // (1)Get RSSI for HT rate\r
+               //\r
+               \r
+                for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++)   \r
+               {\r
+                       // 2008/01/30 MH we will judge RF RX path now.\r
+                       if (pDM_Odm->RFPathRxEnable & BIT(i))\r
+                               rf_rx_num++;\r
+                       //else\r
+                               //continue;\r
+\r
+                       rx_pwr[i] = ((pPhyStaRpt->path_agc[i].gain& 0x3F)*2) - 110;\r
+\r
+\r
+               #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+                       pPhyInfo->RxPwr[i] = rx_pwr[i];\r
+               #endif  \r
+\r
+                       /* Translate DBM to percentage. */\r
+                       RSSI = odm_QueryRxPwrPercentage(rx_pwr[i]);\r
+                       total_rssi += RSSI;\r
+                       //RT_DISP(FRX, RX_PHY_SS, ("RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], RSSI));\r
+\r
+                       //Modification for ext-LNA board\r
+                       if(pDM_Odm->SupportICType&ODM_RTL8192C)\r
+                       {       \r
+                               if(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA))\r
+                               {\r
+                                       if((pPhyStaRpt->path_agc[i].trsw) == 1)\r
+                                               RSSI = (RSSI>94)?100:(RSSI +6);\r
+                                       else\r
+                                               RSSI = (RSSI<=16)?(RSSI>>3):(RSSI -16);\r
+\r
+                                       if((RSSI <= 34) && (RSSI >=4))\r
+                                               RSSI -= 4;\r
+                               }               \r
+                       }\r
+               \r
+                       pPhyInfo->RxMIMOSignalStrength[i] =(u1Byte) RSSI;\r
+\r
+               #if (DM_ODM_SUPPORT_TYPE &  (/*ODM_WIN|*/ODM_CE|ODM_AP|ODM_ADSL))\r
+                       //Get Rx snr value in DB                \r
+                       pPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = (s4Byte)(pPhyStaRpt->path_rxsnr[i]/2);\r
+               #endif\r
+               \r
+                       /* Record Signal Strength for next packet */\r
+                       //if(pPktinfo->bPacketMatchBSSID)\r
+                       {                               \r
+                               if((pDM_Odm->SupportPlatform == ODM_WIN) &&\r
+                                       (pDM_Odm->PatchID==RT_CID_819x_Lenovo))\r
+                               {\r
+                                       if(i==ODM_RF_PATH_A)\r
+                                               pPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,i,RSSI);\r
+                               \r
+                               }               \r
+                               else if((pDM_Odm->SupportPlatform == ODM_WIN) &&\r
+                                       (pDM_Odm->PatchID==RT_CID_819x_Acer))\r
+                               {\r
+                                       pPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Acer(pDM_Odm,isCCKrate,PWDB_ALL,0,RSSI);\r
+                               }       \r
+                               \r
+                       }\r
+               }\r
+               \r
+               \r
+               //\r
+               // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)\r
+               //\r
+               rx_pwr_all = (((pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all) >> 1 )& 0x7f) -110;             \r
+               \r
+               PWDB_ALL_BT = PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);  \r
+               //RT_DISP(FRX, RX_PHY_SS, ("PWDB_ALL=%d\n",PWDB_ALL));          \r
+       \r
+               pPhyInfo->RxPWDBAll = PWDB_ALL;\r
+               //ODM_RT_TRACE(pDM_Odm,ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, ("ODM OFDM RSSI=%d\n",pPhyInfo->RxPWDBAll));\r
+       #if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\r
+               pPhyInfo->BTRxRSSIPercentage = PWDB_ALL_BT;\r
+               pPhyInfo->RxPower = rx_pwr_all;\r
+               pPhyInfo->RecvSignalPower = rx_pwr_all;\r
+       #endif\r
+               \r
+               if((pDM_Odm->SupportPlatform == ODM_WIN) &&(pDM_Odm->PatchID==19)){\r
+                       //do nothing    \r
+               }else if((pDM_Odm->SupportPlatform == ODM_WIN) &&(pDM_Odm->PatchID==25)){\r
+                       //do nothing    \r
+               }\r
+               else{//pMgntInfo->CustomerID != RT_CID_819x_Lenovo\r
+                       //\r
+                       // (3)EVM of HT rate\r
+                       //\r
+                       if(pPktinfo->DataRate >=DESC_RATEMCS8 && pPktinfo->DataRate <=DESC_RATEMCS15)\r
+                               Max_spatial_stream = 2; //both spatial stream make sense\r
+                       else\r
+                               Max_spatial_stream = 1; //only spatial stream 1 makes sense\r
+\r
+                       for(i=0; i<Max_spatial_stream; i++)\r
+                       {\r
+                               // Do not use shift operation like "rx_evmX >>= 1" because the compilor of free build environment\r
+                               // fill most significant bit to "zero" when doing shifting operation which may change a negative \r
+                               // value to positive one, then the dbm value (which is supposed to be negative)  is not correct anymore.                        \r
+                               EVM = odm_EVMdbToPercentage( (pPhyStaRpt->stream_rxevm[i] ));   //dbm\r
+\r
+                               //RT_DISP(FRX, RX_PHY_SQ, ("RXRATE=%x RXEVM=%x EVM=%s%d\n", \r
+                               //GET_RX_STATUS_DESC_RX_MCS(pDesc), pDrvInfo->rxevm[i], "%", EVM));\r
+                               \r
+                               //if(pPktinfo->bPacketMatchBSSID)\r
+                               {\r
+                                       if(i==ODM_RF_PATH_A) // Fill value in RFD, Get the first spatial stream only\r
+                                       {                                               \r
+                                               pPhyInfo->SignalQuality = (u1Byte)(EVM & 0xff);\r
+                                       }                                       \r
+                                       pPhyInfo->RxMIMOSignalQuality[i] = (u1Byte)(EVM & 0xff);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               ODM_ParsingCFO(pDM_Odm, pPktinfo, pPhyStaRpt->path_cfotail);\r
+               \r
+       }\r
+#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\r
+       //UI BSS List signal strength(in percentage), make it good looking, from 0~100.\r
+       //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp().\r
+       if(isCCKrate)\r
+       {               \r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+               // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/   \r
+               pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, PWDB_ALL));//PWDB_ALL;\r
+#else\r
+#ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING\r
+               pPhyInfo->SignalStrength = (u1Byte)PWDB_ALL;\r
+#else\r
+               pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));//PWDB_ALL;\r
+#endif\r
+#endif\r
+       }\r
+       else\r
+       {       \r
+               if (rf_rx_num != 0)\r
+               {                       \r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+                       // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/   \r
+                       pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, total_rssi/=rf_rx_num));//PWDB_ALL;\r
+#else\r
+#ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING\r
+                       total_rssi/=rf_rx_num;\r
+                       pPhyInfo->SignalStrength = (u1Byte)total_rssi;\r
+#else\r
+                       pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, total_rssi/=rf_rx_num));\r
+#endif\r
+#endif\r
+               }\r
+       }\r
+#endif\r
+\r
+       //DbgPrint("isCCKrate = %d, pPhyInfo->RxPWDBAll = %d, pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a = 0x%x\n", \r
+               //isCCKrate, pPhyInfo->RxPWDBAll, pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a);\r
+\r
+       //For 92C/92D HW (Hybrid) Antenna Diversity\r
+#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))      \r
+       pDM_SWAT_Table->antsel = pPhyStaRpt->ant_sel;\r
+       //For 88E HW Antenna Diversity\r
+       pDM_Odm->DM_FatTable.antsel_rx_keep_0 = pPhyStaRpt->ant_sel;\r
+       pDM_Odm->DM_FatTable.antsel_rx_keep_1 = pPhyStaRpt->ant_sel_b;\r
+       pDM_Odm->DM_FatTable.antsel_rx_keep_2 = pPhyStaRpt->antsel_rx_keep_2;\r
+#endif\r
+}\r
+#endif\r
+\r
+\r
+#if    ODM_IC_11AC_SERIES_SUPPORT\r
+\r
+VOID\r
+odm_RxPhyStatusJaguarSeries_Parsing(\r
+       IN OUT  PDM_ODM_T                                       pDM_Odm,\r
+       OUT             PODM_PHY_INFO_T                 pPhyInfo,               \r
+       IN              pu1Byte                                         pPhyStatus,\r
+       IN              PODM_PACKET_INFO_T                      pPktinfo\r
+       )\r
+{                                                      \r
+       u1Byte                          i, Max_spatial_stream;\r
+       s1Byte                          rx_pwr[4], rx_pwr_all=0;\r
+       u1Byte                          EVM = 0, EVMdbm, PWDB_ALL = 0, PWDB_ALL_BT;\r
+       u1Byte                          RSSI, total_rssi=0;\r
+       u1Byte                          isCCKrate=0;    \r
+       u1Byte                          rf_rx_num = 0;\r
+       u1Byte                          cck_highpwr = 0;\r
+       u1Byte                          LNA_idx, VGA_idx;\r
+\r
+       \r
+       PPHY_STATUS_RPT_8812_T pPhyStaRpt = (PPHY_STATUS_RPT_8812_T)pPhyStatus; \r
+\r
+       if(pPktinfo->DataRate <= DESC_RATE54M)\r
+       {\r
+               switch(pPhyStaRpt->r_RFMOD){\r
+                       case 1:\r
+                               if(pPhyStaRpt->sub_chnl == 0)\r
+                                       pPhyInfo->BandWidth = 1;\r
+                               else\r
+                                       pPhyInfo->BandWidth = 0;\r
+                               break;\r
+\r
+                       case 2:\r
+                               if(pPhyStaRpt->sub_chnl == 0)\r
+                                       pPhyInfo->BandWidth = 2;\r
+                               else if(pPhyStaRpt->sub_chnl == 9 || pPhyStaRpt->sub_chnl == 10)\r
+                                       pPhyInfo->BandWidth = 1;\r
+                               else \r
+                                       pPhyInfo->BandWidth = 0;\r
+                               break;\r
+\r
+                       default:        case 0:\r
+                               pPhyInfo->BandWidth = 0;\r
+                               break;                  \r
+               }       \r
+       }\r
+\r
+       if(pPktinfo->DataRate <= DESC_RATE11M)\r
+               isCCKrate = TRUE;\r
+       else\r
+               isCCKrate = FALSE;\r
+       \r
+       pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = -1;\r
+       pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1;\r
+\r
+\r
+       if(isCCKrate)\r
+       {\r
+               u1Byte cck_agc_rpt;\r
+               pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK++;\r
+               // \r
+               // (1)Hardware does not provide RSSI for CCK\r
+               // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)\r
+               //\r
+\r
+               //if(pHalData->eRFPowerState == eRfOn)\r
+                       cck_highpwr = pDM_Odm->bCckHighPower;\r
+               //else\r
+               //      cck_highpwr = FALSE;\r
+\r
+               cck_agc_rpt =  pPhyStaRpt->cfosho[0] ;\r
+               LNA_idx = ((cck_agc_rpt & 0xE0) >>5);\r
+               VGA_idx = (cck_agc_rpt & 0x1F); \r
+               \r
+               if(pDM_Odm->SupportICType == ODM_RTL8812)\r
+               {\r
+                       switch(LNA_idx)\r
+                       {\r
+                               case 7:\r
+                                       if(VGA_idx <= 27)\r
+                                               rx_pwr_all = -100 + 2*(27-VGA_idx); //VGA_idx = 27~2\r
+                                       else\r
+                                               rx_pwr_all = -100;\r
+                                       break;\r
+                               case 6:\r
+                                               rx_pwr_all = -48 + 2*(2-VGA_idx); //VGA_idx = 2~0\r
+                                       break;\r
+                               case 5:\r
+                                               rx_pwr_all = -42 + 2*(7-VGA_idx); //VGA_idx = 7~5\r
+                                       break;\r
+                               case 4:\r
+                                               rx_pwr_all = -36 + 2*(7-VGA_idx); //VGA_idx = 7~4\r
+                                       break;\r
+                               case 3:\r
+                                               //rx_pwr_all = -28 + 2*(7-VGA_idx); //VGA_idx = 7~0\r
+                                               rx_pwr_all = -24 + 2*(7-VGA_idx); //VGA_idx = 7~0\r
+                                       break;\r
+                               case 2:\r
+                                       if(cck_highpwr)\r
+                                               rx_pwr_all = -12 + 2*(5-VGA_idx); //VGA_idx = 5~0\r
+                                       else\r
+                                               rx_pwr_all = -6+ 2*(5-VGA_idx);\r
+                                       break;\r
+                               case 1:\r
+                                               rx_pwr_all = 8-2*VGA_idx;\r
+                                       break;\r
+                               case 0:\r
+                                               rx_pwr_all = 14-2*VGA_idx;\r
+                                       break;\r
+                               default:\r
+                                       //DbgPrint("CCK Exception default\n");\r
+                                       break;\r
+                       }\r
+                       rx_pwr_all += 6;\r
+                       PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\r
+                       \r
+                       if(cck_highpwr == FALSE)\r
+                       {\r
+                               if(PWDB_ALL >= 80)\r
+                                       PWDB_ALL = ((PWDB_ALL-80)<<1)+((PWDB_ALL-80)>>1)+80;\r
+                               else if((PWDB_ALL <= 78) && (PWDB_ALL >= 20))\r
+                                       PWDB_ALL += 3;\r
+                               if(PWDB_ALL>100)\r
+                                       PWDB_ALL = 100;\r
+                       }\r
+               }\r
+               else if(pDM_Odm->SupportICType == ODM_RTL8821)\r
+               {\r
+                       s1Byte Pout = -6;\r
+                               \r
+                       switch(LNA_idx)\r
+                               {\r
+                               case 5:\r
+                                       rx_pwr_all = Pout -32 -(2*VGA_idx);\r
+                                               break;\r
+                               case 4:\r
+                                       rx_pwr_all = Pout -24 -(2*VGA_idx);\r
+                                               break;\r
+                               case 2:\r
+                                       rx_pwr_all = Pout -11 -(2*VGA_idx);\r
+                                               break;\r
+                               case 1:\r
+                                       rx_pwr_all = Pout + 5 -(2*VGA_idx);\r
+                                               break;\r
+                               case 0:\r
+                                       rx_pwr_all = Pout + 21 -(2*VGA_idx);\r
+                                               break;\r
+                               }\r
+                       PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\r
+               }\r
+       \r
+               pPhyInfo->RxPWDBAll = PWDB_ALL;\r
+               //if(pPktinfo->StationID == 0)\r
+               //{\r
+               //      DbgPrint("CCK: LNA_idx = %d, VGA_idx = %d, pPhyInfo->RxPWDBAll = %d\n", \r
+               //              LNA_idx, VGA_idx, pPhyInfo->RxPWDBAll);\r
+               //}\r
+#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\r
+               pPhyInfo->BTRxRSSIPercentage = PWDB_ALL;\r
+               pPhyInfo->RecvSignalPower = rx_pwr_all;\r
+#endif         \r
+               //\r
+               // (3) Get Signal Quality (EVM)\r
+               //\r
+               //if(pPktinfo->bPacketMatchBSSID)\r
+               {\r
+                       u1Byte  SQ,SQ_rpt;                      \r
+                       \r
+                       if((pDM_Odm->SupportPlatform == ODM_WIN) &&\r
+                               (pDM_Odm->PatchID==RT_CID_819x_Lenovo))\r
+                       {\r
+                               SQ = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,0,0);\r
+                       }\r
+                       else if(pPhyInfo->RxPWDBAll > 40 && !pDM_Odm->bInHctTest)\r
+                       {\r
+                               SQ = 100;\r
+                       }\r
+                       else\r
+                       {                                               \r
+                               SQ_rpt = pPhyStaRpt->pwdb_all;\r
+                                       \r
+                               if(SQ_rpt > 64)\r
+                                       SQ = 0;\r
+                               else if (SQ_rpt < 20)\r
+                                       SQ = 100;\r
+                               else\r
+                                       SQ = ((64-SQ_rpt) * 100) / 44;\r
+                       \r
+                       }\r
+                       \r
+                       //DbgPrint("cck SQ = %d\n", SQ);\r
+                       pPhyInfo->SignalQuality = SQ;\r
+                       pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = SQ;\r
+                       pPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1;\r
+               }\r
+       }\r
+       else //is OFDM rate\r
+       {\r
+               pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++;\r
+\r
+               // \r
+               // (1)Get RSSI for OFDM rate\r
+               //\r
+               \r
+               for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++)   \r
+               {\r
+                       // 2008/01/30 MH we will judge RF RX path now.\r
+                       //DbgPrint("pDM_Odm->RFPathRxEnable = %x\n", pDM_Odm->RFPathRxEnable);\r
+                       if (pDM_Odm->RFPathRxEnable & BIT(i))\r
+                       {                               \r
+                               rf_rx_num++;\r
+                       }\r
+                       //else\r
+                               //continue;\r
+                       //2012.05.25 LukeLee: Testchip AGC report is wrong, it should be restored back to old formula in MP chip\r
+                       //if((pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821)) && (!pDM_Odm->bIsMPChip))\r
+                               rx_pwr[i] = (pPhyStaRpt->gain_trsw[i]&0x7F) - 110;\r
+                       //else\r
+                       //      rx_pwr[i] = ((pPhyStaRpt->gain_trsw[i]& 0x3F)*2) - 110;  //OLD FORMULA\r
+\r
+               #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+                       pPhyInfo->RxPwr[i] = rx_pwr[i];\r
+               #endif  \r
+\r
+                       /* Translate DBM to percentage. */\r
+                       RSSI = odm_QueryRxPwrPercentage(rx_pwr[i]);     \r
+               \r
+                       total_rssi += RSSI;\r
+                       //RT_DISP(FRX, RX_PHY_SS, ("RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], RSSI));\r
+\r
+\r
+               \r
+                       pPhyInfo->RxMIMOSignalStrength[i] =(u1Byte) RSSI;\r
+\r
+               #if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE|ODM_AP|ODM_ADSL))\r
+                       //Get Rx snr value in DB                \r
+                       pPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = pPhyStaRpt->rxsnr[i]/2;\r
+               #endif\r
+\r
+                       //\r
+                       // (2) CFO_short  & CFO_tail\r
+                       //                      \r
+                       pPhyInfo->Cfo_short[i] = odm_Cfo( (pPhyStaRpt->cfosho[i]) );\r
+                       pPhyInfo->Cfo_tail[i] = odm_Cfo( (pPhyStaRpt->cfotail[i]) );\r
+\r
+                       /* Record Signal Strength for next packet */\r
+                       //if(pPktinfo->bPacketMatchBSSID)\r
+                       {                               \r
+                               if((pDM_Odm->SupportPlatform == ODM_WIN) &&\r
+                                       (pDM_Odm->PatchID==RT_CID_819x_Lenovo))\r
+                               {\r
+                                       if(i==ODM_RF_PATH_A)\r
+                                               pPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,i,RSSI);\r
+                               \r
+                               }\r
+                       }\r
+               }\r
+               \r
+               \r
+               //\r
+               // (3)PWDB, Average PWDB cacluated by hardware (for rate adaptive)\r
+               //\r
+               //2012.05.25 LukeLee: Testchip AGC report is wrong, it should be restored back to old formula in MP chip\r
+               if((pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821)) && (!pDM_Odm->bIsMPChip))\r
+                       rx_pwr_all = (pPhyStaRpt->pwdb_all& 0x7f) -110;\r
+               else\r
+                       rx_pwr_all = (((pPhyStaRpt->pwdb_all) >> 1 )& 0x7f) -110;        //OLD FORMULA\r
+\r
+               PWDB_ALL_BT = PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);  \r
+                       \r
+               pPhyInfo->RxPWDBAll = PWDB_ALL;\r
+               //ODM_RT_TRACE(pDM_Odm,ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, ("ODM OFDM RSSI=%d\n",pPhyInfo->RxPWDBAll));\r
+       #if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\r
+               pPhyInfo->BTRxRSSIPercentage = PWDB_ALL_BT;\r
+               pPhyInfo->RxPower = rx_pwr_all;\r
+               pPhyInfo->RecvSignalPower = rx_pwr_all;\r
+       #endif\r
+\r
+               //DbgPrint("OFDM: pPhyInfo->RxPWDBAll = %d, pPhyInfo->RxMIMOSignalStrength[0] = %d, pPhyInfo->RxMIMOSignalStrength[1] = %d\n",\r
+               //      pPhyInfo->RxPWDBAll, pPhyInfo->RxMIMOSignalStrength[0], pPhyInfo->RxMIMOSignalStrength[1]);\r
+       \r
+       \r
+               if((pDM_Odm->SupportPlatform == ODM_WIN) &&(pDM_Odm->PatchID==19))\r
+               {\r
+                       //do nothing    \r
+               }\r
+               else\r
+               {       //pMgntInfo->CustomerID != RT_CID_819x_Lenovo\r
+                       //\r
+                       // (4)EVM of OFDM rate\r
+                       //\r
+                       if(     (pPktinfo->DataRate>=DESC_RATEMCS8) &&\r
+                               (pPktinfo->DataRate <=DESC_RATEMCS15))\r
+                               Max_spatial_stream = 2;\r
+                       else if(        (pPktinfo->DataRate>=DESC_RATEVHTSS2MCS0) &&\r
+                               (pPktinfo->DataRate <=DESC_RATEVHTSS2MCS9))\r
+                               Max_spatial_stream = 2;\r
+                       else\r
+                               Max_spatial_stream = 1; \r
+\r
+                       //if(pPktinfo->bPacketMatchBSSID)\r
+                       {\r
+                               //DbgPrint("pPktinfo->DataRate = %d\n", pPktinfo->DataRate);\r
+\r
+                               for(i=0; i<Max_spatial_stream; i++)\r
+                               {\r
+                                       // Do not use shift operation like "rx_evmX >>= 1" because the compilor of free build environment\r
+                                       // fill most significant bit to "zero" when doing shifting operation which may change a negative \r
+                                       // value to positive one, then the dbm value (which is supposed to be negative)  is not correct anymore.                        \r
+                                       //\r
+                                       // 2013/09/02 MH According to 8812AU test, when use RX evm the value sometimes\r
+                                       // will be incorrect and 1SS-MCS-0-7 always incorrect. Only use LSIG the evm value\r
+                                       // seems ok. This seems BB bug, we need use another way to display better SQ.\r
+                                       //\r
+                                       //if (pPktinfo->DataRate>=DESC8812_RATE6M && pPktinfo->DataRate<=DESC8812_RATE54M)\r
+                                       {\r
+                                               \r
+                                               if(i==ODM_RF_PATH_A )\r
+                                               {\r
+                                                       EVM = odm_EVMdbToPercentage( (pPhyStaRpt->sigevm ));    //dbm\r
+                                                       EVM += 20;\r
+                                                       if (EVM > 100)\r
+                                                               EVM = 100;\r
+                                               }\r
+                                       }\r
+#if 0\r
+                                       else\r
+                                       {\r
+                                               if (pPhyStaRpt->rxevm[i] == -128)\r
+                                               {\r
+                                                       pPhyStaRpt->rxevm[i] = -25;\r
+                                               }\r
+                                               EVM = odm_EVMdbToPercentage( (pPhyStaRpt->rxevm[i] ));  //dbm\r
+                                       }\r
+#endif\r
+                                       EVMdbm = odm_EVMdbm_JaguarSeries(pPhyStaRpt->rxevm[i]);\r
+                                       //RT_DISP(FRX, RX_PHY_SQ, ("RXRATE=%x RXEVM=%x EVM=%s%d\n", \r
+                                       //pPktinfo->DataRate, pPhyStaRpt->rxevm[i], "%", EVM));\r
+                                       \r
+                                       {\r
+                                               if(i==ODM_RF_PATH_A) // Fill value in RFD, Get the first spatial stream only\r
+                                               {\r
+                                                       pPhyInfo->SignalQuality = EVM;\r
+                                               }                                       \r
+                                               pPhyInfo->RxMIMOSignalQuality[i] = EVM;\r
+                                               pPhyInfo->RxMIMOEVMdbm[i] = EVMdbm;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+               ODM_ParsingCFO(pDM_Odm, pPktinfo, pPhyStaRpt->cfotail);\r
+               \r
+       }\r
+       //DbgPrint("isCCKrate= %d, pPhyInfo->SignalStrength=%d % PWDB_AL=%d rf_rx_num=%d\n", isCCKrate, pPhyInfo->SignalStrength, PWDB_ALL, rf_rx_num);\r
+       \r
+#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\r
+       //UI BSS List signal strength(in percentage), make it good looking, from 0~100.\r
+       //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp().\r
+       if(isCCKrate)\r
+       {               \r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+               // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/   \r
+               pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, PWDB_ALL));//PWDB_ALL;\r
+#else\r
+               pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));//PWDB_ALL;\r
+#endif\r
+       }\r
+       else\r
+       {       \r
+               if (rf_rx_num != 0)\r
+               {                       \r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+                       // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/   \r
+                       pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, total_rssi/=rf_rx_num));//PWDB_ALL;\r
+#else\r
+                       pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, total_rssi/=rf_rx_num));\r
+#endif\r
+               }\r
+       }\r
+#endif\r
+       pDM_Odm->RxPWDBAve = pDM_Odm->RxPWDBAve + pPhyInfo->RxPWDBAll;\r
+       \r
+       pDM_Odm->DM_FatTable.antsel_rx_keep_0 = pPhyStaRpt->antidx_anta;\r
+       pDM_Odm->DM_FatTable.antsel_rx_keep_1 = pPhyStaRpt->antidx_antb;\r
+\r
+       //DbgPrint("pPhyStaRpt->antidx_anta = %d, pPhyStaRpt->antidx_antb = %d, pPhyStaRpt->resvd_1 = %d", \r
+       //      pPhyStaRpt->antidx_anta, pPhyStaRpt->antidx_antb, pPhyStaRpt->resvd_1);\r
+\r
+       //DbgPrint("----------------------------\n");\r
+       //DbgPrint("pPktinfo->StationID=%d, pPktinfo->DataRate=0x%x\n",pPktinfo->StationID, pPktinfo->DataRate);\r
+       //DbgPrint("pPhyStaRpt->gain_trsw[0]=0x%x, pPhyStaRpt->gain_trsw[1]=0x%x, pPhyStaRpt->pwdb_all=0x%x\n",\r
+       //                      pPhyStaRpt->gain_trsw[0],pPhyStaRpt->gain_trsw[1], pPhyStaRpt->pwdb_all);\r
+       //DbgPrint("pPhyInfo->RxMIMOSignalStrength[0]=%d, pPhyInfo->RxMIMOSignalStrength[1]=%d, RxPWDBAll=%d\n",\r
+       //                      pPhyInfo->RxMIMOSignalStrength[0], pPhyInfo->RxMIMOSignalStrength[1], pPhyInfo->RxPWDBAll);\r
+\r
+}\r
+\r
+#endif\r
+\r
+VOID\r
+odm_Init_RSSIForDM(\r
+       IN OUT  PDM_ODM_T       pDM_Odm\r
+       )\r
+{\r
+\r
+}\r
+\r
+VOID\r
+odm_Process_RSSIForDM( \r
+       IN OUT  PDM_ODM_T                                       pDM_Odm,\r
+       IN              PODM_PHY_INFO_T                         pPhyInfo,\r
+       IN              PODM_PACKET_INFO_T                      pPktinfo\r
+       )\r
+{\r
+       \r
+       s4Byte                  UndecoratedSmoothedPWDB, UndecoratedSmoothedCCK, UndecoratedSmoothedOFDM, RSSI_Ave;\r
+       u1Byte                  i, isCCKrate=0; \r
+       u1Byte                  RSSI_max, RSSI_min;\r
+       u4Byte                  OFDM_pkt=0; \r
+       u4Byte                  Weighting=0;\r
+       PSTA_INFO_T             pEntry;\r
+\r
+       if(pPktinfo->StationID == 0xFF)\r
+               return;\r
+\r
+#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       odm_S0S1_SwAntDivByCtrlFrame_ProcessRSSI(pDM_Odm, pPhyInfo, pPktinfo);\r
+#endif\r
+#endif\r
+\r
+       //\r
+       // 2012/05/30 MH/Luke.Lee Add some description \r
+       // In windows driver: AP/IBSS mode STA\r
+       //\r
+       //if (pDM_Odm->SupportPlatform == ODM_WIN)\r
+       //{\r
+       //      pEntry = pDM_Odm->pODM_StaInfo[pDM_Odm->pAidMap[pPktinfo->StationID-1]];                        \r
+       //}\r
+       //else\r
+               pEntry = pDM_Odm->pODM_StaInfo[pPktinfo->StationID];                                                    \r
+\r
+       if(!IS_STA_VALID(pEntry) )\r
+       {               \r
+               return;\r
+       }\r
+\r
+       if((!pPktinfo->bPacketMatchBSSID) )\r
+       {\r
+               return;\r
+       }\r
+\r
+       if(pPktinfo->bPacketBeacon)\r
+               pDM_Odm->PhyDbgInfo.NumQryBeaconPkt++;\r
+       \r
+       isCCKrate = (pPktinfo->DataRate <= DESC_RATE11M)?TRUE :FALSE;\r
+       pDM_Odm->RxRate = pPktinfo->DataRate;\r
+       /*\r
+       if(!isCCKrate)\r
+       {\r
+               DbgPrint("OFDM: pPktinfo->StationID=%d, isCCKrate=%d, pPhyInfo->RxPWDBAll=%d\n",\r
+                       pPktinfo->StationID, isCCKrate, pPhyInfo->RxPWDBAll);\r
+       }\r
+       */\r
+\r
+       //--------------Statistic for antenna/path diversity------------------\r
+       if(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)\r
+       {\r
+               #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))\r
+                       ODM_Process_RSSIForAntDiv(pDM_Odm,pPhyInfo,pPktinfo);\r
+               #endif\r
+       }\r
+       else if(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV)\r
+       {\r
+               #if (RTL8812A_SUPPORT == 1)\r
+               if(pDM_Odm->SupportICType == ODM_RTL8812)\r
+               {\r
+                       pPATHDIV_T      pDM_PathDiv = &pDM_Odm->DM_PathDiv;\r
+                       if(pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID)\r
+                       {\r
+                               if(pPktinfo->DataRate > DESC_RATE11M)\r
+                                       ODM_PathStatistics_8812A(pDM_Odm, pPktinfo->StationID, pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A], \r
+                                                                                                                                             pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]);\r
+                       }\r
+               }\r
+               #endif\r
+       }\r
+\r
+       //-----------------Smart Antenna Debug Message------------------//\r
+       \r
+       UndecoratedSmoothedCCK =  pEntry->rssi_stat.UndecoratedSmoothedCCK;\r
+       UndecoratedSmoothedOFDM = pEntry->rssi_stat.UndecoratedSmoothedOFDM;\r
+       UndecoratedSmoothedPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;    \r
+       \r
+       if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon)\r
+       {\r
+\r
+               if(!isCCKrate)//ofdm rate\r
+               {\r
+                       if(pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B] == 0)\r
+                        {\r
+                               RSSI_Ave = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A];\r
+                               pDM_Odm->RSSI_A = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A];\r
+                               pDM_Odm->RSSI_B = 0;\r
+                       }\r
+                       else\r
+                       {\r
+                               //DbgPrint("pRfd->Status.RxMIMOSignalStrength[0] = %d, pRfd->Status.RxMIMOSignalStrength[1] = %d \n", \r
+                                       //pRfd->Status.RxMIMOSignalStrength[0], pRfd->Status.RxMIMOSignalStrength[1]);\r
+                               pDM_Odm->RSSI_A =  pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A];\r
+                               pDM_Odm->RSSI_B = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B];\r
+                       \r
+                               if(pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A] > pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B])\r
+                               {\r
+                                       RSSI_max = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A];\r
+                                       RSSI_min = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B];\r
+                               }\r
+                               else\r
+                               {\r
+                                       RSSI_max = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B];\r
+                                       RSSI_min = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A];\r
+                               }\r
+                               if((RSSI_max -RSSI_min) < 3)\r
+                                       RSSI_Ave = RSSI_max;\r
+                               else if((RSSI_max -RSSI_min) < 6)\r
+                                       RSSI_Ave = RSSI_max - 1;\r
+                               else if((RSSI_max -RSSI_min) < 10)\r
+                                       RSSI_Ave = RSSI_max - 2;\r
+                               else\r
+                                       RSSI_Ave = RSSI_max - 3;\r
+                       }\r
+                                       \r
+                       //1 Process OFDM RSSI\r
+                       if(UndecoratedSmoothedOFDM <= 0)        // initialize\r
+                       {\r
+                               UndecoratedSmoothedOFDM = pPhyInfo->RxPWDBAll;\r
+                       }\r
+                       else\r
+                       {\r
+                               if(pPhyInfo->RxPWDBAll > (u4Byte)UndecoratedSmoothedOFDM)\r
+                               {\r
+                                       UndecoratedSmoothedOFDM =       \r
+                                                       ( ((UndecoratedSmoothedOFDM)*(Rx_Smooth_Factor-1)) + \r
+                                                       (RSSI_Ave)) /(Rx_Smooth_Factor);\r
+                                       UndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM + 1;\r
+                               }\r
+                               else\r
+                               {\r
+                                       UndecoratedSmoothedOFDM =       \r
+                                                       ( ((UndecoratedSmoothedOFDM)*(Rx_Smooth_Factor-1)) + \r
+                                                       (RSSI_Ave)) /(Rx_Smooth_Factor);\r
+                               }\r
+                       }                               \r
+                       \r
+                       pEntry->rssi_stat.PacketMap = (pEntry->rssi_stat.PacketMap<<1) | BIT0;                  \r
+                                                                               \r
+               }\r
+               else\r
+               {\r
+                       RSSI_Ave = pPhyInfo->RxPWDBAll;\r
+                       pDM_Odm->RSSI_A = (u1Byte) pPhyInfo->RxPWDBAll;\r
+                       pDM_Odm->RSSI_B = 0;\r
+\r
+                       //1 Process CCK RSSI\r
+                       if(UndecoratedSmoothedCCK <= 0) // initialize\r
+                       {\r
+                               UndecoratedSmoothedCCK = pPhyInfo->RxPWDBAll;\r
+                       }\r
+                       else\r
+                       {\r
+                               if(pPhyInfo->RxPWDBAll > (u4Byte)UndecoratedSmoothedCCK)\r
+                               {\r
+                                       UndecoratedSmoothedCCK =        \r
+                                                       ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + \r
+                                                       (pPhyInfo->RxPWDBAll)) /(Rx_Smooth_Factor);\r
+                                       UndecoratedSmoothedCCK = UndecoratedSmoothedCCK + 1;\r
+                               }\r
+                               else\r
+                               {\r
+                                       UndecoratedSmoothedCCK =        \r
+                                                       ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + \r
+                                                       (pPhyInfo->RxPWDBAll)) /(Rx_Smooth_Factor);\r
+                               }\r
+                       }\r
+                       pEntry->rssi_stat.PacketMap = pEntry->rssi_stat.PacketMap<<1;                   \r
+               }\r
+\r
+               //if(pEntry)\r
+               {\r
+                       //2011.07.28 LukeLee: modified to prevent unstable CCK RSSI\r
+                       if(pEntry->rssi_stat.ValidBit >= 64)\r
+                               pEntry->rssi_stat.ValidBit = 64;\r
+                       else\r
+                               pEntry->rssi_stat.ValidBit++;\r
+                       \r
+                       for(i=0; i<pEntry->rssi_stat.ValidBit; i++)\r
+                               OFDM_pkt += (u1Byte)(pEntry->rssi_stat.PacketMap>>i)&BIT0;\r
+                       \r
+                       if(pEntry->rssi_stat.ValidBit == 64)\r
+                       {\r
+                               Weighting = ((OFDM_pkt<<4) > 64)?64:(OFDM_pkt<<4);\r
+                               UndecoratedSmoothedPWDB = (Weighting*UndecoratedSmoothedOFDM+(64-Weighting)*UndecoratedSmoothedCCK)>>6;\r
+                       }\r
+                       else\r
+                       {\r
+                               if(pEntry->rssi_stat.ValidBit != 0)\r
+                                       UndecoratedSmoothedPWDB = (OFDM_pkt*UndecoratedSmoothedOFDM+(pEntry->rssi_stat.ValidBit-OFDM_pkt)*UndecoratedSmoothedCCK)/pEntry->rssi_stat.ValidBit;\r
+                               else\r
+                                       UndecoratedSmoothedPWDB = 0;\r
+                       }\r
+\r
+                       pEntry->rssi_stat.UndecoratedSmoothedCCK = UndecoratedSmoothedCCK;\r
+                       pEntry->rssi_stat.UndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM;\r
+                       pEntry->rssi_stat.UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB;\r
+\r
+                       //DbgPrint("OFDM_pkt=%d, Weighting=%d\n", OFDM_pkt, Weighting);\r
+                       //DbgPrint("UndecoratedSmoothedOFDM=%d, UndecoratedSmoothedPWDB=%d, UndecoratedSmoothedCCK=%d\n", \r
+                       //      UndecoratedSmoothedOFDM, UndecoratedSmoothedPWDB, UndecoratedSmoothedCCK);\r
+                       \r
+               }\r
+       \r
+       }\r
+}\r
+\r
+\r
+#if(ODM_IC_11N_SERIES_SUPPORT ==1)\r
+//\r
+// Endianness before calling this API\r
+//\r
+VOID\r
+ODM_PhyStatusQuery_92CSeries(\r
+       IN OUT  PDM_ODM_T                                       pDM_Odm,\r
+       OUT             PODM_PHY_INFO_T                         pPhyInfo,\r
+       IN              pu1Byte                                         pPhyStatus,     \r
+       IN              PODM_PACKET_INFO_T                      pPktinfo\r
+       )\r
+{\r
+\r
+       odm_RxPhyStatus92CSeries_Parsing(\r
+                                                       pDM_Odm,\r
+                                                       pPhyInfo,\r
+                                                       pPhyStatus,\r
+                                                       pPktinfo);\r
+\r
+       if( pDM_Odm->RSSI_test == TRUE)\r
+       {\r
+               // Select the packets to do RSSI checking for antenna switching.\r
+               if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon )\r
+               {\r
+                               /*\r
+                       #if 0//(DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+                       dm_SWAW_RSSI_Check(\r
+                               Adapter, \r
+                               (tmppAdapter!=NULL)?(tmppAdapter==Adapter):TRUE,\r
+                               bPacketMatchBSSID,\r
+                               pEntry,\r
+                               pRfd);\r
+                       #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+                       // Select the packets to do RSSI checking for antenna switching.\r
+                       //odm_SwAntDivRSSICheck8192C(padapter, precvframe->u.hdr.attrib.RxPWDBAll);\r
+                       #endif\r
+                               */\r
+#if (RTL8192C_SUPPORT == 1)\r
+                               ODM_SwAntDivChkPerPktRssi(pDM_Odm,pPktinfo->StationID,pPhyInfo);\r
+#endif\r
+               }       \r
+       }\r
+       else\r
+       {\r
+               odm_Process_RSSIForDM(pDM_Odm,pPhyInfo,pPktinfo);\r
+       }\r
+\r
+}\r
+#endif\r
+\r
+#if(ODM_IC_11AC_SERIES_SUPPORT == 1)\r
+//\r
+// Endianness before calling this API\r
+//\r
+VOID\r
+ODM_PhyStatusQuery_JaguarSeries(\r
+       IN OUT  PDM_ODM_T                                       pDM_Odm,\r
+       OUT             PODM_PHY_INFO_T                 pPhyInfo,\r
+       IN              pu1Byte                                         pPhyStatus,     \r
+       IN              PODM_PACKET_INFO_T                      pPktinfo\r
+       )\r
+{\r
+\r
+       odm_RxPhyStatusJaguarSeries_Parsing(\r
+                                                       pDM_Odm,\r
+                                                       pPhyInfo,\r
+                                                       pPhyStatus,\r
+                                                       pPktinfo);\r
+       \r
+       odm_Process_RSSIForDM(pDM_Odm,pPhyInfo,pPktinfo);\r
+\r
+}\r
+#endif\r
+\r
+\r
+VOID\r
+ODM_PhyStatusQuery(\r
+       IN OUT  PDM_ODM_T                                       pDM_Odm,\r
+       OUT             PODM_PHY_INFO_T                         pPhyInfo,\r
+       IN              pu1Byte                                         pPhyStatus,     \r
+       IN              PODM_PACKET_INFO_T                      pPktinfo\r
+       )\r
+{\r
+#if(ODM_IC_11AC_SERIES_SUPPORT == 1)\r
+       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES )\r
+               ODM_PhyStatusQuery_JaguarSeries(pDM_Odm,pPhyInfo,pPhyStatus,pPktinfo);\r
+#endif\r
+\r
+#if(ODM_IC_11N_SERIES_SUPPORT ==1)\r
+       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES )\r
+               ODM_PhyStatusQuery_92CSeries(pDM_Odm,pPhyInfo,pPhyStatus,pPktinfo);\r
+#endif\r
+}\r
+       \r
+// For future use.\r
+VOID\r
+ODM_MacStatusQuery(\r
+       IN OUT  PDM_ODM_T                                       pDM_Odm,\r
+       IN              pu1Byte                                         pMacStatus,\r
+       IN              u1Byte                                          MacID,  \r
+       IN              BOOLEAN                                         bPacketMatchBSSID,\r
+       IN              BOOLEAN                                         bPacketToSelf,\r
+       IN              BOOLEAN                                         bPacketBeacon\r
+       )\r
+{\r
+       // 2011/10/19 Driver team will handle in the future.\r
+       \r
+}\r
+\r
+\r
+//\r
+// If you want to add a new IC, Please follow below template and generate a new one.\r
+// \r
+//\r
+\r
+HAL_STATUS\r
+ODM_ConfigRFWithHeaderFile(\r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      ODM_RF_Config_Type              ConfigType,\r
+       IN      ODM_RF_RADIO_PATH_E     eRFPath\r
+    )\r
+{\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+\r
+   ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, \r
+                               ("===>ODM_ConfigRFWithHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip"));\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, \r
+                               ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n",\r
+                               pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType));\r
+\r
+#if (RTL8723A_SUPPORT == 1)\r
+       if (pDM_Odm->SupportICType == ODM_RTL8723A)\r
+       {\r
+               if(ConfigType == CONFIG_RF_RADIO) {\r
+                       if(eRFPath == ODM_RF_PATH_A)\r
+                               READ_AND_CONFIG_MP(8723A,_RadioA);\r
+               }\r
+       }\r
+#endif\r
+\r
+#if (RTL8188E_SUPPORT == 1)\r
+       if (pDM_Odm->SupportICType == ODM_RTL8188E)\r
+       {\r
+               if(ConfigType == CONFIG_RF_RADIO) {\r
+                       if(eRFPath == ODM_RF_PATH_A)\r
+                                       READ_AND_CONFIG_MP(8188E,_RadioA);\r
+               }\r
+               else if(ConfigType == CONFIG_RF_TXPWR_LMT) {\r
+                       READ_AND_CONFIG_MP(8188E,_TXPWR_LMT);\r
+               }\r
+       }\r
+#endif\r
+\r
+#if (RTL8812A_SUPPORT == 1)\r
+       if (pDM_Odm->SupportICType == ODM_RTL8812)\r
+       {\r
+               if(ConfigType == CONFIG_RF_RADIO) {\r
+                       if(eRFPath == ODM_RF_PATH_A)\r
+                       {\r
+                               READ_AND_CONFIG_MP(8812A,_RadioA);\r
+                       }\r
+                       else if(eRFPath == ODM_RF_PATH_B)\r
+                       {\r
+                               READ_AND_CONFIG_MP(8812A,_RadioB);\r
+                       }\r
+               }\r
+               else if(ConfigType == CONFIG_RF_TXPWR_LMT) {\r
+                       READ_AND_CONFIG_MP(8812A,_TXPWR_LMT);\r
+               }\r
+       }\r
+#endif\r
+\r
+#if (RTL8821A_SUPPORT == 1)\r
+       if (pDM_Odm->SupportICType == ODM_RTL8821)\r
+       {\r
+               if(ConfigType == CONFIG_RF_RADIO) {\r
+                       if(eRFPath == ODM_RF_PATH_A)\r
+                       {\r
+                               READ_AND_CONFIG_MP(8821A,_RadioA);\r
+                       }\r
+               }\r
+               else if(ConfigType == CONFIG_RF_TXPWR_LMT) {\r
+                       \r
+                       if (pDM_Odm->SupportInterface == ODM_ITRF_USB) {\r
+                               if (pDM_Odm->ExtPA5G || pDM_Odm->ExtLNA5G)\r
+                                       READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8811AU_FEM);\r
+                               else\r
+                                       READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8811AU_IPA);                                \r
+                       } else {\r
+                               READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8821A);                     \r
+                       }\r
+               }\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("<===8821_ODM_ConfigRFWithHeaderFile\n"));\r
+       }\r
+#endif\r
+\r
+#if (RTL8723B_SUPPORT == 1)\r
+       if (pDM_Odm->SupportICType == ODM_RTL8723B)\r
+       {\r
+               if(ConfigType == CONFIG_RF_RADIO) {\r
+                       READ_AND_CONFIG_MP(8723B,_RadioA);\r
+               }\r
+               else if(ConfigType == CONFIG_RF_TXPWR_LMT) {\r
+                       READ_AND_CONFIG_MP(8723B,_TXPWR_LMT);\r
+               }\r
+       }\r
+#endif\r
+\r
+#if (RTL8192E_SUPPORT == 1)\r
+       if (pDM_Odm->SupportICType == ODM_RTL8192E)\r
+       {\r
+               if(ConfigType == CONFIG_RF_RADIO) {\r
+                       if(eRFPath == ODM_RF_PATH_A)\r
+                               READ_AND_CONFIG_MP(8192E,_RadioA);\r
+                       else if(eRFPath == ODM_RF_PATH_B)\r
+                               READ_AND_CONFIG_MP(8192E,_RadioB);\r
+               }\r
+               else if(ConfigType == CONFIG_RF_TXPWR_LMT) {\r
+                       READ_AND_CONFIG_MP(8192E,_TXPWR_LMT);\r
+               }\r
+       }\r
+#endif\r
+\r
+#if (RTL8814A_SUPPORT == 1)\r
+       if (pDM_Odm->SupportICType == ODM_RTL8814A)\r
+       {\r
+               /*\r
+               if(ConfigType == CONFIG_RF_TXPWR_LMT) {\r
+                       READ_AND_CONFIG(8813A,_TXPWR_LMT);\r
+               }\r
+               */              \r
+       }\r
+#endif\r
+       \r
+       return HAL_STATUS_SUCCESS;\r
+}\r
+\r
+HAL_STATUS\r
+ODM_ConfigRFWithTxPwrTrackHeaderFile(\r
+       IN      PDM_ODM_T                       pDM_Odm\r
+    )\r
+{\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, \r
+                                ("===>ODM_ConfigRFWithTxPwrTrackHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip"));\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, \r
+                                ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n",\r
+                                pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType));\r
+       if(0)\r
+       {\r
+       }\r
+#if (RTL8821A_SUPPORT == 1) \r
+       else if(pDM_Odm->SupportICType == ODM_RTL8821)\r
+       {\r
+               if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)\r
+                       READ_AND_CONFIG_MP(8821A,_TxPowerTrack_PCIE);\r
+               else if (pDM_Odm->SupportInterface == ODM_ITRF_USB)\r
+                       READ_AND_CONFIG_MP(8821A,_TxPowerTrack_USB);\r
+               else\r
+                       READ_AND_CONFIG_MP(8821A,_TxPowerTrack_PCIE);\r
+       }\r
+#endif\r
+#if (RTL8812A_SUPPORT == 1)\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8812)\r
+       {\r
+               if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)\r
+                       READ_AND_CONFIG_MP(8812A,_TxPowerTrack_PCIE);\r
+               else if (pDM_Odm->SupportInterface == ODM_ITRF_USB) {\r
+                       if (pDM_Odm->RFEType == 3 && pDM_Odm->bIsMPChip) \r
+                               READ_AND_CONFIG_MP(8812A,_TxPowerTrack_RFE3);   \r
+                       else\r
+                               READ_AND_CONFIG_MP(8812A,_TxPowerTrack_USB);    \r
+               }\r
+               \r
+       }\r
+#endif\r
+#if (RTL8192E_SUPPORT == 1) \r
+       else if(pDM_Odm->SupportICType == ODM_RTL8192E)\r
+       {\r
+               if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)\r
+                       READ_AND_CONFIG_MP(8192E,_TxPowerTrack_PCIE);\r
+               else if (pDM_Odm->SupportInterface == ODM_ITRF_USB)\r
+                       READ_AND_CONFIG_MP(8192E,_TxPowerTrack_USB); \r
+       }\r
+#endif\r
+#if RTL8723B_SUPPORT   \r
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+       {\r
+               if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)\r
+                       READ_AND_CONFIG_MP(8723B,_TxPowerTrack_PCIE);\r
+               else if (pDM_Odm->SupportInterface == ODM_ITRF_USB)\r
+                       READ_AND_CONFIG_MP(8723B,_TxPowerTrack_USB);\r
+               else if (pDM_Odm->SupportInterface == ODM_ITRF_SDIO)\r
+                       READ_AND_CONFIG_MP(8723B,_TxPowerTrack_SDIO);                   \r
+       }\r
+#endif \r
+#if RTL8188E_SUPPORT   \r
+       else if(pDM_Odm->SupportICType == ODM_RTL8188E)\r
+       {\r
+               if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)\r
+                       READ_AND_CONFIG_MP(8188E,_TxPowerTrack_PCIE);\r
+               else if (pDM_Odm->SupportInterface == ODM_ITRF_USB)\r
+                       READ_AND_CONFIG_MP(8188E,_TxPowerTrack_USB);\r
+               else\r
+                       READ_AND_CONFIG_MP(8188E,_TxPowerTrack_PCIE);\r
+       }\r
+#endif\r
+\r
+       return HAL_STATUS_SUCCESS;\r
+}\r
+\r
+HAL_STATUS\r
+ODM_ConfigBBWithHeaderFile(\r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      ODM_BB_Config_Type              ConfigType\r
+       )\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+#if (DM_ODM_SUPPORT_TYPE &  ODM_WIN)\r
+       PMGNT_INFO              pMgntInfo = &(Adapter->MgntInfo);       \r
+#endif\r
+#endif\r
+       \r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, \r
+                               ("===>ODM_ConfigBBWithHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip"));\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, \r
+                               ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n",\r
+                               pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType));\r
+\r
+#if (RTL8723A_SUPPORT == 1) \r
+    if(pDM_Odm->SupportICType == ODM_RTL8723A)\r
+       {\r
+               if(ConfigType == CONFIG_BB_PHY_REG)\r
+               {\r
+                       READ_AND_CONFIG_MP(8723A,_PHY_REG);\r
+               }\r
+               else if(ConfigType == CONFIG_BB_AGC_TAB)\r
+               {\r
+                       READ_AND_CONFIG_MP(8723A,_AGC_TAB);\r
+               }\r
+       }               \r
+#endif\r
+\r
+#if (RTL8188E_SUPPORT == 1)\r
+    if(pDM_Odm->SupportICType == ODM_RTL8188E)\r
+       {\r
+               if(ConfigType == CONFIG_BB_PHY_REG)\r
+               {\r
+                               READ_AND_CONFIG_MP(8188E,_PHY_REG);\r
+               }\r
+               else if(ConfigType == CONFIG_BB_AGC_TAB)\r
+               {\r
+                               READ_AND_CONFIG_MP(8188E,_AGC_TAB);\r
+               }\r
+               else if(ConfigType == CONFIG_BB_PHY_REG_PG)\r
+               {\r
+                       READ_AND_CONFIG_MP(8188E,_PHY_REG_PG);\r
+               }\r
+       }\r
+#endif\r
+\r
+#if (RTL8812A_SUPPORT == 1) \r
+       if(pDM_Odm->SupportICType == ODM_RTL8812)\r
+       {\r
+               if(ConfigType == CONFIG_BB_PHY_REG)\r
+               {\r
+                       READ_AND_CONFIG_MP(8812A,_PHY_REG);\r
+               }\r
+               else if(ConfigType == CONFIG_BB_AGC_TAB)\r
+               {\r
+                       READ_AND_CONFIG_MP(8812A,_AGC_TAB);\r
+               }\r
+               else if(ConfigType == CONFIG_BB_PHY_REG_PG)\r
+               {\r
+                       if (pDM_Odm->RFEType == 3 && pDM_Odm->bIsMPChip) \r
+                               READ_AND_CONFIG_MP(8812A,_PHY_REG_PG_ASUS);\r
+#if (DM_ODM_SUPPORT_TYPE &  ODM_WIN)\r
+                       else if (pMgntInfo->CustomerID == RT_CID_WNC_NEC && pDM_Odm->bIsMPChip) \r
+                               READ_AND_CONFIG_MP(8812A,_PHY_REG_PG_NEC);\r
+#endif                 \r
+                       else\r
+                               READ_AND_CONFIG_MP(8812A,_PHY_REG_PG);\r
+               }\r
+               else if(ConfigType == CONFIG_BB_PHY_REG_MP)\r
+               {\r
+                       READ_AND_CONFIG_MP(8812A,_PHY_REG_MP);\r
+               }\r
+               else if(ConfigType == CONFIG_BB_AGC_TAB_DIFF)\r
+               {\r
+                       if ((36 <= *pDM_Odm->pChannel)  && (*pDM_Odm->pChannel  <= 64)) \r
+                               AGC_DIFF_CONFIG_MP(8812A,LB);\r
+                       else if (100 <= *pDM_Odm->pChannel) \r
+                               AGC_DIFF_CONFIG_MP(8812A,HB);\r
+               }\r
+       }               \r
+#endif\r
+\r
+#if (RTL8821A_SUPPORT == 1) \r
+       if(pDM_Odm->SupportICType == ODM_RTL8821)\r
+       {\r
+               if(ConfigType == CONFIG_BB_PHY_REG)\r
+               {\r
+                       READ_AND_CONFIG_MP(8821A,_PHY_REG);\r
+               }\r
+               else if(ConfigType == CONFIG_BB_AGC_TAB)\r
+               {\r
+                       READ_AND_CONFIG_MP(8821A,_AGC_TAB);\r
+               }\r
+               else if(ConfigType == CONFIG_BB_PHY_REG_PG)\r
+               {\r
+                       READ_AND_CONFIG_MP(8821A,_PHY_REG_PG);\r
+               }\r
+       }\r
+#endif\r
+#if (RTL8723B_SUPPORT == 1)\r
+    if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+       {\r
+\r
+               if(ConfigType == CONFIG_BB_PHY_REG)\r
+               {\r
+                       READ_AND_CONFIG_MP(8723B,_PHY_REG);\r
+               }\r
+               else if(ConfigType == CONFIG_BB_AGC_TAB)\r
+               {\r
+                       READ_AND_CONFIG_MP(8723B,_AGC_TAB);\r
+               }\r
+               else if(ConfigType == CONFIG_BB_PHY_REG_PG)\r
+               {\r
+                       READ_AND_CONFIG_MP(8723B,_PHY_REG_PG);\r
+               }\r
+       }\r
+#endif\r
+#if (RTL8192E_SUPPORT == 1)\r
+    if(pDM_Odm->SupportICType == ODM_RTL8192E)\r
+       {\r
+\r
+               if(ConfigType == CONFIG_BB_PHY_REG)\r
+               {\r
+                       READ_AND_CONFIG_MP(8192E,_PHY_REG);\r
+               }\r
+               else if(ConfigType == CONFIG_BB_AGC_TAB)\r
+               {\r
+                       READ_AND_CONFIG_MP(8192E,_AGC_TAB);\r
+               }\r
+               else if(ConfigType == CONFIG_BB_PHY_REG_PG)\r
+               {\r
+                       READ_AND_CONFIG_MP(8192E,_PHY_REG_PG);\r
+               }\r
+       }\r
+#endif\r
+#if (RTL8814A_SUPPORT == 1)\r
+    if(pDM_Odm->SupportICType == ODM_RTL8814A)\r
+       {\r
+\r
+               if(ConfigType == CONFIG_BB_PHY_REG)\r
+               {\r
+                       READ_AND_CONFIG(8813A,_PHY_REG);\r
+               }\r
+               else if(ConfigType == CONFIG_BB_AGC_TAB)\r
+               {\r
+                       READ_AND_CONFIG(8813A,_AGC_TAB);\r
+               }\r
+               else if(ConfigType == CONFIG_BB_PHY_REG_PG)\r
+               {\r
+                       //READ_AND_CONFIG(8813A,_PHY_REG_PG);\r
+               }\r
+       }\r
+#endif\r
+       return HAL_STATUS_SUCCESS; \r
+}                 \r
+\r
+HAL_STATUS\r
+ODM_ConfigMACWithHeaderFile(\r
+       IN      PDM_ODM_T       pDM_Odm\r
+       )\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE &  (ODM_CE|ODM_WIN))  \r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+#endif\r
+       u1Byte result = HAL_STATUS_SUCCESS;\r
+\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, \r
+                               ("===>ODM_ConfigMACWithHeaderFile (%s)\n", (pDM_Odm->bIsMPChip) ? "MPChip" : "TestChip"));\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, \r
+                               ("pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\n",\r
+                               pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType));\r
+       \r
+#if (RTL8723A_SUPPORT == 1)\r
+       if (pDM_Odm->SupportICType == ODM_RTL8723A)\r
+       {\r
+               READ_AND_CONFIG_MP(8723A,_MAC_REG);\r
+       }\r
+#endif\r
+#if (RTL8188E_SUPPORT == 1)  \r
+       if (pDM_Odm->SupportICType == ODM_RTL8188E)\r
+       {\r
+               READ_AND_CONFIG_MP(8188E,_MAC_REG);\r
+       }\r
+#endif\r
+#if (RTL8812A_SUPPORT == 1)\r
+       if (pDM_Odm->SupportICType == ODM_RTL8812)\r
+       {\r
+               READ_AND_CONFIG_MP(8812A,_MAC_REG);\r
+       }\r
+#endif\r
+#if (RTL8821A_SUPPORT == 1)\r
+       if (pDM_Odm->SupportICType == ODM_RTL8821)\r
+       {\r
+               READ_AND_CONFIG_MP(8821A,_MAC_REG);\r
+\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("<===8821_ODM_ConfigMACwithHeaderFile\n"));\r
+       }\r
+#endif\r
+#if (RTL8723B_SUPPORT == 1)  \r
+       if (pDM_Odm->SupportICType == ODM_RTL8723B)\r
+       {\r
+               READ_AND_CONFIG_MP(8723B,_MAC_REG);\r
+       }\r
+#endif\r
+#if (RTL8192E_SUPPORT == 1)  \r
+       if (pDM_Odm->SupportICType == ODM_RTL8192E)\r
+       {\r
+               READ_AND_CONFIG_MP(8192E,_MAC_REG);\r
+       }\r
+#endif\r
+\r
+       return result;\r
+} \r
+\r
+HAL_STATUS\r
+ODM_ConfigFWWithHeaderFile(\r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      ODM_FW_Config_Type      ConfigType,\r
+       OUT u1Byte                              *pFirmware,\r
+       OUT u4Byte                              *pSize\r
+       )\r
+{\r
+\r
+#if (RTL8188E_SUPPORT == 1)  \r
+       if (pDM_Odm->SupportICType == ODM_RTL8188E)\r
+       {\r
+       #ifdef CONFIG_SFW_SUPPORTED\r
+               if (ConfigType == CONFIG_FW_NIC)\r
+               {\r
+                       READ_FIRMWARE_MP(8188E,_FW_NIC_T);\r
+               }\r
+               else if (ConfigType == CONFIG_FW_WoWLAN)\r
+               {\r
+                       READ_FIRMWARE_MP(8188E,_FW_WoWLAN_T);\r
+               }\r
+               else if(ConfigType == CONFIG_FW_NIC_2)\r
+               {\r
+                       READ_FIRMWARE_MP(8188E,_FW_NIC_S);\r
+               }\r
+               else if (ConfigType == CONFIG_FW_WoWLAN_2)\r
+               {\r
+                       READ_FIRMWARE_MP(8188E,_FW_WoWLAN_S);\r
+               }\r
+       #else\r
+               if (ConfigType == CONFIG_FW_NIC)\r
+               {\r
+                       READ_FIRMWARE_MP(8188E,_FW_NIC);\r
+               }\r
+               else if (ConfigType == CONFIG_FW_WoWLAN)\r
+               {\r
+                       READ_FIRMWARE_MP(8188E,_FW_WoWLAN);\r
+               }\r
+       #endif\r
+       }\r
+#endif\r
+#if (RTL8723B_SUPPORT == 1)  \r
+       if (pDM_Odm->SupportICType == ODM_RTL8723B)\r
+       {\r
+               if (ConfigType == CONFIG_FW_NIC)\r
+               {\r
+                       READ_FIRMWARE_MP(8723B,_FW_NIC);\r
+               }\r
+               else if (ConfigType == CONFIG_FW_WoWLAN)\r
+               {\r
+                       READ_FIRMWARE_MP(8723B,_FW_WoWLAN);\r
+               }\r
+#ifdef CONFIG_AP_WOWLAN\r
+               else if (ConfigType == CONFIG_FW_AP_WoWLAN)\r
+               {\r
+                       READ_FIRMWARE(8723B,_FW_AP_WoWLAN);\r
+               }\r
+#endif\r
+               else if (ConfigType == CONFIG_FW_BT)\r
+               {\r
+                       READ_FIRMWARE_MP(8723B,_FW_BT);\r
+               }\r
+               else if (ConfigType == CONFIG_FW_MP)\r
+               {\r
+                       READ_FIRMWARE_MP(8723B,_FW_MP);\r
+               }\r
+       }\r
+#endif\r
+#if (RTL8812A_SUPPORT == 1)\r
+       if (pDM_Odm->SupportICType == ODM_RTL8812)\r
+       {\r
+               if (ConfigType == CONFIG_FW_NIC)\r
+               {\r
+                       READ_FIRMWARE_MP(8812A,_FW_NIC);\r
+               }\r
+               else if (ConfigType == CONFIG_FW_WoWLAN)\r
+               {\r
+                       READ_FIRMWARE_MP(8812A,_FW_WoWLAN);\r
+               }\r
+               else if (ConfigType == CONFIG_FW_BT)\r
+               {\r
+                       READ_FIRMWARE_MP(8812A,_FW_NIC_BT);\r
+               }\r
+\r
+       }\r
+#endif\r
+#if (RTL8821A_SUPPORT == 1)\r
+       if (pDM_Odm->SupportICType == ODM_RTL8821)\r
+       {\r
+               if (ConfigType == CONFIG_FW_NIC)\r
+               {\r
+                       READ_FIRMWARE_MP(8821A,_FW_NIC);\r
+               }\r
+               else if (ConfigType == CONFIG_FW_WoWLAN)\r
+               {\r
+                       READ_FIRMWARE_MP(8821A,_FW_WoWLAN);\r
+               }\r
+               else if (ConfigType == CONFIG_FW_BT)\r
+               {\r
+                       READ_FIRMWARE_MP(8821A,_FW_NIC_BT);\r
+               }\r
+       }\r
+#endif\r
+#if (RTL8192E_SUPPORT == 1)\r
+       if (pDM_Odm->SupportICType == ODM_RTL8192E)\r
+       {\r
+               if (ConfigType == CONFIG_FW_NIC)\r
+               {\r
+                       READ_FIRMWARE_MP(8192E,_FW_NIC);\r
+               }\r
+               else if (ConfigType == CONFIG_FW_WoWLAN)\r
+               {\r
+                       READ_FIRMWARE_MP(8192E,_FW_WoWLAN);\r
+               }\r
+#ifdef CONFIG_AP_WOWLAN\r
+               else if (ConfigType == CONFIG_FW_AP_WoWLAN)\r
+               {\r
+                       READ_FIRMWARE_MP(8192E,_FW_AP_WoWLAN);\r
+               }\r
+#endif\r
+\r
+       }\r
+#endif\r
+       return HAL_STATUS_SUCCESS;    \r
+} \r
+\r
+\r
+u4Byte \r
+ODM_GetHWImgVersion(\r
+       IN      PDM_ODM_T       pDM_Odm\r
+       )\r
+{\r
+    u4Byte  Version=0;\r
+\r
+#if (RTL8723A_SUPPORT == 1)  \r
+       if (pDM_Odm->SupportICType == ODM_RTL8723A)\r
+               Version = GET_VERSION_MP(8723A,_MAC_REG);\r
+#endif\r
+\r
+#if (RTL8723B_SUPPORT == 1)  \r
+       if (pDM_Odm->SupportICType == ODM_RTL8723B)\r
+               Version = GET_VERSION_MP(8723B,_MAC_REG);\r
+#endif\r
+\r
+#if (RTL8188E_SUPPORT == 1)  \r
+       if (pDM_Odm->SupportICType == ODM_RTL8188E)\r
+               Version = GET_VERSION_MP(8188E,_MAC_REG);\r
+#endif\r
+\r
+#if (RTL8821A_SUPPORT == 1)  \r
+       if (pDM_Odm->SupportICType == ODM_RTL8821)\r
+               Version = GET_VERSION_MP(8821A,_MAC_REG);\r
+#endif\r
+\r
+#if (RTL8192E_SUPPORT == 1)  \r
+       if (pDM_Odm->SupportICType == ODM_RTL8192E)\r
+               Version = GET_VERSION_MP(8192E,_MAC_REG);\r
+#endif\r
+\r
+#if (RTL8812A_SUPPORT == 1)  \r
+       if (pDM_Odm->SupportICType == ODM_RTL8812)\r
+               Version = GET_VERSION_MP(8812A,_MAC_REG);\r
+#endif\r
+\r
+       return Version;\r
+}\r
+\r
+\r
+\r
+\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_HWConfig.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_HWConfig.h
new file mode 100755 (executable)
index 0000000..da0e5fc
--- /dev/null
@@ -0,0 +1,237 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+\r
+#ifndef        __HALHWOUTSRC_H__\r
+#define __HALHWOUTSRC_H__\r
+\r
+\r
+/*--------------------------Define -------------------------------------------*/ \r
+//#define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)\r
+#define AGC_DIFF_CONFIG_MP(ic, band) (ODM_ReadAndConfig_MP_##ic##_AGC_TAB_DIFF(pDM_Odm, Array_MP_##ic##_AGC_TAB_DIFF_##band, \\r
+                                                                              sizeof(Array_MP_##ic##_AGC_TAB_DIFF_##band)/sizeof(u4Byte)))\r
+#define AGC_DIFF_CONFIG_TC(ic, band) (ODM_ReadAndConfig_TC_##ic##_AGC_TAB_DIFF(pDM_Odm, Array_TC_##ic##_AGC_TAB_DIFF_##band, \\r
+                                                                              sizeof(Array_TC_##ic##_AGC_TAB_DIFF_##band)/sizeof(u4Byte)))\r
+\r
+#define AGC_DIFF_CONFIG(ic, band) do {\\r
+                                            if (pDM_Odm->bIsMPChip)\\r
+                                                   AGC_DIFF_CONFIG_MP(ic,band);\\r
+                                            else\\r
+                                                AGC_DIFF_CONFIG_TC(ic,band);\\r
+                                    } while(0)\r
+\r
+\r
+//============================================================\r
+// structure and define\r
+//============================================================\r
+\r
+typedef struct _Phy_Rx_AGC_Info\r
+{\r
+       #if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)      \r
+               u1Byte  gain:7,trsw:1;                  \r
+       #else                   \r
+               u1Byte  trsw:1,gain:7;\r
+       #endif\r
+} PHY_RX_AGC_INFO_T,*pPHY_RX_AGC_INFO_T;\r
+\r
+typedef struct _Phy_Status_Rpt_8192cd\r
+{\r
+       PHY_RX_AGC_INFO_T path_agc[2];\r
+       u1Byte  ch_corr[2];                                                                     \r
+       u1Byte  cck_sig_qual_ofdm_pwdb_all;\r
+       u1Byte  cck_agc_rpt_ofdm_cfosho_a;\r
+       u1Byte  cck_rpt_b_ofdm_cfosho_b;\r
+       u1Byte  rsvd_1;//ch_corr_msb;\r
+       u1Byte  noise_power_db_msb;\r
+       s1Byte  path_cfotail[2];        \r
+       u1Byte  pcts_mask[2];   \r
+       s1Byte  stream_rxevm[2];        \r
+       u1Byte  path_rxsnr[2];\r
+       u1Byte  noise_power_db_lsb;\r
+       u1Byte  rsvd_2[3];\r
+       u1Byte  stream_csi[2];\r
+       u1Byte  stream_target_csi[2];\r
+       s1Byte  sig_evm;\r
+       u1Byte  rsvd_3; \r
+\r
+#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)     \r
+       u1Byte  antsel_rx_keep_2:1;     //ex_intf_flg:1;\r
+       u1Byte  sgi_en:1;\r
+       u1Byte  rxsc:2; \r
+       u1Byte  idle_long:1;\r
+       u1Byte  r_ant_train_en:1;\r
+       u1Byte  ant_sel_b:1;\r
+       u1Byte  ant_sel:1;      \r
+#else  // _BIG_ENDIAN_ \r
+       u1Byte  ant_sel:1;      \r
+       u1Byte  ant_sel_b:1;\r
+       u1Byte  r_ant_train_en:1;\r
+       u1Byte  idle_long:1;\r
+       u1Byte  rxsc:2;\r
+       u1Byte  sgi_en:1;\r
+       u1Byte  antsel_rx_keep_2:1;     //ex_intf_flg:1;\r
+#endif\r
+} PHY_STATUS_RPT_8192CD_T,*PPHY_STATUS_RPT_8192CD_T;\r
+\r
+\r
+typedef struct _Phy_Status_Rpt_8812\r
+{\r
+#if 0\r
+       PHY_RX_AGC_INFO_T path_agc[2];\r
+       u1Byte  ch_num[2];                                                                      \r
+       u1Byte  cck_sig_qual_ofdm_pwdb_all;\r
+       u1Byte  cck_agc_rpt_ofdm_cfosho_a;\r
+       u1Byte  cck_bb_pwr_ofdm_cfosho_b;\r
+       u1Byte    cck_rx_path;  //CCK_RX_PATH [3:0] (with regA07[3:0] definition)       \r
+       u1Byte  rsvd_1; \r
+       u1Byte  path_cfotail[2];        \r
+       u1Byte  pcts_mask[2];   \r
+       s1Byte  stream_rxevm[2];        \r
+       u1Byte  path_rxsnr[2];\r
+       u1Byte  rsvd_2[2];      \r
+       u1Byte  stream_snr[2];  \r
+       u1Byte  stream_csi[2];\r
+       u1Byte  rsvd_3[2];\r
+       s1Byte  sig_evm;\r
+       u1Byte  rsvd_4; \r
+#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)     \r
+       u1Byte  antidx_anta:3;\r
+       u1Byte  antidx_antb:3;\r
+       u1Byte  rsvd_5:2;\r
+#else  // _BIG_ENDIAN_ \r
+       u1Byte  rsvd_5:2;\r
+       u1Byte  antidx_antb:3;\r
+       u1Byte  antidx_anta:3;  \r
+#endif\r
+#endif\r
+\r
+       //2012.05.24 LukeLee: This structure should take big/little endian in consideration later.....\r
+       \r
+       //DWORD 0\r
+       u1Byte                  gain_trsw[2];\r
+#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)     \r
+       u2Byte                  chl_num:10;\r
+       u2Byte                  sub_chnl:4;\r
+       u2Byte                  r_RFMOD:2;\r
+#else  // _BIG_ENDIAN_ \r
+       u2Byte                  r_RFMOD:2;\r
+       u2Byte                  sub_chnl:4;\r
+       u2Byte                  chl_num:10;\r
+#endif\r
+\r
+       //DWORD 1\r
+       u1Byte                  pwdb_all;\r
+       u1Byte                  cfosho[4];      // DW 1 byte 1 DW 2 byte 0\r
+\r
+       //DWORD 2\r
+       s1Byte                  cfotail[4];     // DW 2 byte 1 DW 3 byte 0\r
+\r
+       //DWORD 3\r
+       s1Byte                  rxevm[2];       // DW 3 byte 1 DW 3 byte 2\r
+       s1Byte                  rxsnr[2];       // DW 3 byte 3 DW 4 byte 0\r
+\r
+       //DWORD 4\r
+       u1Byte                  PCTS_MSK_RPT[2];        \r
+       u1Byte                  pdsnr[2];       // DW 4 byte 3 DW 5 Byte 0\r
+\r
+       //DWORD 5\r
+       u1Byte                  csi_current[2];\r
+       u1Byte                  rx_gain_c;\r
+\r
+       //DWORD 6\r
+       u1Byte                  rx_gain_d;\r
+       s1Byte                  sigevm;\r
+       u1Byte                  resvd_0;\r
+       u1Byte                  antidx_anta:3;\r
+       u1Byte                  antidx_antb:3;\r
+       u1Byte                  resvd_1:2;\r
+} PHY_STATUS_RPT_8812_T,*PPHY_STATUS_RPT_8812_T;\r
+\r
+\r
+VOID\r
+odm_Init_RSSIForDM(\r
+       IN OUT  PDM_ODM_T       pDM_Odm\r
+       );\r
+\r
+VOID\r
+ODM_PhyStatusQuery(\r
+       IN OUT  PDM_ODM_T                                       pDM_Odm,\r
+       OUT             PODM_PHY_INFO_T                 pPhyInfo,\r
+       IN              pu1Byte                                         pPhyStatus,     \r
+       IN              PODM_PACKET_INFO_T                      pPktinfo\r
+       );\r
+\r
+VOID\r
+ODM_MacStatusQuery(\r
+       IN OUT  PDM_ODM_T                                       pDM_Odm,\r
+       IN              pu1Byte                                         pMacStatus,\r
+       IN              u1Byte                                          MacID,  \r
+       IN              BOOLEAN                                         bPacketMatchBSSID,\r
+       IN              BOOLEAN                                         bPacketToSelf,\r
+       IN              BOOLEAN                                         bPacketBeacon\r
+       );\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE|ODM_AP))\r
+\r
+HAL_STATUS\r
+ODM_ConfigRFWithTxPwrTrackHeaderFile(\r
+       IN      PDM_ODM_T                       pDM_Odm\r
+    );\r
+    \r
+HAL_STATUS\r
+ODM_ConfigRFWithHeaderFile(\r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      ODM_RF_Config_Type              ConfigType,\r
+       IN      ODM_RF_RADIO_PATH_E     eRFPath\r
+       );\r
+\r
+HAL_STATUS\r
+ODM_ConfigBBWithHeaderFile(\r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      ODM_BB_Config_Type              ConfigType\r
+    );\r
+\r
+HAL_STATUS\r
+ODM_ConfigMACWithHeaderFile(\r
+       IN      PDM_ODM_T       pDM_Odm\r
+    );\r
+\r
+HAL_STATUS\r
+ODM_ConfigFWWithHeaderFile(\r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      ODM_FW_Config_Type      ConfigType,\r
+       OUT u1Byte                              *pFirmware,\r
+       OUT u4Byte                              *pSize\r
+       );\r
+\r
+u4Byte \r
+ODM_GetHWImgVersion(\r
+       IN      PDM_ODM_T       pDM_Odm\r
+       );\r
+\r
+s4Byte\r
+odm_SignalScaleMapping(        \r
+       IN OUT PDM_ODM_T pDM_Odm,\r
+       IN      s4Byte CurrSig \r
+       );\r
+\r
+#endif\r
+\r
+#endif\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_NoiseMonitor.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_NoiseMonitor.c
new file mode 100755 (executable)
index 0000000..f8c207b
--- /dev/null
@@ -0,0 +1,197 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+//#include "Mp_Precomp.h"\r
+#include "phydm_precomp.h"\r
+\r
+//=================================================\r
+// This function is for inband noise test utility only\r
+// To obtain the inband noise level(dbm), do the following.\r
+// 1. disable DIG and Power Saving \r
+// 2. Set initial gain = 0x1a\r
+// 3. Stop updating idle time pwer report (for driver read)\r
+//     - 0x80c[25]\r
+//\r
+//=================================================\r
+\r
+#define Valid_Min                              -35\r
+#define Valid_Max                      10\r
+#define ValidCnt                               5       \r
+\r
+s2Byte odm_InbandNoise_Monitor_NSeries(PDM_ODM_T       pDM_Odm,u8 bPauseDIG,u8 IGIValue,u32 max_time)\r
+{\r
+       u4Byte                          tmp4b;  \r
+       u1Byte                          max_rf_path=0,rf_path;  \r
+       u1Byte                          reg_c50, reg_c58,valid_done=0;  \r
+       struct noise_level              noise_data;\r
+       u32 start  = 0,         func_start=0,   func_end = 0;\r
+\r
+       func_start = ODM_GetCurrentTime(pDM_Odm);\r
+       pDM_Odm->noise_level.noise_all = 0;\r
+       \r
+       if((pDM_Odm->RFType == ODM_1T2R) ||(pDM_Odm->RFType == ODM_2T2R))       \r
+               max_rf_path = 2;\r
+       else\r
+               max_rf_path = 1;\r
+       \r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("odm_DebugControlInbandNoise_Nseries() ==> \n"));\r
+\r
+       ODM_Memory_Set(pDM_Odm,&noise_data,0,sizeof(struct noise_level));\r
+       \r
+       //\r
+       // Step 1. Disable DIG && Set initial gain.\r
+       //\r
+       \r
+       if(bPauseDIG)\r
+       {\r
+               odm_PauseDIG(pDM_Odm,ODM_PAUSE_DIG,IGIValue);\r
+       }\r
+       //\r
+       // Step 2. Disable all power save for read registers\r
+       //\r
+       //dcmd_DebugControlPowerSave(pAdapter, PSDisable);\r
+\r
+       //\r
+       // Step 3. Get noise power level\r
+       //\r
+       start = ODM_GetCurrentTime(pDM_Odm);\r
+       while(1)\r
+       {\r
+               \r
+               //Stop updating idle time pwer report (for driver read)\r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_TxGainStage, BIT25, 1);    \r
+               \r
+               //Read Noise Floor Report\r
+               tmp4b = ODM_GetBBReg(pDM_Odm, 0x8f8,bMaskDWord );\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("Noise Floor Report (0x8f8) = 0x%08x\n", tmp4b));\r
+               \r
+               //ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, TestInitialGain);\r
+               //if(max_rf_path == 2)\r
+               //      ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, TestInitialGain);\r
+               \r
+               //update idle time pwer report per 5us\r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_TxGainStage, BIT25, 0);\r
+               \r
+               noise_data.value[ODM_RF_PATH_A] = (u1Byte)(tmp4b&0xff);         \r
+               noise_data.value[ODM_RF_PATH_B]  = (u1Byte)((tmp4b&0xff00)>>8);\r
+       \r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("value_a = 0x%x(%d), value_b = 0x%x(%d)\n", \r
+                       noise_data.value[ODM_RF_PATH_A], noise_data.value[ODM_RF_PATH_A], noise_data.value[ODM_RF_PATH_B], noise_data.value[ODM_RF_PATH_B]));\r
+\r
+                for(rf_path = ODM_RF_PATH_A; rf_path < max_rf_path; rf_path++) \r
+                {\r
+                       noise_data.sval[rf_path] = (s1Byte)noise_data.value[rf_path];\r
+                       noise_data.sval[rf_path] /= 2;\r
+                }      \r
+                       \r
+               \r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("sval_a = %d, sval_b = %d\n", \r
+                       noise_data.sval[ODM_RF_PATH_A], noise_data.sval[ODM_RF_PATH_B]));\r
+               //ODM_delay_ms(10);\r
+               //ODM_sleep_ms(10);\r
+\r
+               for(rf_path = ODM_RF_PATH_A; rf_path < max_rf_path; rf_path++) \r
+               {\r
+                       if( (noise_data.valid_cnt[rf_path] < ValidCnt) && (noise_data.sval[rf_path] < Valid_Max && noise_data.sval[rf_path] >= Valid_Min))\r
+                       {\r
+                               noise_data.valid_cnt[rf_path]++;\r
+                               noise_data.sum[rf_path] += noise_data.sval[rf_path];\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("RF_Path:%d Valid sval = %d\n", rf_path,noise_data.sval[rf_path]));\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("Sum of sval = %d, \n", noise_data.sum[rf_path]));\r
+                               if(noise_data.valid_cnt[rf_path] == ValidCnt)\r
+                               {                               \r
+                                       valid_done++;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("After divided, RF_Path:%d ,sum = %d \n", rf_path,noise_data.sum[rf_path]));\r
+                               }                               \r
+                       \r
+                       }\r
+                       \r
+               }\r
+\r
+               //printk("####### valid_done:%d #############\n",valid_done);\r
+               if ((valid_done==max_rf_path) || (ODM_GetProgressingTime(pDM_Odm,start) > max_time))\r
+               {\r
+                       for(rf_path = ODM_RF_PATH_A; rf_path < max_rf_path; rf_path++)\r
+                       { \r
+                               //printk("%s PATH_%d - sum = %d, valid_cnt = %d \n",__FUNCTION__,rf_path,noise_data.sum[rf_path], noise_data.valid_cnt[rf_path]);\r
+                               if(noise_data.valid_cnt[rf_path])\r
+                                       noise_data.sum[rf_path] /= noise_data.valid_cnt[rf_path];               \r
+                               else\r
+                                       noise_data.sum[rf_path]  = 0;\r
+                       }\r
+                       break;\r
+               }\r
+       }\r
+       reg_c50 = (s4Byte)ODM_GetBBReg(pDM_Odm,rOFDM0_XAAGCCore1,bMaskByte0);\r
+       reg_c50 &= ~BIT7;\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("0x%x = 0x%02x(%d)\n", rOFDM0_XAAGCCore1, reg_c50, reg_c50));\r
+       pDM_Odm->noise_level.noise[ODM_RF_PATH_A] = -110 + reg_c50 + noise_data.sum[ODM_RF_PATH_A];\r
+       pDM_Odm->noise_level.noise_all += pDM_Odm->noise_level.noise[ODM_RF_PATH_A];\r
+               \r
+       if(max_rf_path == 2){\r
+               reg_c58 = (s4Byte)ODM_GetBBReg(pDM_Odm,rOFDM0_XBAGCCore1,bMaskByte0);\r
+               reg_c58 &= ~BIT7;\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("0x%x = 0x%02x(%d)\n", rOFDM0_XBAGCCore1, reg_c58, reg_c58));\r
+               pDM_Odm->noise_level.noise[ODM_RF_PATH_B] = -110 + reg_c58 + noise_data.sum[ODM_RF_PATH_B];\r
+               pDM_Odm->noise_level.noise_all += pDM_Odm->noise_level.noise[ODM_RF_PATH_B];\r
+       }\r
+       pDM_Odm->noise_level.noise_all /= max_rf_path;\r
+       \r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("noise_a = %d, noise_b = %d\n", \r
+               pDM_Odm->noise_level.noise[ODM_RF_PATH_A],\r
+               pDM_Odm->noise_level.noise[ODM_RF_PATH_B]));\r
+\r
+       //\r
+       // Step 4. Recover the Dig\r
+       //\r
+       if(bPauseDIG)\r
+       {\r
+               odm_PauseDIG(pDM_Odm,ODM_RESUME_DIG,IGIValue);\r
+       }       \r
+       func_end = ODM_GetProgressingTime(pDM_Odm,func_start) ; \r
+       //printk("%s noise_a = %d, noise_b = %d noise_all:%d (%d ms)\n",__FUNCTION__,\r
+       //      pDM_Odm->noise_level.noise[ODM_RF_PATH_A],\r
+       //      pDM_Odm->noise_level.noise[ODM_RF_PATH_B],\r
+       //      pDM_Odm->noise_level.noise_all,func_end);       \r
+       \r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("odm_DebugControlInbandNoise_Nseries() <== \n"));\r
+       return pDM_Odm->noise_level.noise_all;\r
+\r
+}\r
+s2Byte ODM_InbandNoise_Monitor(PVOID pDM_VOID,u8 bPauseDIG,u8 IGIValue,u32 max_time)\r
+{\r
+\r
+       PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES )\r
+       {\r
+               //odm_InbandNoise_Monitor_JaguarSeries(pDM_Odm,bPauseDIG,IGIValue,max_time);\r
+               return 0;\r
+       }\r
+       else\r
+       {\r
+               return odm_InbandNoise_Monitor_NSeries(pDM_VOID,bPauseDIG,IGIValue,max_time);\r
+       }\r
+}\r
+\r
+\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_NoiseMonitor.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_NoiseMonitor.h
new file mode 100755 (executable)
index 0000000..6625be6
--- /dev/null
@@ -0,0 +1,49 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ *****************************************************************************/\r
+#ifndef        __ODMNOISEMONITOR_H__\r
+#define __ODMNOISEMONITOR_H__\r
+\r
+#define        ODM_MAX_CHANNEL_NUM                                     38//14+24\r
+struct noise_level\r
+{\r
+       //u1Byte                                value_a, value_b;\r
+       u1Byte                          value[MAX_RF_PATH];\r
+       //s1Byte                                sval_a, sval_b;\r
+       s1Byte                          sval[MAX_RF_PATH];\r
+       \r
+       //s4Byte                                noise_a=0, noise_b=0,sum_a=0, sum_b=0;\r
+       //s4Byte                                noise[ODM_RF_PATH_MAX];\r
+       s4Byte                          sum[MAX_RF_PATH];\r
+       //u1Byte                                valid_cnt_a=0, valid_cnt_b=0, \r
+       u1Byte                          valid[MAX_RF_PATH];\r
+       u1Byte                          valid_cnt[MAX_RF_PATH];\r
+\r
+};\r
+\r
+\r
+typedef struct _ODM_NOISE_MONITOR_\r
+{\r
+       s1Byte                  noise[MAX_RF_PATH];\r
+       s2Byte                  noise_all;      \r
+}ODM_NOISE_MONITOR;\r
+\r
+s2Byte ODM_InbandNoise_Monitor(PVOID pDM_VOID,u8 bPauseDIG,u8 IGIValue,u32 max_time);\r
+\r
+#endif\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PathDiv.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PathDiv.c
new file mode 100755 (executable)
index 0000000..3bbea92
--- /dev/null
@@ -0,0 +1,1585 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+#include "Mp_Precomp.h"
+#include "phydm_precomp.h"\r
+\r
+
+\r
+VOID
+odm_PathDiversityInit(
+       IN      PVOID   pDM_VOID\r
+)
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+
+       if(pDM_Odm->mp_mode == TRUE)
+               return;
+
+       if(!(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV))
+       {
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("Return: Not Support PathDiv\n"));
+               return;
+       }
+
+       #if RTL8812A_SUPPORT
+       if(pDM_Odm->SupportICType & ODM_RTL8812)
+               ODM_PathDiversityInit_8812A(pDM_Odm);
+       #endif
+#endif
+}
+\r
+VOID
+odm_PathDiversity(
+       IN      PVOID   pDM_VOID\r
+)
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       if(!(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV))
+       {
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("Return: Not Support PathDiv\n"));
+               return;
+       }
+
+#if RTL8812A_SUPPORT
+
+       if(pDM_Odm->SupportICType & ODM_RTL8812)
+               ODM_PathDiversity_8812A(pDM_Odm);
+#endif 
+#endif  //(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+}\r
+\r
+\r
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+//\r
+// 2011/12/02 MH Copy from MP oursrc for temporarily test.
+//\r
+\r
+BOOLEAN\r
+odm_IsConnected_92C(
+       IN      PADAPTER        Adapter
+)
+{
+       PRT_WLAN_STA    pEntry;
+       PMGNT_INFO              pMgntInfo = &(Adapter->MgntInfo);
+       u4Byte          i;
+       BOOLEAN         bConnected=FALSE;
+       
+       if(pMgntInfo->mAssoc)
+       {
+               bConnected = TRUE;
+       }
+       else
+       {
+               for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
+               {
+                       if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)
+                               pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
+                       else
+                               pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
+
+                       if(pEntry!=NULL)
+                       {
+                               if(pEntry->bAssociated)
+                               {
+                                       bConnected = TRUE;
+                                       break;
+                               }
+                       }
+                       else
+                       {
+                               break;
+                       }
+               }
+       }
+       return  bConnected;
+}
+\r
+BOOLEAN
+ODM_PathDiversityBeforeLink92C(
+       //IN    PADAPTER        Adapter
+       IN              PDM_ODM_T               pDM_Odm
+       )
+{
+#if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE*  pHalData = NULL;
+       PMGNT_INFO              pMgntInfo = NULL;
+       //pSWAT_T               pDM_SWAT_Table = &Adapter->DM_SWAT_Table;
+       pPD_T                   pDM_PDTable = NULL;
+
+       s1Byte                  Score = 0;
+       PRT_WLAN_BSS    pTmpBssDesc;
+       PRT_WLAN_BSS    pTestBssDesc;
+
+       u1Byte                  target_chnl = 0;
+       u2Byte                  index;
+
+       if (pDM_Odm->Adapter == NULL)  //For BSOD when plug/unplug fast.  //By YJ,120413
+       {       // The ODM structure is not initialized.
+               return FALSE;
+       }
+       pHalData = GET_HAL_DATA(Adapter);
+       pMgntInfo = &Adapter->MgntInfo;
+       pDM_PDTable = &Adapter->DM_PDTable;
+       
+       // Condition that does not need to use path diversity.
+       if((!(pHalData->CVID_Version==VERSION_1_BEFORE_8703B && IS_92C_SERIAL(pHalData->VersionID))) || (pHalData->PathDivCfg!=1) || pMgntInfo->AntennaTest )
+       {
+               RT_TRACE(COMP_INIT, DBG_LOUD, 
+                               ("ODM_PathDiversityBeforeLink92C(): No PathDiv Mechanism before link.\n"));
+               return FALSE;
+       }
+
+       // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.
+       PlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
+       if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)
+       {
+               PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
+       
+               RT_TRACE(COMP_INIT, DBG_LOUD, 
+                               ("ODM_PathDiversityBeforeLink92C(): RFChangeInProgress(%x), eRFPowerState(%x)\n", 
+                               pMgntInfo->RFChangeInProgress,
+                               pHalData->eRFPowerState));
+       
+               //pDM_SWAT_Table->SWAS_NoLink_State = 0;
+               pDM_PDTable->PathDiv_NoLink_State = 0;
+               
+               return FALSE;
+       }
+       else
+       {
+               PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
+       }
+
+       //1 Run AntDiv mechanism "Before Link" part.
+       //if(pDM_SWAT_Table->SWAS_NoLink_State == 0)
+       if(pDM_PDTable->PathDiv_NoLink_State == 0)
+       {
+               //1 Prepare to do Scan again to check current antenna state.
+
+               // Set check state to next step.
+               //pDM_SWAT_Table->SWAS_NoLink_State = 1;
+               pDM_PDTable->PathDiv_NoLink_State = 1;
+       
+               // Copy Current Scan list.
+               Adapter->MgntInfo.tmpNumBssDesc = pMgntInfo->NumBssDesc;
+               PlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);
+
+               // Switch Antenna to another one.
+               if(pDM_PDTable->DefaultRespPath == 0)
+               {
+                       PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x05); // TRX path = PathB
+                       odm_SetRespPath_92C(Adapter, 1);
+                       pDM_PDTable->OFDMTXPath = 0xFFFFFFFF;
+                       pDM_PDTable->CCKTXPath = 0xFFFFFFFF;
+               }
+               else
+               {
+                       PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x00); // TRX path = PathA
+                       odm_SetRespPath_92C(Adapter, 0);
+                       pDM_PDTable->OFDMTXPath = 0x0;
+                       pDM_PDTable->CCKTXPath = 0x0;
+               }
+#if 0  
+
+               pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
+               pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==Antenna_A)?Antenna_B:Antenna_A;
+               
+               RT_TRACE(COMP_INIT, DBG_LOUD, 
+                       ("ODM_SwAntDivCheckBeforeLink: Change to Ant(%s) for testing.\n", (pDM_SWAT_Table->CurAntenna==Antenna_A)?"A":"B"));
+               //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
+               pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
+               PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
+#endif
+
+               // Go back to scan function again.
+               RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Scan one more time\n"));
+               pMgntInfo->ScanStep=0;
+               target_chnl = odm_SwAntDivSelectScanChnl(Adapter);
+               odm_SwAntDivConstructScanChnl(Adapter, target_chnl);
+               PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);
+
+               return TRUE;
+       }
+       else
+       {
+               //1 ScanComple() is called after antenna swiched.
+               //1 Check scan result and determine which antenna is going
+               //1 to be used.
+
+               for(index=0; index<Adapter->MgntInfo.tmpNumBssDesc; index++)
+               {
+                       pTmpBssDesc = &(Adapter->MgntInfo.tmpbssDesc[index]);
+                       pTestBssDesc = &(pMgntInfo->bssDesc[index]);
+
+                       if(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)
+                       {
+                               RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C(): ERROR!! This shall not happen.\n"));
+                               continue;
+                       }
+
+                       if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
+                       {
+                               RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score++\n"));
+                               RT_PRINT_STR(COMP_INIT, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
+                               RT_TRACE(COMP_INIT, DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
+                       
+                               Score++;
+                               PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
+                       }
+                       else if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)
+                       {
+                               RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score--\n"));
+                               RT_PRINT_STR(COMP_INIT, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
+                               RT_TRACE(COMP_INIT, DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
+                               Score--;
+                       }
+
+               }
+
+               if(pMgntInfo->NumBssDesc!=0 && Score<=0)
+               {
+                       RT_TRACE(COMP_INIT, DBG_LOUD,
+                               ("ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\n", pDM_PDTable->DefaultRespPath));
+
+                       //pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
+               }
+               else
+               {
+                       RT_TRACE(COMP_INIT, DBG_LOUD, 
+                               ("ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\n", pDM_PDTable->DefaultRespPath));
+
+                       if(pDM_PDTable->DefaultRespPath == 0)
+                       {
+                               pDM_PDTable->OFDMTXPath = 0xFFFFFFFF;
+                               pDM_PDTable->CCKTXPath = 0xFFFFFFFF;
+                               odm_SetRespPath_92C(Adapter, 1);
+                       }
+                       else
+                       {
+                               pDM_PDTable->OFDMTXPath = 0x0;
+                               pDM_PDTable->CCKTXPath = 0x0;
+                               odm_SetRespPath_92C(Adapter, 0);
+                       }
+                       PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x01); // RX path = PathAB
+
+                       //pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;
+
+                       //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
+                       //pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
+                       //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
+               }
+
+               // Check state reset to default and wait for next time.
+               //pDM_SWAT_Table->SWAS_NoLink_State = 0;
+               pDM_PDTable->PathDiv_NoLink_State = 0;
+
+               return FALSE;
+       }
+#else
+               return  FALSE;
+#endif
+       
+}
+
+
+
+VOID
+odm_PathDiversityAfterLink_92C(
+       IN      PADAPTER        Adapter
+)
+{
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+       pPD_T           pDM_PDTable = &Adapter->DM_PDTable;
+       u1Byte          DefaultRespPath=0;
+
+       if((!(pHalData->CVID_Version==VERSION_1_BEFORE_8703B && IS_92C_SERIAL(pHalData->VersionID))) || (pHalData->PathDivCfg != 1) || (pHalData->eRFPowerState == eRfOff))
+       {
+               if(pHalData->PathDivCfg == 0)
+               {
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("No ODM_TXPathDiversity()\n"));
+               }
+               else
+               {
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("2T ODM_TXPathDiversity()\n"));
+               }
+               return;
+       }
+       if(!odm_IsConnected_92C(Adapter))
+       {
+               RT_TRACE(       COMP_INIT, DBG_LOUD, ("ODM_TXPathDiversity(): No Connections\n"));
+               return;
+       }
+       
+       
+       if(pDM_PDTable->TrainingState == 0)
+       {
+               RT_TRACE(       COMP_INIT, DBG_LOUD, ("ODM_TXPathDiversity() ==>\n"));
+               odm_OFDMTXPathDiversity_92C(Adapter);
+
+               if((pDM_PDTable->CCKPathDivEnable == TRUE) && (pDM_PDTable->OFDM_Pkt_Cnt < 100))
+               {
+                       //RT_TRACE(     COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=0\n"));
+                       
+                       if(pDM_PDTable->CCK_Pkt_Cnt > 300)
+                               pDM_PDTable->Timer = 20;
+                       else if(pDM_PDTable->CCK_Pkt_Cnt > 100)
+                               pDM_PDTable->Timer = 60;
+                       else
+                               pDM_PDTable->Timer = 250;
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: timer=%d\n",pDM_PDTable->Timer));
+
+                       PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x00); // RX path = PathA
+                       pDM_PDTable->TrainingState = 1;
+                       pHalData->RSSI_test = TRUE;
+                       ODM_SetTimer( pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, pDM_PDTable->Timer); //ms
+               }
+               else
+               {
+                       pDM_PDTable->CCKTXPath = pDM_PDTable->OFDMTXPath;
+                       DefaultRespPath = pDM_PDTable->OFDMDefaultRespPath;
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_SetRespPath_92C: Skip odm_CCKTXPathDiversity_92C, DefaultRespPath is OFDM\n"));
+                       odm_SetRespPath_92C(Adapter, DefaultRespPath);
+                       odm_ResetPathDiversity_92C(Adapter);
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("ODM_TXPathDiversity() <==\n"));
+               }
+       }
+       else if(pDM_PDTable->TrainingState == 1)
+       {               
+               //RT_TRACE(     COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=1\n"));\r
+               PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x05); // RX path = PathB
+               pDM_PDTable->TrainingState = 2;
+               ODM_SetTimer( pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, pDM_PDTable->Timer); //ms
+       }
+       else
+       {
+               //RT_TRACE(     COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=2\n"));\r
+               pDM_PDTable->TrainingState = 0; 
+               odm_CCKTXPathDiversity_92C(Adapter); 
+               if(pDM_PDTable->OFDM_Pkt_Cnt != 0)
+               {
+                       DefaultRespPath = pDM_PDTable->OFDMDefaultRespPath;
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_SetRespPath_92C: DefaultRespPath is OFDM\n"));
+               }
+               else
+               {
+                       DefaultRespPath = pDM_PDTable->CCKDefaultRespPath;
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_SetRespPath_92C: DefaultRespPath is CCK\n"));
+               }
+               odm_SetRespPath_92C(Adapter, DefaultRespPath);
+               odm_ResetPathDiversity_92C(Adapter);
+               RT_TRACE(       COMP_INIT, DBG_LOUD, ("ODM_TXPathDiversity() <==\n"));
+       }
+
+}
+\r
+VOID
+odm_SetRespPath_92C(
+       IN      PADAPTER        Adapter,
+       IN      u1Byte  DefaultRespPath
+       )
+{
+       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
+
+       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_SetRespPath_92C: Select Response Path=%d\n",DefaultRespPath));
+       if(DefaultRespPath != pDM_PDTable->DefaultRespPath)
+       {
+               if(DefaultRespPath == 0)
+               {
+                       PlatformEFIOWrite1Byte(Adapter, 0x6D8, (PlatformEFIORead1Byte(Adapter, 0x6D8)&0xc0)|0x15);      
+               }
+               else
+               {
+                       PlatformEFIOWrite1Byte(Adapter, 0x6D8, (PlatformEFIORead1Byte(Adapter, 0x6D8)&0xc0)|0x2A);
+               }       
+       }
+       pDM_PDTable->DefaultRespPath = DefaultRespPath;
+}\r
+\r
+VOID
+odm_OFDMTXPathDiversity_92C(
+       IN      PADAPTER        Adapter)
+{
+//     HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+       PMGNT_INFO              pMgntInfo = &(Adapter->MgntInfo);
+       PRT_WLAN_STA    pEntry;
+       u1Byte  i, DefaultRespPath = 0;
+       s4Byte  MinRSSI = 0xFF;
+       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
+       pDM_PDTable->OFDMTXPath = 0;
+       
+       //1 Default Port
+       if(pMgntInfo->mAssoc)
+       {
+               RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port RSSI[0]=%d, RSSI[1]=%d\n",
+                       Adapter->RxStats.RxRSSIPercentage[0], Adapter->RxStats.RxRSSIPercentage[1]));
+               if(Adapter->RxStats.RxRSSIPercentage[0] > Adapter->RxStats.RxRSSIPercentage[1])
+               {
+                       pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & (~BIT0);
+                       MinRSSI =  Adapter->RxStats.RxRSSIPercentage[1];
+                       DefaultRespPath = 0;
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port Select Path-0\n"));
+               }
+               else
+               {
+                       pDM_PDTable->OFDMTXPath =  pDM_PDTable->OFDMTXPath | BIT0;
+                       MinRSSI =  Adapter->RxStats.RxRSSIPercentage[0];
+                       DefaultRespPath = 1;
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port Select Path-1\n"));
+               }
+                       //RT_TRACE(     COMP_INIT, DBG_LOUD, ("pDM_PDTable->OFDMTXPath =0x%x\n",pDM_PDTable->OFDMTXPath));\r
+       }
+       //1 Extension Port
+       for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
+       {
+               if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)
+                       pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
+               else
+                       pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
+
+               if(pEntry!=NULL)
+               {
+                       if(pEntry->bAssociated)
+                       {
+                               RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d, RSSI_0=%d, RSSI_1=%d\n", 
+                                       pEntry->AssociatedMacId, pEntry->rssi_stat.RxRSSIPercentage[0], pEntry->rssi_stat.RxRSSIPercentage[1]));
+                               
+                               if(pEntry->rssi_stat.RxRSSIPercentage[0] > pEntry->rssi_stat.RxRSSIPercentage[1])
+                               {
+                                       pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & ~(BIT(pEntry->AssociatedMacId));
+                                       //pHalData->TXPath = pHalData->TXPath & ~(1<<(pEntry->AssociatedMacId));
+                                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-0\n", pEntry->AssociatedMacId));
+                                       if(pEntry->rssi_stat.RxRSSIPercentage[1] < MinRSSI)
+                                       {
+                                               MinRSSI = pEntry->rssi_stat.RxRSSIPercentage[1];
+                                               DefaultRespPath = 0;
+                                       }
+                               }
+                               else
+                               {
+                                       pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath | BIT(pEntry->AssociatedMacId);
+                                       //pHalData->TXPath = pHalData->TXPath | (1 << (pEntry->AssociatedMacId));
+                                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-1\n", pEntry->AssociatedMacId));
+                                       if(pEntry->rssi_stat.RxRSSIPercentage[0] < MinRSSI)
+                                       {
+                                               MinRSSI = pEntry->rssi_stat.RxRSSIPercentage[0];
+                                               DefaultRespPath = 1;
+                                       }
+                               }
+                       }
+               }
+               else
+               {
+                       break;
+               }
+       }
+
+       pDM_PDTable->OFDMDefaultRespPath = DefaultRespPath;
+}
+\r
+\r
+VOID
+odm_CCKTXPathDiversity_92C(
+       IN      PADAPTER        Adapter
+)
+{
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+       PMGNT_INFO              pMgntInfo = &(Adapter->MgntInfo);
+       PRT_WLAN_STA    pEntry;
+       s4Byte  MinRSSI = 0xFF;
+       u1Byte  i, DefaultRespPath = 0;
+//     BOOLEAN bBModePathDiv = FALSE;
+       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
+
+       //1 Default Port
+       if(pMgntInfo->mAssoc)
+       {
+               if(pHalData->OFDM_Pkt_Cnt == 0)
+               {
+                       for(i=0; i<2; i++)
+                       {
+                               if(pDM_PDTable->RSSI_CCK_Path_cnt[i] > 1) //Because the first packet is discarded
+                                       pDM_PDTable->RSSI_CCK_Path[i] = pDM_PDTable->RSSI_CCK_Path[i] / (pDM_PDTable->RSSI_CCK_Path_cnt[i]-1);
+                               else
+                                       pDM_PDTable->RSSI_CCK_Path[i] = 0;
+                       }
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: pDM_PDTable->RSSI_CCK_Path[0]=%d, pDM_PDTable->RSSI_CCK_Path[1]=%d\n",
+                               pDM_PDTable->RSSI_CCK_Path[0], pDM_PDTable->RSSI_CCK_Path[1]));
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: pDM_PDTable->RSSI_CCK_Path_cnt[0]=%d, pDM_PDTable->RSSI_CCK_Path_cnt[1]=%d\n",
+                               pDM_PDTable->RSSI_CCK_Path_cnt[0], pDM_PDTable->RSSI_CCK_Path_cnt[1]));
+               
+                       if(pDM_PDTable->RSSI_CCK_Path[0] > pDM_PDTable->RSSI_CCK_Path[1])
+                       {
+                               pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0);
+                               MinRSSI =  pDM_PDTable->RSSI_CCK_Path[1];
+                               DefaultRespPath = 0;
+                               RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\n"));
+                       }
+                       else if(pDM_PDTable->RSSI_CCK_Path[0] < pDM_PDTable->RSSI_CCK_Path[1])
+                       {
+                               pDM_PDTable->CCKTXPath =  pDM_PDTable->CCKTXPath | BIT0;
+                               MinRSSI =  pDM_PDTable->RSSI_CCK_Path[0];
+                               DefaultRespPath = 1;
+                               RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-1\n"));
+                       }
+                       else
+                       {
+                               if((pDM_PDTable->RSSI_CCK_Path[0] != 0) && (pDM_PDTable->RSSI_CCK_Path[0] < MinRSSI))
+                               {
+                                       pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0);
+                                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\n"));
+                                       MinRSSI =  pDM_PDTable->RSSI_CCK_Path[1];
+                                       DefaultRespPath = 0;
+                               }
+                               else
+                               {
+                                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port unchange CCK Path\n"));
+                               }
+                       }
+               }
+               else //Follow OFDM decision
+               {
+                       pDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~BIT0)) | (pDM_PDTable->OFDMTXPath &BIT0);
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Follow OFDM decision, Default port Select CCK Path-%d\n",
+                               pDM_PDTable->CCKTXPath &BIT0));
+               }
+       }
+       //1 Extension Port
+       for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
+       {
+               if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)
+                       pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
+               else
+                       pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
+
+               if(pEntry!=NULL)
+               {
+                       if(pEntry->bAssociated)
+                       {
+                               if(pEntry->rssi_stat.OFDM_Pkt_Cnt == 0)
+                               {
+                                       u1Byte j=0;
+                                       for(j=0; j<2; j++)
+                                       {
+                                               if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[j] > 1)
+                                                       pEntry->rssi_stat.RSSI_CCK_Path[j] = pEntry->rssi_stat.RSSI_CCK_Path[j] / (pEntry->rssi_stat.RSSI_CCK_Path_cnt[j]-1);
+                                               else
+                                                       pEntry->rssi_stat.RSSI_CCK_Path[j] = 0;
+                                       }
+                                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d, RSSI_CCK0=%d, RSSI_CCK1=%d\n", 
+                                               pEntry->AssociatedMacId, pEntry->rssi_stat.RSSI_CCK_Path[0], pEntry->rssi_stat.RSSI_CCK_Path[1]));
+                                       
+                                       if(pEntry->rssi_stat.RSSI_CCK_Path[0] >pEntry->rssi_stat.RSSI_CCK_Path[1])
+                                       {
+                                               pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AssociatedMacId));
+                                               RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\n", pEntry->AssociatedMacId));
+                                               if(pEntry->rssi_stat.RSSI_CCK_Path[1] < MinRSSI)
+                                               {
+                                                       MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1];
+                                                       DefaultRespPath = 0;
+                                               }
+                                       }
+                                       else if(pEntry->rssi_stat.RSSI_CCK_Path[0] <pEntry->rssi_stat.RSSI_CCK_Path[1])
+                                       {
+                                               pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath | BIT(pEntry->AssociatedMacId);
+                                               RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-1\n", pEntry->AssociatedMacId));
+                                               if(pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI)
+                                               {
+                                                       MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[0];
+                                                       DefaultRespPath = 1;
+                                               }
+                                       }
+                                       else
+                                       {
+                                               if((pEntry->rssi_stat.RSSI_CCK_Path[0] != 0) && (pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI))
+                                               {
+                                                       pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AssociatedMacId));
+                                                       MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1];
+                                                       DefaultRespPath = 0;
+                                                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\n", pEntry->AssociatedMacId));
+                                               }
+                                               else
+                                               {
+                                                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d unchange CCK Path\n", pEntry->AssociatedMacId));
+                                               }
+                                       }
+                               }
+                               else //Follow OFDM decision
+                               {
+                                       pDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~(BIT(pEntry->AssociatedMacId)))) | (pDM_PDTable->OFDMTXPath & BIT(pEntry->AssociatedMacId));
+                                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Follow OFDM decision, MACID=%d Select CCK Path-%d\n",
+                                               pEntry->AssociatedMacId, (pDM_PDTable->CCKTXPath & BIT(pEntry->AssociatedMacId))>>(pEntry->AssociatedMacId)));
+                               }
+                       }
+               }
+               else
+               {
+                       break;
+               }
+       }
+
+       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C:MinRSSI=%d\n",MinRSSI));
+
+       if(MinRSSI == 0xFF)
+               DefaultRespPath = pDM_PDTable->CCKDefaultRespPath;
+
+       pDM_PDTable->CCKDefaultRespPath = DefaultRespPath;
+}
+\r
+\r
+VOID
+odm_ResetPathDiversity_92C(
+               IN      PADAPTER        Adapter
+)
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
+       PRT_WLAN_STA    pEntry;
+       u4Byte  i,j;
+
+       pHalData->RSSI_test = FALSE;
+       pDM_PDTable->CCK_Pkt_Cnt = 0;
+       pDM_PDTable->OFDM_Pkt_Cnt = 0;
+       pHalData->CCK_Pkt_Cnt =0;
+       pHalData->OFDM_Pkt_Cnt =0;
+       
+       if(pDM_PDTable->CCKPathDivEnable == TRUE)       
+               PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x01); //RX path = PathAB
+
+       for(i=0; i<2; i++)
+       {
+               pDM_PDTable->RSSI_CCK_Path_cnt[i]=0;
+               pDM_PDTable->RSSI_CCK_Path[i] = 0;
+       }
+       for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
+       {
+               if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)
+                       pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
+               else
+                       pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
+
+               if(pEntry!=NULL)
+               {
+                       pEntry->rssi_stat.CCK_Pkt_Cnt = 0;
+                       pEntry->rssi_stat.OFDM_Pkt_Cnt = 0;
+                       for(j=0; j<2; j++)
+                       {
+                               pEntry->rssi_stat.RSSI_CCK_Path_cnt[j] = 0;
+                               pEntry->rssi_stat.RSSI_CCK_Path[j] = 0;
+                       }
+               }
+               else
+                       break;
+       }
+}
+
+
+
+
+
+VOID
+odm_CCKTXPathDiversityCallback(
+       PRT_TIMER               pTimer
+)
+{
+#if USE_WORKITEM
+       PADAPTER        Adapter = (PADAPTER)pTimer->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+          PDM_ODM_T            pDM_Odm = &pHalData->DM_OutSrc;
+#else
+       PADAPTER        Adapter = (PADAPTER)pTimer->Adapter;
+#endif
+
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+#if USE_WORKITEM
+       PlatformScheduleWorkItem(&pDM_Odm->CCKPathDiversityWorkitem);
+#else
+       odm_PathDiversityAfterLink_92C(Adapter);
+#endif
+#else
+       PlatformScheduleWorkItem(&pDM_Odm->CCKPathDiversityWorkitem);
+#endif
+
+}
+
+
+VOID
+odm_CCKTXPathDiversityWorkItemCallback(
+    IN PVOID            pContext
+    )
+{
+       PADAPTER        Adapter = (PADAPTER)pContext;
+
+       odm_CCKTXPathDiversity_92C(Adapter);
+}
+
+//
+// 20100514 Luke/Joseph:
+// Callback function for 500ms antenna test trying.
+//
+VOID
+odm_PathDivChkAntSwitchCallback(
+       PRT_TIMER               pTimer
+)
+{
+       PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+
+#if USE_WORKITEM
+       PlatformScheduleWorkItem(&pDM_Odm->PathDivSwitchWorkitem);
+#else
+       odm_PathDivChkAntSwitch(pDM_Odm);
+#endif
+#else
+       PlatformScheduleWorkItem(&pDM_Odm->PathDivSwitchWorkitem);
+#endif
+
+//odm_SwAntDivChkAntSwitch(Adapter, SWAW_STEP_DETERMINE);
+
+}
+
+
+VOID
+odm_PathDivChkAntSwitchWorkitemCallback(
+    IN PVOID            pContext
+    )
+{
+       PADAPTER        pAdapter = (PADAPTER)pContext;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+
+       odm_PathDivChkAntSwitch(pDM_Odm);
+}\r
+\r
+\r
+ //MAC0_ACCESS_PHY1
+
+// 2011-06-22 Neil Chen & Gary Hsin
+// Refer to Jr.Luke's SW ANT DIV
+// 92D Path Diversity Main function
+// refer to 88C software antenna diversity
+// 
+VOID
+odm_PathDivChkAntSwitch(
+       PDM_ODM_T               pDM_Odm
+       //PADAPTER              Adapter,
+       //u1Byte                        Step
+)
+{
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       PMGNT_INFO              pMgntInfo = &Adapter->MgntInfo;
+
+
+       pSWAT_T                 pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+       s4Byte                  curRSSI=100, RSSI_A, RSSI_B;
+       u1Byte                  nextAntenna=AUX_ANT;
+       static u8Byte           lastTxOkCnt=0, lastRxOkCnt=0;
+       u8Byte                  curTxOkCnt, curRxOkCnt;
+       static u8Byte           TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
+       u8Byte                  CurByteCnt=0, PreByteCnt=0;
+       static u1Byte           TrafficLoad = TRAFFIC_LOW;
+       u1Byte                  Score_A=0, Score_B=0;
+       u1Byte                  i=0x0;
+       // Neil Chen
+       static u1Byte        pathdiv_para=0x0;     
+       static u1Byte        switchfirsttime=0x00;
+       // u1Byte                 regB33 = (u1Byte) PHY_QueryBBReg(Adapter, 0xB30,BIT27);
+       u1Byte                  regB33 = (u1Byte)ODM_GetBBReg(pDM_Odm, PATHDIV_REG, BIT27);
+
+
+       //u1Byte                 reg637 =0x0;   
+       static u1Byte        fw_value=0x0;         
+       //u8Byte                        curTxOkCnt_tmp, curRxOkCnt_tmp;
+       PADAPTER            BuddyAdapter = Adapter->BuddyAdapter;     // another adapter MAC
+        // Path Diversity   //Neil Chen--2011--06--22
+
+       //u1Byte                 PathDiv_Trigger = (u1Byte) PHY_QueryBBReg(Adapter, 0xBA0,BIT31);
+       u1Byte                 PathDiv_Trigger = (u1Byte) ODM_GetBBReg(pDM_Odm, PATHDIV_TRI,BIT31);
+       u1Byte                 PathDiv_Enable = pHalData->bPathDiv_Enable;
+
+
+       //DbgPrint("Path Div PG Value:%x \n",PathDiv_Enable);   
+       if((BuddyAdapter==NULL)||(!PathDiv_Enable)||(PathDiv_Trigger)||(pHalData->CurrentBandType == BAND_ON_2_4G))
+       {
+           return;
+       }
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD,("===================>odm_PathDivChkAntSwitch()\n"));
+
+       // The first time to switch path excluding 2nd, 3rd, ....etc....
+       if(switchfirsttime==0)
+       {
+           if(regB33==0)
+           {
+              pDM_SWAT_Table->CurAntenna = MAIN_ANT;    // Default MAC0_5G-->Path A (current antenna)     
+           }       
+       }
+
+       // Condition that does not need to use antenna diversity.
+       if(pDM_Odm->SupportICType != ODM_RTL8192D)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_PathDiversityMechanims(): No PathDiv Mechanism.\n"));
+               return;
+       }
+
+       // Radio off: Status reset to default and return.
+       if(pHalData->eRFPowerState==eRfOff)
+       {
+               //ODM_SwAntDivRestAfterLink(Adapter);
+               return;
+       }
+
+       /*
+       // Handling step mismatch condition.
+       // Peak step is not finished at last time. Recover the variable and check again.
+       if(     Step != pDM_SWAT_Table->try_flag        )
+       {
+               ODM_SwAntDivRestAfterLink(Adapter);
+       } */
+       
+       if(pDM_SWAT_Table->try_flag == 0xff)
+       {
+               // Select RSSI checking target
+               if(pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter))
+               {
+                       // Target: Infrastructure mode AP.
+                       pHalData->RSSI_target = NULL;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_PathDivMechanism(): RSSI_target is DEF AP!\n"));
+               }
+               else
+               {
+                       u1Byte                  index = 0;
+                       PRT_WLAN_STA    pEntry = NULL;
+                       PADAPTER                pTargetAdapter = NULL;
+               
+                       if(     pMgntInfo->mIbss || ACTING_AS_AP(Adapter) )
+                       {
+                               // Target: AP/IBSS peer.
+                               pTargetAdapter = Adapter;
+                       }
+                       else if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)
+                       {
+                               // Target: VWIFI peer.
+                               pTargetAdapter = GetFirstExtAdapter(Adapter);
+                       }
+
+                       if(pTargetAdapter != NULL)
+                       {
+                               for(index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
+                               {
+                                       pEntry = AsocEntry_EnumStation(pTargetAdapter, index);
+                                       if(pEntry != NULL)
+                                       {
+                                               if(pEntry->bAssociated)
+                                                       break;                  
+                                       }
+                               }
+                       }
+
+                       if(pEntry == NULL)
+                       {
+                               ODM_PathDivRestAfterLink(pDM_Odm);
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
+                               return;
+                       }
+                       else
+                       {
+                               pHalData->RSSI_target = pEntry;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
+                       }
+               }
+                       
+               pHalData->RSSI_cnt_A = 0;
+               pHalData->RSSI_cnt_B = 0;
+               pDM_SWAT_Table->try_flag = 0;
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): Set try_flag to 0 prepare for peak!\n"));
+               return;
+       }
+       else
+       {
+              // 1st step
+               curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - lastTxOkCnt;
+               curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - lastRxOkCnt;
+               lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
+               lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
+       
+               if(pDM_SWAT_Table->try_flag == 1)   // Training State
+               {
+                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+                       {
+                               TXByteCnt_A += curTxOkCnt;
+                               RXByteCnt_A += curRxOkCnt;
+                       }
+                       else
+                       {
+                               TXByteCnt_B += curTxOkCnt;
+                               RXByteCnt_B += curRxOkCnt;
+                       }
+               
+                       nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
+                       pDM_SWAT_Table->RSSI_Trying--;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying));
+                       if(pDM_SWAT_Table->RSSI_Trying == 0)
+                       {
+                               CurByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (TXByteCnt_A+RXByteCnt_A) : (TXByteCnt_B+RXByteCnt_B);
+                               PreByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (TXByteCnt_B+RXByteCnt_B) : (TXByteCnt_A+RXByteCnt_A);
+                               
+                               if(TrafficLoad == TRAFFIC_HIGH)
+                               {
+                                       //CurByteCnt = PlatformDivision64(CurByteCnt, 9);
+                                       PreByteCnt =PreByteCnt*9;
+                               }
+                               else if(TrafficLoad == TRAFFIC_LOW)
+                               {
+                                       //CurByteCnt = PlatformDivision64(CurByteCnt, 2);
+                                       PreByteCnt =PreByteCnt*2;
+                               }
+                               if(pHalData->RSSI_cnt_A > 0)
+                                       RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A; 
+                               else
+                                       RSSI_A = 0;
+                               if(pHalData->RSSI_cnt_B > 0)
+                                       RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B; 
+                            else
+                                       RSSI_B = 0;
+                               curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
+                               pDM_SWAT_Table->PreRSSI =  (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_B : RSSI_A;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI));
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: preAntenna= %s, curAntenna= %s \n", 
+                               (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
+                                       RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B));
+                       }
+
+               }
+               else   // try_flag=0
+               {
+               
+                       if(pHalData->RSSI_cnt_A > 0)
+                               RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A; 
+                       else
+                               RSSI_A = 0;
+                       if(pHalData->RSSI_cnt_B > 0)
+                               RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B; 
+                       else
+                               RSSI_B = 0;     
+                       curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
+                       pDM_SWAT_Table->PreRSSI =  (pDM_SWAT_Table->PreAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI));
+                      ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: preAntenna= %s, curAntenna= %s \n", 
+                       (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
+
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
+                               RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B));
+                       //RT_TRACE(COMP_INIT, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt));
+                       //RT_TRACE(COMP_INIT, DBG_LOUD, ("Ekul:curRxOkCnt = %d\n", curRxOkCnt));
+               }
+
+               //1 Trying State
+               if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0))
+               {
+
+                       if(pDM_SWAT_Table->TestMode == TP_MODE)
+                       {
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: TestMode = TP_MODE"));
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH= TRY:CurByteCnt = %"i64fmt"d,", CurByteCnt));
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH= TRY:PreByteCnt = %"i64fmt"d\n",PreByteCnt));             
+                               if(CurByteCnt < PreByteCnt)
+                               {
+                                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+                                               pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
+                                       else
+                                               pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
+                               }
+                               else
+                               {
+                                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+                                               pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
+                                       else
+                                               pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
+                               }
+                               for (i= 0; i<8; i++)
+                               {
+                                       if(((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1)
+                                               Score_A++;
+                                       else
+                                               Score_B++;
+                               }
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap));
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Score_A=%d, Score_B=%d\n", Score_A, Score_B));
+                       
+                               if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+                               {
+                                       nextAntenna = (Score_A >= Score_B)?MAIN_ANT:AUX_ANT;
+                               }
+                               else
+                               {
+                                       nextAntenna = (Score_B >= Score_A)?AUX_ANT:MAIN_ANT;
+                               }
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: nextAntenna=%s\n",(nextAntenna==MAIN_ANT)?"MAIN":"AUX"));
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: preAntenna= %s, curAntenna= %s \n", 
+                               (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
+
+                               if(nextAntenna != pDM_SWAT_Table->CurAntenna)
+                               {
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Switch back to another antenna"));
+                               }
+                               else
+                               {
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: current anntena is good\n"));
+                               }       
+                       }
+
+                    
+                       if(pDM_SWAT_Table->TestMode == RSSI_MODE)
+                       {       
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: TestMode = RSSI_MODE"));
+                               pDM_SWAT_Table->SelectAntennaMap=0xAA;
+                               if(curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna
+                               {
+                                       //RT_TRACE(COMP_INIT, DBG_LOUD, ("SWAS: Switch back to another antenna"));
+                                       nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)?AUX_ANT : MAIN_ANT;
+                               }
+                               else // current anntena is good
+                               {
+                                       nextAntenna =pDM_SWAT_Table->CurAntenna;
+                                       //RT_TRACE(COMP_INIT, DBG_LOUD, ("SWAS: current anntena is good\n"));
+                               }
+                       }
+                       
+                       pDM_SWAT_Table->try_flag = 0;
+                       pHalData->RSSI_test = FALSE;
+                       pHalData->RSSI_sum_A = 0;
+                       pHalData->RSSI_cnt_A = 0;
+                       pHalData->RSSI_sum_B = 0;
+                       pHalData->RSSI_cnt_B = 0;
+                       TXByteCnt_A = 0;
+                       TXByteCnt_B = 0;
+                       RXByteCnt_A = 0;
+                       RXByteCnt_B = 0;
+                       
+               }
+
+               //1 Normal State
+               else if(pDM_SWAT_Table->try_flag == 0)
+               {
+                       if(TrafficLoad == TRAFFIC_HIGH)
+                       {
+                               if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
+                                       TrafficLoad = TRAFFIC_HIGH;
+                               else
+                                       TrafficLoad = TRAFFIC_LOW;
+                       }
+                       else if(TrafficLoad == TRAFFIC_LOW)
+                               {
+                               if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
+                                       TrafficLoad = TRAFFIC_HIGH;
+                               else
+                                       TrafficLoad = TRAFFIC_LOW;
+                       }
+                       if(TrafficLoad == TRAFFIC_HIGH)
+                               pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
+                       //RT_TRACE(COMP_INIT, DBG_LOUD, ("Normal:TrafficLoad = %llu\n", curTxOkCnt+curRxOkCnt));
+
+                       //Prepare To Try Antenna                
+                               nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
+                               pDM_SWAT_Table->try_flag = 1;
+                               pHalData->RSSI_test = TRUE;
+                       if((curRxOkCnt+curTxOkCnt) > 1000)
+                       {
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+                           pDM_SWAT_Table->RSSI_Trying = 4;                           
+#else
+                           pDM_SWAT_Table->RSSI_Trying = 2;
+#endif
+                               pDM_SWAT_Table->TestMode = TP_MODE;
+                       }
+                       else
+                       {
+                               pDM_SWAT_Table->RSSI_Trying = 2;
+                               pDM_SWAT_Table->TestMode = RSSI_MODE;
+
+                       }
+                          
+                       //RT_TRACE(COMP_INIT, DBG_LOUD, ("SWAS: Normal State -> Begin Trying!\n"));                     
+                       pHalData->RSSI_sum_A = 0;
+                       pHalData->RSSI_cnt_A = 0;
+                       pHalData->RSSI_sum_B = 0;
+                       pHalData->RSSI_cnt_B = 0;
+               } // end of try_flag=0
+       }
+       
+       //1 4.Change TRX antenna
+       if(nextAntenna != pDM_SWAT_Table->CurAntenna)
+       {
+       
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Change TX Antenna!\n "));
+               //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, nextAntenna); for 88C
+               if(nextAntenna==MAIN_ANT)
+               {
+                   ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Next Antenna is RF PATH A\n "));
+                   pathdiv_para = 0x02;   //02 to switchback to RF path A
+                   fw_value = 0x03;
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+                 odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
+#else
+                 ODM_FillH2CCmd(pDM_Odm, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));      \r
+#endif
+               }       
+              else if(nextAntenna==AUX_ANT)
+              {
+                  ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Next Antenna is RF PATH B\n "));
+                  if(switchfirsttime==0)  // First Time To Enter Path Diversity
+                  {
+                      switchfirsttime=0x01;
+                      pathdiv_para = 0x00;
+                         fw_value=0x00;    // to backup RF Path A Releated Registers             
+                                         
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+                     odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
+#else
+                     ODM_FillH2CCmd(pDM_Odm, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));  \r
+                     //for(u1Byte n=0; n<80,n++)
+                     //{
+                     //delay_us(500);
+                         ODM_delay_ms(500);
+                     odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
+                                        
+                        fw_value=0x01;         // to backup RF Path A Releated Registers                
+                     ODM_FillH2CCmd(pDM_Odm, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));  \r
+#endif 
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: FIRST TIME To DO PATH SWITCH!\n "));    
+                  }               
+                   else
+                   {
+                       pathdiv_para = 0x01;
+                        fw_value = 0x02;       
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+                     odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
+#else
+                     ODM_FillH2CCmd(pDM_Odm, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));  \r
+#endif 
+                   }           
+              }
+           //   odm_PathDiversity_8192D(Adapter, pathdiv_para);
+       }
+
+       //1 5.Reset Statistics
+       pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
+       pDM_SWAT_Table->CurAntenna = nextAntenna;
+       pDM_SWAT_Table->PreRSSI = curRSSI;
+
+       //1 6.Set next timer
+
+       if(pDM_SWAT_Table->RSSI_Trying == 0)
+               return;
+
+       if(pDM_SWAT_Table->RSSI_Trying%2 == 0)
+       {
+               if(pDM_SWAT_Table->TestMode == TP_MODE)
+               {
+                       if(TrafficLoad == TRAFFIC_HIGH)
+                       {
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 10 ); //ms
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 10 ms\n"));
+#else
+                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 20 ); //ms
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 20 ms\n"));
+#endif                         
+                       }
+                       else if(TrafficLoad == TRAFFIC_LOW)
+                       {
+                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 50 ); //ms
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 50 ms\n"));
+                       }
+               }
+               else   // TestMode == RSSI_MODE
+               {
+                       ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 500 ); //ms
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 500 ms\n"));
+               }
+       }
+       else
+       {
+               if(pDM_SWAT_Table->TestMode == TP_MODE)
+               {
+                       if(TrafficLoad == TRAFFIC_HIGH)
+                               
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 90 ); //ms
+                               //ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 90 ms\n"));
+#else          
+                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 180); //ms
+#endif                         
+                       else if(TrafficLoad == TRAFFIC_LOW)
+                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 100 ); //ms
+               }
+               else
+                       ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 500 ); //ms
+       }
+}
+\r
+\r
+\r
+VOID
+ODM_CCKPathDiversityChkPerPktRssi(
+       PADAPTER                Adapter,
+       BOOLEAN                 bIsDefPort,
+       BOOLEAN                 bMatchBSSID,
+       PRT_WLAN_STA    pEntry,
+       PRT_RFD                 pRfd,
+       pu1Byte                 pDesc
+       )
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       BOOLEAN                 bCount = FALSE;
+       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
+       //BOOLEAN       isCCKrate = RX_HAL_IS_CCK_RATE_92C(pDesc);
+#if DEV_BUS_TYPE != RT_SDIO_INTERFACE
+       BOOLEAN isCCKrate = RX_HAL_IS_CCK_RATE(Adapter, pDesc);
+#else  //below code would be removed if we have verified SDIO
+       BOOLEAN isCCKrate = IS_HARDWARE_TYPE_8188E(Adapter) ? RX_HAL_IS_CCK_RATE_88E(pDesc) : RX_HAL_IS_CCK_RATE_92C(pDesc);
+#endif
+
+       if((pHalData->PathDivCfg != 1) || (pHalData->RSSI_test == FALSE))
+               return;
+               
+       if(pHalData->RSSI_target==NULL && bIsDefPort && bMatchBSSID)
+               bCount = TRUE;
+       else if(pHalData->RSSI_target!=NULL && pEntry!=NULL && pHalData->RSSI_target==pEntry)
+               bCount = TRUE;
+
+       if(bCount && isCCKrate)
+       {
+               if(pDM_PDTable->TrainingState == 1 )
+               {
+                       if(pEntry)
+                       {
+                               if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[0] != 0)
+                                       pEntry->rssi_stat.RSSI_CCK_Path[0] += pRfd->Status.RxPWDBAll;
+                               pEntry->rssi_stat.RSSI_CCK_Path_cnt[0]++;
+                       }
+                       else
+                       {
+                               if(pDM_PDTable->RSSI_CCK_Path_cnt[0] != 0)
+                                       pDM_PDTable->RSSI_CCK_Path[0] += pRfd->Status.RxPWDBAll;
+                               pDM_PDTable->RSSI_CCK_Path_cnt[0]++;
+                       }
+               }
+               else if(pDM_PDTable->TrainingState == 2 )
+               {
+                       if(pEntry)
+                       {
+                               if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[1] != 0)
+                                       pEntry->rssi_stat.RSSI_CCK_Path[1] += pRfd->Status.RxPWDBAll;
+                               pEntry->rssi_stat.RSSI_CCK_Path_cnt[1]++;
+                       }
+                       else
+                       {
+                               if(pDM_PDTable->RSSI_CCK_Path_cnt[1] != 0)
+                                       pDM_PDTable->RSSI_CCK_Path[1] += pRfd->Status.RxPWDBAll;
+                               pDM_PDTable->RSSI_CCK_Path_cnt[1]++;
+                       }
+               }
+       }
+}
+
+
+
+
+//Neil Chen---2011--06--22
+//----92D Path Diversity----//
+//#ifdef PathDiv92D
+//==================================
+//3 Path Diversity 
+//==================================
+//
+// 20100514 Luke/Joseph:
+// Add new function for antenna diversity after link.
+// This is the main function of antenna diversity after link.
+// This function is called in HalDmWatchDog() and ODM_SwAntDivChkAntSwitchCallback().
+// HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test.
+// In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing.
+// After 500ms, ODM_SwAntDivChkAntSwitchCallback() calls this function to compare the signal just
+// listened on the air with the RSSI of original antenna.
+// It chooses the antenna with better RSSI.
+// There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting 
+// penalty to get next try.
+//
+//
+// 20100503 Joseph:
+// Add new function SwAntDivCheck8192C().
+// This is the main function of Antenna diversity function before link.
+// Mainly, it just retains last scan result and scan again.
+// After that, it compares the scan result to see which one gets better RSSI.
+// It selects antenna with better receiving power and returns better scan result.
+//
+
+
+//
+// 20100514 Luke/Joseph:
+// This function is used to gather the RSSI information for antenna testing.
+// It selects the RSSI of the peer STA that we want to know.
+//
+VOID
+ODM_PathDivChkPerPktRssi(
+       PADAPTER                Adapter,
+       BOOLEAN                 bIsDefPort,
+       BOOLEAN                 bMatchBSSID,
+       PRT_WLAN_STA    pEntry,
+       PRT_RFD                 pRfd
+       )
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);      
+       BOOLEAN                 bCount = FALSE;
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+       pSWAT_T                 pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+
+       if(pHalData->RSSI_target==NULL && bIsDefPort && bMatchBSSID)
+               bCount = TRUE;
+       else if(pHalData->RSSI_target!=NULL && pEntry!=NULL && pHalData->RSSI_target==pEntry)
+               bCount = TRUE;
+
+       if(bCount)
+       {
+               //1 RSSI for SW Antenna Switch
+               if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+               {
+                       pHalData->RSSI_sum_A += pRfd->Status.RxPWDBAll;
+                       pHalData->RSSI_cnt_A++;
+               }
+               else
+               {
+                       pHalData->RSSI_sum_B += pRfd->Status.RxPWDBAll;
+                       pHalData->RSSI_cnt_B++;
+
+               }
+       }
+}
+\r
+\r
+//
+// 20100514 Luke/Joseph:
+// Add new function to reset antenna diversity state after link.
+//
+VOID
+ODM_PathDivRestAfterLink(
+       IN      PDM_ODM_T               pDM_Odm
+       )
+{
+       PADAPTER                Adapter=pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       pSWAT_T                 pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+
+       pHalData->RSSI_cnt_A = 0;
+       pHalData->RSSI_cnt_B = 0;
+       pHalData->RSSI_test = FALSE;
+       pDM_SWAT_Table->try_flag = 0x0;       // NOT 0xff
+       pDM_SWAT_Table->RSSI_Trying = 0;
+       pDM_SWAT_Table->SelectAntennaMap=0xAA;
+       pDM_SWAT_Table->CurAntenna = MAIN_ANT;  
+}\r
+\r
+\r
+//==================================================
+//3 PathDiv End
+//==================================================\r
+\r
+\r
+VOID
+ODM_FillTXPathInTXDESC(
+               IN      PADAPTER        Adapter,
+               IN      PRT_TCB         pTcb,
+               IN      pu1Byte         pDesc
+)
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       u4Byte  TXPath;
+       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
+
+       //2011.09.05  Add by Luke Lee for path diversity
+       if(pHalData->PathDivCfg == 1)
+       {       
+               TXPath = (pDM_PDTable->OFDMTXPath >> pTcb->macId) & BIT0;
+               //RT_TRACE(     COMP_INIT, DBG_LOUD, ("Fill TXDESC: macID=%d, TXPath=%d\n", pTcb->macId, TXPath));
+               //SET_TX_DESC_TX_ANT_CCK(pDesc,TXPath);
+               if(TXPath == 0)
+               {
+                       SET_TX_DESC_TX_ANTL_92C(pDesc,1);
+                       SET_TX_DESC_TX_ANT_HT_92C(pDesc,1);
+               }
+               else
+               {
+                       SET_TX_DESC_TX_ANTL_92C(pDesc,2);
+                       SET_TX_DESC_TX_ANT_HT_92C(pDesc,2);
+               }
+               TXPath = (pDM_PDTable->CCKTXPath >> pTcb->macId) & BIT0;
+               if(TXPath == 0)
+               {
+                       SET_TX_DESC_TX_ANT_CCK_92C(pDesc,1);
+               }
+               else
+               {
+                       SET_TX_DESC_TX_ANT_CCK_92C(pDesc,2);
+               }
+       }
+}
+
+//Only for MP //Neil Chen--2012--0502--
+VOID
+odm_PathDivInit_92D(
+IN     PDM_ODM_T       pDM_Odm)
+{
+       pPATHDIV_PARA   pathIQK = &pDM_Odm->pathIQK;
+
+       pathIQK->org_2g_RegC14=0x0;
+       pathIQK->org_2g_RegC4C=0x0;
+       pathIQK->org_2g_RegC80=0x0;
+       pathIQK->org_2g_RegC94=0x0;
+       pathIQK->org_2g_RegCA0=0x0;
+       pathIQK->org_5g_RegC14=0x0;
+       pathIQK->org_5g_RegCA0=0x0;
+       pathIQK->org_5g_RegE30=0x0;
+       pathIQK->swt_2g_RegC14=0x0;
+       pathIQK->swt_2g_RegC4C=0x0;
+       pathIQK->swt_2g_RegC80=0x0;
+       pathIQK->swt_2g_RegC94=0x0;
+       pathIQK->swt_2g_RegCA0=0x0;
+       pathIQK->swt_5g_RegC14=0x0;
+       pathIQK->swt_5g_RegCA0=0x0;
+       pathIQK->swt_5g_RegE30=0x0;
+
+}\r
+\r
+\r
+u1Byte
+odm_SwAntDivSelectScanChnl(
+       IN      PADAPTER        Adapter
+       )
+{
+#if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
+       PHAL_DATA_TYPE          pHalData = GET_HAL_DATA(Adapter);
+       PMGNT_INFO                      pMgntInfo = &(Adapter->MgntInfo);
+       PDM_ODM_T                       pDM_Odm = &pHalData->DM_OutSrc;
+       u2Byte                          i;
+       u1Byte                          j, ScanChannel = 0, ChannelNum = 0;
+       PRT_CHANNEL_LIST        pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+       u1Byte                          EachChannelSTAs[MAX_SCAN_CHANNEL_NUM] = {0};
+
+       if(pMgntInfo->tmpNumBssDesc == 0)
+               return 0;
+
+       for(i = 0; i < pMgntInfo->tmpNumBssDesc; i++)
+       {               
+               ChannelNum = pMgntInfo->tmpbssDesc[i].ChannelNumber;
+               for(j = 0; j < pChannelList->ChannelLen; j++)
+               {
+                       if(pChannelList->ChnlListEntry[j].ChannelNum == ChannelNum)
+                       {
+                               EachChannelSTAs[j]++;
+                               break;
+                       }
+               }
+       }
+       
+       for(i = 0; i < MAX_SCAN_CHANNEL_NUM; i++)
+               {
+               if(EachChannelSTAs[i] > EachChannelSTAs[ScanChannel])
+                       ScanChannel = (u1Byte)i;
+               }
+
+       if(EachChannelSTAs[ScanChannel] == 0)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("odm_SwAntDivSelectScanChnl(): Scan List is empty.\n"));
+               return 0;
+       }
+       
+       ScanChannel = pChannelList->ChnlListEntry[ScanChannel].ChannelNum;
+
+       
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, 
+               ("odm_SwAntDivSelectScanChnl(): Channel (( %d )) is select as scan channel.\n", ScanChannel));
+
+       return ScanChannel;
+#else
+       return  0;
+#endif 
+}
+
+
+VOID
+odm_SwAntDivConstructScanChnl(
+       IN      PADAPTER        Adapter,
+       IN      u1Byte          ScanChnl
+       )
+{
+
+       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
+
+       if(ScanChnl == 0)
+       {
+               u1Byte                          i;              
+               PRT_CHANNEL_LIST        pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+       
+               // 20100519 Joseph: Original antenna scanned nothing. 
+               // Test antenna shall scan all channel with half period in this condition.
+
+               RT_TRACE_F(COMP_SCAN, DBG_TRACE, (" RT_CHNL_LIST_ACTION_CONSTRUCT chnl %d \n", ScanChnl));
+
+               RtActChannelList(Adapter, RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST, NULL, NULL);
+               for(i = 0; i < pChannelList->ChannelLen; i++)
+                       pChannelList->ChnlListEntry[i].ScanPeriod /= 2;
+       }
+       else
+       {
+               // The using of this CustomizedScanRequest is a trick to rescan the two channels 
+               //      under the NORMAL scanning process. It will not affect MGNT_INFO.CustomizedScanRequest.
+               CUSTOMIZED_SCAN_REQUEST CustomScanReq;
+
+               CustomScanReq.bEnabled = TRUE;
+               CustomScanReq.Channels[0] = ScanChnl;
+               CustomScanReq.Channels[1] = pMgntInfo->dot11CurrentChannelNumber;
+               CustomScanReq.nChannels = 2;
+               CustomScanReq.ScanType = SCAN_ACTIVE;
+               CustomScanReq.Duration = DEFAULT_PASSIVE_SCAN_PERIOD;
+
+               RT_TRACE_F(COMP_SCAN, DBG_TRACE, (" RT_CHNL_LIST_ACTION_CONSTRUCT chnl %d \n", ScanChnl));
+
+               RtActChannelList(Adapter, RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST, &CustomScanReq, NULL);
+       }
+
+}
+\r
+\r
+#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PathDiv.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PathDiv.h
new file mode 100755 (executable)
index 0000000..e72e937
--- /dev/null
@@ -0,0 +1,193 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __PHYDMPATHDIV_H__\r
+#define    __PHYDMPATHDIV_H__\r
+\r
+#define PATHDIV_VERSION        "1.0"\r
+\r
+VOID   \r
+odm_PathDiversityInit(\r
+       IN      PVOID   pDM_VOID\r
+       );\r
+\r
+VOID    \r
+odm_PathDiversity(\r
+       IN      PVOID   pDM_VOID\r
+       );\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) \r
+\r
+//#define   PATHDIV_ENABLE      1\r
+#define dm_PathDiv_RSSI_Check  ODM_PathDivChkPerPktRssi\r
+#define PathDivCheckBeforeLink8192C    ODM_PathDiversityBeforeLink92C\r
+\r
+typedef struct _PathDiv_Parameter_define_\r
+{\r
+       u4Byte org_5g_RegE30;\r
+       u4Byte org_5g_RegC14;\r
+       u4Byte org_5g_RegCA0;\r
+       u4Byte swt_5g_RegE30;\r
+       u4Byte swt_5g_RegC14;\r
+       u4Byte swt_5g_RegCA0;\r
+       //for 2G IQK information\r
+       u4Byte org_2g_RegC80;\r
+       u4Byte org_2g_RegC4C;\r
+       u4Byte org_2g_RegC94;\r
+       u4Byte org_2g_RegC14;\r
+       u4Byte org_2g_RegCA0;\r
+\r
+       u4Byte swt_2g_RegC80;\r
+       u4Byte swt_2g_RegC4C;\r
+       u4Byte swt_2g_RegC94;\r
+       u4Byte swt_2g_RegC14;\r
+       u4Byte swt_2g_RegCA0;\r
+}PATHDIV_PARA,*pPATHDIV_PARA;\r
+\r
+VOID   \r
+odm_PathDiversityInit_92C(\r
+       IN      PADAPTER        Adapter\r
+       );\r
+\r
+VOID   \r
+odm_2TPathDiversityInit_92C(\r
+       IN      PADAPTER        Adapter\r
+       );\r
+\r
+VOID   \r
+odm_1TPathDiversityInit_92C(   \r
+       IN      PADAPTER        Adapter\r
+       );\r
+\r
+BOOLEAN\r
+odm_IsConnected_92C(\r
+       IN      PADAPTER        Adapter\r
+       );\r
+\r
+BOOLEAN \r
+ODM_PathDiversityBeforeLink92C(\r
+       //IN    PADAPTER        Adapter\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       );\r
+\r
+VOID   \r
+odm_PathDiversityAfterLink_92C(\r
+       IN      PADAPTER        Adapter\r
+       );\r
+\r
+VOID\r
+odm_SetRespPath_92C(   \r
+       IN      PADAPTER        Adapter,        \r
+       IN      u1Byte  DefaultRespPath\r
+       );\r
+\r
+VOID   \r
+odm_OFDMTXPathDiversity_92C(\r
+       IN      PADAPTER        Adapter\r
+       );\r
+\r
+VOID   \r
+odm_CCKTXPathDiversity_92C(    \r
+       IN      PADAPTER        Adapter\r
+       );\r
+\r
+VOID   \r
+odm_ResetPathDiversity_92C(    \r
+       IN      PADAPTER        Adapter\r
+       );\r
+\r
+VOID\r
+odm_CCKTXPathDiversityCallback(\r
+       PRT_TIMER               pTimer\r
+       );\r
+\r
+VOID\r
+odm_CCKTXPathDiversityWorkItemCallback(\r
+       IN PVOID            pContext\r
+       );\r
+\r
+VOID\r
+odm_PathDivChkAntSwitchCallback(\r
+       PRT_TIMER               pTimer\r
+       );\r
+\r
+VOID\r
+odm_PathDivChkAntSwitchWorkitemCallback(\r
+       IN PVOID            pContext\r
+       );\r
+\r
+\r
+VOID \r
+odm_PathDivChkAntSwitch(\r
+       PDM_ODM_T    pDM_Odm\r
+       );\r
+\r
+VOID\r
+ODM_CCKPathDiversityChkPerPktRssi(\r
+       PADAPTER                Adapter,\r
+       BOOLEAN                 bIsDefPort,\r
+       BOOLEAN                 bMatchBSSID,\r
+       PRT_WLAN_STA    pEntry,\r
+       PRT_RFD                 pRfd,\r
+       pu1Byte                 pDesc\r
+       );\r
+\r
+VOID \r
+ODM_PathDivChkPerPktRssi(\r
+       PADAPTER                Adapter,\r
+       BOOLEAN                 bIsDefPort,\r
+       BOOLEAN                 bMatchBSSID,\r
+       PRT_WLAN_STA    pEntry,\r
+       PRT_RFD                 pRfd    \r
+       );\r
+\r
+VOID
+ODM_PathDivRestAfterLink(
+       IN      PDM_ODM_T               pDM_Odm
+       );\r
+\r
+VOID
+ODM_FillTXPathInTXDESC(
+               IN      PADAPTER        Adapter,
+               IN      PRT_TCB         pTcb,
+               IN      pu1Byte         pDesc
+       );\r
+\r
+VOID
+odm_PathDivInit_92D(
+       IN      PDM_ODM_T       pDM_Odm\r
+       );\r
+\r
+u1Byte\r
+odm_SwAntDivSelectScanChnl(
+       IN      PADAPTER        Adapter
+       );\r
+\r
+VOID
+odm_SwAntDivConstructScanChnl(
+       IN      PADAPTER        Adapter,
+       IN      u1Byte          ScanChnl
+       );\r
+       \r
+ #endif       //#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) \r
\r
\r
+ #endif                 //#ifndef  __ODMPATHDIV_H__\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PowerTracking.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PowerTracking.c
new file mode 100755 (executable)
index 0000000..507b250
--- /dev/null
@@ -0,0 +1,687 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+#include "Mp_Precomp.h"\r
+#include "phydm_precomp.h"\r
+\r
+//============================================================
+// Global var
+//============================================================
+
+u4Byte OFDMSwingTable[OFDM_TABLE_SIZE] = {
+       0x7f8001fe,     // 0, +6.0dB
+       0x788001e2,     // 1, +5.5dB
+       0x71c001c7,     // 2, +5.0dB
+       0x6b8001ae,     // 3, +4.5dB
+       0x65400195,     // 4, +4.0dB
+       0x5fc0017f,     // 5, +3.5dB
+       0x5a400169,     // 6, +3.0dB
+       0x55400155,     // 7, +2.5dB
+       0x50800142,     // 8, +2.0dB
+       0x4c000130,     // 9, +1.5dB
+       0x47c0011f,     // 10, +1.0dB
+       0x43c0010f,     // 11, +0.5dB
+       0x40000100,     // 12, +0dB
+       0x3c8000f2,     // 13, -0.5dB
+       0x390000e4,     // 14, -1.0dB
+       0x35c000d7,     // 15, -1.5dB
+       0x32c000cb,     // 16, -2.0dB
+       0x300000c0,     // 17, -2.5dB
+       0x2d4000b5,     // 18, -3.0dB
+       0x2ac000ab,     // 19, -3.5dB
+       0x288000a2,     // 20, -4.0dB
+       0x26000098,     // 21, -4.5dB
+       0x24000090,     // 22, -5.0dB
+       0x22000088,     // 23, -5.5dB
+       0x20000080,     // 24, -6.0dB
+       0x1e400079,     // 25, -6.5dB
+       0x1c800072,     // 26, -7.0dB
+       0x1b00006c,     // 27. -7.5dB
+       0x19800066,     // 28, -8.0dB
+       0x18000060,     // 29, -8.5dB
+       0x16c0005b,     // 30, -9.0dB
+       0x15800056,     // 31, -9.5dB
+       0x14400051,     // 32, -10.0dB
+       0x1300004c,     // 33, -10.5dB
+       0x12000048,     // 34, -11.0dB
+       0x11000044,     // 35, -11.5dB
+       0x10000040,     // 36, -12.0dB
+};
+
+u1Byte CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8] = {
+       {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04},       // 0, +0dB
+       {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04},       // 1, -0.5dB
+       {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},       // 2, -1.0dB
+       {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03},       // 3, -1.5dB
+       {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},       // 4, -2.0dB 
+       {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03},       // 5, -2.5dB
+       {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},       // 6, -3.0dB
+       {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03},       // 7, -3.5dB
+       {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},       // 8, -4.0dB 
+       {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02},       // 9, -4.5dB
+       {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},       // 10, -5.0dB 
+       {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02},       // 11, -5.5dB
+       {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},       // 12, -6.0dB <== default
+       {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02},       // 13, -6.5dB
+       {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},       // 14, -7.0dB 
+       {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02},       // 15, -7.5dB
+       {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},       // 16, -8.0dB 
+       {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02},       // 17, -8.5dB
+       {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},       // 18, -9.0dB 
+       {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},       // 19, -9.5dB
+       {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},       // 20, -10.0dB
+       {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01},       // 21, -10.5dB
+       {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01},       // 22, -11.0dB
+       {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01},       // 23, -11.5dB
+       {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01},       // 24, -12.0dB
+       {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01},       // 25, -12.5dB
+       {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01},       // 26, -13.0dB
+       {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01},       // 27, -13.5dB
+       {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01},       // 28, -14.0dB
+       {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01},       // 29, -14.5dB
+       {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01},       // 30, -15.0dB
+       {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01},       // 31, -15.5dB
+       {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01}        // 32, -16.0dB
+};
+
+
+u1Byte CCKSwingTable_Ch14[CCK_TABLE_SIZE][8] = {
+       {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00},       // 0, +0dB  
+       {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00},       // 1, -0.5dB 
+       {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},       // 2, -1.0dB  
+       {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00},       // 3, -1.5dB
+       {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},       // 4, -2.0dB  
+       {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00},       // 5, -2.5dB
+       {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},       // 6, -3.0dB  
+       {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00},       // 7, -3.5dB  
+       {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},       // 8, -4.0dB  
+       {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00},       // 9, -4.5dB
+       {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},       // 10, -5.0dB  
+       {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},       // 11, -5.5dB
+       {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},       // 12, -6.0dB  <== default
+       {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00},       // 13, -6.5dB 
+       {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},       // 14, -7.0dB  
+       {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00},       // 15, -7.5dB
+       {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},       // 16, -8.0dB  
+       {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00},       // 17, -8.5dB
+       {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},       // 18, -9.0dB  
+       {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},       // 19, -9.5dB
+       {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},       // 20, -10.0dB
+       {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00},       // 21, -10.5dB
+       {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00},       // 22, -11.0dB
+       {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},       // 23, -11.5dB
+       {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},       // 24, -12.0dB
+       {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00},       // 25, -12.5dB
+       {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},       // 26, -13.0dB
+       {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},       // 27, -13.5dB
+       {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},       // 28, -14.0dB
+       {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},       // 29, -14.5dB
+       {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},       // 30, -15.0dB
+       {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},       // 31, -15.5dB
+       {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}        // 32, -16.0dB
+};
+
+
+u4Byte OFDMSwingTable_New[OFDM_TABLE_SIZE] = {
+       0x0b40002d, // 0,  -15.0dB      
+       0x0c000030, // 1,  -14.5dB
+       0x0cc00033, // 2,  -14.0dB
+       0x0d800036, // 3,  -13.5dB
+       0x0e400039, // 4,  -13.0dB    
+       0x0f00003c, // 5,  -12.5dB
+       0x10000040, // 6,  -12.0dB
+       0x11000044, // 7,  -11.5dB
+       0x12000048, // 8,  -11.0dB
+       0x1300004c, // 9,  -10.5dB
+       0x14400051, // 10, -10.0dB
+       0x15800056, // 11, -9.5dB
+       0x16c0005b, // 12, -9.0dB
+       0x18000060, // 13, -8.5dB
+       0x19800066, // 14, -8.0dB
+       0x1b00006c, // 15, -7.5dB
+       0x1c800072, // 16, -7.0dB
+       0x1e400079, // 17, -6.5dB
+       0x20000080, // 18, -6.0dB
+       0x22000088, // 19, -5.5dB
+       0x24000090, // 20, -5.0dB
+       0x26000098, // 21, -4.5dB
+       0x288000a2, // 22, -4.0dB
+       0x2ac000ab, // 23, -3.5dB
+       0x2d4000b5, // 24, -3.0dB
+       0x300000c0, // 25, -2.5dB
+       0x32c000cb, // 26, -2.0dB
+       0x35c000d7, // 27, -1.5dB
+       0x390000e4, // 28, -1.0dB
+       0x3c8000f2, // 29, -0.5dB
+       0x40000100, // 30, +0dB
+       0x43c0010f, // 31, +0.5dB
+       0x47c0011f, // 32, +1.0dB
+       0x4c000130, // 33, +1.5dB
+       0x50800142, // 34, +2.0dB
+       0x55400155, // 35, +2.5dB
+       0x5a400169, // 36, +3.0dB
+       0x5fc0017f, // 37, +3.5dB
+       0x65400195, // 38, +4.0dB
+       0x6b8001ae, // 39, +4.5dB
+       0x71c001c7, // 40, +5.0dB
+       0x788001e2, // 41, +5.5dB
+       0x7f8001fe  // 42, +6.0dB
+};               
+
+
+u1Byte CCKSwingTable_Ch1_Ch13_New[CCK_TABLE_SIZE][8] = {
+       {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01},       //  0, -16.0dB
+       {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01},       //  1, -15.5dB
+       {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01},       //  2, -15.0dB
+       {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01},       //  3, -14.5dB
+       {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01},       //  4, -14.0dB
+       {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01},       //  5, -13.5dB
+       {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01},       //  6, -13.0dB
+       {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01},       //  7, -12.5dB
+       {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01},       //  8, -12.0dB
+       {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01},       //  9, -11.5dB
+       {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01},       // 10, -11.0dB
+       {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01},       // 11, -10.5dB
+       {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},       // 12, -10.0dB
+       {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},       // 13, -9.5dB
+       {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},       // 14, -9.0dB 
+       {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02},       // 15, -8.5dB
+       {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},       // 16, -8.0dB 
+       {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02},       // 17, -7.5dB
+       {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},       // 18, -7.0dB 
+       {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02},       // 19, -6.5dB
+    {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},  // 20, -6.0dB 
+       {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02},       // 21, -5.5dB
+       {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},       // 22, -5.0dB 
+       {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02},       // 23, -4.5dB
+       {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},       // 24, -4.0dB 
+       {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03},       // 25, -3.5dB
+       {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},       // 26, -3.0dB
+       {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03},       // 27, -2.5dB
+       {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},       // 28, -2.0dB 
+       {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03},       // 29, -1.5dB
+       {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},       // 30, -1.0dB
+       {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04},       // 31, -0.5dB
+       {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}        // 32, +0dB
+};                                                                  
+
+
+u1Byte CCKSwingTable_Ch14_New[CCK_TABLE_SIZE][8]= {
+       {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00},       //  0, -16.0dB
+       {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},       //  1, -15.5dB
+       {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},       //  2, -15.0dB
+       {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},       //  3, -14.5dB
+       {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},       //  4, -14.0dB
+       {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},       //  5, -13.5dB
+       {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},       //  6, -13.0dB
+       {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00},       //  7, -12.5dB
+       {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},       //  8, -12.0dB
+       {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},       //  9, -11.5dB
+       {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00},       // 10, -11.0dB
+       {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00},       // 11, -10.5dB
+       {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},       // 12, -10.0dB
+       {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},       // 13, -9.5dB
+       {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},       // 14, -9.0dB  
+       {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00},       // 15, -8.5dB
+       {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},       // 16, -8.0dB  
+       {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00},       // 17, -7.5dB
+       {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},       // 18, -7.0dB  
+       {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00},       // 19, -6.5dB 
+       {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},       // 20, -6.0dB  
+       {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},       // 21, -5.5dB
+       {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},       // 22, -5.0dB  
+       {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00},       // 23, -4.5dB
+       {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},       // 24, -4.0dB  
+       {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00},       // 25, -3.5dB  
+       {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},       // 26, -3.0dB  
+       {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00},       // 27, -2.5dB
+       {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},       // 28, -2.0dB  
+       {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00},       // 29, -1.5dB
+       {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},       // 30, -1.0dB  
+       {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00},       // 31, -0.5dB 
+       {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}        // 32, +0dB     
+};
+
+u4Byte TxScalingTable_Jaguar[TXSCALE_TABLE_SIZE] =
+{
+       0x081, // 0,  -12.0dB
+       0x088, // 1,  -11.5dB
+       0x090, // 2,  -11.0dB
+       0x099, // 3,  -10.5dB
+       0x0A2, // 4,  -10.0dB
+       0x0AC, // 5,  -9.5dB
+       0x0B6, // 6,  -9.0dB
+       0x0C0, // 7,  -8.5dB
+       0x0CC, // 8,  -8.0dB
+       0x0D8, // 9,  -7.5dB
+       0x0E5, // 10, -7.0dB
+       0x0F2, // 11, -6.5dB
+       0x101, // 12, -6.0dB
+       0x110, // 13, -5.5dB
+       0x120, // 14, -5.0dB
+       0x131, // 15, -4.5dB
+       0x143, // 16, -4.0dB
+       0x156, // 17, -3.5dB
+       0x16A, // 18, -3.0dB
+       0x180, // 19, -2.5dB
+       0x197, // 20, -2.0dB
+       0x1AF, // 21, -1.5dB
+       0x1C8, // 22, -1.0dB
+       0x1E3, // 23, -0.5dB
+       0x200, // 24, +0  dB
+       0x21E, // 25, +0.5dB
+       0x23E, // 26, +1.0dB
+       0x261, // 27, +1.5dB
+       0x285, // 28, +2.0dB
+       0x2AB, // 29, +2.5dB
+       0x2D3, // 30, +3.0dB
+       0x2FE, // 31, +3.5dB
+       0x32B, // 32, +4.0dB
+       0x35C, // 33, +4.5dB
+       0x38E, // 34, +5.0dB
+       0x3C4, // 35, +5.5dB
+       0x3FE  // 36, +6.0dB    
+};
+\r
+#ifdef AP_BUILD_WORKAROUND
+
+unsigned int TxPwrTrk_OFDM_SwingTbl[TxPwrTrk_OFDM_SwingTbl_Len] = {
+       /*  +6.0dB */ 0x7f8001fe,
+       /*  +5.5dB */ 0x788001e2,
+       /*  +5.0dB */ 0x71c001c7,
+       /*  +4.5dB */ 0x6b8001ae,
+       /*  +4.0dB */ 0x65400195,
+       /*  +3.5dB */ 0x5fc0017f,
+       /*  +3.0dB */ 0x5a400169,
+       /*  +2.5dB */ 0x55400155,
+       /*  +2.0dB */ 0x50800142,
+       /*  +1.5dB */ 0x4c000130,
+       /*  +1.0dB */ 0x47c0011f,
+       /*  +0.5dB */ 0x43c0010f,
+       /*   0.0dB */ 0x40000100,
+       /*  -0.5dB */ 0x3c8000f2,
+       /*  -1.0dB */ 0x390000e4,
+       /*  -1.5dB */ 0x35c000d7,
+       /*  -2.0dB */ 0x32c000cb,
+       /*  -2.5dB */ 0x300000c0,
+       /*  -3.0dB */ 0x2d4000b5,
+       /*  -3.5dB */ 0x2ac000ab,
+       /*  -4.0dB */ 0x288000a2,
+       /*  -4.5dB */ 0x26000098,
+       /*  -5.0dB */ 0x24000090,
+       /*  -5.5dB */ 0x22000088,
+       /*  -6.0dB */ 0x20000080,
+       /*  -6.5dB */ 0x1a00006c,
+       /*  -7.0dB */ 0x1c800072,
+       /*  -7.5dB */ 0x18000060,
+       /*  -8.0dB */ 0x19800066,
+       /*  -8.5dB */ 0x15800056,
+       /*  -9.0dB */ 0x26c0005b,
+       /*  -9.5dB */ 0x14400051,
+       /* -10.0dB */ 0x24400051,
+       /* -10.5dB */ 0x1300004c,
+       /* -11.0dB */ 0x12000048,
+       /* -11.5dB */ 0x11000044,
+       /* -12.0dB */ 0x10000040
+};
+#endif
+\r
+
+
+VOID
+odm_TXPowerTrackingInit(
+       IN      PVOID           pDM_VOID \r
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       if(!(pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_IC_11N_SERIES)))
+               return;
+#endif
+
+       odm_TXPowerTrackingThermalMeterInit(pDM_Odm);
+}      
+
+u1Byte 
+getSwingIndex(
+       IN      PVOID           pDM_VOID \r
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       u1Byte                  i = 0;
+       u4Byte                  bbSwing;
+       u4Byte                  swingTableSize;
+       pu4Byte                         pSwingTable;
+
+       if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8723B ||
+               pDM_Odm->SupportICType == ODM_RTL8192E) 
+       {
+               bbSwing = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, 0xFFC00000);
+
+               pSwingTable = OFDMSwingTable_New;
+               swingTableSize = OFDM_TABLE_SIZE;
+       } else {
+#if ((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
+               if (pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821)
+               {
+                       bbSwing = PHY_GetTxBBSwing_8812A(Adapter, pHalData->CurrentBandType, ODM_RF_PATH_A);
+                       pSwingTable = TxScalingTable_Jaguar;
+                       swingTableSize = TXSCALE_TABLE_SIZE;
+               }
+               else
+#endif
+               {
+                       bbSwing = 0;
+                       pSwingTable = OFDMSwingTable;
+                       swingTableSize = OFDM_TABLE_SIZE;
+               }
+       }
+
+       for (i = 0; i < swingTableSize; ++i) {
+               u4Byte tableValue = pSwingTable[i];
+               
+               if (tableValue >= 0x100000 )
+                       tableValue >>= 22;
+               if (bbSwing == tableValue)
+                       break;
+       }
+       return i;
+}
+
+VOID
+odm_TXPowerTrackingThermalMeterInit(
+       IN      PVOID           pDM_VOID \r
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       u1Byte defaultSwingIndex = getSwingIndex(pDM_Odm);\r
+       u1Byte                  p = 0;
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+
+       if(pDM_Odm->mp_mode == FALSE)
+               pHalData->TxPowerTrackControl = TRUE;
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+       PADAPTER                        Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+
+
+       if (pDM_Odm->SupportICType >= ODM_RTL8188E) 
+       {
+               pDM_Odm->RFCalibrateInfo.bTXPowerTracking = _TRUE;
+               pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
+               pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = _FALSE;
+               
+               if(pDM_Odm->mp_mode == FALSE)
+                       pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;
+               else
+                       pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE;
+
+               MSG_8192C("pDM_Odm TxPowerTrackControl = %d\n", pDM_Odm->RFCalibrateInfo.TxPowerTrackControl);
+       }
+       else
+       {
+               struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+
+               pdmpriv->bTXPowerTracking = _TRUE;
+               pdmpriv->TXPowercount = 0;
+               pdmpriv->bTXPowerTrackingInit = _FALSE;
+               //#if   (MP_DRIVER != 1)                //for mp driver, turn off txpwrtracking as default
+
+               if(pDM_Odm->mp_mode == FALSE)
+                       pdmpriv->TxPowerTrackControl = _TRUE;
+               else
+                       pdmpriv->TxPowerTrackControl = _FALSE;
+
+
+               //MSG_8192C("pdmpriv->TxPowerTrackControl = %d\n", pdmpriv->TxPowerTrackControl);
+       }
+       
+#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       #ifdef RTL8188E_SUPPORT
+       {
+               pDM_Odm->RFCalibrateInfo.bTXPowerTracking = _TRUE;
+               pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
+               pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = _FALSE;
+               pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;
+       }
+       #endif
+#endif
+
+       //pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = TRUE;
+       pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter;
+       pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter;
+       pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter;       
+
+       // The index of "0 dB" in SwingTable.
+       if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8723B ||
+               pDM_Odm->SupportICType == ODM_RTL8192E) 
+       {
+               pDM_Odm->DefaultOfdmIndex = (defaultSwingIndex >= OFDM_TABLE_SIZE) ? 30 : defaultSwingIndex;
+               pDM_Odm->DefaultCckIndex = 20;  
+       }
+       else
+       {
+               pDM_Odm->DefaultOfdmIndex = (defaultSwingIndex >= TXSCALE_TABLE_SIZE) ? 24 : defaultSwingIndex;
+               pDM_Odm->DefaultCckIndex = 24;  
+       }
+
+       pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex;
+       pDM_Odm->RFCalibrateInfo.CCK_index = pDM_Odm->DefaultCckIndex;
+       
+       for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p)
+       {
+               pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex;             
+               pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex;             
+               pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0;
+               pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0;
+               pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
+       }
+
+}
+
+
+VOID
+ODM_TXPowerTrackingCheck(
+       IN      PVOID           pDM_VOID\r
+       )
+{
+       //
+       // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
+       // at the same time. In the stage2/3, we need to prive universal interface and merge all
+       // HW dynamic mechanism.
+       //\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       switch  (pDM_Odm->SupportPlatform)
+       {
+               case    ODM_WIN:
+                       odm_TXPowerTrackingCheckMP(pDM_Odm);
+                       break;
+
+               case    ODM_CE:
+                       odm_TXPowerTrackingCheckCE(pDM_Odm);
+                       break;
+
+               case    ODM_AP:
+                       odm_TXPowerTrackingCheckAP(pDM_Odm);            
+                       break;          
+
+               case    ODM_ADSL:
+                       //odm_DIGAP(pDM_Odm);
+                       break;  
+       }
+
+}
+
+VOID
+odm_TXPowerTrackingCheckCE(
+       IN      PVOID           pDM_VOID\r
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+       PADAPTER        Adapter = pDM_Odm->Adapter;
+       #if( (RTL8192C_SUPPORT==1) ||  (RTL8723A_SUPPORT==1) )
+       if(IS_HARDWARE_TYPE_8192C(Adapter)){
+               rtl8192c_odm_CheckTXPowerTracking(Adapter);
+               return;
+       }
+       #endif
+
+       #if (RTL8192D_SUPPORT==1) 
+       if(IS_HARDWARE_TYPE_8192D(Adapter)){    
+               #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
+               if(!Adapter->bSlaveOfDMSP)
+               #endif
+                       rtl8192d_odm_CheckTXPowerTracking(Adapter);
+               return; 
+       }
+       #endif
+
+       #if(((RTL8188E_SUPPORT==1) ||  (RTL8812A_SUPPORT==1) ||  (RTL8821A_SUPPORT==1) ||  (RTL8192E_SUPPORT==1)  ||  (RTL8723B_SUPPORT==1)  ))
+       if(!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK))
+       {
+               return;
+       }
+
+       if(!pDM_Odm->RFCalibrateInfo.TM_Trigger)                //at least delay 1 sec
+       {
+               //pHalData->TxPowerCheckCnt++;  //cosa add for debug
+               if(IS_HARDWARE_TYPE_8188E(Adapter) || IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8192E(Adapter)||IS_HARDWARE_TYPE_8723B(Adapter))
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_T_METER_NEW, (BIT17 | BIT16), 0x03);
+               else
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_T_METER_OLD, bRFRegOffsetMask, 0x60);
+               
+               //DBG_871X("Trigger Thermal Meter!!\n");
+               
+               pDM_Odm->RFCalibrateInfo.TM_Trigger = 1;
+               return;
+       }
+       else
+       {
+               //DBG_871X("Schedule TxPowerTracking direct call!!\n");
+               ODM_TXPowerTrackingCallback_ThermalMeter(Adapter);
+               pDM_Odm->RFCalibrateInfo.TM_Trigger = 0;
+       }
+       #endif
+#endif 
+}
+
+VOID
+odm_TXPowerTrackingCheckMP(
+       IN      PVOID           pDM_VOID\r
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       PADAPTER        Adapter = pDM_Odm->Adapter;
+
+       if (ODM_CheckPowerStatus(Adapter) == FALSE) 
+       {
+               RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, ("===>ODM_CheckPowerStatus() return FALSE\n"));
+               return;
+       }
+
+       if(IS_HARDWARE_TYPE_8723A(Adapter))
+               return;
+
+       if(!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == FALSE)
+               odm_TXPowerTrackingThermalMeterCheck(Adapter);
+       else {
+               RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, ("!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == FALSE\n"));
+       }
+#endif
+       
+}
+
+
+VOID
+odm_TXPowerTrackingCheckAP(
+       IN      PVOID           pDM_VOID\r
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+       prtl8192cd_priv priv            = pDM_Odm->priv;
+
+       if ( (priv->pmib->dot11RFEntry.ther) && ((priv->up_time % priv->pshare->rf_ft_var.tpt_period) == 0)){
+#ifdef CONFIG_RTL_92D_SUPPORT
+               if (GET_CHIP_VER(priv)==VERSION_8192D){
+                       tx_power_tracking_92D(priv);
+               } else 
+#endif
+               {
+#ifdef CONFIG_RTL_92C_SUPPORT                  
+                       tx_power_tracking(priv);
+#endif
+               }
+       }
+#endif 
+
+}
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+VOID
+odm_TXPowerTrackingThermalMeterCheck(
+       IN      PADAPTER                Adapter
+       )
+{
+#ifndef AP_BUILD_WORKAROUND
+       static u1Byte                   TM_Trigger = 0;
+
+       if(!(GET_HAL_DATA(Adapter)->DM_OutSrc.SupportAbility & ODM_RF_TX_PWR_TRACK))
+       {
+               RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,
+                       ("===>odm_TXPowerTrackingThermalMeterCheck(),pMgntInfo->bTXPowerTracking is FALSE, return!!\n"));
+               return;
+       }
+
+       if(!TM_Trigger)         //at least delay 1 sec
+       {
+               if(IS_HARDWARE_TYPE_8192D(Adapter))
+                       PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER_92D, BIT17 | BIT16, 0x03);
+               else if(IS_HARDWARE_TYPE_8188E(Adapter) || IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8192E(Adapter) ||
+                           IS_HARDWARE_TYPE_8723B(Adapter))
+                       PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER_88E, BIT17 | BIT16, 0x03);
+               else
+                       PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);
+               
+               RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Trigger Thermal Meter!!\n"));
+               
+               TM_Trigger = 1;
+               return;
+       }
+       else
+       {
+               RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Schedule TxPowerTracking direct call!!\n"));           
+               odm_TXPowerTrackingDirectCall(Adapter); //Using direct call is instead, added by Roger, 2009.06.18.
+               TM_Trigger = 0;
+       }
+#endif
+}
+#endif\r
+\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PowerTracking.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_PowerTracking.h
new file mode 100755 (executable)
index 0000000..727cdb1
--- /dev/null
@@ -0,0 +1,248 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __PHYDMPOWERTRACKING_H__\r
+#define    __PHYDMPOWERTRACKING_H__\r
+\r
+#define POWRTRACKING_VERSION   "1.0"\r
+\r
+#define                DPK_DELTA_MAPPING_NUM   13\r
+#define                index_mapping_HP_NUM    15      \r
+#define        OFDM_TABLE_SIZE         43\r
+#define        CCK_TABLE_SIZE                  33\r
+#define TXSCALE_TABLE_SIZE             37\r
+#define TXPWR_TRACK_TABLE_SIZE         30\r
+#define DELTA_SWINGIDX_SIZE     30\r
+#define BAND_NUM                               4\r
+\r
+#define AVG_THERMAL_NUM                8\r
+#define HP_THERMAL_NUM         8\r
+#define IQK_MAC_REG_NUM                4\r
+#define IQK_ADDA_REG_NUM               16\r
+#define IQK_BB_REG_NUM_MAX     10\r
+#if (RTL8192D_SUPPORT==1) \r
+#define IQK_BB_REG_NUM         10\r
+#else\r
+#define IQK_BB_REG_NUM         9\r
+#endif\r
+\r
+\r
+#define IQK_Matrix_REG_NUM     8\r
+#define IQK_Matrix_Settings_NUM        14+24+21 // Channels_2_4G_NUM + Channels_5G_20M_NUM + Channels_5G\r
+\r
+extern u4Byte OFDMSwingTable[OFDM_TABLE_SIZE];\r
+extern u1Byte CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8];\r
+extern u1Byte CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8];\r
+\r
+extern u4Byte OFDMSwingTable_New[OFDM_TABLE_SIZE];\r
+extern u1Byte CCKSwingTable_Ch1_Ch13_New[CCK_TABLE_SIZE][8];\r
+extern u1Byte CCKSwingTable_Ch14_New [CCK_TABLE_SIZE][8];\r
+\r
+extern  u4Byte TxScalingTable_Jaguar[TXSCALE_TABLE_SIZE];\r
+\r
+// <20121018, Kordan> In case fail to read TxPowerTrack.txt, we use the table of 88E as the default table.\r
+static u1Byte DeltaSwingTableIdx_2GA_P_8188E[] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4,  4,  4,  4,  4,  4,  5,  5,  7,  7,  8,  8,  8,  9,  9,  9,  9,  9};\r
+static u1Byte DeltaSwingTableIdx_2GA_N_8188E[] = {0, 0, 0, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5,  6,  6,  7,  7,  7,  7,  8,  8,  9,  9, 10, 10, 10, 11, 11, 11, 11}; \r
+\r
+#define dm_CheckTXPowerTracking        ODM_TXPowerTrackingCheck\r
+\r
+typedef struct _IQK_MATRIX_REGS_SETTING{\r
+       BOOLEAN         bIQKDone;\r
+       s4Byte          Value[3][IQK_Matrix_REG_NUM];\r
+       BOOLEAN         bBWIqkResultSaved[3];   \r
+}IQK_MATRIX_REGS_SETTING,*PIQK_MATRIX_REGS_SETTING;\r
+\r
+typedef struct ODM_RF_Calibration_Structure\r
+{\r
+       //for tx power tracking\r
+       \r
+       u4Byte  RegA24; // for TempCCK\r
+       s4Byte  RegE94;\r
+       s4Byte  RegE9C;\r
+       s4Byte  RegEB4;\r
+       s4Byte  RegEBC; \r
+\r
+       u1Byte          TXPowercount;\r
+       BOOLEAN bTXPowerTrackingInit; \r
+       BOOLEAN bTXPowerTracking;\r
+       u1Byte          TxPowerTrackControl; //for mp mode, turn off txpwrtracking as default\r
+       u1Byte          TM_Trigger;\r
+       u1Byte          InternalPA5G[2];        //pathA / pathB\r
+       \r
+       u1Byte          ThermalMeter[2];    // ThermalMeter, index 0 for RFIC0, and 1 for RFIC1\r
+       u1Byte          ThermalValue;\r
+       u1Byte          ThermalValue_LCK;\r
+       u1Byte          ThermalValue_IQK;\r
+       u1Byte  ThermalValue_DPK;               \r
+       u1Byte  ThermalValue_AVG[AVG_THERMAL_NUM];\r
+       u1Byte  ThermalValue_AVG_index;         \r
+       u1Byte  ThermalValue_RxGain;\r
+       u1Byte  ThermalValue_Crystal;\r
+       u1Byte  ThermalValue_DPKstore;\r
+       u1Byte  ThermalValue_DPKtrack;\r
+       BOOLEAN TxPowerTrackingInProgress;\r
+       \r
+       BOOLEAN bReloadtxpowerindex;    \r
+       u1Byte  bRfPiEnable;\r
+       u4Byte  TXPowerTrackingCallbackCnt; //cosa add for debug\r
+\r
+\r
+       //------------------------- Tx power Tracking -------------------------//\r
+       u1Byte  bCCKinCH14;\r
+       u1Byte  CCK_index;\r
+       u1Byte  OFDM_index[MAX_RF_PATH];\r
+       s1Byte  PowerIndexOffset[MAX_RF_PATH];\r
+       s1Byte  DeltaPowerIndex[MAX_RF_PATH];\r
+       s1Byte  DeltaPowerIndexLast[MAX_RF_PATH];       \r
+       BOOLEAN bTxPowerChanged;\r
+               \r
+       u1Byte  ThermalValue_HP[HP_THERMAL_NUM];\r
+       u1Byte  ThermalValue_HP_index;\r
+       IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM];\r
+       u1Byte  Delta_LCK;\r
+       s1Byte  BBSwingDiff2G, BBSwingDiff5G; // Unit: dB\r
+    u1Byte  DeltaSwingTableIdx_2GCCKA_P[DELTA_SWINGIDX_SIZE];\r
+    u1Byte  DeltaSwingTableIdx_2GCCKA_N[DELTA_SWINGIDX_SIZE];\r
+    u1Byte  DeltaSwingTableIdx_2GCCKB_P[DELTA_SWINGIDX_SIZE];\r
+    u1Byte  DeltaSwingTableIdx_2GCCKB_N[DELTA_SWINGIDX_SIZE];\r
+    u1Byte  DeltaSwingTableIdx_2GA_P[DELTA_SWINGIDX_SIZE];\r
+    u1Byte  DeltaSwingTableIdx_2GA_N[DELTA_SWINGIDX_SIZE];\r
+    u1Byte  DeltaSwingTableIdx_2GB_P[DELTA_SWINGIDX_SIZE];\r
+    u1Byte  DeltaSwingTableIdx_2GB_N[DELTA_SWINGIDX_SIZE];\r
+    u1Byte  DeltaSwingTableIdx_5GA_P[BAND_NUM][DELTA_SWINGIDX_SIZE];\r
+    u1Byte  DeltaSwingTableIdx_5GA_N[BAND_NUM][DELTA_SWINGIDX_SIZE];\r
+    u1Byte  DeltaSwingTableIdx_5GB_P[BAND_NUM][DELTA_SWINGIDX_SIZE];\r
+    u1Byte  DeltaSwingTableIdx_5GB_N[BAND_NUM][DELTA_SWINGIDX_SIZE];\r
+    u1Byte  DeltaSwingTableIdx_2GA_P_8188E[DELTA_SWINGIDX_SIZE];\r
+    u1Byte  DeltaSwingTableIdx_2GA_N_8188E[DELTA_SWINGIDX_SIZE];\r
+    \r
+    \r
+       //--------------------------------------------------------------------//        \r
+       \r
+       //for IQK       \r
+       u4Byte  RegC04;\r
+       u4Byte  Reg874;\r
+       u4Byte  RegC08;\r
+       u4Byte  RegB68;\r
+       u4Byte  RegB6C;\r
+       u4Byte  Reg870;\r
+       u4Byte  Reg860;\r
+       u4Byte  Reg864;\r
+       \r
+       BOOLEAN bIQKInitialized;\r
+       BOOLEAN bLCKInProgress;\r
+       BOOLEAN bAntennaDetected;\r
+       BOOLEAN bNeedIQK;\r
+       BOOLEAN bIQKInProgress; \r
+       u1Byte  Delta_IQK;\r
+       u4Byte  ADDA_backup[IQK_ADDA_REG_NUM];\r
+       u4Byte  IQK_MAC_backup[IQK_MAC_REG_NUM];\r
+       u4Byte  IQK_BB_backup_recover[9];\r
+       u4Byte  IQK_BB_backup[IQK_BB_REG_NUM];  \r
+       u4Byte  TxIQC_8723B[2][3][2]; // { {S1: 0xc94, 0xc80, 0xc4c} , {S0: 0xc9c, 0xc88, 0xc4c}}\r
+       u4Byte  RxIQC_8723B[2][2][2]; // { {S1: 0xc14, 0xca0} ,           {S0: 0xc14, 0xca0}}\r
+\r
+       // <James> IQK time measurement \r
+       u8Byte  IQK_StartTime;\r
+       u8Byte  IQK_ProgressingTime;\r
+\r
+       //for APK\r
+       u4Byte  APKoutput[2][2]; //path A/B; output1_1a/output1_2a\r
+       u1Byte  bAPKdone;\r
+       u1Byte  bAPKThermalMeterIgnore;\r
+       \r
+       // DPK\r
+       BOOLEAN bDPKFail;       \r
+       u1Byte  bDPdone;\r
+       u1Byte  bDPPathAOK;\r
+       u1Byte  bDPPathBOK;\r
+\r
+       u4Byte  TxLOK[2];\r
+\r
+}ODM_RF_CAL_T,*PODM_RF_CAL_T;\r
+\r
+\r
+VOID   \r
+ODM_TXPowerTrackingCheck(\r
+       IN      PVOID           pDM_VOID\r
+       );\r
+\r
+\r
+VOID\r
+odm_TXPowerTrackingInit(\r
+       IN      PVOID           pDM_VOID\r
+       );\r
+\r
+VOID\r
+odm_TXPowerTrackingCheckAP(
+       IN      PVOID           pDM_VOID\r
+       );
+
+VOID
+odm_TXPowerTrackingThermalMeterInit(
+       IN      PVOID           pDM_VOID\r
+       );
+\r
+VOID
+odm_TXPowerTrackingInit(
+       IN      PVOID           pDM_VOID\r
+       );
+
+VOID
+odm_TXPowerTrackingCheckMP(
+       IN      PVOID           pDM_VOID\r
+       );
+
+
+VOID
+odm_TXPowerTrackingCheckCE(
+       IN      PVOID           pDM_VOID\r
+       );
+
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) 
+
+VOID 
+odm_TXPowerTrackingCallbackThermalMeter92C(
+            IN PADAPTER        Adapter
+            );
+
+VOID
+odm_TXPowerTrackingCallbackRXGainThermalMeter92D(
+       IN PADAPTER     Adapter
+       );
+
+VOID
+odm_TXPowerTrackingCallbackThermalMeter92D(
+            IN PADAPTER        Adapter
+            );
+
+VOID
+odm_TXPowerTrackingDirectCall92C(
+            IN PADAPTER                Adapter
+            );
+
+VOID
+odm_TXPowerTrackingThermalMeterCheck(
+       IN      PADAPTER                Adapter
+       );
+
+#endif\r
+\r
+#endif\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RXHP.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RXHP.c
new file mode 100755 (executable)
index 0000000..fcdcb0e
--- /dev/null
@@ -0,0 +1,1685 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+//============================================================\r
+// include files\r
+//============================================================\r
+#include "Mp_Precomp.h"\r
+#include "phydm_precomp.h"\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+#define        AFH_PSD         1       //0:normal PSD scan, 1: only do 20 pts PSD
+#define        MODE_40M                0       //0:20M, 1:40M
+#define        PSD_TH2         3  
+#define        PSD_CHMIN               20   // Minimum channel number for BT AFH
+#define        SIR_STEP_SIZE   3
+#define   Smooth_Size_1        5
+#define        Smooth_TH_1     3
+#define   Smooth_Size_2        10
+#define        Smooth_TH_2     4
+#define   Smooth_Size_3        20
+#define        Smooth_TH_3     4
+#define   Smooth_Step_Size 5
+#define        Adaptive_SIR    1
+#define        SCAN_INTERVAL   1500 //ms
+#define        SYN_Length              5    // for 92D
+       
+#define        LNA_Low_Gain_1                      0x64
+#define        LNA_Low_Gain_2                      0x5A
+#define        LNA_Low_Gain_3                      0x58
+
+#define        pw_th_10dB                                      0x0
+#define        pw_th_16dB                                      0x3
+
+#define        FA_RXHP_TH1                           5000
+#define        FA_RXHP_TH2                           1500
+#define        FA_RXHP_TH3                             800
+#define        FA_RXHP_TH4                             600
+#define        FA_RXHP_TH5                             500
+
+#define        Idle_Mode                                       0
+#define        High_TP_Mode                            1
+#define        Low_TP_Mode                             2
+
+
+VOID
+odm_PSDMonitorInit(
+       IN              PVOID                   pDM_VOID\r
+       )\r
+{
+#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)\r
+       PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+\r
+       //HAL_DATA_TYPE         *pHalData = GET_HAL_DATA(Adapter);
+       //PSD Monitor Setting
+       //Which path in ADC/DAC is turnned on for PSD: both I/Q
+       ODM_SetBBReg(pDM_Odm, ODM_PSDREG, BIT10|BIT11, 0x3);
+       //Ageraged number: 8
+       ODM_SetBBReg(pDM_Odm, ODM_PSDREG, BIT12|BIT13, 0x1);
+       pDM_Odm->bPSDinProcess = FALSE;
+       pDM_Odm->bUserAssignLevel = FALSE;
+       pDM_Odm->bPSDactive = FALSE;
+       //pDM_Odm->bDMInitialGainEnable=TRUE;           //change the initialization to DIGinit
+       //Set Debug Port
+       //PHY_SetBBReg(Adapter, 0x908, bMaskDWord, 0x803);
+       //PHY_SetBBReg(Adapter, 0xB34, bMaskByte0, 0x00); // pause PSD
+       //PHY_SetBBReg(Adapter, 0xB38, bMaskByte0, 10); //rescan
+       //PHY_SetBBReg(Adapter, 0xB38, bMaskByte2|bMaskByte3, 100); //interval
+
+       //PlatformSetTimer( Adapter, &pHalData->PSDTriggerTimer, 0); //ms
+#endif
+}
+
+VOID
+PatchDCTone(
+       IN              PVOID                   pDM_VOID,\r
+       pu4Byte         PSD_report,
+       u1Byte          initial_gain_psd
+)
+{\r
+       PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       //HAL_DATA_TYPE         *pHalData = GET_HAL_DATA(Adapter);
+       //PADAPTER      pAdapter;
+       
+       u4Byte  psd_report;
+
+       //2 Switch to CH11 to patch CH9 and CH13 DC tone
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, 11);
+       
+       if(pDM_Odm->SupportICType== ODM_RTL8192D)
+       {
+               if((*(pDM_Odm->pMacPhyMode) == ODM_SMSP)||(*(pDM_Odm->pMacPhyMode) == ODM_DMSP))
+               {
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, 11);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, 0xfffff, 0x643BC);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, 0xfffff, 0xFC038);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, 0xfffff, 0x77C1A);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, 0xfffff, 0x41289);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, 0xfffff, 0x01840);
+               }
+               else
+               {
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, 0xfffff, 0x643BC);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, 0xfffff, 0xFC038);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, 0xfffff, 0x77C1A);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, 0xfffff, 0x41289);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, 0xfffff, 0x01840);
+               }
+       }
+       
+       //Ch9 DC tone patch
+       psd_report = GetPSDData(pDM_Odm, 96, initial_gain_psd);
+       PSD_report[50] = psd_report;
+       //Ch13 DC tone patch
+       psd_report = GetPSDData(pDM_Odm, 32, initial_gain_psd);
+       PSD_report[70] = psd_report;
+       
+       //2 Switch to CH3 to patch CH1 and CH5 DC tone
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, 3);
+
+       
+       if(pDM_Odm->SupportICType==ODM_RTL8192D)
+       {
+               if((*(pDM_Odm->pMacPhyMode) == ODM_SMSP)||(*(pDM_Odm->pMacPhyMode) == ODM_DMSP))
+               {
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, 3);
+                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x25, 0xfffff, 0x643BC);
+                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x26, 0xfffff, 0xFC038);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, 0xfffff, 0x07C1A);
+                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x2B, 0xfffff, 0x61289);
+                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x2C, 0xfffff, 0x01C41);
+               }
+               else
+               {
+                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x25, 0xfffff, 0x643BC);
+                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x26, 0xfffff, 0xFC038);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, 0xfffff, 0x07C1A);
+                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x2B, 0xfffff, 0x61289);
+                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x2C, 0xfffff, 0x01C41);
+               }
+       }
+       
+       //Ch1 DC tone patch
+       psd_report = GetPSDData(pDM_Odm, 96, initial_gain_psd);
+       PSD_report[10] = psd_report;
+       //Ch5 DC tone patch
+       psd_report = GetPSDData(pDM_Odm, 32, initial_gain_psd);
+       PSD_report[30] = psd_report;
+
+}
+
+
+VOID
+GoodChannelDecision(
+       IN              PVOID                   pDM_VOID,\r
+       pu4Byte         PSD_report,
+       pu1Byte         PSD_bitmap,
+       u1Byte          RSSI_BT,
+       pu1Byte         PSD_bitmap_memory)
+{\r
+       PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       pRXHP_T                 pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
+       //s4Byte        TH1 =  SSBT-0x15;    // modify TH by Neil Chen
+       s4Byte  TH1= RSSI_BT+0x14;
+       s4Byte  TH2 = RSSI_BT+85;
+       //u2Byte    TH3;
+//     s4Byte  RegB34;
+       u1Byte  bitmap, Smooth_size[3], Smooth_TH[3];
+       //u1Byte        psd_bit;
+       u4Byte  i,n,j, byte_idx, bit_idx, good_cnt, good_cnt_smoothing, Smooth_Interval[3];
+       int             start_byte_idx,start_bit_idx,cur_byte_idx, cur_bit_idx,NOW_byte_idx ;
+       
+//     RegB34 = PHY_QueryBBReg(Adapter,0xB34, bMaskDWord)&0xFF;
+
+       if((pDM_Odm->SupportICType == ODM_RTL8192C)||(pDM_Odm->SupportICType == ODM_RTL8192D))
+       {
+            TH1 = RSSI_BT + 0x14;  
+       }
+
+       Smooth_size[0]=Smooth_Size_1;
+       Smooth_size[1]=Smooth_Size_2;
+       Smooth_size[2]=Smooth_Size_3;
+       Smooth_TH[0]=Smooth_TH_1;
+       Smooth_TH[1]=Smooth_TH_2;
+       Smooth_TH[2]=Smooth_TH_3;
+       Smooth_Interval[0]=16;
+       Smooth_Interval[1]=15;
+       Smooth_Interval[2]=13;
+       good_cnt = 0;
+       if(pDM_Odm->SupportICType==ODM_RTL8723A)
+       {
+               //2 Threshold  
+
+               if(RSSI_BT >=41)
+                       TH1 = 113;      
+               else if(RSSI_BT >=38)   // >= -15dBm
+                       TH1 = 105;                              //0x69
+               else if((RSSI_BT >=33)&(RSSI_BT <38))
+                       TH1 = 99+(RSSI_BT-33);         //0x63
+               else if((RSSI_BT >=26)&(RSSI_BT<33))
+                       TH1 = 99-(33-RSSI_BT)+2;     //0x5e
+               else if((RSSI_BT >=24)&(RSSI_BT<26))
+                       TH1 = 88-((RSSI_BT-24)*3);   //0x58
+               else if((RSSI_BT >=18)&(RSSI_BT<24))
+                       TH1 = 77+((RSSI_BT-18)*2);
+               else if((RSSI_BT >=14)&(RSSI_BT<18))
+                       TH1 = 63+((RSSI_BT-14)*2);
+               else if((RSSI_BT >=8)&(RSSI_BT<14))
+                       TH1 = 58+((RSSI_BT-8)*2);
+               else if((RSSI_BT >=3)&(RSSI_BT<8))
+                       TH1 = 52+(RSSI_BT-3);
+               else
+                       TH1 = 51;
+       }
+
+       for (i = 0; i< 10; i++)
+               PSD_bitmap[i] = 0;
+       
+
+        // Add By Gary
+       for (i=0; i<80; i++)
+               pRX_HP_Table->PSD_bitmap_RXHP[i] = 0;
+       // End
+
+
+
+       if(pDM_Odm->SupportICType==ODM_RTL8723A)
+       {
+               TH1 =TH1-SIR_STEP_SIZE;
+       }
+       while (good_cnt < PSD_CHMIN)
+       {
+               good_cnt = 0;
+               if(pDM_Odm->SupportICType==ODM_RTL8723A)
+               {
+               if(TH1 ==TH2)
+                       break;
+               if((TH1+SIR_STEP_SIZE) < TH2)
+                       TH1 += SIR_STEP_SIZE;
+               else
+                       TH1 = TH2;
+               }
+               else
+               {
+                       if(TH1==(RSSI_BT+0x1E))
+                            break;    
+                       if((TH1+2) < (RSSI_BT+0x1E))
+                               TH1+=3;
+                       else
+                               TH1 = RSSI_BT+0x1E;     
+             
+               }
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD: decision threshold is: %d", TH1));
+                        
+               for (i = 0; i< 80; i++)
+               {
+                       if((s4Byte)(PSD_report[i]) < TH1)
+                       {
+                               byte_idx = i / 8;
+                               bit_idx = i -8*byte_idx;
+                               bitmap = PSD_bitmap[byte_idx];
+                               PSD_bitmap[byte_idx] = bitmap | (u1Byte) (1 << bit_idx);
+                       }
+               }
+
+#if DBG
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: before smoothing\n"));
+               for(n=0;n<10;n++)
+               {
+                       //DbgPrint("PSD_bitmap[%u]=%x\n", n, PSD_bitmap[n]);
+                       for (i = 0; i<8; i++)
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD_bitmap[%u] =   %d\n", 2402+n*8+i, (PSD_bitmap[n]&BIT(i))>>i));
+               }
+#endif
+       
+               //1 Start of smoothing function
+
+               for (j=0;j<3;j++)
+               {
+                       start_byte_idx=0;
+                       start_bit_idx=0;
+                       for(n=0; n<Smooth_Interval[j]; n++)
+                       {
+                               good_cnt_smoothing = 0;
+                               cur_bit_idx = start_bit_idx;
+                               cur_byte_idx = start_byte_idx;
+                               for ( i=0; i < Smooth_size[j]; i++)
+                               {
+                                       NOW_byte_idx = cur_byte_idx + (i+cur_bit_idx)/8;
+                                       if ( (PSD_bitmap[NOW_byte_idx]& BIT( (cur_bit_idx + i)%8)) != 0)
+                                               good_cnt_smoothing++;
+
+                               }
+
+                               if( good_cnt_smoothing < Smooth_TH[j] )
+                               {
+                                       cur_bit_idx = start_bit_idx;
+                                       cur_byte_idx = start_byte_idx;
+                                       for ( i=0; i< Smooth_size[j] ; i++)
+                                       {       
+                                               NOW_byte_idx = cur_byte_idx + (i+cur_bit_idx)/8;                                
+                                               PSD_bitmap[NOW_byte_idx] = PSD_bitmap[NOW_byte_idx] & (~BIT( (cur_bit_idx + i)%8));
+                                       }
+                               }
+                               start_bit_idx =  start_bit_idx + Smooth_Step_Size;
+                               while ( (start_bit_idx)  > 7 )
+                               {
+                                       start_byte_idx= start_byte_idx+start_bit_idx/8;
+                                       start_bit_idx = start_bit_idx%8;
+                               }
+                       }
+
+                       ODM_RT_TRACE(   pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: after %u smoothing", j+1));
+                       for(n=0;n<10;n++)
+                       {
+                               for (i = 0; i<8; i++)
+                               {
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD_bitmap[%u] =   %d\n", 2402+n*8+i, (PSD_bitmap[n]&BIT(i))>>i));
+                                       
+                                       if ( ((PSD_bitmap[n]&BIT(i))>>i) ==1)  //----- Add By Gary
+                                       {
+                                          pRX_HP_Table->PSD_bitmap_RXHP[8*n+i] = 1;
+                                       }                                                  // ------end by Gary
+                               }
+                       }
+
+               }
+
+       
+               good_cnt = 0;
+               for ( i = 0; i < 10; i++)
+               {
+                       for (n = 0; n < 8; n++)
+                               if((PSD_bitmap[i]& BIT(n)) != 0)
+                                       good_cnt++;
+               }
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, ODM_COMP_PSD,("PSD: good channel cnt = %u",good_cnt));
+       }
+
+       //RT_TRACE(ODM_COMP_PSD, DBG_LOUD,("PSD: SSBT=%d, TH2=%d, TH1=%d",SSBT,TH2,TH1));
+       for (i = 0; i <10; i++)
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: PSD_bitmap[%u]=%x",i,PSD_bitmap[i]));
+/*     
+       //Update bitmap memory
+       for(i = 0; i < 80; i++)
+       {
+               byte_idx = i / 8;
+               bit_idx = i -8*byte_idx;
+               psd_bit = (PSD_bitmap[byte_idx] & BIT(bit_idx)) >> bit_idx;
+               bitmap = PSD_bitmap_memory[i]; 
+               PSD_bitmap_memory[i] = (bitmap << 1) |psd_bit;
+       }
+*/
+}
+
+
+
+VOID
+odm_PSD_Monitor(
+       IN              PVOID                   pDM_VOID\r
+)
+{\r
+       PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+       //PDM_ODM_T             pDM_Odm = &pHalData->DM_OutSrc;
+
+       unsigned int            pts, start_point, stop_point;
+       u1Byte                  initial_gain ;
+       static u1Byte           PSD_bitmap_memory[80], init_memory = 0;
+       static u1Byte           psd_cnt=0;
+       static u4Byte           PSD_report[80], PSD_report_tmp;
+       static u8Byte           lastTxOkCnt=0, lastRxOkCnt=0;
+       u1Byte                  H2C_PSD_DATA[5]={0,0,0,0,0};
+       static u1Byte           H2C_PSD_DATA_last[5] ={0,0,0,0,0};
+       u1Byte                  idx[20]={96,99,102,106,109,112,115,118,122,125,
+                                       0,3,6,10,13,16,19,22,26,29};
+       u1Byte                  n, i, channel, BBReset,tone_idx;
+       u1Byte                  PSD_bitmap[10], SSBT=0,initial_gain_psd=0, RSSI_BT=0, initialGainUpper;
+       s4Byte                          PSD_skip_start, PSD_skip_stop;
+       u4Byte                  CurrentChannel, RXIQI, RxIdleLowPwr, wlan_channel;
+       u4Byte                  ReScan, Interval, Is40MHz;
+       u8Byte                  curTxOkCnt, curRxOkCnt;
+       int                             cur_byte_idx, cur_bit_idx;
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       PMGNT_INFO              pMgntInfo = &Adapter->MgntInfo;
+       
+
+       if(*pDM_Odm->pbDriverIsGoingToPnpSetPowerSleep)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("pbDriverIsGoingToPnpSetPowerSleep!!!!!!!!!!!!!!!\n"));
+               return;
+       }
+
+       
+       if( (*(pDM_Odm->pbScanInProcess)) ||
+               pDM_Odm->bLinkInProcess)
+       {
+               if((pDM_Odm->SupportICType==ODM_RTL8723A)&(pDM_Odm->SupportInterface==ODM_ITRF_PCIE))
+               {
+                       ODM_SetTimer( pDM_Odm, &pDM_Odm->PSDTimer, 1500); //ms  
+                       //psd_cnt=0;
+               }
+               return;
+       }
+
+       if(pDM_Odm->bBtHsOperation)
+       {
+               ReScan = 1;
+               Interval = SCAN_INTERVAL;
+       }
+       else
+       {
+       ReScan = PSD_RESCAN;
+       Interval = SCAN_INTERVAL;
+       }
+
+       //1 Initialization
+       if(init_memory == 0)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Init memory\n"));
+               for(i = 0; i < 80; i++)
+                       PSD_bitmap_memory[i] = 0xFF; // channel is always good
+               init_memory = 1;
+       }
+       if(psd_cnt == 0)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Enter dm_PSD_Monitor\n"));
+               for(i = 0; i < 80; i++)
+                       PSD_report[i] = 0;
+       }
+
+       //1 Backup Current Settings
+       CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
+/*
+       if(pDM_Odm->SupportICType==ODM_RTL8192D)
+       {
+               //2 Record Current synthesizer parameters based on current channel
+               if((*pDM_Odm->MacPhyMode92D == SINGLEMAC_SINGLEPHY)||(*pDM_Odm->MacPhyMode92D == DUALMAC_SINGLEPHY))
+               {
+                       SYN_RF25 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x25, bMaskDWord);
+                       SYN_RF26 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x26, bMaskDWord);
+                       SYN_RF27 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x27, bMaskDWord);
+                       SYN_RF2B = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x2B, bMaskDWord);
+                       SYN_RF2C = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x2C, bMaskDWord);
+               }
+               else     // DualMAC_DualPHY 2G
+               {
+                       SYN_RF25 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x25, bMaskDWord);
+                       SYN_RF26 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x26, bMaskDWord);
+                       SYN_RF27 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x27, bMaskDWord);
+                       SYN_RF2B = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x2B, bMaskDWord);
+                       SYN_RF2C = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x2C, bMaskDWord);
+               }
+       }
+*/
+       //RXIQI = PHY_QueryBBReg(Adapter, 0xC14, bMaskDWord);
+       RXIQI = ODM_GetBBReg(pDM_Odm, 0xC14, bMaskDWord);
+
+       //RxIdleLowPwr = (PHY_QueryBBReg(Adapter, 0x818, bMaskDWord)&BIT28)>>28;
+       RxIdleLowPwr = (ODM_GetBBReg(pDM_Odm, 0x818, bMaskDWord)&BIT28)>>28;
+
+       //2???
+       if(CHNL_RUN_ABOVE_40MHZ(pMgntInfo))
+               Is40MHz = TRUE;
+       else
+               Is40MHz = FALSE;
+
+       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_PSD, DBG_LOUD,("PSD Scan Start\n"));
+       //1 Turn off CCK
+       //PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT24, 0);
+       ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0);
+       //1 Turn off TX
+       //Pause TX Queue
+       //PlatformEFIOWrite1Byte(Adapter, REG_TXPAUSE, 0xFF);
+       ODM_Write1Byte(pDM_Odm,REG_TXPAUSE, 0xFF);
+       
+       //Force RX to stop TX immediately
+       //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
+
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
+       //1 Turn off RX
+       //Rx AGC off  RegC70[0]=0, RegC7C[20]=0
+       //PHY_SetBBReg(Adapter, 0xC70, BIT0, 0);
+       //PHY_SetBBReg(Adapter, 0xC7C, BIT20, 0);
+
+       ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 0);
+       ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 0);
+
+       
+       //Turn off CCA
+       //PHY_SetBBReg(Adapter, 0xC14, bMaskDWord, 0x0);
+       ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0);
+       
+       //BB Reset
+       //BBReset = PlatformEFIORead1Byte(Adapter, 0x02);
+       BBReset = ODM_Read1Byte(pDM_Odm, 0x02);
+       
+       //PlatformEFIOWrite1Byte(Adapter, 0x02, BBReset&(~BIT0));
+       //PlatformEFIOWrite1Byte(Adapter, 0x02, BBReset|BIT0);
+       ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 1); //clock gated to prevent from AGC table mess 
+       ODM_Write1Byte(pDM_Odm,  0x02, BBReset&(~BIT0));
+       ODM_Write1Byte(pDM_Odm,  0x02, BBReset|BIT0);
+       ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 0);
+       
+       //1 Leave RX idle low power
+       //PHY_SetBBReg(Adapter, 0x818, BIT28, 0x0);
+
+       ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0);
+       //1 Fix initial gain
+       //if (IS_HARDWARE_TYPE_8723AE(Adapter))
+       //RSSI_BT = pHalData->RSSI_BT;
+       //else if((IS_HARDWARE_TYPE_8192C(Adapter))||(IS_HARDWARE_TYPE_8192D(Adapter)))      // Add by Gary
+       //    RSSI_BT = RSSI_BT_new;
+
+       if((pDM_Odm->SupportICType==ODM_RTL8723A)&(pDM_Odm->SupportInterface==ODM_ITRF_PCIE))
+       RSSI_BT=pDM_Odm->RSSI_BT;               //need to check C2H to pDM_Odm RSSI BT
+
+       if(RSSI_BT>=47)
+               RSSI_BT=47;
+          
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
+       
+       if(pDM_Odm->SupportICType==ODM_RTL8723A)
+       {
+              //Neil add--2011--10--12
+               //2 Initial Gain index 
+               if(RSSI_BT >=35)   // >= -15dBm
+                       initial_gain_psd = RSSI_BT*2;
+               else if((RSSI_BT >=33)&(RSSI_BT<35))
+                       initial_gain_psd = RSSI_BT*2+6;
+               else if((RSSI_BT >=24)&(RSSI_BT<33))
+                       initial_gain_psd = 70-(33-RSSI_BT);
+               else if((RSSI_BT >=19)&(RSSI_BT<24))
+                       initial_gain_psd = 64-((24-RSSI_BT)*4);
+               else if((RSSI_BT >=14)&(RSSI_BT<19))
+                       initial_gain_psd = 44-((18-RSSI_BT)*2);
+               else if((RSSI_BT >=8)&(RSSI_BT<14))
+                       initial_gain_psd = 35-(14-RSSI_BT);
+               else
+                       initial_gain_psd = 0x1B;
+       }
+       else
+       {
+       
+               //need to do    
+               initial_gain_psd = pDM_Odm->RSSI_Min;    // PSD report based on RSSI
+               //}     
+       }
+       //if(RSSI_BT<0x17)
+       //      RSSI_BT +=3;
+       //DbgPrint("PSD: RSSI_BT= %d\n", RSSI_BT);
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
+
+       //initialGainUpper = 0x5E;  //Modify by neil chen
+       
+       if(pDM_Odm->bUserAssignLevel)
+       {
+               pDM_Odm->bUserAssignLevel = FALSE;
+               initialGainUpper = 0x7f;
+       }
+       else
+       {
+               initialGainUpper = 0x5E;
+       }
+       
+       /*
+       if (initial_gain_psd < 0x1a)
+               initial_gain_psd = 0x1a;
+       if (initial_gain_psd > initialGainUpper)
+               initial_gain_psd = initialGainUpper;
+       */
+
+       //if(pDM_Odm->SupportICType==ODM_RTL8723A)
+       SSBT = RSSI_BT  * 2 +0x3E;
+       
+       
+       //if(IS_HARDWARE_TYPE_8723AE(Adapter))
+       //      SSBT = RSSI_BT  * 2 +0x3E;
+       //else if((IS_HARDWARE_TYPE_8192C(Adapter))||(IS_HARDWARE_TYPE_8192D(Adapter)))   // Add by Gary
+       //{
+       //      RSSI_BT = initial_gain_psd;
+       //      SSBT = RSSI_BT;
+       //}
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: SSBT= %d\n", SSBT));
+       ODM_RT_TRACE(   pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: initial gain= 0x%x\n", initial_gain_psd));
+       //DbgPrint("PSD: SSBT= %d", SSBT);
+       //need to do
+       pDM_Odm->bDMInitialGainEnable = FALSE;
+       initial_gain =(u1Byte) (ODM_GetBBReg(pDM_Odm, 0xc50, bMaskDWord) & 0x7F);
+       
+        // make sure the initial gain is under the correct range.
+       //initial_gain_psd &= 0x7f;
+       ODM_Write_DIG(pDM_Odm, initial_gain_psd);
+       //1 Turn off 3-wire
+       ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0xF);
+
+       //pts value = 128, 256, 512, 1024
+       pts = 128;
+
+       if(pts == 128)
+       {
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);
+               start_point = 64;
+               stop_point = 192;
+       }
+       else if(pts == 256)
+       {
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x1);
+               start_point = 128;
+               stop_point = 384;
+       }
+       else if(pts == 512)
+       {
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x2);
+               start_point = 256;
+               stop_point = 768;
+       }
+       else
+       {
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x3);
+               start_point = 512;
+               stop_point = 1536;
+       }
+       
+
+//3 Skip WLAN channels if WLAN busy
+
+       curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - lastTxOkCnt;
+       curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - lastRxOkCnt;
+       lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
+       lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);   
+
+       PSD_skip_start=80;
+       PSD_skip_stop = 0;
+       wlan_channel = CurrentChannel & 0x0f;
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD: current channel: %x, BW:%d \n", wlan_channel, Is40MHz));
+       if(pDM_Odm->SupportICType==ODM_RTL8723A)
+       {
+               if(pDM_Odm->bBtHsOperation)
+               {
+                       if(pDM_Odm->bLinked)
+                       {
+                               if(Is40MHz)
+                               {
+                                       PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2;  // Modify by Neil to add 10 chs to mask
+                                       PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
+                               }
+                               else
+                               {
+                                       PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-10;  // Modify by Neil to add 10 chs to mask
+                                       PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+18; 
+                               }
+                       }
+                       else
+                       {
+                               // mask for 40MHz
+                               PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2;  // Modify by Neil to add 10 chs to mask
+                               PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
+                       }
+                       if(PSD_skip_start < 0)
+                               PSD_skip_start = 0;
+                       if(PSD_skip_stop >80)
+                               PSD_skip_stop = 80;
+               }
+               else
+               {
+                       if((curRxOkCnt+curTxOkCnt) > 5)
+                       {
+                               if(Is40MHz)
+                               {
+                                       PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2;  // Modify by Neil to add 10 chs to mask
+                                       PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
+                               }
+                               else
+                               {
+                                       PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-10;  // Modify by Neil to add 10 chs to mask
+                                       PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+18; 
+                               }
+                               
+                               if(PSD_skip_start < 0)
+                                       PSD_skip_start = 0;
+                               if(PSD_skip_stop >80)
+                                       PSD_skip_stop = 80;
+                       }
+               }
+       }
+#if 0  
+       else
+       {
+               if((curRxOkCnt+curTxOkCnt) > 1000)
+               {
+                       PSD_skip_start = (wlan_channel-1)*5 -Is40MHz*10;
+                       PSD_skip_stop = PSD_skip_start + (1+Is40MHz)*20;
+               }
+       }   
+#endif  //Reove RXHP Issue
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD: Skip tone from %d to %d \n", PSD_skip_start, PSD_skip_stop));
+
+       for (n=0;n<80;n++)
+       {
+               if((n%20)==0)
+               {
+                       channel = (n/20)*4 + 1;
+                                       
+                                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
+                               }
+               tone_idx = n%20;
+               if ((n>=PSD_skip_start) && (n<PSD_skip_stop))
+               {       
+                       PSD_report[n] = SSBT;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD:Tone %d skipped \n", n));
+               }
+               else
+               {
+                       PSD_report_tmp =  GetPSDData(pDM_Odm, idx[tone_idx], initial_gain_psd);
+
+                       if ( PSD_report_tmp > PSD_report[n])
+                               PSD_report[n] = PSD_report_tmp;
+                               
+               }
+       }
+
+       PatchDCTone(pDM_Odm, PSD_report, initial_gain_psd);
+      
+       //----end
+       //1 Turn on RX
+       //Rx AGC on
+       ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 1);
+       ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 1);
+       //CCK on
+       ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1);
+       //1 Turn on TX
+       //Resume TX Queue
+       
+       ODM_Write1Byte(pDM_Odm,REG_TXPAUSE, 0x00);
+       //Turn on 3-wire
+       ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0x0);
+       //1 Restore Current Settings
+       //Resume DIG
+       pDM_Odm->bDMInitialGainEnable = TRUE;
+       
+       ODM_Write_DIG(pDM_Odm, initial_gain);
+
+       // restore originl center frequency
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, CurrentChannel);
+
+       //Turn on CCA
+       ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, RXIQI);
+       //Restore RX idle low power
+       if(RxIdleLowPwr == TRUE)
+               ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 1);
+       
+       psd_cnt++;
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD:psd_cnt = %d \n",psd_cnt));
+       if (psd_cnt < ReScan)
+               ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, Interval);            
+       else
+       {
+               psd_cnt = 0;
+               for(i=0;i<80;i++)
+                       //DbgPrint("psd_report[%d]=     %d \n", 2402+i, PSD_report[i]);
+                       RT_TRACE(       ODM_COMP_PSD, DBG_LOUD,("psd_report[%d]=     %d \n", 2402+i, PSD_report[i]));
+
+
+               GoodChannelDecision(pDM_Odm, PSD_report, PSD_bitmap,RSSI_BT, PSD_bitmap_memory);
+
+               if(pDM_Odm->SupportICType==ODM_RTL8723A)
+               {
+                       cur_byte_idx=0;
+                       cur_bit_idx=0;
+
+                       //2 Restore H2C PSD Data to Last Data
+                       H2C_PSD_DATA_last[0] = H2C_PSD_DATA[0];
+                       H2C_PSD_DATA_last[1] = H2C_PSD_DATA[1];
+                       H2C_PSD_DATA_last[2] = H2C_PSD_DATA[2];
+                       H2C_PSD_DATA_last[3] = H2C_PSD_DATA[3];
+                       H2C_PSD_DATA_last[4] = H2C_PSD_DATA[4];
+
+       
+                       //2 Translate 80bit channel map to 40bit channel        
+                       for ( i=0;i<5;i++)
+                       {
+                               for(n=0;n<8;n++)
+                               {
+                                       cur_byte_idx = i*2 + n/4;
+                                       cur_bit_idx = (n%4)*2;
+                                       if ( ((PSD_bitmap[cur_byte_idx]& BIT(cur_bit_idx)) != 0) && ((PSD_bitmap[cur_byte_idx]& BIT(cur_bit_idx+1)) != 0))
+                                               H2C_PSD_DATA[i] = H2C_PSD_DATA[i] | (u1Byte) (1 << n);
+                               }
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("H2C_PSD_DATA[%d]=0x%x\n" ,i, H2C_PSD_DATA[i]));
+                       }
+       
+                       //3 To Compare the difference
+                       for ( i=0;i<5;i++)
+                       {
+                               if(H2C_PSD_DATA[i] !=H2C_PSD_DATA_last[i])
+                               {
+                                       FW_FillH2CCmd(Adapter, H2C_92C_PSD_RESULT, 5, H2C_PSD_DATA);
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_PSD, DBG_LOUD,("Need to Update the AFH Map \n"));
+                                       break;
+                               }
+                               else
+                               {
+                                       if(i==5)
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Not need to Update\n"));  
+                               }
+                       }
+                       if(pDM_Odm->bBtHsOperation)
+                       {
+                               ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, 10000);
+                               ODM_RT_TRACE(   pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Leave dm_PSD_Monitor\n"));             
+                       }
+                       else
+                       {
+                               ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, 1500);
+                               ODM_RT_TRACE(   pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Leave dm_PSD_Monitor\n"));             
+               }
+       }
+    }
+}
+/*
+//Neil for Get BT RSSI
+// Be Triggered by BT C2H CMD
+VOID
+ODM_PSDGetRSSI(
+       IN      u1Byte  RSSI_BT)
+{
+
+
+}
+
+*/
+
+VOID
+ODM_PSDMonitor(
+       IN              PVOID                   pDM_VOID\r
+       )
+{\r
+       PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+       
+       //if(IS_HARDWARE_TYPE_8723AE(Adapter))
+       
+       if(pDM_Odm->SupportICType == ODM_RTL8723A)   //may need to add other IC type
+       {
+               if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE)
+               {
+                       if(!pDM_Odm->bBtEnabled) //need to check upper layer connection
+                       {
+                               pDM_Odm->bPSDactive=FALSE;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, ("odm_PSDMonitor, return for BT is disabled!!!\n"));
+                               return; 
+                       }
+
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, ("odm_PSDMonitor\n"));
+               //{
+                       pDM_Odm->bPSDinProcess = TRUE;
+                       pDM_Odm->bPSDactive=TRUE;
+                       odm_PSD_Monitor(pDM_Odm);
+                       pDM_Odm->bPSDinProcess = FALSE;
+               }       
+       }       
+
+}
+VOID
+odm_PSDMonitorCallback(
+       PRT_TIMER               pTimer
+)
+{
+       PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+
+       PlatformScheduleWorkItem(&pHalData->PSDMonitorWorkitem);
+}
+
+VOID
+odm_PSDMonitorWorkItemCallback(
+    IN PVOID            pContext
+    )
+{
+       PADAPTER        Adapter = (PADAPTER)pContext;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+
+       ODM_PSDMonitor(pDM_Odm);
+}
+
+
+ //cosa debug tool need to modify
+
+VOID
+ODM_PSDDbgControl(
+       IN      PADAPTER        Adapter,
+       IN      u4Byte          mode,
+       IN      u4Byte          btRssi
+       )
+{
+#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, (" Monitor mode=%d, btRssi=%d\n", mode, btRssi));
+       if(mode)
+       {
+               pDM_Odm->RSSI_BT = (u1Byte)btRssi;
+               pDM_Odm->bUserAssignLevel = TRUE;
+               ODM_SetTimer( pDM_Odm, &pDM_Odm->PSDTimer, 0); //ms             
+       }
+       else
+       {
+               ODM_CancelTimer(pDM_Odm, &pDM_Odm->PSDTimer);
+       }
+#endif
+}
+
+
+//#if(DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
+
+void   odm_RXHPInit(
+       IN              PVOID                   pDM_VOID)\r
+{
+#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)\r
+       PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       pRXHP_T                 pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;
+       u1Byte                  index;
+
+       pRX_HP_Table->RXHP_enable = TRUE;
+       pRX_HP_Table->RXHP_flag = 0;
+       pRX_HP_Table->PSD_func_trigger = 0;
+       pRX_HP_Table->Pre_IGI = 0x20;
+       pRX_HP_Table->Cur_IGI = 0x20;
+       pRX_HP_Table->Cur_pw_th = pw_th_10dB;
+       pRX_HP_Table->Pre_pw_th = pw_th_10dB;
+       for(index=0; index<80; index++)
+               pRX_HP_Table->PSD_bitmap_RXHP[index] = 1;
+
+#if(DEV_BUS_TYPE == RT_USB_INTERFACE)
+       pRX_HP_Table->TP_Mode = Idle_Mode;
+#endif
+#endif
+}
+\r
+VOID
+odm_PSD_RXHP(
+       IN              PVOID                   pDM_VOID\r
+)
+{\r
+       PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       pRXHP_T                 pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;
+       PADAPTER                Adapter =  pDM_Odm->Adapter;
+       PMGNT_INFO              pMgntInfo = &(Adapter->MgntInfo);
+       unsigned int            pts, start_point, stop_point, initial_gain ;
+       static u1Byte           PSD_bitmap_memory[80], init_memory = 0;
+       static u1Byte           psd_cnt=0;
+       static u4Byte           PSD_report[80], PSD_report_tmp;
+       static u8Byte           lastTxOkCnt=0, lastRxOkCnt=0;
+       u1Byte                  idx[20]={96,99,102,106,109,112,115,118,122,125,
+                                       0,3,6,10,13,16,19,22,26,29};
+       u1Byte                  n, i, channel, BBReset,tone_idx;
+       u1Byte                  PSD_bitmap[10]/*, SSBT=0*/,initial_gain_psd=0, RSSI_BT=0, initialGainUpper;
+       s4Byte                          PSD_skip_start, PSD_skip_stop;
+       u4Byte                  CurrentChannel, RXIQI, RxIdleLowPwr, wlan_channel;
+       u4Byte                  ReScan, Interval, Is40MHz;
+       u8Byte                  curTxOkCnt, curRxOkCnt;
+       //--------------2G band synthesizer for 92D switch RF channel using----------------- 
+       u1Byte                  group_idx=0;
+       u4Byte                  SYN_RF25=0, SYN_RF26=0, SYN_RF27=0, SYN_RF2B=0, SYN_RF2C=0;
+       u4Byte                  SYN[5] = {0x25, 0x26, 0x27, 0x2B, 0x2C};    // synthesizer RF register for 2G channel
+       u4Byte                  SYN_group[3][5] = {{0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840},     // For CH1,2,4,9,10.11.12   {0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840}
+                                                                           {0x643BC, 0xFC038, 0x07C1A, 0x41289, 0x01840},     // For CH3,13,14
+                                                                           {0x243BC, 0xFC438, 0x07C1A, 0x4128B, 0x0FC41}};   // For Ch5,6,7,8
+       //--------------------- Add by Gary for Debug setting ----------------------
+       u1Byte                 RSSI_BT_new = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB9C, 0xFF);
+       u1Byte                 rssi_ctrl = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB38, 0xFF);
+       //---------------------------------------------------------------------
+       
+       if(pMgntInfo->bScanInProgress)
+       {
+               return;
+       }
+
+       ReScan = PSD_RESCAN;
+       Interval = SCAN_INTERVAL;
+
+
+       //1 Initialization
+       if(init_memory == 0)
+       {
+               RT_TRACE(       ODM_COMP_PSD, DBG_LOUD,("Init memory\n"));
+               for(i = 0; i < 80; i++)
+                       PSD_bitmap_memory[i] = 0xFF; // channel is always good
+               init_memory = 1;
+       }
+       if(psd_cnt == 0)
+       {
+               RT_TRACE(ODM_COMP_PSD, DBG_LOUD,("Enter dm_PSD_Monitor\n"));
+               for(i = 0; i < 80; i++)
+                       PSD_report[i] = 0;
+       }
+
+       //1 Backup Current Settings
+       CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
+       if(pDM_Odm->SupportICType == ODM_RTL8192D)
+       {
+               //2 Record Current synthesizer parameters based on current channel
+               if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
+               {
+                       SYN_RF25 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, bMaskDWord);
+                       SYN_RF26 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, bMaskDWord);
+                       SYN_RF27 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, bMaskDWord);
+                       SYN_RF2B = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, bMaskDWord);
+                       SYN_RF2C = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, bMaskDWord);
+               }
+               else     // DualMAC_DualPHY 2G
+               {
+                       SYN_RF25 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, bMaskDWord);
+                       SYN_RF26 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, bMaskDWord);
+                       SYN_RF27 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, bMaskDWord);
+                       SYN_RF2B = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, bMaskDWord);
+                       SYN_RF2C = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, bMaskDWord);
+               }
+       }
+       RXIQI = ODM_GetBBReg(pDM_Odm, 0xC14, bMaskDWord);
+       RxIdleLowPwr = (ODM_GetBBReg(pDM_Odm, 0x818, bMaskDWord)&BIT28)>>28;
+       Is40MHz = *(pDM_Odm->pBandWidth);
+       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_PSD, DBG_LOUD,("PSD Scan Start\n"));
+       //1 Turn off CCK
+       ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0);
+       //1 Turn off TX
+       //Pause TX Queue
+       ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0xFF);
+       //Force RX to stop TX immediately
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
+       //1 Turn off RX
+       //Rx AGC off  RegC70[0]=0, RegC7C[20]=0
+       ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 0);
+       ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 0);
+       //Turn off CCA
+       ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0);
+       //BB Reset
+       ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 1); //clock gated to prevent from AGC table mess 
+       BBReset = ODM_Read1Byte(pDM_Odm, 0x02);
+       ODM_Write1Byte(pDM_Odm, 0x02, BBReset&(~BIT0));
+       ODM_Write1Byte(pDM_Odm, 0x02, BBReset|BIT0);
+       ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 0);
+       //1 Leave RX idle low power
+       ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0);
+       //1 Fix initial gain
+       RSSI_BT = RSSI_BT_new;
+       RT_TRACE(ODM_COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
+       
+       if(rssi_ctrl == 1)        // just for debug!!
+               initial_gain_psd = RSSI_BT_new; 
+       else
+               initial_gain_psd = pDM_Odm->RSSI_Min;    // PSD report based on RSSI
+       
+       RT_TRACE(ODM_COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
+       
+       initialGainUpper = 0x54;
+       
+       RSSI_BT = initial_gain_psd;
+       //SSBT = RSSI_BT;
+       
+       //RT_TRACE(     ODM_COMP_PSD, DBG_LOUD,("PSD: SSBT= %d\n", SSBT));
+       RT_TRACE(       ODM_COMP_PSD, DBG_LOUD,("PSD: initial gain= 0x%x\n", initial_gain_psd));
+       
+       pDM_Odm->bDMInitialGainEnable = FALSE;          
+       initial_gain = ODM_GetBBReg(pDM_Odm, 0xc50, bMaskDWord) & 0x7F;
+       //ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain_psd); 
+       ODM_Write_DIG(pDM_Odm, initial_gain_psd);
+       //1 Turn off 3-wire
+       ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0xF);
+
+       //pts value = 128, 256, 512, 1024
+       pts = 128;
+
+       if(pts == 128)
+       {
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);
+               start_point = 64;
+               stop_point = 192;
+       }
+       else if(pts == 256)
+       {
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x1);
+               start_point = 128;
+               stop_point = 384;
+       }
+       else if(pts == 512)
+       {
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x2);
+               start_point = 256;
+               stop_point = 768;
+       }
+       else
+       {
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x3);
+               start_point = 512;
+               stop_point = 1536;
+       }
+       
+
+//3 Skip WLAN channels if WLAN busy
+       curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - lastTxOkCnt;
+       curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - lastRxOkCnt;
+       lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
+       lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
+       
+       PSD_skip_start=80;
+       PSD_skip_stop = 0;
+       wlan_channel = CurrentChannel & 0x0f;
+
+       RT_TRACE(ODM_COMP_PSD,DBG_LOUD,("PSD: current channel: %x, BW:%d \n", wlan_channel, Is40MHz));
+       
+       if((curRxOkCnt+curTxOkCnt) > 1000)
+       {
+               PSD_skip_start = (wlan_channel-1)*5 -Is40MHz*10;
+               PSD_skip_stop = PSD_skip_start + (1+Is40MHz)*20;
+       }
+
+       RT_TRACE(ODM_COMP_PSD,DBG_LOUD,("PSD: Skip tone from %d to %d \n", PSD_skip_start, PSD_skip_stop));
+
+       for (n=0;n<80;n++)
+       {
+               if((n%20)==0)
+               {
+                       channel = (n/20)*4 + 1;
+                       if(pDM_Odm->SupportICType == ODM_RTL8192D)
+                       {
+                               switch(channel)
+                               {
+                                       case 1: 
+                                       case 9:
+                                               group_idx = 0;
+                                               break;
+                                       case 5:
+                                               group_idx = 2;
+                                               break;
+                                       case 13:
+                                               group_idx = 1;
+                                               break;
+                               }
+                               if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))   
+               {
+                                       for(i = 0; i < SYN_Length; i++)
+                                               ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, SYN[i], bMaskDWord, SYN_group[group_idx][i]);
+
+                                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
+                                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, channel);
+                               }
+                               else  // DualMAC_DualPHY 2G
+                       {
+                                       for(i = 0; i < SYN_Length; i++)
+                                               ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, SYN[i], bMaskDWord, SYN_group[group_idx][i]);   
+                                       
+                                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
+                               }
+                       }
+                       else
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
+                       }       
+               tone_idx = n%20;
+               if ((n>=PSD_skip_start) && (n<PSD_skip_stop))
+               {       
+                       PSD_report[n] = initial_gain_psd;//SSBT;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD:Tone %d skipped \n", n));
+               }
+               else
+               {
+                       PSD_report_tmp =  GetPSDData(pDM_Odm, idx[tone_idx], initial_gain_psd);
+
+                       if ( PSD_report_tmp > PSD_report[n])
+                               PSD_report[n] = PSD_report_tmp;
+                               
+               }
+       }
+
+       PatchDCTone(pDM_Odm, PSD_report, initial_gain_psd);
+      
+       //----end
+       //1 Turn on RX
+       //Rx AGC on
+       ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 1);
+       ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 1);
+       //CCK on
+       ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1);
+       //1 Turn on TX
+       //Resume TX Queue
+       ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0x00);
+       //Turn on 3-wire
+       ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0x0);
+       //1 Restore Current Settings
+       //Resume DIG
+       pDM_Odm->bDMInitialGainEnable= TRUE;
+       //ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain);
+       ODM_Write_DIG(pDM_Odm,(u1Byte) initial_gain);
+       // restore originl center frequency
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, CurrentChannel);
+       if(pDM_Odm->SupportICType == ODM_RTL8192D)
+       {
+               if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
+               {
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, bMaskDWord, CurrentChannel);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, bMaskDWord, SYN_RF25);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, bMaskDWord, SYN_RF26);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, bMaskDWord, SYN_RF27);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, bMaskDWord, SYN_RF2B);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, bMaskDWord, SYN_RF2C);
+               }
+               else     // DualMAC_DualPHY
+               {
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, bMaskDWord, SYN_RF25);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, bMaskDWord, SYN_RF26);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, bMaskDWord, SYN_RF27);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, bMaskDWord, SYN_RF2B);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, bMaskDWord, SYN_RF2C);
+               }
+       }
+       //Turn on CCA
+       ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, RXIQI);
+       //Restore RX idle low power
+       if(RxIdleLowPwr == TRUE)
+               ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 1);
+       
+       psd_cnt++;
+       //gPrint("psd cnt=%d\n", psd_cnt);
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD:psd_cnt = %d \n",psd_cnt));
+       if (psd_cnt < ReScan)
+       {
+               ODM_SetTimer(pDM_Odm, &pRX_HP_Table->PSDTimer, Interval);  //ms
+       }
+       else
+       {       \r
+               psd_cnt = 0;
+               for(i=0;i<80;i++)
+                       RT_TRACE(       ODM_COMP_PSD, DBG_LOUD,("psd_report[%d]=     %d \n", 2402+i, PSD_report[i]));
+                       //DbgPrint("psd_report[%d]=     %d \n", 2402+i, PSD_report[i]);
+
+               GoodChannelDecision(pDM_Odm, PSD_report, PSD_bitmap,RSSI_BT, PSD_bitmap_memory);
+
+       }\r
+}\r
+\r
+void odm_Write_RXHP(
+       IN              PVOID                   pDM_VOID)\r
+{\r
+       PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       pRXHP_T         pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
+       u4Byte          currentIGI;
+
+       if(pRX_HP_Table->Cur_IGI != pRX_HP_Table->Pre_IGI)
+       {
+               ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
+               ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);    
+       }
+       
+       if(pRX_HP_Table->Cur_pw_th != pRX_HP_Table->Pre_pw_th)
+{
+               ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore2, BIT8|BIT9, pRX_HP_Table->Cur_pw_th);  // RegC54[9:8]=2'b11:  AGC Flow 3
+       }
+
+       if(pRX_HP_Table->RXHP_flag == 0)
+       {
+               pRX_HP_Table->Cur_IGI = 0x20;
+       }
+       else
+       {
+               currentIGI = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0);
+               if(currentIGI<0x50)
+               {
+                       ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
+                       ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);    
+               }
+       }
+       pRX_HP_Table->Pre_IGI = pRX_HP_Table->Cur_IGI;
+       pRX_HP_Table->Pre_pw_th = pRX_HP_Table->Cur_pw_th;
+
+}
+\r
+\r
+void odm_RXHP(
+       IN              PVOID                   pDM_VOID)\r
+{
+#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))
+#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) | (DEV_BUS_TYPE == RT_USB_INTERFACE)\r
+       PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER        Adapter =  pDM_Odm->Adapter;
+       PMGNT_INFO      pMgntInfo = &(Adapter->MgntInfo);
+       pDIG_T          pDM_DigTable = &pDM_Odm->DM_DigTable;
+       pRXHP_T         pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;
+       PFALSE_ALARM_STATISTICS         FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm , PHYDM_FALSEALMCNT);\r
+       
+       u1Byte                  i, j, sum;
+       u1Byte                  Is40MHz;
+       s1Byte                  Intf_diff_idx, MIN_Intf_diff_idx = 16;   
+       s4Byte                  cur_channel;    
+       u1Byte                  ch_map_intf_5M[17] = {0};     
+       static u4Byte           FA_TH = 0;      
+       static u1Byte           psd_intf_flag = 0;
+       static s4Byte           curRssi = 0;                
+       static s4Byte           preRssi = 0;                                                                
+       static u1Byte           PSDTriggerCnt = 1;
+       
+       u1Byte                  RX_HP_enable = (u1Byte)(ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore2, bMaskDWord)>>31);   // for debug!!
+
+#if(DEV_BUS_TYPE == RT_USB_INTERFACE)  
+       static s8Byte           lastTxOkCnt = 0, lastRxOkCnt = 0;  
+       s8Byte                  curTxOkCnt, curRxOkCnt;
+       s8Byte                  curTPOkCnt;
+       s8Byte                  TP_Acc3, TP_Acc5;
+       static s8Byte           TP_Buff[5] = {0};
+       static u1Byte           pre_state = 0, pre_state_flag = 0;
+       static u1Byte           Intf_HighTP_flag = 0, De_counter = 16; 
+       static u1Byte           TP_Degrade_flag = 0;
+#endif    
+       static u1Byte           LatchCnt = 0;
+       
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8188E))
+               return;
+       //AGC RX High Power Mode is only applied on 2G band in 92D!!!
+       if(pDM_Odm->SupportICType == ODM_RTL8192D)
+       {
+               if(*(pDM_Odm->pBandType) != ODM_BAND_2_4G)
+                       return;
+       }
+
+       if(!(pDM_Odm->SupportAbility & ODM_BB_RXHP))
+               return;
+
+
+       //RX HP ON/OFF
+       if(RX_HP_enable == 1)
+               pRX_HP_Table->RXHP_enable = FALSE;
+       else
+               pRX_HP_Table->RXHP_enable = TRUE;
+
+       if(pRX_HP_Table->RXHP_enable == FALSE)
+       {
+               if(pRX_HP_Table->RXHP_flag == 1)
+               {
+                       pRX_HP_Table->RXHP_flag = 0;
+                       psd_intf_flag = 0;
+               }
+               return;
+       }
+
+#if(DEV_BUS_TYPE == RT_USB_INTERFACE)  
+       //2 Record current TP for USB interface
+       curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast)-lastTxOkCnt;
+       curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast)-lastRxOkCnt;
+       lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
+       lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
+
+       curTPOkCnt = curTxOkCnt+curRxOkCnt;
+       TP_Buff[0] = curTPOkCnt;    // current TP  
+       TP_Acc3 = PlatformDivision64((TP_Buff[1]+TP_Buff[2]+TP_Buff[3]), 3);
+       TP_Acc5 = PlatformDivision64((TP_Buff[0]+TP_Buff[1]+TP_Buff[2]+TP_Buff[3]+TP_Buff[4]), 5);
+       
+       if(TP_Acc5 < 1000)
+               pRX_HP_Table->TP_Mode = Idle_Mode;
+       else if((1000 < TP_Acc5)&&(TP_Acc5 < 3750000))
+               pRX_HP_Table->TP_Mode = Low_TP_Mode;
+       else
+               pRX_HP_Table->TP_Mode = High_TP_Mode;
+
+       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP TP Mode = %d\n", pRX_HP_Table->TP_Mode));
+       // Since TP result would be sampled every 2 sec, it needs to delay 4sec to wait PSD processing.
+       // When LatchCnt = 0, we would Get PSD result.
+       if(TP_Degrade_flag == 1)
+       {
+               LatchCnt--;
+               if(LatchCnt == 0)
+               {
+                       TP_Degrade_flag = 0;
+               }
+       }
+       // When PSD function triggered by TP degrade 20%, and Interference Flag = 1
+       // Set a De_counter to wait IGI = upper bound. If time is UP, the Interference flag will be pull down.
+       if(Intf_HighTP_flag == 1)
+       {
+               De_counter--;
+               if(De_counter == 0)
+               {
+                       Intf_HighTP_flag = 0;
+                       psd_intf_flag = 0;
+               }
+       }
+#endif
+
+       //2 AGC RX High Power Mode by PSD only applied to STA Mode
+       //3 NOT applied 1. Ad Hoc Mode.
+       //3 NOT applied 2. AP Mode
+       if ((pMgntInfo->mAssoc) && (!pMgntInfo->mIbss) && (!ACTING_AS_AP(Adapter)))
+       {    
+               Is40MHz = *(pDM_Odm->pBandWidth);
+               curRssi = pDM_Odm->RSSI_Min;
+               cur_channel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x0fff) & 0x0f;
+               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP RX HP flag = %d\n", pRX_HP_Table->RXHP_flag));
+               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP FA = %d\n", FalseAlmCnt->Cnt_all));
+               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP cur RSSI = %d, pre RSSI=%d\n", curRssi, preRssi));
+               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP current CH = %d\n", cur_channel));
+               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP Is 40MHz = %d\n", Is40MHz));
+               //2 PSD function would be triggered 
+               //3 1. Every 4 sec for PCIE
+               //3 2. Before TP Mode (Idle TP<4kbps) for USB
+               //3 3. After TP Mode (High TP) for USB 
+               if((curRssi > 68) && (pRX_HP_Table->RXHP_flag == 0))    // Only RSSI>TH and RX_HP_flag=0 will Do PSD process 
+               {
+#if (DEV_BUS_TYPE == RT_USB_INTERFACE)
+                       //2 Before TP Mode ==> PSD would be trigger every 4 sec
+                       if(pRX_HP_Table->TP_Mode == Idle_Mode)          //2.1 less wlan traffic <4kbps
+                       {
+#endif
+                               if(PSDTriggerCnt == 1)       
+                               {       
+                                       odm_PSD_RXHP(pDM_Odm);
+                                       pRX_HP_Table->PSD_func_trigger = 1;
+                                       PSDTriggerCnt = 0;
+                               }
+                               else
+                               {
+                                       PSDTriggerCnt++;
+                               }
+#if(DEV_BUS_TYPE == RT_USB_INTERFACE)
+                       }       
+                       //2 After TP Mode ==> Check if TP degrade larger than 20% would trigger PSD function
+                       if(pRX_HP_Table->TP_Mode == High_TP_Mode)
+                       {
+                               if((pre_state_flag == 0)&&(LatchCnt == 0)) 
+                               {
+                                       // TP var < 5%
+                                       if((((curTPOkCnt-TP_Acc3)*20)<(TP_Acc3))&&(((curTPOkCnt-TP_Acc3)*20)>(-TP_Acc3)))
+                                       {
+                                               pre_state++;
+                                               if(pre_state == 3)      // hit pre_state condition => consecutive 3 times
+                                               {
+                                                       pre_state_flag = 1;
+                                                       pre_state = 0;
+                                               }
+
+                                       }
+                                       else
+                                       {
+                                               pre_state = 0;
+                                       }
+                               }
+                               //3 If pre_state_flag=1 ==> start to monitor TP degrade 20%
+                               if(pre_state_flag == 1)         
+                               {
+                                       if(((TP_Acc3-curTPOkCnt)*5)>(TP_Acc3))      // degrade 20%
+                                       {
+                                               odm_PSD_RXHP(pDM_Odm);
+                                               pRX_HP_Table->PSD_func_trigger = 1;
+                                               TP_Degrade_flag = 1;
+                                               LatchCnt = 2;
+                                               pre_state_flag = 0;
+                                       }
+                                       else if(((TP_Buff[2]-curTPOkCnt)*5)>TP_Buff[2])
+                                       {
+                                               odm_PSD_RXHP(pDM_Odm);
+                                               pRX_HP_Table->PSD_func_trigger = 1;
+                                               TP_Degrade_flag = 1;
+                                               LatchCnt = 2;
+                                               pre_state_flag = 0;
+                                       }
+                                       else if(((TP_Buff[3]-curTPOkCnt)*5)>TP_Buff[3])
+                                       {
+                                               odm_PSD_RXHP(pDM_Odm);
+                                               pRX_HP_Table->PSD_func_trigger = 1;
+                                               TP_Degrade_flag = 1;
+                                               LatchCnt = 2;
+                                               pre_state_flag = 0;
+                                       }
+                               }
+                       }
+#endif
+}
+
+#if (DEV_BUS_TYPE == RT_USB_INTERFACE)
+               for (i=0;i<4;i++)
+               {
+                       TP_Buff[4-i] = TP_Buff[3-i];
+               }
+#endif
+               //2 Update PSD bitmap according to PSD report 
+               if((pRX_HP_Table->PSD_func_trigger == 1)&&(LatchCnt == 0))
+               {       
+                       //2 Separate 80M bandwidth into 16 group with smaller 5M BW.
+                       for (i = 0 ; i < 16 ; i++)
+                       {
+                               sum = 0;
+                               for(j = 0; j < 5 ; j++)
+                                       sum += pRX_HP_Table->PSD_bitmap_RXHP[5*i + j];
+            
+                               if(sum < 5)
+                               {
+                                       ch_map_intf_5M[i] = 1;  // interference flag
+                               }
+                       }
+                       //=============just for debug=========================
+                       //for(i=0;i<16;i++)
+                               //DbgPrint("RX HP: ch_map_intf_5M[%d] = %d\n", i, ch_map_intf_5M[i]);
+                       //===============================================
+                       //2 Mask target channel 5M index
+                       for(i = 0; i < (4+4*Is40MHz) ; i++)
+                       {
+                               ch_map_intf_5M[cur_channel - (1+2*Is40MHz) + i] = 0;  
+                       }
+                               
+                       psd_intf_flag = 0;
+                       for(i = 0; i < 16; i++)
+                       {
+                               if(ch_map_intf_5M[i] == 1)
+                       {
+                               psd_intf_flag = 1;            // interference is detected!!!    
+                               break;
+                               }
+                       }
+                               
+#if (DEV_BUS_TYPE == RT_USB_INTERFACE)
+                       if(pRX_HP_Table->TP_Mode!=Idle_Mode)
+                       {
+                               if(psd_intf_flag == 1)     // to avoid psd_intf_flag always 1
+                               {
+                                       Intf_HighTP_flag = 1;
+                                       De_counter = 32;     // 0x1E -> 0x3E needs 32 times by each IGI step =1
+                               }
+                       }
+#endif
+                       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP psd_intf_flag = %d\n", psd_intf_flag));
+                       //2 Distance between target channel and interference
+                       for(i = 0; i < 16; i++)
+                       {
+                               if(ch_map_intf_5M[i] == 1)
+                               {
+                                       Intf_diff_idx = ((cur_channel+Is40MHz-(i+1))>0) ? (s1Byte)(cur_channel-2*Is40MHz-(i-2)) : (s1Byte)((i+1)-(cur_channel+2*Is40MHz));  
+                               if(Intf_diff_idx < MIN_Intf_diff_idx)
+                                               MIN_Intf_diff_idx = Intf_diff_idx;    // the min difference index between interference and target
+                               }
+                       }
+                       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP MIN_Intf_diff_idx = %d\n", MIN_Intf_diff_idx)); 
+                       //2 Choose False Alarm Threshold
+                       switch (MIN_Intf_diff_idx){
+                               case 0: 
+                               case 1:
+                               case 2:
+                               case 3:          
+                                       FA_TH = FA_RXHP_TH1;  
+                               break;
+                               case 4:                         // CH5
+                               case 5:                         // CH6
+                                       FA_TH = FA_RXHP_TH2;    
+                                       break;
+                               case 6:                         // CH7
+                               case 7:                         // CH8
+                                       FA_TH = FA_RXHP_TH3;
+                                       break; 
+                               case 8:                         // CH9
+                               case 9:                         //CH10
+                                       FA_TH = FA_RXHP_TH4;
+                                       break;  
+                               case 10:
+                               case 11:
+                               case 12:
+                               case 13:         
+                               case 14:
+                               case 15:                
+                                       FA_TH = FA_RXHP_TH5;
+                                       break;                  
+                       }       
+                       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP FA_TH = %d\n", FA_TH));
+                       pRX_HP_Table->PSD_func_trigger = 0;
+               }
+               //1 Monitor RSSI variation to choose the suitable IGI or Exit AGC RX High Power Mode
+               if(pRX_HP_Table->RXHP_flag == 1)
+               {
+               if ((curRssi > 80)&&(preRssi < 80))
+               { 
+                               pRX_HP_Table->Cur_IGI = LNA_Low_Gain_1;
+               }
+               else if ((curRssi < 80)&&(preRssi > 80))
+               {
+                               pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
+                       }
+               else if ((curRssi > 72)&&(preRssi < 72))
+                       {
+                               pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
+               }
+               else if ((curRssi < 72)&&( preRssi > 72))
+                       {
+                               pRX_HP_Table->Cur_IGI = LNA_Low_Gain_3;
+               }
+               else if (curRssi < 68)           //RSSI is NOT large enough!!==> Exit AGC RX High Power Mode
+               {
+                               pRX_HP_Table->Cur_pw_th = pw_th_10dB;
+                               pRX_HP_Table->RXHP_flag = 0;    // Back to Normal DIG Mode                
+                               psd_intf_flag = 0;
+                       }
+               }
+               else    // pRX_HP_Table->RXHP_flag == 0
+               {
+                       //1 Decide whether to enter AGC RX High Power Mode
+                       if ((curRssi > 70) && (psd_intf_flag == 1) && (FalseAlmCnt->Cnt_all > FA_TH) &&  
+                               (pDM_DigTable->CurIGValue == pDM_DigTable->rx_gain_range_max))
+                       {
+                               if (curRssi > 80)
+                               {
+                                       pRX_HP_Table->Cur_IGI = LNA_Low_Gain_1;
+                               }
+                               else if (curRssi > 72) 
+                       {
+                                       pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
+                               }
+                               else
+                               {
+                                       pRX_HP_Table->Cur_IGI = LNA_Low_Gain_3;
+                               }
+                               pRX_HP_Table->Cur_pw_th = pw_th_16dB;           //RegC54[9:8]=2'b11: to enter AGC Flow 3
+                               pRX_HP_Table->First_time_enter = TRUE;
+                               pRX_HP_Table->RXHP_flag = 1;    //      RXHP_flag=1: AGC RX High Power Mode, RXHP_flag=0: Normal DIG Mode
+                       }
+               }
+               preRssi = curRssi; 
+               odm_Write_RXHP(pDM_Odm);        
+       }
+#endif //#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))
+#endif //#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) | (DEV_BUS_TYPE == RT_USB_INTERFACE)
+}\r
+\r
+
+VOID
+odm_PSD_RXHPCallback(
+       PRT_TIMER               pTimer
+)
+{\r
+       PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+       pRXHP_T                 pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;
+       
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+       #if USE_WORKITEM
+       ODM_ScheduleWorkItem(&pRX_HP_Table->PSDTimeWorkitem);
+       #else
+       odm_PSD_RXHP(pDM_Odm);
+       #endif
+#else
+       ODM_ScheduleWorkItem(&pRX_HP_Table->PSDTimeWorkitem);
+#endif
+       
+       }
+
+VOID
+odm_PSD_RXHPWorkitemCallback(
+    IN PVOID            pContext
+    )
+{
+       PADAPTER        pAdapter = (PADAPTER)pContext;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+       
+       odm_PSD_RXHP(pDM_Odm);
+}
+
+#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+\r
+\r
\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RXHP.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RXHP.h
new file mode 100755 (executable)
index 0000000..ef07bba
--- /dev/null
@@ -0,0 +1,105 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+#ifndef        __PHYDMRXHP_H__\r
+#define    __PHYDMRXHP_H__\r
+\r
+#define RXHP_VERSION   "1.0"\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+\r
+#define        AFH_PSD         1       //0:normal PSD scan, 1: only do 20 pts PSD\r
+#define        MODE_40M                0       //0:20M, 1:40M\r
+#define        PSD_TH2         3  \r
+#define        PSD_CHMIN               20   // Minimum channel number for BT AFH\r
+#define        SIR_STEP_SIZE   3\r
+#define   Smooth_Size_1        5\r
+#define        Smooth_TH_1     3\r
+#define   Smooth_Size_2        10\r
+#define        Smooth_TH_2     4\r
+#define   Smooth_Size_3        20\r
+#define        Smooth_TH_3     4\r
+#define   Smooth_Step_Size 5\r
+#define        Adaptive_SIR    1\r
+#define        PSD_RESCAN              4\r
+#define        PSD_SCAN_INTERVAL       700 //ms\r
+\r
+typedef struct _RX_High_Power_\r
+{\r
+       u1Byte          RXHP_flag;\r
+       u1Byte          PSD_func_trigger;\r
+       u1Byte          PSD_bitmap_RXHP[80];\r
+       u1Byte          Pre_IGI;\r
+       u1Byte          Cur_IGI;\r
+       u1Byte          Pre_pw_th;\r
+       u1Byte          Cur_pw_th;\r
+       BOOLEAN         First_time_enter;\r
+       BOOLEAN         RXHP_enable;\r
+       u1Byte          TP_Mode;\r
+       RT_TIMER        PSDTimer;\r
+       #if USE_WORKITEM\r
+       RT_WORK_ITEM            PSDTimeWorkitem;\r
+       #endif\r
+}RXHP_T, *pRXHP_T;\r
+\r
+#define        dm_PSDMonitorCallback   odm_PSDMonitorCallback\r
+VOID   odm_PSDMonitorCallback(PRT_TIMER                pTimer);\r
+\r
+VOID
+odm_PSDMonitorInit(
+       IN              PVOID                   pDM_VOID\r
+       );\r
+\r
+void   odm_RXHPInit(
+       IN              PVOID                   pDM_VOID);\r
+\r
+void odm_RXHP(
+       IN              PVOID                   pDM_VOID);\r
+\r
+VOID
+odm_PSD_RXHPCallback(
+       PRT_TIMER               pTimer
+);\r
+\r
+ VOID\r
+ODM_PSDDbgControl(
+       IN      PADAPTER        Adapter,
+       IN      u4Byte          mode,
+       IN      u4Byte          btRssi
+       );\r
+\r
+ VOID\r
+odm_PSD_RXHPCallback(
+       PRT_TIMER               pTimer
+);\r
+\r
+VOID
+odm_PSD_RXHPWorkitemCallback(
+    IN PVOID            pContext
+    );\r
+\r
+VOID
+odm_PSDMonitorWorkItemCallback(
+    IN PVOID            pContext
+    );\r
+\r
+ #endif\r
+\r
+ #endif\r
\ No newline at end of file
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RaInfo.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RaInfo.c
new file mode 100755 (executable)
index 0000000..0e78737
--- /dev/null
@@ -0,0 +1,1595 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+#include "Mp_Precomp.h"\r
+#include "phydm_precomp.h"\r
+\r
+\r
+VOID\r
+odm_RSSIMonitorInit(\r
+       IN              PVOID           pDM_VOID\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       pRA_T           pRA_Table = &pDM_Odm->DM_RA_Table;\r
+       pRA_Table->firstconnect = FALSE;\r
+       \r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN))\r
+       pRA_Table->PT_collision_pre = TRUE;   //used in ODM_DynamicARFBSelect(WIN only)\r
+#endif \r
+#endif\r
+}\r
+\r
+\r
+VOID\r
+odm_RSSIMonitorCheck(\r
+       IN              PVOID           pDM_VOID\r
+       )\r
+{\r
+       // \r
+       // For AP/ADSL use prtl8192cd_priv\r
+       // For CE/NIC use PADAPTER\r
+       //\r
+PDM_ODM_T              pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))\r
+               return;\r
+       \r
+       //\r
+       // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\r
+       // at the same time. In the stage2/3, we need to prive universal interface and merge all\r
+       // HW dynamic mechanism.\r
+       //\r
+       switch  (pDM_Odm->SupportPlatform)\r
+       {\r
+               case    ODM_WIN:\r
+                       odm_RSSIMonitorCheckMP(pDM_Odm);\r
+                       break;\r
+\r
+               case    ODM_CE:\r
+                       odm_RSSIMonitorCheckCE(pDM_Odm);\r
+                       break;\r
+\r
+               case    ODM_AP:\r
+                       odm_RSSIMonitorCheckAP(pDM_Odm);\r
+                       break;          \r
+\r
+               case    ODM_ADSL:\r
+                       //odm_DIGAP(pDM_Odm);\r
+                       break;  \r
+       }\r
+       \r
+}      // odm_RSSIMonitorCheck\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+VOID\r
+odm_RSSIDumpToRegister(\r
+       IN      PVOID   pDM_VOID\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+\r
+       if(pDM_Odm->SupportICType == ODM_RTL8812)\r
+       {\r
+               PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[0]);\r
+               PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[1]);\r
+\r
+               // Rx EVM\r
+               PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[0]);\r
+               PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[1]);\r
+\r
+               // Rx SNR\r
+               PlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));\r
+               PlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));\r
+\r
+               // Rx Cfo_Short\r
+               PlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[0]);\r
+               PlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[1]);\r
+\r
+               // Rx Cfo_Tail\r
+               PlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[0]);\r
+               PlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[1]);\r
+       }\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8192E)\r
+       {\r
+               PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[0]);\r
+               PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[1]);\r
+               // Rx EVM\r
+               PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[0]);\r
+               PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[1]);\r
+               // Rx SNR\r
+               PlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));\r
+               PlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));\r
+               // Rx Cfo_Short\r
+               PlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[0]);\r
+               PlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[1]);\r
+               // Rx Cfo_Tail\r
+               PlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[0]);\r
+               PlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[1]);\r
+        }\r
+}\r
+#endif\r
+\r
+VOID\r
+odm_RSSIMonitorCheckMP(\r
+       IN      PVOID   pDM_VOID\r
+       )\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
+       PRT_WLAN_STA    pEntry = NULL;\r
+       u1Byte                  i;\r
+       s4Byte                  tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff;\r
+       u1Byte                  H2C_Parameter[4] ={0};\r
+       PMGNT_INFO              pMgntInfo = &Adapter->MgntInfo;\r
+       PMGNT_INFO              pDefaultMgntInfo = &Adapter->MgntInfo;\r
+       u8Byte                  curTxOkCnt = 0, curRxOkCnt = 0; \r
+       u1Byte                  STBC_TX = 0;\r
+       BOOLEAN                 FirstConnect;                                                    \r
+       pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table; \r
+       pDIG_T                  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
+\r
+#if (BEAMFORMING_SUPPORT == 1) \r
+       BEAMFORMING_CAP Beamform_cap = BEAMFORMING_CAP_NONE;\r
+       u1Byte                  TxBF_EN = 0;\r
+#endif\r
+\r
+       PADAPTER        pLoopAdapter = GetDefaultAdapter(Adapter);\r
+\r
+       BOOLEAN         bExtRAInfo = FALSE;\r
+\r
+       if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821 || pDM_Odm->SupportICType == ODM_RTL8723B)\r
+               bExtRAInfo = TRUE;\r
+\r
+       FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);\r
+       pRA_Table->firstconnect = pHalData->bLinked;                                               \r
+       H2C_Parameter[3] |= FirstConnect << 5;\r
+\r
+       if(pDM_Odm->SupportICType == ODM_RTL8188E && (pDefaultMgntInfo->CustomerID==RT_CID_819x_HP))\r
+       {\r
+               if(curRxOkCnt >(curTxOkCnt*6))\r
+                       PlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0x8f015);\r
+               else\r
+                       PlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0xff015);\r
+       }       \r
+\r
+       if(pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821)\r
+       {\r
+               if(curRxOkCnt >(curTxOkCnt*6))\r
+                       H2C_Parameter[3]=0x01;\r
+               else\r
+                       H2C_Parameter[3]=0x00;\r
+       }\r
+\r
+       while(pLoopAdapter)\r
+       {               \r
+       \r
+               if(pLoopAdapter != NULL){\r
+                       pMgntInfo = &pLoopAdapter->MgntInfo;                    \r
+                       curTxOkCnt = pLoopAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;\r
+                       curRxOkCnt = pLoopAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;\r
+                       pMgntInfo->lastTxOkCnt = curTxOkCnt;\r
+                       pMgntInfo->lastRxOkCnt = curRxOkCnt;                    \r
+               }\r
+\r
+               for(i = 0; i < ASSOCIATE_ENTRY_NUM; i++)\r
+               {\r
+               \r
+                       if(IsAPModeExist(pLoopAdapter))\r
+                       {\r
+                               if(GetFirstExtAdapter(pLoopAdapter) != NULL && \r
+                                       GetFirstExtAdapter(pLoopAdapter) == pLoopAdapter){      \r
+                                       pEntry = AsocEntry_EnumStation(pLoopAdapter, i);                \r
+                               }\r
+                               else if(GetFirstGOPort(pLoopAdapter) != NULL && \r
+                                       IsFirstGoAdapter(pLoopAdapter)){\r
+                                       pEntry = AsocEntry_EnumStation(pLoopAdapter, i);                                                \r
+                               }                               \r
+                       }\r
+                       else\r
+                       {\r
+                                       if(GetDefaultAdapter(pLoopAdapter) == pLoopAdapter){\r
+                                               pEntry = AsocEntry_EnumStation(pLoopAdapter, i);                                        \r
+                                       }\r
+                       }\r
+\r
+               if(pEntry != NULL)\r
+               {\r
+                       if(pEntry->bAssociated)\r
+                       {\r
+                       \r
+                               RT_DISP_ADDR(FDM, DM_PWDB, ("pEntry->MacAddr ="), pEntry->MacAddr);\r
+                               RT_DISP(FDM, DM_PWDB, ("pEntry->rssi = 0x%x(%d)\n", \r
+                                       pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->rssi_stat.UndecoratedSmoothedPWDB));\r
+\r
+                               if(bExtRAInfo)\r
+                               {\r
+\r
+#if (BEAMFORMING_SUPPORT == 1)\r
+                                       Beamform_cap = Beamforming_GetEntryBeamCapByMacId(Adapter, pEntry->AssociatedMacId);\r
+                                       if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))\r
+                                               TxBF_EN = 1;\r
+                                       else\r
+                                               TxBF_EN = 0;\r
+       \r
+                                       H2C_Parameter[3] |= TxBF_EN << 6; \r
+                                       \r
+                                       if(TxBF_EN)\r
+                                               STBC_TX = 0;\r
+                                       else\r
+#endif\r
+                                       {\r
+                                               if(IS_WIRELESS_MODE_AC(Adapter))\r
+                                                       STBC_TX = TEST_FLAG(pEntry->VHTInfo.STBC, STBC_VHT_ENABLE_TX);\r
+                                               else\r
+                                                       STBC_TX = TEST_FLAG(pEntry->HTInfo.STBC, STBC_HT_ENABLE_TX);\r
+                                       }\r
+\r
+                                       H2C_Parameter[3] |= STBC_TX << 1;\r
+                               }\r
+\r
+                               if(pEntry->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)\r
+                                       tmpEntryMinPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;\r
+                               if(pEntry->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)\r
+                                       tmpEntryMaxPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;\r
+\r
+                               H2C_Parameter[2] = (u1Byte)(pEntry->rssi_stat.UndecoratedSmoothedPWDB & 0xFF);\r
+                               H2C_Parameter[1] = 0x20;   // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1\r
+                               H2C_Parameter[0] = (pEntry->AssociatedMacId);\r
+                               if(bExtRAInfo)\r
+                                       ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);\r
+                               else\r
+                                       ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       break;\r
+               }\r
+       }\r
+\r
+               pLoopAdapter = GetNextExtAdapter(pLoopAdapter);\r
+       }\r
+\r
+       if(tmpEntryMaxPWDB != 0)        // If associated entry is found\r
+       {\r
+               pHalData->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;\r
+               RT_DISP(FDM, DM_PWDB, ("EntryMaxPWDB = 0x%x(%d)\n",     tmpEntryMaxPWDB, tmpEntryMaxPWDB));\r
+       }\r
+       else\r
+       {\r
+               pHalData->EntryMaxUndecoratedSmoothedPWDB = 0;\r
+       }\r
+       \r
+       if(tmpEntryMinPWDB != 0xff) // If associated entry is found\r
+       {\r
+               pHalData->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;\r
+               RT_DISP(FDM, DM_PWDB, ("EntryMinPWDB = 0x%x(%d)\n", tmpEntryMinPWDB, tmpEntryMinPWDB));\r
+\r
+       }\r
+       else\r
+       {\r
+               pHalData->EntryMinUndecoratedSmoothedPWDB = 0;\r
+       }\r
+\r
+       // Indicate Rx signal strength to FW.\r
+       if(pHalData->bUseRAMask)\r
+       {\r
+               if(bExtRAInfo)\r
+               {\r
+                       PRT_HIGH_THROUGHPUT             pHTInfo = GET_HT_INFO(pDefaultMgntInfo);\r
+                       PRT_VERY_HIGH_THROUGHPUT        pVHTInfo = GET_VHT_INFO(pDefaultMgntInfo);\r
+\r
+#if (BEAMFORMING_SUPPORT == 1)\r
+                       \r
+                       Beamform_cap = Beamforming_GetEntryBeamCapByMacId(Adapter, pDefaultMgntInfo->mMacId);\r
+\r
+                       if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))\r
+                               TxBF_EN = 1;\r
+                       else\r
+                               TxBF_EN = 0;\r
+\r
+                       H2C_Parameter[3] |= TxBF_EN << 6; \r
+\r
+                       if(TxBF_EN)\r
+                               STBC_TX = 0;\r
+                       else\r
+#endif\r
+                       {\r
+                               if(IS_WIRELESS_MODE_AC(Adapter))\r
+                                       STBC_TX = TEST_FLAG(pVHTInfo->VhtCurStbc, STBC_VHT_ENABLE_TX);\r
+                               else\r
+                                       STBC_TX = TEST_FLAG(pHTInfo->HtCurStbc, STBC_HT_ENABLE_TX);\r
+                       }\r
+\r
+                       H2C_Parameter[3] |= STBC_TX << 1;\r
+               }\r
+               \r
+               H2C_Parameter[2] = (u1Byte)(pHalData->UndecoratedSmoothedPWDB & 0xFF);\r
+               H2C_Parameter[1] = 0x20;        // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1\r
+               H2C_Parameter[0] = 0;           // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1\r
+               if(bExtRAInfo)\r
+                       ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);\r
+               else\r
+                       ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter);\r
+               \r
+               // BT 3.0 HS mode Rssi\r
+               if(pDM_Odm->bBtHsOperation)\r
+               {\r
+                       H2C_Parameter[2] = pDM_Odm->btHsRssi;\r
+                       H2C_Parameter[1] = 0x0;\r
+                       H2C_Parameter[0] = 2;\r
+                       if(bExtRAInfo)\r
+                               ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);\r
+                       else    \r
+                               ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               PlatformEFIOWrite1Byte(Adapter, 0x4fe, (u1Byte)pHalData->UndecoratedSmoothedPWDB);\r
+       }\r
+\r
+       if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8192E))\r
+               odm_RSSIDumpToRegister(pDM_Odm);\r
+               \r
+\r
+       {\r
+               PADAPTER pLoopAdapter = GetDefaultAdapter(Adapter);\r
+               s4Byte  GlobalRSSI_min = 0xFF, LocalRSSI_Min;\r
+               BOOLEAN         bLink= FALSE;\r
+               \r
+               while(pLoopAdapter)\r
+               {\r
+                       LocalRSSI_Min = odm_FindMinimumRSSI(pLoopAdapter);\r
+                       //DbgPrint("pHalData->bLinked=%d, LocalRSSI_Min=%d\n", pHalData->bLinked, LocalRSSI_Min);\r
+                       if((LocalRSSI_Min < GlobalRSSI_min) && (LocalRSSI_Min != 0))\r
+                               GlobalRSSI_min = LocalRSSI_Min;                 \r
+                       \r
+                       if(pHalData->bLinked)\r
+                               bLink = TRUE;\r
+                       \r
+                       pLoopAdapter = GetNextExtAdapter(pLoopAdapter);\r
+               }\r
+\r
+               pHalData->bLinked = bLink;\r
+               ODM_CmnInfoUpdate(&pHalData->DM_OutSrc ,ODM_CMNINFO_LINK, (u8Byte)bLink);\r
+               ODM_CmnInfoUpdate(&pHalData->DM_OutSrc ,ODM_CMNINFO_RSSI_MIN, (u8Byte)GlobalRSSI_min);\r
+               \r
+       }\r
+       \r
+#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+}\r
+\r
+#if(DM_ODM_SUPPORT_TYPE==ODM_CE)\r
+//\r
+//sherry move from DUSC to here 20110517\r
+//\r
+static VOID\r
+FindMinimumRSSI_Dmsp(\r
+       IN      PADAPTER        pAdapter\r
+)\r
+{\r
+#if 0\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
+       s32     Rssi_val_min_back_for_mac0;\r
+       BOOLEAN         bGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(pAdapter);\r
+       BOOLEAN         bRestoreRssi = _FALSE;\r
+       PADAPTER        BuddyAdapter = pAdapter->BuddyAdapter;\r
+\r
+       if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)\r
+       {\r
+               if(BuddyAdapter!= NULL)\r
+               {\r
+                       if(pHalData->bSlaveOfDMSP)\r
+                       {\r
+                               //ODM_RT_TRACE(pDM_Odm,COMP_EASY_CONCURRENT,DBG_LOUD,("bSlavecase of dmsp\n"));\r
+                               BuddyAdapter->DualMacDMSPControl.RssiValMinForAnotherMacOfDMSP = pdmpriv->MinUndecoratedPWDBForDM;\r
+                       }\r
+                       else\r
+                       {\r
+                               if(bGetValueFromBuddyAdapter)\r
+                               {\r
+                                       //ODM_RT_TRACE(pDM_Odm,COMP_EASY_CONCURRENT,DBG_LOUD,("get new RSSI\n"));\r
+                                       bRestoreRssi = _TRUE;\r
+                                       Rssi_val_min_back_for_mac0 = pdmpriv->MinUndecoratedPWDBForDM;\r
+                                       pdmpriv->MinUndecoratedPWDBForDM = pAdapter->DualMacDMSPControl.RssiValMinForAnotherMacOfDMSP;\r
+                               }\r
+                       }\r
+               }\r
+               \r
+       }\r
+\r
+       if(bRestoreRssi)\r
+       {\r
+               bRestoreRssi = _FALSE;\r
+               pdmpriv->MinUndecoratedPWDBForDM = Rssi_val_min_back_for_mac0;\r
+       }\r
+#endif\r
+}\r
+\r
+static void\r
+FindMinimumRSSI(\r
+IN     PADAPTER        pAdapter\r
+       )\r
+{      \r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;   \r
+       PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);\r
+\r
+       //1 1.Determine the minimum RSSI \r
+\r
+       if((pDM_Odm->bLinked != _TRUE) &&\r
+               (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))\r
+       {\r
+               pdmpriv->MinUndecoratedPWDBForDM = 0;\r
+               //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any \n"));\r
+       }\r
+       else\r
+       {\r
+               pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;\r
+       }\r
+\r
+       //DBG_8192C("%s=>MinUndecoratedPWDBForDM(%d)\n",__FUNCTION__,pdmpriv->MinUndecoratedPWDBForDM);\r
+       //ODM_RT_TRACE(pDM_Odm,COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n",pHalData->MinUndecoratedPWDBForDM));\r
+}\r
+#endif\r
+\r
+VOID\r
+odm_RSSIMonitorCheckCE(\r
+       IN              PVOID           pDM_VOID\r
+       )\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER        Adapter = pDM_Odm->Adapter;\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
+       struct dvobj_priv       *pdvobjpriv = adapter_to_dvobj(Adapter);\r
+       int     i;\r
+       int     tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff;\r
+       u8      sta_cnt=0;\r
+       u32     UL_DL_STATE = 0, STBC_TX = 0, TxBF_EN = 0;\r
+       u32     PWDB_rssi[NUM_STA]={0};//[0~15]:MACID, [16~31]:PWDB_rssi\r
+       BOOLEAN                 FirstConnect = FALSE;\r
+       pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
+\r
+       if(pDM_Odm->bLinked != _TRUE)\r
+               return;\r
+\r
+       #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))\r
+       if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))\r
+       {\r
+               u64     curTxOkCnt = pdvobjpriv->traffic_stat.cur_tx_bytes;\r
+               u64     curRxOkCnt = pdvobjpriv->traffic_stat.cur_rx_bytes;\r
+\r
+               if(curRxOkCnt >(curTxOkCnt*6))\r
+                       UL_DL_STATE = 1;\r
+               else\r
+                       UL_DL_STATE = 0;\r
+       }\r
+       #endif\r
+\r
+       FirstConnect = (pDM_Odm->bLinked) && (pRA_Table->firstconnect == FALSE);    \r
+       pRA_Table->firstconnect = pDM_Odm->bLinked;\r
+\r
+       //if(check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)\r
+       {\r
+               #if 1\r
+               struct sta_info *psta;\r
+               \r
+               for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {\r
+                       if (IS_STA_VALID(psta = pDM_Odm->pODM_StaInfo[i]))\r
+                       {\r
+                                       if(IS_MCAST( psta->hwaddr))  //if(psta->mac_id ==1)\r
+                                                continue;\r
+                                                               \r
+                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB == (-1))\r
+                                                continue;\r
+                                                               \r
+                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)\r
+                                               tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;\r
+\r
+                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)\r
+                                               tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;\r
+\r
+                                       #if 0\r
+                                       DBG_871X("%s mac_id:%u, mac:"MAC_FMT", rssi:%d\n", __func__,\r
+                                               psta->mac_id, MAC_ARG(psta->hwaddr), psta->rssi_stat.UndecoratedSmoothedPWDB);\r
+                                       #endif\r
+\r
+                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)) {\r
+\r
+#ifdef CONFIG_80211N_HT\r
+                                               if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812)\r
+                                               {\r
+#ifdef CONFIG_BEAMFORMING\r
+                                                       BEAMFORMING_CAP Beamform_cap = beamforming_get_entry_beam_cap_by_mac_id(&Adapter->mlmepriv, psta->mac_id);\r
+\r
+                                                       if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))\r
+                                                               TxBF_EN = 1;\r
+                                                       else\r
+                                                               TxBF_EN = 0;\r
+\r
+                                                       if (TxBF_EN) {\r
+                                                               STBC_TX = 0;\r
+                                                       }\r
+                                                       else\r
+#endif\r
+                                                       {\r
+#ifdef CONFIG_80211AC_VHT\r
+                                                               if(IsSupportedVHT(psta->wireless_mode))\r
+                                                                       STBC_TX = TEST_FLAG(psta->vhtpriv.stbc_cap, STBC_VHT_ENABLE_TX);\r
+                                                               else    \r
+#endif\r
+                                                                       STBC_TX = TEST_FLAG(psta->htpriv.stbc_cap, STBC_HT_ENABLE_TX);\r
+                                                       }\r
+                                               }\r
+#endif\r
+\r
+                                               if(pDM_Odm->SupportICType == ODM_RTL8192D)\r
+                                                       PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) | ((Adapter->stapriv.asoc_sta_count+1) << 8));\r
+                                               else if ((pDM_Odm->SupportICType == ODM_RTL8192E)||(pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))\r
+                                                       PWDB_rssi[sta_cnt++] = (((u8)(psta->mac_id&0xFF)) | ((psta->rssi_stat.UndecoratedSmoothedPWDB&0x7F)<<16) |(STBC_TX << 25) | (FirstConnect << 29) | (TxBF_EN << 30));\r
+                                               else\r
+                                                       PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );\r
+                                       }\r
+                       }\r
+               }\r
+               #else\r
+               _irqL irqL;\r
+               _list   *plist, *phead;\r
+               struct sta_info *psta;\r
+               struct sta_priv *pstapriv = &Adapter->stapriv;\r
+               u8 bcast_addr[ETH_ALEN]= {0xff,0xff,0xff,0xff,0xff,0xff};\r
+\r
+               _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\r
+\r
+               for(i=0; i< NUM_STA; i++)\r
+               {\r
+                       phead = &(pstapriv->sta_hash[i]);\r
+                       plist = get_next(phead);\r
+               \r
+                       while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\r
+                       {\r
+                               psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);\r
+\r
+                               plist = get_next(plist);\r
+\r
+                               if(_rtw_memcmp(psta->hwaddr, bcast_addr, ETH_ALEN) || \r
+                                       _rtw_memcmp(psta->hwaddr, myid(&Adapter->eeprompriv), ETH_ALEN))\r
+                                       continue;\r
+\r
+                               if(psta->state & WIFI_ASOC_STATE)\r
+                               {\r
+                                       \r
+                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)\r
+                                               tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;\r
+\r
+                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)\r
+                                               tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;\r
+\r
+                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)){\r
+                                               //printk("%s==> mac_id(%d),rssi(%d)\n",__FUNCTION__,psta->mac_id,psta->rssi_stat.UndecoratedSmoothedPWDB);\r
+                                               #if(RTL8192D_SUPPORT==1)\r
+                                               PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) | ((Adapter->stapriv.asoc_sta_count+1) << 8));\r
+                                               #else\r
+                                               PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );\r
+                                               #endif\r
+                                       }\r
+                               }\r
+                       \r
+                       }\r
+\r
+               }\r
+       \r
+               _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\r
+               #endif\r
+\r
+               //printk("%s==> sta_cnt(%d)\n",__FUNCTION__,sta_cnt);\r
+\r
+               for(i=0; i< sta_cnt; i++)\r
+               {\r
+                       if(PWDB_rssi[i] != (0)){\r
+                               if(pHalData->fw_ractrl == _TRUE)// Report every sta's RSSI to FW\r
+                               {\r
+                                       #if(RTL8192D_SUPPORT==1)\r
+                                       if(pDM_Odm->SupportICType == ODM_RTL8192D){\r
+                                               FillH2CCmd92D(Adapter, H2C_RSSI_REPORT, 3, (u8 *)(&PWDB_rssi[i]));              \r
+                                       }\r
+                                       #endif\r
+                                       \r
+                                       #if((RTL8192C_SUPPORT==1)||(RTL8723A_SUPPORT==1))\r
+                                       if((pDM_Odm->SupportICType == ODM_RTL8192C)||(pDM_Odm->SupportICType == ODM_RTL8723A)){\r
+                                               rtl8192c_set_rssi_cmd(Adapter, (u8*)&PWDB_rssi[i]);\r
+                                       }\r
+                                       #endif\r
+                                       \r
+                                       #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))\r
+                                       if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821)){   \r
+                                               PWDB_rssi[i] |= (UL_DL_STATE << 24);\r
+                                               rtl8812_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));\r
+                                       }\r
+                                       #endif\r
+                                       #if(RTL8192E_SUPPORT==1)\r
+                                       if(pDM_Odm->SupportICType == ODM_RTL8192E){\r
+                                               rtl8192e_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));\r
+                                       }\r
+                                       #endif\r
+                                       #if(RTL8723B_SUPPORT==1)\r
+                                       if(pDM_Odm->SupportICType == ODM_RTL8723B){\r
+                                               rtl8723b_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));\r
+                                       }\r
+                                       #endif\r
+\r
+                                       #if(RTL8188E_SUPPORT==1)\r
+                                       if(pDM_Odm->SupportICType == ODM_RTL8188E){\r
+                                               rtl8188e_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));\r
+                                       }\r
+                                       #endif\r
+                                                                               \r
+                               }\r
+                               else{\r
+                                       #if((RTL8188E_SUPPORT==1)&&(RATE_ADAPTIVE_SUPPORT == 1))\r
+                                       if(pDM_Odm->SupportICType == ODM_RTL8188E){\r
+                                               ODM_RA_SetRSSI_8188E(\r
+                                               &(pHalData->odmpriv), (PWDB_rssi[i]&0xFF), (u8)((PWDB_rssi[i]>>16) & 0xFF));\r
+                                       }\r
+                                       #endif\r
+                               }\r
+                       }\r
+               }               \r
+       }\r
+\r
+\r
+\r
+       if(tmpEntryMaxPWDB != 0)        // If associated entry is found\r
+       {\r
+               pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;             \r
+       }\r
+       else\r
+       {\r
+               pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0;\r
+       }\r
+\r
+       if(tmpEntryMinPWDB != 0xff) // If associated entry is found\r
+       {\r
+               pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;             \r
+       }\r
+       else\r
+       {\r
+               pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0;\r
+       }\r
+\r
+       FindMinimumRSSI(Adapter);//get pdmpriv->MinUndecoratedPWDBForDM\r
+\r
+       #if(RTL8192D_SUPPORT==1)\r
+       FindMinimumRSSI_Dmsp(Adapter);\r
+       #endif\r
+       pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;\r
+       //ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);\r
+#endif//if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+}\r
+\r
+\r
+VOID\r
+odm_RSSIMonitorCheckAP(\r
+       IN              PVOID           pDM_VOID\r
+       )\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT) ||defined(CONFIG_RTL_8812_SUPPORT)||defined(CONFIG_WLAN_HAL_8881A)||defined(CONFIG_WLAN_HAL_8192EE)\r
+       {\r
+               PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+               prtl8192cd_priv priv            = pDM_Odm->priv;                \r
+               u4Byte i;\r
+               PSTA_INFO_T pstat;\r
+               static u1Byte H2C_Parameter[5];\r
+               u1Byte    TxBF_EN = 0;\r
+               pBDC_T  pDM_BdcTable = &pDM_Odm->DM_BdcTable;\r
+\r
+               if( priv->up_time % 2 )\r
+                       return;\r
+\r
+               pDM_BdcTable->num_Txbfee_Client=0;\r
+               pDM_BdcTable->num_Txbfer_Client=0;\r
+               //pDM_BdcTable->num_Client=0;\r
+               \r
+               for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\r
+               {\r
+                       pstat = pDM_Odm->pODM_StaInfo[i];\r
+                       if(IS_STA_VALID(pstat) )\r
+                       {                       \r
+#ifdef BEAMFORMING_SUPPORT\r
+                               BEAMFORMING_CAP Beamform_cap = Beamforming_GetEntryBeamCapByMacId(priv, pstat->aid);\r
+                               if(Beamform_cap == BEAMFORMER_CAP_HT_EXPLICIT || Beamform_cap == BEAMFORMER_CAP_VHT_SU ||\r
+                                        Beamform_cap == (BEAMFORMER_CAP_HT_EXPLICIT|BEAMFORMEE_CAP_HT_EXPLICIT) ||\r
+                                        Beamform_cap == (BEAMFORMER_CAP_VHT_SU|BEAMFORMEE_CAP_VHT_SU))\r
+                               {\r
+                                       TxBF_EN = (1<< 6);\r
+                                       pDM_BdcTable->w_BFee_Client[i]=1; //AP act as BFer\r
+                                       pDM_BdcTable->num_Txbfee_Client++;\r
+                               }\r
+                               else \r
+                               {\r
+                                       pDM_BdcTable->w_BFee_Client[i]=0; //AP act as BFer\r
+                               }\r
+                               \r
+                               if((Beamform_cap & BEAMFORMEE_CAP_HT_EXPLICIT) || (Beamform_cap & BEAMFORMEE_CAP_VHT_SU) )\r
+                               {\r
+                                       pDM_BdcTable->w_BFer_Client[i]=1; //AP act as BFee\r
+                                       pDM_BdcTable->num_Txbfer_Client++;\r
+                               }\r
+                               else \r
+                               {\r
+                                       pDM_BdcTable->w_BFer_Client[i]=0; //AP act as BFer\r
+                               }\r
+\r
+                                       \r
+                               //pDM_BdcTable->num_Client++;\r
+               \r
+                               \r
+                               \r
+#endif                 \r
+//#ifdef STA_EXT\r
+//                             if (GET_CHIP_VER(priv)==VERSION_8812E && REMAP_AID(pstat) < (RTL8812_NUM_STAT - 1))\r
+//#endif\r
+                               {\r
+#ifdef CONFIG_RTL_8812_SUPPORT\r
+#ifdef STA_EXT\r
+                                       if(REMAP_AID(pstat) < (RTL8812_NUM_STAT - 1))\r
+#endif                                 \r
+\r
+                                       if(pDM_Odm->SupportICType == ODM_RTL8812) {\r
+                                               memset(H2C_Parameter,0,5);                                              \r
+                                               H2C_Parameter[2] = (u1Byte)(pstat->rssi & 0x7F);\r
+                                               H2C_Parameter[0] = REMAP_AID(pstat);                            \r
+                                               if ((priv->pmib->dot11nConfigEntry.dot11nSTBC) && (\r
+                                                       (pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_RX_STBC_CAP_)\r
+#ifdef RTK_AC_SUPPORT                  \r
+                                                       || (pstat->vht_cap_buf.vht_cap_info & cpu_to_le32(_VHTCAP_RX_STBC_CAP_))\r
+#endif\r
+                                                       )))     \r
+                                                       H2C_Parameter[3] |= 2;\r
+                                               H2C_Parameter[3] |= TxBF_EN ; \r
+                                               FillH2CCmd8812(pDM_Odm->priv, H2C_8812_RSSI_REPORT, 4, H2C_Parameter);\r
+                                       }\r
+#endif\r
+                               }\r
+//#ifdef STA_EXT\r
+//                             else if (GET_CHIP_VER(priv)!=VERSION_8812E && REMAP_AID(pstat) < (FW_NUM_STAT - 1)) \r
+//#endif\r
+                               {\r
+#if defined(CONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8192EE)\r
+#ifdef STA_EXT\r
+                                       if(REMAP_AID(pstat) < (RTL8812_NUM_STAT - 1))\r
+#endif \r
+                                       if(pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E) {\r
+//                                             u1Byte  H2C_Parameter[5] ={0};  \r
+                                               u1Byte  cmdlen = 3;\r
+                                               memset(H2C_Parameter, 0, 5);\r
+                                               H2C_Parameter[2] = (u1Byte)(pstat->rssi & 0xFF);\r
+                                               H2C_Parameter[0] = REMAP_AID(pstat);\r
+                                               if(pDM_Odm->SupportICType == ODM_RTL8192E) {\r
+                                                       cmdlen = 4;\r
+                                                       if ((priv->pmib->dot11nConfigEntry.dot11nSTBC) && (pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_RX_STBC_CAP_)))   \r
+                                                               H2C_Parameter[3] |= 2;          \r
+                                                        H2C_Parameter[3] |= TxBF_EN; \r
+\r
+                                               } \r
+                        GET_HAL_INTERFACE(pDM_Odm->priv)->FillH2CCmdHandler(pDM_Odm->priv, H2C_88XX_RSSI_REPORT, cmdlen, H2C_Parameter);\r
+                                       }\r
+#endif\r
+                               \r
+#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT) \r
+#ifdef STA_EXT\r
+                                       if(REMAP_AID(pstat) < (FW_NUM_STAT - 1))\r
+#endif\r
+                                       if(pDM_Odm->SupportICType == ODM_RTL8192C || pDM_Odm->SupportICType == ODM_RTL8192D) \r
+                                               add_update_rssi(pDM_Odm->priv, pstat);\r
+#endif\r
+                               }\r
+\r
+                       }               \r
+               }\r
+       }\r
+#endif\r
+#endif\r
+\r
+}\r
+\r
+\r
+VOID\r
+odm_RateAdaptiveMaskInit(\r
+       IN      PVOID   pDM_VOID        \r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PODM_RATE_ADAPTIVE      pOdmRA = &pDM_Odm->RateAdaptive;\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       PMGNT_INFO              pMgntInfo = &pDM_Odm->Adapter->MgntInfo;\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);\r
+\r
+       pMgntInfo->Ratr_State = DM_RATR_STA_INIT;\r
+\r
+       if (pMgntInfo->DM_Type == DM_Type_ByDriver)\r
+               pHalData->bUseRAMask = TRUE;\r
+       else\r
+               pHalData->bUseRAMask = FALSE;   \r
+\r
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+       pOdmRA->Type = DM_Type_ByDriver;\r
+       if (pOdmRA->Type == DM_Type_ByDriver)\r
+               pDM_Odm->bUseRAMask = _TRUE;\r
+       else\r
+               pDM_Odm->bUseRAMask = _FALSE;   \r
+#endif\r
+\r
+       pOdmRA->RATRState = DM_RATR_STA_INIT;\r
+       \r
+#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       if(pDM_Odm->SupportICType == ODM_RTL8812)\r
+               pOdmRA->LdpcThres = 50;         \r
+       else\r
+               pOdmRA->LdpcThres = 35;\r
+               \r
+       pOdmRA->RtsThres = 35;\r
+       \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       pOdmRA->LdpcThres = 35;\r
+       pOdmRA->bUseLdpc = FALSE;\r
+       \r
+#else\r
+       pOdmRA->UltraLowRSSIThresh = 9; \r
+       \r
+#endif\r
+\r
+       pOdmRA->HighRSSIThresh = 50;\r
+       pOdmRA->LowRSSIThresh = 20;\r
+}\r
+/*-----------------------------------------------------------------------------\r
+ * Function:   odm_RefreshRateAdaptiveMask()\r
+ *\r
+ * Overview:   Update rate table mask according to rssi\r
+ *\r
+ * Input:              NONE\r
+ *\r
+ * Output:             NONE\r
+ *\r
+ * Return:             NONE\r
+ *\r
+ * Revised History:\r
+ *     When            Who             Remark\r
+ *     05/27/2009      hpfan   Create Version 0.  \r
+ *\r
+ *---------------------------------------------------------------------------*/\r
+VOID\r
+odm_RefreshRateAdaptiveMask(\r
+       IN      PVOID   pDM_VOID\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask()---------->\n")); \r
+       if (!(pDM_Odm->SupportAbility & ODM_BB_RA_MASK))\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask(): Return cos not supported\n"));\r
+               return; \r
+       }\r
+       //\r
+       // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\r
+       // at the same time. In the stage2/3, we need to prive universal interface and merge all\r
+       // HW dynamic mechanism.\r
+       //\r
+       switch  (pDM_Odm->SupportPlatform)\r
+       {\r
+               case    ODM_WIN:\r
+                       odm_RefreshRateAdaptiveMaskMP(pDM_Odm);\r
+                       break;\r
+\r
+               case    ODM_CE:\r
+                       odm_RefreshRateAdaptiveMaskCE(pDM_Odm);\r
+                       break;\r
+\r
+               case    ODM_AP:\r
+               case    ODM_ADSL:\r
+                       odm_RefreshRateAdaptiveMaskAPADSL(pDM_Odm);\r
+                       break;\r
+       }\r
+       \r
+}\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+VOID\r
+odm_RefreshLdpcRtsMP(\r
+       IN      PADAPTER                        pAdapter,\r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      u1Byte                          mMacId,\r
+       IN      u1Byte                          IOTPeer,\r
+       IN      s4Byte                          UndecoratedSmoothedPWDB \r
+       )\r
+{\r
+       BOOLEAN                                 bCtlLdpc = FALSE;\r
+       PMGNT_INFO                              pMgntInfo = GetDefaultMgntInfo(pAdapter);\r
+       PODM_RATE_ADAPTIVE              pRA = &pDM_Odm->RateAdaptive;\r
+\r
+       if(pDM_Odm->SupportICType != ODM_RTL8821 && pDM_Odm->SupportICType != ODM_RTL8812)\r
+               return;\r
+\r
+       if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))\r
+               bCtlLdpc = TRUE;\r
+       else if(        pDM_Odm->SupportICType == ODM_RTL8812 && \r
+                       IOTPeer == HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP)\r
+                               bCtlLdpc = TRUE;\r
+\r
+       if(bCtlLdpc)\r
+       {\r
+               if(UndecoratedSmoothedPWDB < (pRA->LdpcThres-5))\r
+                       MgntSet_TX_LDPC(pAdapter, mMacId, TRUE);\r
+               else if(UndecoratedSmoothedPWDB > pRA->LdpcThres)\r
+                       MgntSet_TX_LDPC(pAdapter, mMacId, FALSE);\r
+       }       \r
+\r
+       if(UndecoratedSmoothedPWDB < (pRA->RtsThres-5))\r
+               pRA->bLowerRtsRate = TRUE;\r
+       else if(UndecoratedSmoothedPWDB > pRA->RtsThres)\r
+               pRA->bLowerRtsRate = FALSE;\r
+}\r
+#endif\r
+\r
+\r
+VOID\r
+odm_RefreshRateAdaptiveMaskMP(\r
+       IN              PVOID           pDM_VOID\r
+       )\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                                pAdapter         =  pDM_Odm->Adapter;\r
+       PADAPTER                                pTargetAdapter = NULL;\r
+       HAL_DATA_TYPE                   *pHalData = GET_HAL_DATA(pAdapter);\r
+       PMGNT_INFO                              pMgntInfo = GetDefaultMgntInfo(pAdapter);\r
+\r
+       if(pAdapter->bDriverStopped)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));\r
+               return;\r
+       }\r
+\r
+       if(!pHalData->bUseRAMask)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));\r
+               return;\r
+       }\r
+\r
+       // if default port is connected, update RA table for default port (infrastructure mode only)\r
+       if(pMgntInfo->mAssoc && (!ACTING_AS_AP(pAdapter)))\r
+       {       \r
+               odm_RefreshLdpcRtsMP(pAdapter, pDM_Odm, pMgntInfo->mMacId,  pMgntInfo->IOTPeer, pHalData->UndecoratedSmoothedPWDB);\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("odm_RefreshRateAdaptiveMask(): Infrasture Mode\n"));\r
+               if( ODM_RAStateCheck(pDM_Odm, pHalData->UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pMgntInfo->Ratr_State) )\r
+               {\r
+                       ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target AP addr : "), pMgntInfo->Bssid);\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pHalData->UndecoratedSmoothedPWDB, pMgntInfo->Ratr_State));\r
+                       pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);\r
+               }\r
+               else if(pDM_Odm->bChangeState)\r
+               {\r
+                       ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target AP addr : "), pMgntInfo->Bssid);\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Change Power Training State, bDisablePowerTraining = %d\n", pDM_Odm->bDisablePowerTraining));\r
+                       pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);\r
+               }\r
+       }\r
+\r
+       //\r
+       // The following part configure AP/VWifi/IBSS rate adaptive mask.\r
+       //\r
+\r
+       if(pMgntInfo->mIbss)    // Target: AP/IBSS peer.\r
+               pTargetAdapter = GetDefaultAdapter(pAdapter);\r
+       else\r
+               pTargetAdapter = GetFirstAPAdapter(pAdapter);\r
+\r
+       // if extension port (softap) is started, updaet RA table for more than one clients associate\r
+       if(pTargetAdapter != NULL)\r
+       {\r
+               int     i;\r
+               PRT_WLAN_STA    pEntry;\r
+\r
+               for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)\r
+               {\r
+                       pEntry = AsocEntry_EnumStation(pTargetAdapter, i);\r
+                       if(NULL != pEntry)\r
+                       {\r
+                               if(pEntry->bAssociated)\r
+                               {\r
+                                       odm_RefreshLdpcRtsMP(pAdapter, pDM_Odm, pEntry->AssociatedMacId, pEntry->IOTPeer, pEntry->rssi_stat.UndecoratedSmoothedPWDB);\r
+\r
+                                       if(ODM_RAStateCheck(pDM_Odm, pEntry->rssi_stat.UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pEntry->Ratr_State) )\r
+                                       {\r
+                                               ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pEntry->MacAddr);\r
+                                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->Ratr_State));\r
+                                               pAdapter->HalFunc.UpdateHalRAMaskHandler(pTargetAdapter, pEntry->AssociatedMacId, pEntry, pEntry->Ratr_State);\r
+                                       }\r
+                                       else if(pDM_Odm->bChangeState)\r
+                                       {\r
+                                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Change Power Training State, bDisablePowerTraining = %d\n", pDM_Odm->bDisablePowerTraining));\r
+                                               pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       if(pMgntInfo->bSetTXPowerTrainingByOid)\r
+               pMgntInfo->bSetTXPowerTrainingByOid = FALSE;    \r
+#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+}\r
+\r
+\r
+VOID\r
+odm_RefreshRateAdaptiveMaskCE(\r
+       IN      PVOID   pDM_VOID        \r
+       )\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       u1Byte  i;\r
+       PADAPTER        pAdapter         =  pDM_Odm->Adapter;\r
+       PODM_RATE_ADAPTIVE              pRA = &pDM_Odm->RateAdaptive;\r
+\r
+       if(pAdapter->bDriverStopped)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));\r
+               return;\r
+       }\r
+\r
+       if(!pDM_Odm->bUseRAMask)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));\r
+               return;\r
+       }\r
+\r
+       //printk("==> %s \n",__FUNCTION__);\r
+\r
+       for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++){\r
+               PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];\r
+               if(IS_STA_VALID(pstat) ) {\r
+                       if(IS_MCAST( pstat->hwaddr))  //if(psta->mac_id ==1)\r
+                                continue;\r
+                       if(IS_MCAST( pstat->hwaddr))\r
+                               continue;\r
+\r
+                       #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))\r
+                       if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))\r
+                       {\r
+                               if(pstat->rssi_stat.UndecoratedSmoothedPWDB < pRA->LdpcThres)\r
+                               {\r
+                                       pRA->bUseLdpc = TRUE;\r
+                                       pRA->bLowerRtsRate = TRUE;\r
+                                       if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))\r
+                                               Set_RA_LDPC_8812(pstat, TRUE);\r
+                                       //DbgPrint("RSSI=%d, bUseLdpc = TRUE\n", pHalData->UndecoratedSmoothedPWDB);\r
+                               }\r
+                               else if(pstat->rssi_stat.UndecoratedSmoothedPWDB > (pRA->LdpcThres-5))\r
+                               {\r
+                                       pRA->bUseLdpc = FALSE;\r
+                                       pRA->bLowerRtsRate = FALSE;\r
+                                       if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))\r
+                                               Set_RA_LDPC_8812(pstat, FALSE);\r
+                                       //DbgPrint("RSSI=%d, bUseLdpc = FALSE\n", pHalData->UndecoratedSmoothedPWDB);\r
+                               }\r
+                       }\r
+                       #endif\r
+\r
+                       if( TRUE == ODM_RAStateCheck(pDM_Odm, pstat->rssi_stat.UndecoratedSmoothedPWDB, FALSE , &pstat->rssi_level) )\r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level));\r
+                               //printk("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level);\r
+                               rtw_hal_update_ra_mask(pstat, pstat->rssi_level);\r
+                       }\r
+                       else if(pDM_Odm->bChangeState)\r
+                       {\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Change Power Training State, bDisablePowerTraining = %d\n", pDM_Odm->bDisablePowerTraining));\r
+                               rtw_hal_update_ra_mask(pstat, pstat->rssi_level);\r
+                       }\r
+               \r
+               }\r
+       }                       \r
+       \r
+#endif\r
+}\r
+\r
+VOID\r
+odm_RefreshRateAdaptiveMaskAPADSL(\r
+       IN      PVOID   pDM_VOID\r
+       )\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       struct rtl8192cd_priv *priv = pDM_Odm->priv;\r
+       struct aid_obj *aidarray;\r
+       u4Byte i;\r
+       PSTA_INFO_T pstat;\r
+\r
+       if(priv->up_time % 2)\r
+               return; \r
+\r
+       for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {\r
+               pstat = pDM_Odm->pODM_StaInfo[i];\r
+\r
+               if(IS_STA_VALID(pstat) )\r
+               {                       \r
+#if defined(UNIVERSAL_REPEATER) || defined(MBSSID)\r
+                       aidarray = container_of(pstat, struct aid_obj, station);\r
+                       priv = aidarray->priv;\r
+#endif\r
+\r
+                       if (!priv->pmib->dot11StationConfigEntry.autoRate) \r
+                               continue;\r
+\r
+                       if(ODM_RAStateCheck(pDM_Odm, (s4Byte)pstat->rssi, FALSE, &pstat->rssi_level) ) {\r
+                               ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pstat->hwaddr);\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi, pstat->rssi_level));\r
+\r
+#if defined(CONFIG_PCI_HCI)\r
+#ifdef CONFIG_WLAN_HAL\r
+                               if (IS_HAL_CHIP(priv)) {\r
+#ifdef WDS\r
+                                       if(!(pstat->state & WIFI_WDS))//if WDS donot setting\r
+#endif\r
+                                               GET_HAL_INTERFACE(priv)->UpdateHalRAMaskHandler(priv, pstat, pstat->rssi_level);\r
+                               } else\r
+#endif\r
+#ifdef CONFIG_RTL_8812_SUPPORT\r
+                               if(GET_CHIP_VER(priv)== VERSION_8812E) {\r
+                                       UpdateHalRAMask8812(priv, pstat, 3);\r
+                               } else\r
+#endif\r
+#ifdef CONFIG_RTL_88E_SUPPORT\r
+                               if (GET_CHIP_VER(priv)==VERSION_8188E) {\r
+#ifdef TXREPORT\r
+                                       add_RATid(priv, pstat);\r
+#endif\r
+                               } else\r
+#endif\r
+                               {\r
+#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)\r
+                                       add_update_RATid(priv, pstat);\r
+#endif\r
+                               }\r
+#elif defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                               update_STA_RATid(priv, pstat);\r
+#endif\r
+                       }\r
+               }\r
+       }\r
+#endif\r
+}\r
+\r
+\r
+// Return Value: BOOLEAN\r
+// - TRUE: RATRState is changed.\r
+BOOLEAN \r
+ODM_RAStateCheck(\r
+       IN              PVOID                   pDM_VOID,\r
+       IN              s4Byte                  RSSI,\r
+       IN              BOOLEAN                 bForceUpdate,\r
+       OUT             pu1Byte                 pRATRState\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive;\r
+       const u1Byte GoUpGap = 5;\r
+       u1Byte HighRSSIThreshForRA = pRA->HighRSSIThresh;\r
+       u1Byte LowRSSIThreshForRA = pRA->LowRSSIThresh;\r
+       u1Byte RATRState;\r
+\r
+       // Threshold Adjustment: \r
+       // when RSSI state trends to go up one or two levels, make sure RSSI is high enough.\r
+       // Here GoUpGap is added to solve the boundary's level alternation issue.\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       u1Byte UltraLowRSSIThreshForRA = pRA->UltraLowRSSIThresh;\r
+       if(pDM_Odm->SupportICType == ODM_RTL8881A)              \r
+               LowRSSIThreshForRA = 30;                // for LDPC / BCC switch\r
+#endif\r
+\r
+       switch (*pRATRState)\r
+       {\r
+               case DM_RATR_STA_INIT:\r
+               case DM_RATR_STA_HIGH:\r
+                       break;\r
+\r
+               case DM_RATR_STA_MIDDLE:\r
+                       HighRSSIThreshForRA += GoUpGap;\r
+                       break;\r
+\r
+               case DM_RATR_STA_LOW:\r
+                       HighRSSIThreshForRA += GoUpGap;\r
+                       LowRSSIThreshForRA += GoUpGap;\r
+                       break;\r
+                       \r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+               case DM_RATR_STA_ULTRA_LOW:\r
+                       HighRSSIThreshForRA += GoUpGap;\r
+                       LowRSSIThreshForRA += GoUpGap;\r
+                       UltraLowRSSIThreshForRA += GoUpGap;\r
+                       break;\r
+#endif\r
+\r
+               default: \r
+                       ODM_RT_ASSERT(pDM_Odm, FALSE, ("wrong rssi level setting %d !", *pRATRState) );\r
+                       break;\r
+       }\r
+\r
+       // Decide RATRState by RSSI.\r
+       if(RSSI > HighRSSIThreshForRA)\r
+               RATRState = DM_RATR_STA_HIGH;\r
+       else if(RSSI > LowRSSIThreshForRA)\r
+               RATRState = DM_RATR_STA_MIDDLE;\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       else if(RSSI > UltraLowRSSIThreshForRA)\r
+               RATRState = DM_RATR_STA_LOW;\r
+       else\r
+               RATRState = DM_RATR_STA_ULTRA_LOW;\r
+#else\r
+       else\r
+               RATRState = DM_RATR_STA_LOW;\r
+#endif\r
+       //printk("==>%s,RATRState:0x%02x ,RSSI:%d \n",__FUNCTION__,RATRState,RSSI);\r
+\r
+       if( *pRATRState!=RATRState || bForceUpdate)\r
+       {\r
+               ODM_RT_TRACE( pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI Level %d -> %d\n", *pRATRState, RATRState) );\r
+               *pRATRState = RATRState;\r
+               return TRUE;\r
+       }\r
+\r
+       return FALSE;\r
+}\r
+\r
+VOID\r
+odm_RefreshBasicRateMask(\r
+       IN      PVOID   pDM_VOID\r
+       )\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                Adapter  =  pDM_Odm->Adapter;\r
+       static u1Byte           Stage = 0;\r
+       u1Byte                  CurStage = 0;\r
+       OCTET_STRING    osRateSet;\r
+       PMGNT_INFO              pMgntInfo = GetDefaultMgntInfo(Adapter);\r
+       u1Byte                  RateSet[5] = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M, MGN_6M};\r
+\r
+       if(pDM_Odm->SupportICType != ODM_RTL8812 && pDM_Odm->SupportICType != ODM_RTL8821 )\r
+               return;\r
+\r
+       if(pDM_Odm->bLinked == FALSE)   // unlink Default port information\r
+               CurStage = 0;   \r
+       else if(pDM_Odm->RSSI_Min < 40) // link RSSI  < 40%\r
+               CurStage = 1;\r
+       else if(pDM_Odm->RSSI_Min > 45) // link RSSI > 45%\r
+               CurStage = 3;   \r
+       else\r
+               CurStage = 2;                                   // link  25% <= RSSI <= 30%\r
+\r
+       if(CurStage != Stage)\r
+       {\r
+               if(CurStage == 1)\r
+               {\r
+                       FillOctetString(osRateSet, RateSet, 5);\r
+                       FilterSupportRate(pMgntInfo->mBrates, &osRateSet, FALSE);\r
+                       Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_BASIC_RATE, (pu1Byte)&osRateSet);\r
+               }\r
+               else if(CurStage == 3 && (Stage == 1 || Stage == 2))\r
+               {\r
+                       Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_BASIC_RATE, (pu1Byte)(&pMgntInfo->mBrates) );\r
+               }\r
+       }\r
+       \r
+       Stage = CurStage;\r
+#endif\r
+}\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+VOID\r
+ODM_DynamicARFBSelect(\r
+       IN              PVOID           pDM_VOID,\r
+       IN              u1Byte                  rate,\r
+       IN              BOOLEAN                 Collision_State \r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
+\r
+       if(pDM_Odm->SupportICType != ODM_RTL8192E)\r
+               return;\r
+\r
+       if(Collision_State == pRA_Table->PT_collision_pre)\r
+               return;\r
+\r
+       if (rate >= DESC_RATEMCS8  && rate <= DESC_RATEMCS12){\r
+               if (Collision_State == 1){\r
+                       if(rate == DESC_RATEMCS12){\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060501);        \r
+                       }\r
+                       else if(rate == DESC_RATEMCS11){\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07070605);        \r
+                       }\r
+                       else if(rate == DESC_RATEMCS10){\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080706);        \r
+                       }\r
+                       else if(rate == DESC_RATEMCS9){\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080707);        \r
+                       }\r
+                       else{\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09090808);        \r
+                       }\r
+               }\r
+               else{   // Collision_State == 0\r
+                       if(rate == DESC_RATEMCS12){\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05010000);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);        \r
+                       }\r
+                       else if(rate == DESC_RATEMCS11){\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x06050000);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080807);        \r
+                       }\r
+                       else if(rate == DESC_RATEMCS10){\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07060000);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090908);        \r
+                       }\r
+                       else if(rate == DESC_RATEMCS9){\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07070000);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090808);        \r
+                       }\r
+                       else{\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x08080000);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0b0a0909);        \r
+                       }\r
+               }\r
+       }\r
+       else{  // MCS13~MCS15,  1SS, G-mode\r
+               if (Collision_State == 1){\r
+                       if(rate == DESC_RATEMCS15){\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x05040302);        \r
+                       }\r
+                       else if(rate == DESC_RATEMCS14){\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050302);        \r
+                       }\r
+                       else if(rate == DESC_RATEMCS13){\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060502);        \r
+                       }\r
+                       else{\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050402);        \r
+                       }\r
+               }\r
+               else{   // Collision_State == 0\r
+                       if(rate == DESC_RATEMCS15){\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060504);        \r
+                       }\r
+                       else if(rate == DESC_RATEMCS14){\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);        \r
+                       }\r
+                       else if(rate == DESC_RATEMCS13){\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05020000);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);        \r
+                       }\r
+                       else{\r
+\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x04020000);\r
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);        \r
+                       }\r
+\r
+\r
+               }\r
+\r
+       }       \r
+        pRA_Table->PT_collision_pre = Collision_State; \r
+}\r
+\r
+VOID\r
+ODM_RateAdaptiveStateApInit(   \r
+       IN      PVOID           PADAPTER_VOID,\r
+       IN      PRT_WLAN_STA    pEntry\r
+       )\r
+{\r
+       PADAPTER                Adapter = (PADAPTER)PADAPTER_VOID;\r
+       pEntry->Ratr_State = DM_RATR_STA_INIT;\r
+}\r
+#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+u4Byte \r
+ODM_Get_Rate_Bitmap(\r
+       IN      PVOID           pDM_VOID,       \r
+       IN      u4Byte          macid,\r
+       IN      u4Byte          ra_mask,        \r
+       IN      u1Byte          rssi_level\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PSTA_INFO_T     pEntry;\r
+       u4Byte  rate_bitmap = 0;\r
+       u1Byte  WirelessMode;\r
+       //u1Byte        WirelessMode =*(pDM_Odm->pWirelessMode);\r
+       \r
+       \r
+       pEntry = pDM_Odm->pODM_StaInfo[macid];\r
+       if(!IS_STA_VALID(pEntry))\r
+               return ra_mask;\r
+\r
+       WirelessMode = pEntry->wireless_mode;\r
+       \r
+       switch(WirelessMode)\r
+       {\r
+               case ODM_WM_B:\r
+                       if(ra_mask & 0x0000000c)                //11M or 5.5M enable                            \r
+                               rate_bitmap = 0x0000000d;\r
+                       else\r
+                               rate_bitmap = 0x0000000f;\r
+                       break;\r
+                       \r
+               case (ODM_WM_G):\r
+               case (ODM_WM_A):\r
+                       if(rssi_level == DM_RATR_STA_HIGH)\r
+                               rate_bitmap = 0x00000f00;\r
+                       else\r
+                               rate_bitmap = 0x00000ff0;\r
+                       break;\r
+                       \r
+               case (ODM_WM_B|ODM_WM_G):\r
+                       if(rssi_level == DM_RATR_STA_HIGH)\r
+                               rate_bitmap = 0x00000f00;\r
+                       else if(rssi_level == DM_RATR_STA_MIDDLE)\r
+                               rate_bitmap = 0x00000ff0;\r
+                       else\r
+                               rate_bitmap = 0x00000ff5;\r
+                       break;          \r
+\r
+               case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G)    :\r
+               case (ODM_WM_B|ODM_WM_N24G)     :\r
+               case (ODM_WM_G|ODM_WM_N24G)     :\r
+               case (ODM_WM_A|ODM_WM_N5G)      :\r
+                       {                                       \r
+                               if (    pDM_Odm->RFType == ODM_1T2R ||pDM_Odm->RFType == ODM_1T1R)\r
+                               {\r
+                                       if(rssi_level == DM_RATR_STA_HIGH)\r
+                                       {\r
+                                               rate_bitmap = 0x000f0000;\r
+                                       }\r
+                                       else if(rssi_level == DM_RATR_STA_MIDDLE)\r
+                                       {\r
+                                               rate_bitmap = 0x000ff000;\r
+                                       }\r
+                                       else{\r
+                                               if (*(pDM_Odm->pBandWidth) == ODM_BW40M)\r
+                                                       rate_bitmap = 0x000ff015;\r
+                                               else\r
+                                                       rate_bitmap = 0x000ff005;\r
+                                       }                               \r
+                               }\r
+                               else\r
+                               {\r
+                                       if(rssi_level == DM_RATR_STA_HIGH)\r
+                                       {               \r
+                                               rate_bitmap = 0x0f8f0000;\r
+                                       }\r
+                                       else if(rssi_level == DM_RATR_STA_MIDDLE)\r
+                                       {\r
+                                               rate_bitmap = 0x0f8ff000;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               if (*(pDM_Odm->pBandWidth) == ODM_BW40M)\r
+                                                       rate_bitmap = 0x0f8ff015;\r
+                                               else\r
+                                                       rate_bitmap = 0x0f8ff005;\r
+                                       }                                       \r
+                               }\r
+                       }\r
+                       break;\r
+\r
+               case (ODM_WM_AC|ODM_WM_G):\r
+                       if(rssi_level == 1)\r
+                               rate_bitmap = 0xfc3f0000;\r
+                       else if(rssi_level == 2)\r
+                               rate_bitmap = 0xfffff000;\r
+                       else\r
+                               rate_bitmap = 0xffffffff;\r
+                       break;\r
+\r
+               case (ODM_WM_AC|ODM_WM_A):\r
+\r
+                       if (pDM_Odm->RFType == RF_1T1R)\r
+                       {\r
+                               if(rssi_level == 1)                             // add by Gary for ac-series\r
+                                       rate_bitmap = 0x003f8000;\r
+                               else if (rssi_level == 2)\r
+                                       rate_bitmap = 0x003ff000;\r
+                               else\r
+                                       rate_bitmap = 0x003ff010;\r
+                       }\r
+                       else\r
+                       {\r
+                               if(rssi_level == 1)                             // add by Gary for ac-series\r
+                                       rate_bitmap = 0xfe3f8000;       // VHT 2SS MCS3~9\r
+                               else if (rssi_level == 2)\r
+                                       rate_bitmap = 0xfffff000;       // VHT 2SS MCS0~9\r
+                               else\r
+                                       rate_bitmap = 0xfffff010;       // All\r
+                       }\r
+                       break;\r
+                       \r
+               default:\r
+                       if(pDM_Odm->RFType == RF_1T2R)\r
+                               rate_bitmap = 0x000fffff;\r
+                       else\r
+                               rate_bitmap = 0x0fffffff;\r
+                       break;  \r
+\r
+       }\r
+\r
+       //printk("%s ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x \n",__FUNCTION__,rssi_level,WirelessMode,rate_bitmap);\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (" ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x \n",rssi_level,WirelessMode,rate_bitmap));\r
+\r
+       return (ra_mask&rate_bitmap);\r
+       \r
+}      \r
+\r
+#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
\ No newline at end of file
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RaInfo.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RaInfo.h
new file mode 100755 (executable)
index 0000000..b9625de
--- /dev/null
@@ -0,0 +1,167 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __PHYDMRAINFO_H__\r
+#define    __PHYDMRAINFO_H__\r
+\r
+#define RAINFO_VERSION "1.0"\r
+\r
+#define AP_InitRateAdaptiveState       ODM_RateAdaptiveStateApInit\r
+\r
+#define                DM_RATR_STA_INIT                        0\r
+#define                DM_RATR_STA_HIGH                        1\r
+#define                DM_RATR_STA_MIDDLE              2\r
+#define                DM_RATR_STA_LOW                 3\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+#define                DM_RATR_STA_ULTRA_LOW   4\r
+#endif\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+typedef struct _Rate_Adaptive_Table_{\r
+       u1Byte          firstconnect;\r
+       #if(DM_ODM_SUPPORT_TYPE==ODM_WIN)\r
+       BOOLEAN         PT_collision_pre;\r
+       #endif\r
+}RA_T, *pRA_T;\r
+#endif\r
+\r
+typedef struct _ODM_RATE_ADAPTIVE\r
+{\r
+       u1Byte                          Type;                           // DM_Type_ByFW/DM_Type_ByDriver\r
+       u1Byte                          HighRSSIThresh;         // if RSSI > HighRSSIThresh     => RATRState is DM_RATR_STA_HIGH\r
+       u1Byte                          LowRSSIThresh;          // if RSSI <= LowRSSIThresh     => RATRState is DM_RATR_STA_LOW\r
+       u1Byte                          RATRState;                      // Current RSSI level, DM_RATR_STA_HIGH/DM_RATR_STA_MIDDLE/DM_RATR_STA_LOW\r
+\r
+       #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+       u1Byte                          LdpcThres;                      // if RSSI > LdpcThres => switch from LPDC to BCC\r
+       BOOLEAN                         bLowerRtsRate;\r
+       #endif\r
+\r
+       #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       u1Byte                          RtsThres;\r
+       #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       BOOLEAN                         bUseLdpc;\r
+       #else\r
+       u1Byte                          UltraLowRSSIThresh;\r
+       u4Byte                          LastRATR;                       // RATR Register Content\r
+       #endif\r
+\r
+} ODM_RATE_ADAPTIVE, *PODM_RATE_ADAPTIVE;\r
+\r
+VOID
+odm_RSSIMonitorInit(
+       IN              PVOID           pDM_VOID\r
+       );
+\r
+VOID\r
+odm_RSSIMonitorCheck(
+       IN              PVOID            pDM_VOID\r
+       );\r
+\r
+#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)\r
+VOID\r
+odm_RSSIDumpToRegister(\r
+       IN      PVOID   pDM_VOID\r
+       );\r
+#endif\r
+\r
+VOID
+odm_RSSIMonitorCheckMP(
+       IN              PVOID           pDM_VOID\r
+       );
+
+VOID 
+odm_RSSIMonitorCheckCE(
+       IN              PVOID           pDM_VOID\r
+       );\r
+\r
+VOID 
+odm_RSSIMonitorCheckAP(
+       IN              PVOID            pDM_VOID\r
+       );
+
+\r
+VOID\r
+odm_RateAdaptiveMaskInit(\r
+       IN      PVOID   pDM_VOID        \r
+       );\r
+\r
+VOID
+odm_RefreshRateAdaptiveMask(
+       IN      PVOID   pDM_VOID\r
+       );\r
+\r
+VOID
+odm_RefreshRateAdaptiveMaskMP(
+       IN      PVOID   pDM_VOID\r
+       );\r
+\r
+VOID
+odm_RefreshRateAdaptiveMaskCE(
+       IN      PVOID   pDM_VOID        \r
+       );\r
+\r
+VOID
+odm_RefreshRateAdaptiveMaskAPADSL(
+       IN      PVOID   pDM_VOID\r
+       );\r
+\r
+BOOLEAN 
+ODM_RAStateCheck(
+       IN              PVOID                   pDM_VOID,\r
+       IN              s4Byte                  RSSI,
+       IN              BOOLEAN                 bForceUpdate,
+       OUT             pu1Byte                 pRATRState
+       );\r
+       \r
+VOID
+odm_RefreshBasicRateMask(
+       IN      PVOID   pDM_VOID\r
+       );\r
+\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+VOID
+ODM_DynamicARFBSelect(
+       IN              PVOID                   pDM_VOID,\r
+       IN              u1Byte                  rate,
+       IN      BOOLEAN                 Collision_State 
+       );\r
+       \r
+VOID\r
+ODM_RateAdaptiveStateApInit(   \r
+       IN      PVOID           PADAPTER_VOID,\r
+       IN      PRT_WLAN_STA    pEntry\r
+       );\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+u4Byte \r
+ODM_Get_Rate_Bitmap(\r
+       IN      PVOID           pDM_VOID,       \r
+       IN      u4Byte          macid,\r
+       IN      u4Byte          ra_mask,        \r
+       IN      u1Byte          rssi_level\r
+       );\r
+#endif\r
+\r
+#endif //#ifndef       __ODMRAINFO_H__\r
+\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RegDefine11AC.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RegDefine11AC.h
new file mode 100755 (executable)
index 0000000..e7e5418
--- /dev/null
@@ -0,0 +1,76 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __ODM_REGDEFINE11AC_H__\r
+#define __ODM_REGDEFINE11AC_H__\r
+\r
+//2 RF REG LIST\r
+\r
+\r
+\r
+//2 BB REG LIST\r
+//PAGE 8\r
+#define        ODM_REG_CCK_RPT_FORMAT_11AC     0x804\r
+#define        ODM_REG_BB_RX_PATH_11AC                 0x808\r
+#define        ODM_REG_BB_ATC_11AC                             0x860\r
+#define        ODM_REG_DBG_RPT_11AC                            0x8fc\r
+//PAGE 9\r
+#define        ODM_REG_OFDM_FA_RST_11AC                0x9A4\r
+#define        ODM_REG_NHM_TIMER_11AC                  0x990\r
+#define        ODM_REG_NHM_TH9_TH10_11AC               0x994\r
+#define        ODM_REG_NHM_TH3_TO_TH0_11AC     0x998\r
+#define        ODM_REG_NHM_TH7_TO_TH4_11AC     0x99c\r
+#define        ODM_REG_NHM_TH8_11AC                    0x9a0\r
+#define        ODM_REG_NHM_9E8_11AC                    0x9e8\r
+//PAGE A\r
+#define        ODM_REG_CCK_CCA_11AC                    0xA0A\r
+#define        ODM_REG_CCK_FA_RST_11AC                 0xA2C\r
+#define        ODM_REG_CCK_FA_11AC                             0xA5C\r
+//PAGE B\r
+#define        ODM_REG_RST_RPT_11AC                            0xB58\r
+//PAGE C\r
+#define        ODM_REG_TRMUX_11AC                              0xC08\r
+#define        ODM_REG_IGI_A_11AC                              0xC50\r
+//PAGE E\r
+#define        ODM_REG_IGI_B_11AC                              0xE50\r
+#define        ODM_REG_TRMUX_11AC_B                    0xE08\r
+//PAGE F\r
+#define        ODM_REG_CCK_CCA_CNT_11AC                0xF08\r
+#define        ODM_REG_OFDM_FA_11AC                    0xF48\r
+#define        ODM_REG_RPT_11AC                                        0xfa0\r
+#define        ODM_REG_NHM_CNT_11AC                    0xfa8\r
+//PAGE 18\r
+#define        ODM_REG_IGI_C_11AC                              0x1850\r
+//PAGE 1A\r
+#define        ODM_REG_IGI_D_11AC                              0x1A50\r
+\r
+//2 MAC REG LIST\r
+#define        ODM_REG_RESP_TX_11AC                            0x6D8\r
+\r
+\r
+\r
+//DIG Related\r
+#define        ODM_BIT_IGI_11AC                                        0xFFFFFFFF\r
+#define        ODM_BIT_CCK_RPT_FORMAT_11AC             BIT16\r
+#define        ODM_BIT_BB_RX_PATH_11AC                 0xF\r
+#define        ODM_BIT_BB_ATC_11AC                             BIT14\r
+\r
+#endif\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RegDefine11N.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_RegDefine11N.h
new file mode 100755 (executable)
index 0000000..9d07509
--- /dev/null
@@ -0,0 +1,181 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __ODM_REGDEFINE11N_H__\r
+#define __ODM_REGDEFINE11N_H__\r
+\r
+\r
+//2 RF REG LIST\r
+#define        ODM_REG_RF_MODE_11N                             0x00\r
+#define        ODM_REG_RF_0B_11N                               0x0B\r
+#define        ODM_REG_CHNBW_11N                               0x18\r
+#define        ODM_REG_T_METER_11N                             0x24\r
+#define        ODM_REG_RF_25_11N                               0x25\r
+#define        ODM_REG_RF_26_11N                               0x26\r
+#define        ODM_REG_RF_27_11N                               0x27\r
+#define        ODM_REG_RF_2B_11N                               0x2B\r
+#define        ODM_REG_RF_2C_11N                               0x2C\r
+#define        ODM_REG_RXRF_A3_11N                             0x3C\r
+#define        ODM_REG_T_METER_92D_11N                 0x42\r
+#define        ODM_REG_T_METER_88E_11N                 0x42\r
+\r
+\r
+\r
+//2 BB REG LIST\r
+//PAGE 8\r
+#define        ODM_REG_BB_CTRL_11N                             0x800\r
+#define        ODM_REG_RF_PIN_11N                              0x804\r
+#define        ODM_REG_PSD_CTRL_11N                            0x808\r
+#define        ODM_REG_TX_ANT_CTRL_11N                 0x80C\r
+#define        ODM_REG_BB_PWR_SAV5_11N         0x818\r
+#define        ODM_REG_CCK_RPT_FORMAT_11N              0x824\r
+#define        ODM_REG_CCK_RPT_FORMAT_11N_B    0x82C\r
+#define        ODM_REG_RX_DEFUALT_A_11N                0x858\r
+#define        ODM_REG_RX_DEFUALT_B_11N                0x85A\r
+#define        ODM_REG_BB_PWR_SAV3_11N         0x85C\r
+#define        ODM_REG_ANTSEL_CTRL_11N                 0x860\r
+#define        ODM_REG_RX_ANT_CTRL_11N                 0x864\r
+#define        ODM_REG_PIN_CTRL_11N                            0x870\r
+#define        ODM_REG_BB_PWR_SAV1_11N         0x874\r
+#define        ODM_REG_ANTSEL_PATH_11N                 0x878\r
+#define        ODM_REG_BB_3WIRE_11N                    0x88C\r
+#define        ODM_REG_SC_CNT_11N                              0x8C4\r
+#define        ODM_REG_PSD_DATA_11N                            0x8B4\r
+#define        ODM_REG_PSD_DATA_11N                            0x8B4\r
+#define        ODM_REG_NHM_TIMER_11N                   0x894\r
+#define        ODM_REG_NHM_TH9_TH10_11N                0x890\r
+#define        ODM_REG_NHM_TH3_TO_TH0_11N              0x898\r
+#define        ODM_REG_NHM_TH7_TO_TH4_11N              0x89c\r
+#define        ODM_REG_NHM_CNT_11N                             0x8d8\r
+//PAGE 9\r
+#define        ODM_REG_DBG_RPT_11N                             0x908\r
+#define        ODM_REG_ANT_MAPPING1_11N                0x914\r
+#define        ODM_REG_ANT_MAPPING2_11N                0x918\r
+//PAGE A\r
+#define        ODM_REG_CCK_ANTDIV_PARA1_11N    0xA00\r
+#define        ODM_REG_CCK_CCA_11N                             0xA0A\r
+#define        ODM_REG_CCK_ANTDIV_PARA2_11N    0xA0C\r
+#define        ODM_REG_CCK_ANTDIV_PARA3_11N    0xA10\r
+#define        ODM_REG_CCK_ANTDIV_PARA4_11N    0xA14\r
+#define        ODM_REG_CCK_FILTER_PARA1_11N    0xA22\r
+#define        ODM_REG_CCK_FILTER_PARA2_11N    0xA23\r
+#define        ODM_REG_CCK_FILTER_PARA3_11N    0xA24\r
+#define        ODM_REG_CCK_FILTER_PARA4_11N    0xA25\r
+#define        ODM_REG_CCK_FILTER_PARA5_11N    0xA26\r
+#define        ODM_REG_CCK_FILTER_PARA6_11N    0xA27\r
+#define        ODM_REG_CCK_FILTER_PARA7_11N    0xA28\r
+#define        ODM_REG_CCK_FILTER_PARA8_11N    0xA29\r
+#define        ODM_REG_CCK_FA_RST_11N                  0xA2C\r
+#define        ODM_REG_CCK_FA_MSB_11N                  0xA58\r
+#define        ODM_REG_CCK_FA_LSB_11N                  0xA5C\r
+#define        ODM_REG_CCK_CCA_CNT_11N                 0xA60\r
+#define        ODM_REG_BB_PWR_SAV4_11N         0xA74\r
+//PAGE B\r
+#define        ODM_REG_LNA_SWITCH_11N                  0xB2C\r
+#define        ODM_REG_PATH_SWITCH_11N                 0xB30\r
+#define        ODM_REG_RSSI_CTRL_11N                   0xB38\r
+#define        ODM_REG_CONFIG_ANTA_11N                 0xB68\r
+#define        ODM_REG_RSSI_BT_11N                             0xB9C\r
+//PAGE C\r
+#define        ODM_REG_OFDM_FA_HOLDC_11N               0xC00\r
+#define        ODM_REG_BB_RX_PATH_11N                  0xC04\r
+#define        ODM_REG_TRMUX_11N                               0xC08\r
+#define        ODM_REG_OFDM_FA_RSTC_11N                0xC0C\r
+#define        ODM_REG_RXIQI_MATRIX_11N                        0xC14\r
+#define        ODM_REG_TXIQK_MATRIX_LSB1_11N   0xC4C\r
+#define        ODM_REG_IGI_A_11N                                       0xC50\r
+#define        ODM_REG_ANTDIV_PARA2_11N                0xC54\r
+#define        ODM_REG_IGI_B_11N                                       0xC58\r
+#define        ODM_REG_ANTDIV_PARA3_11N                0xC5C\r
+#define   ODM_REG_L1SBD_PD_CH_11N                      0XC6C\r
+#define        ODM_REG_BB_PWR_SAV2_11N         0xC70\r
+#define        ODM_REG_RX_OFF_11N                              0xC7C\r
+#define        ODM_REG_TXIQK_MATRIXA_11N               0xC80\r
+#define        ODM_REG_TXIQK_MATRIXB_11N               0xC88\r
+#define        ODM_REG_TXIQK_MATRIXA_LSB2_11N  0xC94\r
+#define        ODM_REG_TXIQK_MATRIXB_LSB2_11N  0xC9C\r
+#define        ODM_REG_RXIQK_MATRIX_LSB_11N    0xCA0\r
+#define        ODM_REG_ANTDIV_PARA1_11N                0xCA4\r
+#define        ODM_REG_OFDM_FA_TYPE1_11N               0xCF0\r
+//PAGE D\r
+#define        ODM_REG_OFDM_FA_RSTD_11N                0xD00\r
+#define        ODM_REG_BB_ATC_11N                              0xD2C\r
+#define        ODM_REG_OFDM_FA_TYPE2_11N               0xDA0\r
+#define        ODM_REG_OFDM_FA_TYPE3_11N               0xDA4\r
+#define        ODM_REG_OFDM_FA_TYPE4_11N               0xDA8\r
+#define        ODM_REG_RPT_11N                                 0xDF4\r
+//PAGE E\r
+#define        ODM_REG_TXAGC_A_6_18_11N                0xE00\r
+#define        ODM_REG_TXAGC_A_24_54_11N               0xE04\r
+#define        ODM_REG_TXAGC_A_1_MCS32_11N     0xE08\r
+#define        ODM_REG_TXAGC_A_MCS0_3_11N              0xE10\r
+#define        ODM_REG_TXAGC_A_MCS4_7_11N              0xE14\r
+#define        ODM_REG_TXAGC_A_MCS8_11_11N     0xE18\r
+#define        ODM_REG_TXAGC_A_MCS12_15_11N    0xE1C\r
+#define        ODM_REG_FPGA0_IQK_11N                   0xE28\r
+#define        ODM_REG_TXIQK_TONE_A_11N                0xE30\r
+#define        ODM_REG_RXIQK_TONE_A_11N                0xE34\r
+#define        ODM_REG_TXIQK_PI_A_11N                  0xE38\r
+#define        ODM_REG_RXIQK_PI_A_11N                  0xE3C\r
+#define        ODM_REG_TXIQK_11N                               0xE40\r
+#define        ODM_REG_RXIQK_11N                               0xE44\r
+#define        ODM_REG_IQK_AGC_PTS_11N                 0xE48\r
+#define        ODM_REG_IQK_AGC_RSP_11N                 0xE4C\r
+#define        ODM_REG_BLUETOOTH_11N                   0xE6C\r
+#define        ODM_REG_RX_WAIT_CCA_11N                 0xE70\r
+#define        ODM_REG_TX_CCK_RFON_11N                 0xE74\r
+#define        ODM_REG_TX_CCK_BBON_11N                 0xE78\r
+#define        ODM_REG_OFDM_RFON_11N                   0xE7C\r
+#define        ODM_REG_OFDM_BBON_11N                   0xE80\r
+#define        ODM_REG_TX2RX_11N                               0xE84\r
+#define        ODM_REG_TX2TX_11N                               0xE88\r
+#define        ODM_REG_RX_CCK_11N                              0xE8C\r
+#define        ODM_REG_RX_OFDM_11N                             0xED0\r
+#define        ODM_REG_RX_WAIT_RIFS_11N                0xED4\r
+#define        ODM_REG_RX2RX_11N                               0xED8\r
+#define        ODM_REG_STANDBY_11N                             0xEDC\r
+#define        ODM_REG_SLEEP_11N                               0xEE0\r
+#define        ODM_REG_PMPD_ANAEN_11N                  0xEEC\r
+#define        ODM_REG_IGI_C_11N                                       0xF84\r
+#define        ODM_REG_IGI_D_11N                                       0xF88\r
+\r
+//2 MAC REG LIST\r
+#define        ODM_REG_BB_RST_11N                              0x02\r
+#define        ODM_REG_ANTSEL_PIN_11N                  0x4C\r
+#define        ODM_REG_EARLY_MODE_11N                  0x4D0\r
+#define        ODM_REG_RSSI_MONITOR_11N                0x4FE\r
+#define        ODM_REG_EDCA_VO_11N                             0x500\r
+#define        ODM_REG_EDCA_VI_11N                             0x504\r
+#define        ODM_REG_EDCA_BE_11N                             0x508\r
+#define        ODM_REG_EDCA_BK_11N                             0x50C\r
+#define        ODM_REG_TXPAUSE_11N                             0x522\r
+#define        ODM_REG_RESP_TX_11N                             0x6D8\r
+#define        ODM_REG_ANT_TRAIN_PARA1_11N             0x7b0\r
+#define        ODM_REG_ANT_TRAIN_PARA2_11N             0x7b4\r
+\r
+\r
+//DIG Related\r
+#define        ODM_BIT_IGI_11N                                 0x0000007F\r
+#define        ODM_BIT_CCK_RPT_FORMAT_11N              BIT9\r
+#define        ODM_BIT_BB_RX_PATH_11N                  0xF\r
+#define        ODM_BIT_BB_ATC_11N                              BIT11\r
+\r
+#endif\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_debug.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_debug.c
new file mode 100755 (executable)
index 0000000..7e514db
--- /dev/null
@@ -0,0 +1,873 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+\r
+#include "Mp_Precomp.h"\r
+#include "phydm_precomp.h"\r
+\r
+\r
+VOID \r
+PHYDM_InitDebugSetting(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+pDM_Odm->DebugLevel                            =       ODM_DBG_TRACE;\r
+\r
+pDM_Odm->DebugComponents                       = \r
+\\r
+#if DBG\r
+//BB Functions\r
+//                                                                     ODM_COMP_DIG                                    |\r
+//                                                                     ODM_COMP_RA_MASK                                |\r
+//                                                                     ODM_COMP_DYNAMIC_TXPWR          |\r
+//                                                                     ODM_COMP_FA_CNT                         |\r
+//                                                                     ODM_COMP_RSSI_MONITOR                   |\r
+//                                                                     ODM_COMP_CCK_PD                         |\r
+//                                                                     ODM_COMP_ANT_DIV                                |\r
+//                                                                     ODM_COMP_PWR_SAVE                               |\r
+//                                                                     ODM_COMP_PWR_TRAIN                      |\r
+//                                                                     ODM_COMP_RATE_ADAPTIVE          |\r
+//                                                                     ODM_COMP_PATH_DIV                               |\r
+//                                                                     ODM_COMP_DYNAMIC_PRICCA         |\r
+//                                                                     ODM_COMP_RXHP                                   |\r
+//                                                                     ODM_COMP_MP                                     |\r
+//                                                                     ODM_COMP_CFO_TRACKING           |\r
+//                                                                     ODM_COMP_ACS                                    |\r
+//                                                                     PHYDM_COMP_ADAPTIVITY                   |\r
+\r
+//MAC Functions\r
+//                                                                     ODM_COMP_EDCA_TURBO                     |\r
+//                                                                     ODM_COMP_EARLY_MODE                     |\r
+//RF Functions\r
+//                                                                     ODM_COMP_TX_PWR_TRACK           |\r
+//                                                                     ODM_COMP_RX_GAIN_TRACK          |\r
+//                                                                     ODM_COMP_CALIBRATION                    |\r
+//Common\r
+//                                                                     ODM_COMP_COMMON                         |\r
+//                                                                     ODM_COMP_INIT                                   |\r
+//                                                                     ODM_COMP_PSD                                    |\r
+#endif\r
+                                                                       0;\r
+}\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+\r
+static u1Byte  BbDbgBuf[BB_TMP_BUF_SIZE];\r
+VOID\r
+phydm_BB_Debug_Info(IN PDM_ODM_T pDM_Odm)\r
+{\r
+\r
+       u1Byte  RX_HT_BW, RX_VHT_BW, RXSC, RX_HT, RX_BW;\r
+       static u1Byte vRX_BW ;\r
+       u4Byte  value32, value32_1, value32_2, value32_3;\r
+       s4Byte  SFO_A, SFO_B, SFO_C, SFO_D;\r
+       s4Byte  LFO_A, LFO_B, LFO_C, LFO_D;\r
+       static u1Byte   MCSS,Tail,Parity,rsv,vrsv,idx,smooth,htsound,agg,stbc,vstbc,fec,fecext,sgi,sgiext,htltf,vgid,vNsts,vtxops,vrsv2,vbrsv,bf,vbcrc;\r
+       static u2Byte   HLength,htcrc8,Length;\r
+       static u2Byte vpaid;\r
+       static u2Byte   vLength,vhtcrc8,vMCSS,vTail,vbTail;\r
+       static u1Byte   HMCSS,HRX_BW;\r
+\r
+       \r
+       u1Byte    pwDB;\r
+       s1Byte    RXEVM_0, RXEVM_1, RXEVM_2 ;\r
+       u1Byte    RF_gain_pathA, RF_gain_pathB, RF_gain_pathC, RF_gain_pathD;\r
+       u1Byte    RX_SNR_pathA, RX_SNR_pathB, RX_SNR_pathC, RX_SNR_pathD;\r
+       s4Byte    sig_power;\r
+       const char *RXHT_table[] = {"legacy", "HT", "VHT"};\r
+       const char *BW_table[] = {"20M", "40M", "80M"};\r
+       const char *RXSC_table[] = {"duplicate/full bw", "usc20-1", "lsc20-1", "usc20-2", "lsc20-2",  "usc40", "lsc40"};\r
+\r
+       const char *L_rate[]={"6M","9M","12M","18M","24M","36M","48M","54M"}; \r
+\r
+       \r
+       /*\r
+       const double evm_comp_20M = 0.579919469776867; //10*log10(64.0/56.0)\r
+       const double evm_comp_40M = 0.503051183113957; //10*log10(128.0/114.0)\r
+       const double evm_comp_80M = 0.244245993314183; //10*log10(256.0/242.0)\r
+       const double evm_comp_160M = 0.244245993314183; //10*log10(512.0/484.0)\r
+       */\r
+\r
+       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
+               return;\r
+\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s \n", "BB Report Info");\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       //BW & Mode Detection\r
+       ///////////////////////////////////////////////////////                 \r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xf80 ,bMaskDWord);\r
+       value32_2 =value32; \r
+       RX_HT_BW = (u1Byte)(value32&0x1)        ;\r
+       RX_VHT_BW = (u1Byte)((value32>>1)&0x3);\r
+       RXSC = (u1Byte)(value32&0x78);\r
+       value32_1= (value32&0x180)>>7;\r
+       RX_HT = (u1Byte)(value32_1);\r
+       /*              \r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "F80", value32_2);\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "RX_HT_BW", RX_HT_BW);\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "RX_VHT_BW", RX_VHT_BW);\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "RX_SC", RXSC);\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "RX_HT", RX_HT);\r
+       DCMD_Printf(BbDbgBuf);\r
+       */\r
+       \r
+       //rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  RX_HT:%s ", RXHT_table[RX_HT]);\r
+       //DCMD_Printf(BbDbgBuf);\r
+       RX_BW = 0;\r
+\r
+       if(RX_HT == 2)\r
+       {\r
+               rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  Mode: VHT Mode");\r
+               DCMD_Printf(BbDbgBuf);\r
+               if(RX_VHT_BW==0)\r
+               {\r
+                       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "     BW=20M");\r
+                       DCMD_Printf(BbDbgBuf);\r
+               }       \r
+               else if(RX_VHT_BW==1)\r
+               {\r
+                       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "     BW=40M");\r
+                       DCMD_Printf(BbDbgBuf);\r
+               }\r
+               else\r
+               {\r
+                       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "     BW=80M");\r
+                       DCMD_Printf(BbDbgBuf);\r
+               }\r
+               RX_BW = RX_VHT_BW;\r
+       }\r
+       else if(RX_HT == 1)\r
+       {\r
+               rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  Mode: HT Mode");\r
+               DCMD_Printf(BbDbgBuf);\r
+               if(RX_HT_BW==0)\r
+               {\r
+                       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "     BW=20M");\r
+                       DCMD_Printf(BbDbgBuf);\r
+               }       \r
+               else if(RX_HT_BW==1)\r
+               {\r
+                       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "     BW=40M");\r
+                       DCMD_Printf(BbDbgBuf);\r
+               }\r
+               RX_BW = RX_HT_BW;\r
+       }\r
+       else\r
+       {\r
+               rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  Mode: Legeacy Mode");\r
+               DCMD_Printf(BbDbgBuf);\r
+       }\r
+\r
+       if(RX_HT !=0)\r
+       {\r
+               if(RXSC==0)\r
+                       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  duplicate/full bw");\r
+               else if(RXSC==1)\r
+                       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  usc20-1");\r
+               else if(RXSC==2)\r
+                       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  lsc20-1");\r
+               else if(RXSC==3)\r
+                       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  usc20-2");\r
+               else if(RXSC==4)\r
+                       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  lsc20-2");\r
+               else if(RXSC==9)\r
+                       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  usc40");\r
+               else if(RXSC==10)\r
+                       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  lsc40");\r
+               DCMD_Printf(BbDbgBuf);\r
+       }\r
+       /*\r
+       if(RX_HT == 2){\r
+               rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "  BW:%s", BW_table[RX_VHT_BW]);\r
+               RX_BW = RX_VHT_BW;\r
+               }\r
+       else if(RX_HT == 1){            \r
+               rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "  BW:%s", BW_table[RX_HT_BW]);\r
+               RX_BW = RX_HT_BW;\r
+               }\r
+       else\r
+               rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE,  "");\r
+       \r
+       DCMD_Printf(BbDbgBuf);  \r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "  RXSC:%s", RXSC_table[RXSC]);             \r
+       DCMD_Printf(BbDbgBuf);\r
+       */\r
+       /////////////////////////////////////////////////////// \r
+       \r
+//     rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "dB Conversion: 10log(65)", ODM_PWdB_Conversion(65,10,0));\r
+//     DCMD_Printf(BbDbgBuf);\r
+\r
+        // RX signal power and AGC related info\r
+        ///////////////////////////////////////////////////////\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xF90 ,bMaskDWord);\r
+       pwDB = (u1Byte) ((value32 & bMaskByte1) >> 8);\r
+       pwDB=pwDB>>1;\r
+       sig_power = -110+pwDB;\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "OFDM RX Signal Power(dB)", sig_power);\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xd14 ,bMaskDWord);\r
+       RX_SNR_pathA = (u1Byte)(value32&0xFF)>>1;\r
+       RF_gain_pathA = (s1Byte) ((value32 & bMaskByte1) >> 8);\r
+       RF_gain_pathA *=2;\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xd54 ,bMaskDWord);\r
+       RX_SNR_pathB = (u1Byte)(value32&0xFF)>>1;\r
+       RF_gain_pathB = (s1Byte) ((value32 & bMaskByte1) >> 8);\r
+       RF_gain_pathB *=2;\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xd94 ,bMaskDWord);\r
+       RX_SNR_pathC = (u1Byte)(value32&0xFF)>>1;\r
+       RF_gain_pathC = (s1Byte) ((value32 & bMaskByte1) >> 8);\r
+       RF_gain_pathC *=2;\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xdd4 ,bMaskDWord);\r
+       RX_SNR_pathD = (u1Byte)(value32&0xFF)>>1;\r
+       RF_gain_pathD = (s1Byte) ((value32 & bMaskByte1) >> 8);\r
+       RF_gain_pathD *=2;\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d", "OFDM RX RF Gain(A/B/C/D)", RF_gain_pathA, RF_gain_pathA, RF_gain_pathC, RF_gain_pathD);\r
+       DCMD_Printf(BbDbgBuf);  \r
+        ///////////////////////////////////////////////////////\r
+\r
+       // RX Counter related info\r
+        ///////////////////////////////////////////////////////        \r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xF08 ,bMaskDWord);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "OFDM CCA Counter", ((value32&0xFFFF0000)>>16));\r
+       DCMD_Printf(BbDbgBuf);\r
+       \r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xFD0 ,bMaskDWord);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "OFDM SBD Fail Counter", value32&0xFFFF);\r
+       DCMD_Printf(BbDbgBuf);\r
+       \r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xFC4 ,bMaskDWord);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d", "VHT SIGA/SIGB CRC8 Fail Counter", value32&0xFFFF, ((value32&0xFFFF0000)>>16));\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xFCC ,bMaskDWord);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "CCK CCA Counter", value32&0xFFFF);\r
+       DCMD_Printf(BbDbgBuf);\r
+       \r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xFBC ,bMaskDWord);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d", "LSIG (\"Parity Fail\"/\"Rate Illegal\") Counter", value32&0xFFFF, ((value32&0xFFFF0000)>>16));\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       value32_1 = ODM_GetBBReg(pDM_Odm, 0xFC8 ,bMaskDWord);\r
+       value32_2 = ODM_GetBBReg(pDM_Odm, 0xFC0 ,bMaskDWord);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d", "HT/VHT MCS NOT SUPPORT counter", ((value32_2&0xFFFF0000)>>16), value32_1&0xFFFF);\r
+       DCMD_Printf(BbDbgBuf);\r
+       ///////////////////////////////////////////////////////\r
+       \r
+       // PostFFT related info\r
+       ///////////////////////////////////////////////////////\r
+\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xF8c ,bMaskDWord);\r
+       RXEVM_0 = (s1Byte) ((value32 & bMaskByte2) >> 16);\r
+       RXEVM_0 /=2;\r
+       if(RXEVM_0 < -63)\r
+               RXEVM_0=0;\r
+       \r
+       DCMD_Printf(BbDbgBuf);\r
+       RXEVM_1 = (s1Byte) ((value32 & bMaskByte3) >> 24);\r
+       RXEVM_1 /=2;\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xF88 ,bMaskDWord);\r
+       RXEVM_2 = (s1Byte) ((value32 & bMaskByte2) >> 16);\r
+       RXEVM_2 /=2;\r
+\r
+       if(RXEVM_1 < -63)\r
+               RXEVM_1=0;\r
+       if(RXEVM_2 < -63)\r
+               RXEVM_2=0;\r
+       \r
+       /*\r
+       if(RX_BW == 0){\r
+               RXEVM_0 -= evm_comp_20M;\r
+               RXEVM_1 -= evm_comp_20M;\r
+               RXEVM_2 -= evm_comp_20M;                \r
+               }\r
+       else if(RX_BW == 1){\r
+               RXEVM_0 -= evm_comp_40M;\r
+               RXEVM_1 -= evm_comp_40M;\r
+               RXEVM_2 -= evm_comp_40M;                \r
+               }\r
+       else if (RX_BW == 2){\r
+               RXEVM_0 -= evm_comp_80M;\r
+               RXEVM_1 -= evm_comp_80M;\r
+               RXEVM_2 -= evm_comp_80M;                \r
+               }\r
+               */\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d", "RXEVM (1ss/2ss/3ss)", RXEVM_0, RXEVM_1, RXEVM_2);\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+//     value32 = ODM_GetBBReg(pDM_Odm, 0xD14 ,bMaskDWord);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d", "RXSNR(A/B/C/D, dB)", RX_SNR_pathA, RX_SNR_pathB, RX_SNR_pathC, RX_SNR_pathD);\r
+       DCMD_Printf(BbDbgBuf);\r
+//     rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "B_RXSNR", (value32&0xFF00)>>9);\r
+//     DCMD_Printf(BbDbgBuf);\r
+\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xF8C ,bMaskDWord);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d", "CSI_1st /CSI_2nd", value32&0xFFFF, ((value32&0xFFFF0000)>>16));\r
+       DCMD_Printf(BbDbgBuf);\r
+       ///////////////////////////////////////////////////////                 \r
+       \r
+       //BW & Mode Detection\r
+\r
+       //Reset Page F Counter\r
+       ODM_SetBBReg(pDM_Odm, 0xB58 ,BIT0, 1);\r
+       ODM_SetBBReg(pDM_Odm, 0xB58 ,BIT0, 0);\r
+       \r
+       //CFO Report Info\r
+       //Short CFO\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xd0c ,bMaskDWord);\r
+       value32_1 = ODM_GetBBReg(pDM_Odm, 0xd4c ,bMaskDWord);\r
+       value32_2 = ODM_GetBBReg(pDM_Odm, 0xd8c ,bMaskDWord);\r
+       value32_3 = ODM_GetBBReg(pDM_Odm, 0xdcc ,bMaskDWord);\r
+\r
+       SFO_A=(s4Byte)(value32&bMask12Bits);\r
+       SFO_B=(s4Byte)(value32_1&bMask12Bits);\r
+       SFO_C=(s4Byte)(value32_2&bMask12Bits);\r
+       SFO_D=(s4Byte)(value32_3&bMask12Bits);\r
+\r
+       LFO_A=(s4Byte)(value32>>16);\r
+       LFO_B=(s4Byte)(value32_1>>16);\r
+       LFO_C=(s4Byte)(value32_2>>16);\r
+       LFO_D=(s4Byte)(value32_3>>16);\r
+\r
+       //SFO 2's to dec\r
+       if(SFO_A >2047)\r
+       {\r
+               SFO_A=SFO_A-4096;\r
+       }\r
+       SFO_A=(SFO_A*312500)/2048;\r
+       \r
+       if(SFO_B >2047)\r
+       {\r
+               SFO_B=SFO_B-4096;\r
+       }\r
+       SFO_B=(SFO_B*312500)/2048;\r
+       if(SFO_C >2047)\r
+       {\r
+               SFO_C=SFO_C-4096;\r
+       }\r
+       SFO_C=(SFO_C*312500)/2048;\r
+       if(SFO_D >2047)\r
+       {\r
+               SFO_D=SFO_D-4096;\r
+       }\r
+       SFO_D=(SFO_D*312500)/2048;\r
+\r
+       //LFO 2's to dec\r
+       \r
+       if(LFO_A >4095)\r
+       {\r
+               LFO_A=LFO_A-8192;\r
+       }\r
+       \r
+       if(LFO_B >4095)\r
+       {\r
+               LFO_B=LFO_B-8192;\r
+       }\r
+\r
+       if(LFO_C>4095)\r
+       {\r
+               LFO_C=LFO_C-8192;\r
+       }\r
+\r
+       if(LFO_D >4095)\r
+       {\r
+               LFO_D=LFO_D-8192;\r
+       }\r
+       LFO_A=LFO_A*312500/4096;\r
+       LFO_B=LFO_B*312500/4096;\r
+       LFO_C=LFO_C*312500/4096;\r
+       LFO_D=LFO_D*312500/4096;\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "CFO Report Info");\r
+       DCMD_Printf(BbDbgBuf);\r
+       \r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d/ %d/ %d", "  Short CFO(Hz) <A/B/C/D>", SFO_A,SFO_B,SFO_C,SFO_D);\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d/ %d/ %d", "  Long CFO(Hz) <A/B/C/D>", LFO_A,LFO_B,LFO_C,LFO_D);\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       //SCFO\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xd10 ,bMaskDWord);\r
+       value32_1 = ODM_GetBBReg(pDM_Odm, 0xd50 ,bMaskDWord);\r
+       value32_2 = ODM_GetBBReg(pDM_Odm, 0xd90 ,bMaskDWord);\r
+       value32_3 = ODM_GetBBReg(pDM_Odm, 0xdd0 ,bMaskDWord);\r
+\r
+       SFO_A=(s4Byte)(value32&0x7ff);\r
+       SFO_B=(s4Byte)(value32_1&0x7ff);\r
+       SFO_C=(s4Byte)(value32_2&0x7ff);\r
+       SFO_D=(s4Byte)(value32_3&0x7ff);\r
+\r
+       if(SFO_A >1023)\r
+       {\r
+               SFO_A=SFO_A-2048;\r
+       }\r
+       \r
+       if(SFO_B >2047)\r
+       {\r
+               SFO_B=SFO_B-4096;\r
+}\r
+\r
+       if(SFO_C >2047)\r
+       {\r
+               SFO_C=SFO_C-4096;\r
+       }\r
+\r
+       if(SFO_D >2047)\r
+       {\r
+               SFO_D=SFO_D-4096;\r
+       }\r
+       \r
+       SFO_A=SFO_A*312500/1024;\r
+       SFO_B=SFO_B*312500/1024;\r
+       SFO_C=SFO_C*312500/1024;\r
+       SFO_D=SFO_D*312500/1024;\r
+\r
+       LFO_A=(s4Byte)(value32>>16);\r
+       LFO_B=(s4Byte)(value32_1>>16);\r
+       LFO_C=(s4Byte)(value32_2>>16);\r
+       LFO_D=(s4Byte)(value32_3>>16);\r
+\r
+       if(LFO_A >4095)\r
+       {\r
+               LFO_A=LFO_A-8192;\r
+       }\r
+       \r
+       if(LFO_B >4095)\r
+       {\r
+               LFO_B=LFO_B-8192;\r
+       }\r
+\r
+       if(LFO_C>4095)\r
+       {\r
+               LFO_C=LFO_C-8192;\r
+       }\r
+\r
+       if(LFO_D >4095)\r
+       {\r
+               LFO_D=LFO_D-8192;\r
+       }\r
+       LFO_A=LFO_A*312500/4096;\r
+       LFO_B=LFO_B*312500/4096;\r
+       LFO_C=LFO_C*312500/4096;\r
+       LFO_D=LFO_D*312500/4096;\r
+       \r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d/ %d/ %d", "  Value SCFO(Hz) <A/B/C/D>", SFO_A,SFO_B,SFO_C,SFO_D);\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d/ %d/ %d", "  ACQ CFO(Hz) <A/B/C/D>", LFO_A,LFO_B,LFO_C,LFO_D);\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xd14 ,bMaskDWord);\r
+       value32_1 = ODM_GetBBReg(pDM_Odm, 0xd54 ,bMaskDWord);\r
+       value32_2 = ODM_GetBBReg(pDM_Odm, 0xd94 ,bMaskDWord);\r
+       value32_3 = ODM_GetBBReg(pDM_Odm, 0xdd4 ,bMaskDWord);\r
+\r
+       LFO_A=(s4Byte)(value32>>16);\r
+       LFO_B=(s4Byte)(value32_1>>16);\r
+       LFO_C=(s4Byte)(value32_2>>16);\r
+       LFO_D=(s4Byte)(value32_3>>16);\r
+\r
+       if(LFO_A >4095)\r
+       {\r
+               LFO_A=LFO_A-8192;\r
+       }\r
+       \r
+       if(LFO_B >4095)\r
+       {\r
+               LFO_B=LFO_B-8192;\r
+       }\r
+\r
+       if(LFO_C>4095)\r
+       {\r
+               LFO_C=LFO_C-8192;\r
+       }\r
+\r
+       if(LFO_D >4095)\r
+       {\r
+               LFO_D=LFO_D-8192;\r
+       }\r
+       LFO_A=LFO_A*312500/4096;\r
+       LFO_B=LFO_B*312500/4096;\r
+       LFO_C=LFO_C*312500/4096;\r
+       LFO_D=LFO_D*312500/4096;\r
+       \r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d/ %d/ %d", "  End CFO(Hz) <A/B/C/D>", LFO_A,LFO_B,LFO_C,LFO_D);\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xf20 ,bMaskDWord);   //L SIG\r
+       \r
+       Tail=(u1Byte)((value32&0xfc0000)>>16);\r
+       Parity = (u1Byte)((value32&0x20000)>>16);\r
+       Length =(u2Byte)((value32&0x1ffe00)>>8);\r
+       rsv = (u1Byte)(value32&0x10);\r
+       MCSS=(u1Byte)(value32&0x0f);\r
+\r
+       switch(MCSS)\r
+       {\r
+               case 0x0b:\r
+                       idx=0;\r
+               break;\r
+               case 0x0f:\r
+                       idx=1;\r
+               break;\r
+               case 0x0a:\r
+                       idx=2;\r
+               break;\r
+               case 0x0e:\r
+                       idx=3;\r
+               break;\r
+               case 0x09:\r
+                       idx=4;\r
+               break;\r
+               case 0x08:\r
+                       idx=5;\r
+               break;\r
+               case 0x0c:\r
+                       idx=6;\r
+               break;\r
+               default:\r
+                       idx=6;\r
+               break;\r
+                       \r
+       }\r
+\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "L-SIG");\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n   Rate:%s", L_rate[idx]);             \r
+       DCMD_Printf(BbDbgBuf);  \r
+\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x/ %x /%x", "  Rsv/Length/Parity",rsv,RX_BW,Length);\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "HT-SIG1");\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xf2c ,bMaskDWord);   //HT SIG\r
+       if(RX_HT == 1)\r
+       {\r
+       \r
+               HMCSS=(u1Byte)(value32&0x7F);\r
+               HRX_BW = (u1Byte)(value32&0x80);\r
+               HLength =(u2Byte)((value32>>8)&0xffff);\r
+       }\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x / %x/ %x", "  MCS/BW/Length",HMCSS,HRX_BW,HLength);\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "HT-SIG2");\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xf30 ,bMaskDWord);   //HT SIG\r
+\r
+       if(RX_HT == 1)\r
+       {\r
+               smooth = (u1Byte)(value32&0x01);\r
+               htsound =  (u1Byte)(value32&0x02);\r
+               rsv=(u1Byte)(value32&0x04);\r
+               agg =(u1Byte)(value32&0x08);\r
+               stbc =(u1Byte)(value32&0x30);\r
+               fec=(u1Byte)(value32&0x40);\r
+               sgi=(u1Byte)(value32&0x80);\r
+               htltf=(u1Byte)((value32&0x300)>>8);\r
+               htcrc8=(u2Byte)((value32&0x3fc00)>>8);\r
+               Tail=(u1Byte)((value32&0xfc0000)>>16);\r
+\r
+       \r
+       }\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x / %x/ %x/ %x/ %x/ %x", "  Smooth/NoSound/Rsv/Aggregate/STBC/LDPC",smooth,htsound,rsv,agg,stbc,fec);\r
+       DCMD_Printf(BbDbgBuf);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x / %x/ %x/ %x", "  SGI/E-HT-LTFs/CRC/Tail",sgi,htltf,htcrc8,Tail);\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       \r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "VHT-SIG-A1");\r
+       DCMD_Printf(BbDbgBuf);\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xf2c ,bMaskDWord);   //VHT SIG A1\r
+       if(RX_HT == 2)\r
+       {\r
+               //value32 = ODM_GetBBReg(pDM_Odm, 0xf2c ,bMaskDWord);   //VHT SIG A1\r
+               vRX_BW=(u1Byte)(value32&0x03);\r
+               vrsv=(u1Byte)(value32&0x04);\r
+               vstbc =(u1Byte)(value32&0x08);\r
+               vgid = (u1Byte)((value32&0x3f0)>>4);\r
+               vNsts = (u1Byte)(((value32&0x1c00)>>8)+1);\r
+               vpaid = (u2Byte)(value32&0x3fe);\r
+               vtxops =(u1Byte)((value32&0x400000)>>20);\r
+               vrsv2 = (u1Byte)((value32&0x800000)>>20);\r
+       }\r
+\r
+       //rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x", "F2C", value32);\r
+       //DCMD_Printf(BbDbgBuf);\r
+\r
+       \r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x / %x/ %x/ %x/ %x/ %x /%x /%x", "  BW/Rsv1/STBC/GID/Nsts/PAID/TXOPPS/Rsv2",vRX_BW,vrsv,vstbc,vgid,vNsts,vpaid,vtxops,vrsv2);\r
+       DCMD_Printf(BbDbgBuf);\r
+       \r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "VHT-SIG-A2");\r
+       DCMD_Printf(BbDbgBuf);\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xf30 ,bMaskDWord);   //VHT SIG\r
+\r
+\r
+       if(RX_HT == 2)\r
+       {\r
+               //value32 = ODM_GetBBReg(pDM_Odm, 0xf30 ,bMaskDWord);   //VHT SIG\r
+\r
+               //sgi=(u1Byte)(value32&0x01);\r
+               sgiext =(u1Byte)(value32&0x03);\r
+               //fec = (u1Byte)(value32&0x04);\r
+               fecext = (u1Byte)(value32&0x0C);\r
+\r
+               vMCSS =(u1Byte)(value32&0xf0); \r
+               bf = (u1Byte)((value32&0x100)>>8); \r
+               vrsv =(u1Byte)((value32&0x200)>>8);  \r
+               vhtcrc8=(u2Byte)((value32&0x3fc00)>>8);\r
+               vTail=(u1Byte)((value32&0xfc0000)>>16);\r
+       }\r
+       //rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x", "F30", value32);\r
+       //DCMD_Printf(BbDbgBuf);\r
+       \r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x / %x/ %x/ %x/ %x/ %x/ %x", "  SGI/FEC/MCS/BF/Rsv/CRC/Tail",sgiext,fecext,vMCSS,bf,vrsv,vhtcrc8,vTail);\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "VHT-SIG-B");\r
+       DCMD_Printf(BbDbgBuf);\r
+       value32 = ODM_GetBBReg(pDM_Odm, 0xf34 ,bMaskDWord);   //VHT SIG\r
+       {\r
+               vLength=(u2Byte)(value32&0x1fffff);\r
+               vbrsv = (u1Byte)((value32&0x600000)>>20);\r
+               vbTail =(u2Byte)((value32&0x1f800000)>>20);\r
+               vbcrc = (u1Byte)((value32&0x80000000)>>28);\r
+       \r
+       }\r
+       //rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x", "F34", value32);\r
+       //DCMD_Printf(BbDbgBuf);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %x / %x/ %x/ %x/", "  Length/Rsv/Tail/CRC",vLength,vbrsv,vbTail,vbcrc);\r
+       DCMD_Printf(BbDbgBuf);\r
+       \r
+               \r
+}\r
+\r
+\r
+VOID phydm_BasicProfile(\r
+       IN              PVOID                   pDM_VOID\r
+       )\r
+{\r
+        PDM_ODM_T              pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+        PADAPTER                      Adapter = pDM_Odm->Adapter;\r
+        char* Cut = NULL;\r
+       char* ICType = NULL;\r
+\r
+        rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n%-35s", "% Basic Profile %");\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       if(pDM_Odm->SupportICType == ODM_RTL8192C)\r
+               ICType = "RTL8192C";\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8192D)\r
+               ICType = "RTL8192D";\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8723A)\r
+               ICType = "RTL8723A";\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8188E)\r
+               ICType = "RTL8188E";\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8812)\r
+               ICType = "RTL8812A";\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8821)\r
+               ICType = "RTL8821A";\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8192E)\r
+               ICType = "RTL8192E";\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+               ICType = "RTL8723B";\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8814A)\r
+               ICType = "RTL8814A";\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8881A)\r
+               ICType = "RTL8881A";\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8821B)\r
+               ICType = "RTL8821B";\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8822B)\r
+               ICType = "RTL8822B";\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8703B)\r
+               ICType = "RTL8703B";\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8195A)\r
+               ICType = "RTL8195A";\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8188F)\r
+               ICType = "RTL8188F";\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  %-35s: %s (MP Chip: %s)","IC Type", ICType, pDM_Odm->bIsMPChip?"Yes":"No");          \r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+        if(pDM_Odm->CutVersion==ODM_CUT_A)\r
+            Cut = "A";\r
+        else if(pDM_Odm->CutVersion==ODM_CUT_B)\r
+            Cut = "B";\r
+        else if(pDM_Odm->CutVersion==ODM_CUT_C)\r
+            Cut = "C";\r
+        else if(pDM_Odm->CutVersion==ODM_CUT_D)\r
+            Cut = "D";\r
+        else if(pDM_Odm->CutVersion==ODM_CUT_E)\r
+            Cut = "E";\r
+        else if(pDM_Odm->CutVersion==ODM_CUT_F)\r
+            Cut = "F";\r
+        else if(pDM_Odm->CutVersion==ODM_CUT_I)\r
+            Cut = "I";\r
+        rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  %-35s: %s","Cut Version", Cut);             \r
+       DCMD_Printf(BbDbgBuf);\r
+        rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  %-35s: %d","PHY Parameter Version", ODM_GetHWImgVersion(pDM_Odm));          \r
+       DCMD_Printf(BbDbgBuf);\r
+        rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  %-35s: %d (Subversion: %d)","FW Version", Adapter->MgntInfo.FirmwareVersion, Adapter->MgntInfo.FirmwareSubVersion);         \r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+       //1 PHY DM Version List\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n%-35s","% PHYDM Version %");\r
+       DCMD_Printf(BbDbgBuf);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  %-35s: %s","Adaptivity", ADAPTIVITY_VERSION);\r
+       DCMD_Printf(BbDbgBuf);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  %-35s: %s","DIG", DIG_VERSION);\r
+       DCMD_Printf(BbDbgBuf);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  %-35s: %s","Dynamic BB PowerSaving", DYNAMIC_BBPWRSAV_VERSION);\r
+       DCMD_Printf(BbDbgBuf);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  %-35s: %s","CFO Tracking", CFO_TRACKING_VERSION);\r
+       DCMD_Printf(BbDbgBuf);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  %-35s: %s","Antenna Diversity", ANTDIV_VERSION);\r
+       DCMD_Printf(BbDbgBuf);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  %-35s: %s","Power Tracking", POWRTRACKING_VERSION);\r
+       DCMD_Printf(BbDbgBuf);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  %-35s: %s","Dynamic TxPower", DYNAMIC_TXPWR_VERSION);\r
+       DCMD_Printf(BbDbgBuf);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  %-35s: %s","RA Info", RAINFO_VERSION);\r
+       DCMD_Printf(BbDbgBuf);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  %-35s: %s","Antenna Detection", ANTDECT_VERSION);\r
+       DCMD_Printf(BbDbgBuf);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  %-35s: %s","Auto Channel Selection", ACS_VERSION);\r
+       DCMD_Printf(BbDbgBuf);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  %-35s: %s","EDCA Turbo", EDCATURBO_VERSION);\r
+       DCMD_Printf(BbDbgBuf);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  %-35s: %s","Path Diversity", PATHDIV_VERSION);\r
+       DCMD_Printf(BbDbgBuf);\r
+       rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, "\r\n  %-35s: %s","RxHP", RXHP_VERSION);\r
+       DCMD_Printf(BbDbgBuf);\r
+\r
+}\r
+#endif\r
+VOID\r
+phydm_BasicDbgMessage\r
+(\r
+       IN              PVOID                   pDM_VOID\r
+       )\r
+{\r
+#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+        PDM_ODM_T              pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm , PHYDM_FALSEALMCNT);\r
+       pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
+       \r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_BasicDbgMsg==>\n"));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bLinked = %d, RSSI_Min = %d, CurrentIGI = 0x%x \n",\r
+               pDM_Odm->bLinked, pDM_Odm->RSSI_Min, pDM_DigTable->CurIGValue) );\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("Cnt_Cck_fail = %d, Cnt_Ofdm_fail = %d, Total False Alarm = %d\n", \r
+               FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_all));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RxRate = 0x%x, RSSI_A = %d, RSSI_B = %d\n", \r
+               pDM_Odm->RxRate, pDM_Odm->RSSI_A, pDM_Odm->RSSI_B));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RSSI_C = %d, RSSI_D = %d\n", pDM_Odm->RSSI_C, pDM_Odm->RSSI_D));\r
+#endif\r
+}\r
+\r
+#if( DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+struct _PHYDM_COMMAND {
+       char name[16];
+       u1Byte id;
+};
+
+enum PHYDM_CMD_ID {
+       PHYDM_ANTDIV,
+};
+
+struct _PHYDM_COMMAND phy_dm_ary[] = {
+       {"antdiv", PHYDM_ANTDIV},
+};
+
+s4Byte
+PhyDM_Cmd(
+       IN PDM_ODM_T    pDM_Odm,
+       IN char         *input,
+       IN u4Byte       in_len,
+       IN u1Byte       flag,
+       OUT char        *output,
+       IN u4Byte       out_len
+       )
+{
+       u4Byte used = 0;
+
+       if (flag == 0) {
+               if (out_len > used)
+                       used += snprintf(output+used, out_len-used, "GET, nothing to print\n");
+       } else {
+               char *token;
+               u1Byte id = 0;
+               int var = 0;
+
+               token = strsep(&input, ", ");
+               if (token) {
+                       int n, i;
+                       n = sizeof(phy_dm_ary)/sizeof(struct _PHYDM_COMMAND);
+                       for (i = 0; i < n; i++) {
+                               if (strcmp(phy_dm_ary[i].name, token) == 0) {
+                                       id = phy_dm_ary[i].id;
+                                       break;
+                               }
+                       }
+                       if (i == n) {
+                               if (out_len > used)
+                                       used += snprintf(output+used, out_len-used, "SET, command not found!\n");
+                               goto exit;
+                       }
+               }
+
+               switch (id) {
+               case PHYDM_ANTDIV:
+                       token = strsep(&input, ", ");
+                       sscanf(token, "%d", &var);
+                       if (out_len > used)
+                               used += snprintf(output+used, out_len-used, "SET, old antdiv_select=%d\n", pDM_Odm->antdiv_select);
+                       pDM_Odm->antdiv_select = var;
+                       if (out_len > used)
+                               used += snprintf(output+used, out_len-used, "SET, new antdiv_select=%d\n", pDM_Odm->antdiv_select);
+                       break;
+
+               default:
+                       if (out_len > used)
+                               used += snprintf(output+used, out_len-used, "SET, unknown command!\n");
+                       break;
+               }
+       }
+
+exit:
+       return 0;
+}\r
+#endif\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_debug.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_debug.h
new file mode 100755 (executable)
index 0000000..93574f2
--- /dev/null
@@ -0,0 +1,202 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+\r
+#ifndef        __ODM_DBG_H__\r
+#define __ODM_DBG_H__\r
+\r
+\r
+//-----------------------------------------------------------------------------\r
+//     Define the debug levels\r
+//\r
+//     1.      DBG_TRACE and DBG_LOUD are used for normal cases.\r
+//     So that, they can help SW engineer to develope or trace states changed \r
+//     and also help HW enginner to trace every operation to and from HW, \r
+//     e.g IO, Tx, Rx. \r
+//\r
+//     2.      DBG_WARNNING and DBG_SERIOUS are used for unusual or error cases, \r
+//     which help us to debug SW or HW.\r
+//\r
+//-----------------------------------------------------------------------------\r
+//\r
+//     Never used in a call to ODM_RT_TRACE()!\r
+//\r
+#define ODM_DBG_OFF                                    1\r
+\r
+//\r
+//     Fatal bug. \r
+//     For example, Tx/Rx/IO locked up, OS hangs, memory access violation, \r
+//     resource allocation failed, unexpected HW behavior, HW BUG and so on.\r
+//\r
+#define ODM_DBG_SERIOUS                                2\r
+\r
+//\r
+//     Abnormal, rare, or unexpeted cases.\r
+//     For example, IRP/Packet/OID canceled, device suprisely unremoved and so on.\r
+//\r
+#define ODM_DBG_WARNING                                3\r
+\r
+//\r
+//     Normal case with useful information about current SW or HW state. \r
+//     For example, Tx/Rx descriptor to fill, Tx/Rx descriptor completed status, \r
+//     SW protocol state change, dynamic mechanism state change and so on.\r
+//\r
+#define ODM_DBG_LOUD                                   4\r
+\r
+//\r
+//     Normal case with detail execution flow or information.\r
+//\r
+#define ODM_DBG_TRACE                                  5\r
+\r
+//-----------------------------------------------------------------------------\r
+// Define the tracing components\r
+//\r
+//-----------------------------------------------------------------------------\r
+//BB Functions\r
+#define ODM_COMP_DIG                                   BIT0    \r
+#define ODM_COMP_RA_MASK                               BIT1    \r
+#define ODM_COMP_DYNAMIC_TXPWR         BIT2\r
+#define ODM_COMP_FA_CNT                                BIT3\r
+#define ODM_COMP_RSSI_MONITOR          BIT4\r
+#define ODM_COMP_CCK_PD                                BIT5\r
+#define ODM_COMP_ANT_DIV                               BIT6\r
+#define ODM_COMP_PWR_SAVE                      BIT7\r
+#define ODM_COMP_PWR_TRAIN                     BIT8\r
+#define ODM_COMP_RATE_ADAPTIVE         BIT9\r
+#define ODM_COMP_PATH_DIV                              BIT10\r
+#define ODM_COMP_PSD                                   BIT11\r
+#define ODM_COMP_DYNAMIC_PRICCA                BIT12\r
+#define ODM_COMP_RXHP                                  BIT13\r
+#define ODM_COMP_MP                                    BIT14\r
+#define ODM_COMP_CFO_TRACKING          BIT15\r
+#define ODM_COMP_ACS                                   BIT16\r
+#define PHYDM_COMP_ADAPTIVITY                  BIT17\r
+//MAC Functions\r
+#define ODM_COMP_EDCA_TURBO                    BIT20\r
+#define ODM_COMP_EARLY_MODE                    BIT21\r
+//RF Functions\r
+#define ODM_COMP_TX_PWR_TRACK          BIT24\r
+#define ODM_COMP_RX_GAIN_TRACK         BIT25\r
+#define ODM_COMP_CALIBRATION                   BIT26\r
+//Common Functions\r
+#define ODM_COMP_COMMON                                BIT30\r
+#define ODM_COMP_INIT                                  BIT31\r
+\r
+/*------------------------Export Marco Definition---------------------------*/\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       #define RT_PRINTK                               DbgPrint\r
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+       #define DbgPrint        printk\r
+       #define RT_PRINTK(fmt, args...) DbgPrint( "%s(): " fmt, __FUNCTION__, ## args);\r
+       #define RT_DISP(dbgtype, dbgflag, printstr)\r
+#else\r
+       #define DbgPrint        panic_printk\r
+       #define RT_PRINTK(fmt, args...) DbgPrint( "%s(): " fmt, __FUNCTION__, ## args);\r
+#endif\r
+\r
+#ifndef ASSERT\r
+       #define ASSERT(expr)\r
+#endif\r
+\r
+#if DBG\r
+#define ODM_RT_TRACE(pDM_Odm, comp, level, fmt)                                                                        \\r
+               if(((comp) & pDM_Odm->DebugComponents) && (level <= pDM_Odm->DebugLevel || level == ODM_DBG_SERIOUS))   \\r
+               {                                                                                                                                                       \\r
+                       if(pDM_Odm->SupportICType == ODM_RTL8192C)                                                              \\r
+                               DbgPrint("[ODM-92C] ");                                                                                         \\r
+                       else if(pDM_Odm->SupportICType == ODM_RTL8192D)                                                 \\r
+                               DbgPrint("[ODM-92D] ");                                                                                         \\r
+                       else if(pDM_Odm->SupportICType == ODM_RTL8723A)                                                 \\r
+                               DbgPrint("[ODM-8723A] ");                                                                                       \\r
+                       else if(pDM_Odm->SupportICType == ODM_RTL8188E)                                                 \\r
+                               DbgPrint("[ODM-8188E] ");                                                                                       \\r
+                       else if(pDM_Odm->SupportICType == ODM_RTL8192E)                                                 \\r
+                               DbgPrint("[ODM-8192E] ");                                                                                       \\r
+                       else if(pDM_Odm->SupportICType == ODM_RTL8812)                                                  \\r
+                               DbgPrint("[ODM-8812] ");                                                                                        \\r
+                       else if(pDM_Odm->SupportICType == ODM_RTL8821)                                                  \\r
+                               DbgPrint("[ODM-8821] ");                                                                                        \\r
+                       else if(pDM_Odm->SupportICType == ODM_RTL8814A)                                                 \\r
+                               DbgPrint("[ODM-8814] ");                                                                                        \\r
+                       RT_PRINTK fmt;                                                                                                                  \\r
+               }\r
+\r
+#define ODM_RT_TRACE_F(pDM_Odm, comp, level, fmt)                                                                      \\r
+               if(((comp) & pDM_Odm->DebugComponents) && (level <= pDM_Odm->DebugLevel))       \\r
+               {                                                                                                                                                       \\r
+                       RT_PRINTK fmt;                                                                                                                  \\r
+               }\r
+\r
+#define ODM_RT_ASSERT(pDM_Odm, expr, fmt)                                                                                      \\r
+               if(!(expr)) {                                                                                                                                   \\r
+                       DbgPrint( "Assertion failed! %s at ......\n", #expr);                                                           \\r
+                       DbgPrint( "      ......%s,%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__);                        \\r
+                       RT_PRINTK fmt;                                                                                                                  \\r
+                       ASSERT(FALSE);                                                                                                                  \\r
+               }\r
+#define ODM_dbg_enter() { DbgPrint("==> %s\n", __FUNCTION__); }\r
+#define ODM_dbg_exit() { DbgPrint("<== %s\n", __FUNCTION__); }\r
+#define ODM_dbg_trace(str) { DbgPrint("%s:%s\n", __FUNCTION__, str); }\r
+\r
+#define ODM_PRINT_ADDR(pDM_Odm, comp, level, title_str, ptr)                                                   \\r
+                       if(((comp) & pDM_Odm->DebugComponents) && (level <= pDM_Odm->DebugLevel))       \\r
+                       {                                                                                                                                               \\r
+                               int __i;                                                                                                                                \\r
+                               pu1Byte __ptr = (pu1Byte)ptr;                                                                                   \\r
+                               DbgPrint("[ODM] ");                                                                                                     \\r
+                               DbgPrint(title_str);                                                                                                    \\r
+                               DbgPrint(" ");                                                                                                          \\r
+                               for( __i=0; __i<6; __i++ )                                                                                              \\r
+                                       DbgPrint("%02X%s", __ptr[__i], (__i==5)?"":"-");                                                \\r
+                               DbgPrint("\n");                                                                                                         \\r
+                       }\r
+#else\r
+#define ODM_RT_TRACE(pDM_Odm, comp, level, fmt)\r
+#define ODM_RT_TRACE_F(pDM_Odm, comp, level, fmt)\r
+#define ODM_RT_ASSERT(pDM_Odm, expr, fmt)\r
+#define ODM_dbg_enter()\r
+#define ODM_dbg_exit()\r
+#define ODM_dbg_trace(str)\r
+#define ODM_PRINT_ADDR(pDM_Odm, comp, level, title_str, ptr)\r
+#endif\r
+\r
+\r
+VOID \r
+PHYDM_InitDebugSetting(IN              PDM_ODM_T               pDM_Odm);\r
+\r
+#define        BB_TMP_BUF_SIZE         100\r
+VOID phydm_BB_Debug_Info(IN PDM_ODM_T pDM_Odm);\r
+VOID phydm_BasicProfile(IN             PVOID                   pDM_VOID);\r
+VOID phydm_BasicDbgMessage(    IN              PVOID                   pDM_VOID);\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+s4Byte\r
+PhyDM_Cmd(\r
+       IN PDM_ODM_T    pDM_Odm,\r
+       IN char         *input,\r
+       IN u4Byte       in_len,\r
+       IN u1Byte       flag,\r
+       OUT char        *output,\r
+       IN u4Byte       out_len\r
+);\r
+#endif\r
+\r
+#endif // __ODM_DBG_H__\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_interface.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_interface.c
new file mode 100755 (executable)
index 0000000..16caf37
--- /dev/null
@@ -0,0 +1,835 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+\r
+#include "Mp_Precomp.h"\r
+#include "phydm_precomp.h"\r
+\r
+//\r
+// ODM IO Relative API.\r
+//\r
+\r
+u1Byte\r
+ODM_Read1Byte(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u4Byte                  RegAddr\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       prtl8192cd_priv priv    = pDM_Odm->priv;\r
+       return  RTL_R8(RegAddr);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       return rtw_read8(Adapter,RegAddr);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       return  PlatformEFIORead1Byte(Adapter, RegAddr);\r
+#endif \r
+\r
+}\r
+\r
+\r
+u2Byte\r
+ODM_Read2Byte(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u4Byte                  RegAddr\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       prtl8192cd_priv priv    = pDM_Odm->priv;\r
+       return  RTL_R16(RegAddr);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       return rtw_read16(Adapter,RegAddr);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       return  PlatformEFIORead2Byte(Adapter, RegAddr);\r
+#endif \r
+\r
+}\r
+\r
+\r
+u4Byte\r
+ODM_Read4Byte(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u4Byte                  RegAddr\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       prtl8192cd_priv priv    = pDM_Odm->priv;\r
+       return  RTL_R32(RegAddr);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       return rtw_read32(Adapter,RegAddr);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       return  PlatformEFIORead4Byte(Adapter, RegAddr);\r
+#endif \r
+\r
+}\r
+\r
+\r
+VOID\r
+ODM_Write1Byte(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u4Byte                  RegAddr,\r
+       IN      u1Byte                  Data\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       prtl8192cd_priv priv    = pDM_Odm->priv;\r
+       RTL_W8(RegAddr, Data);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       rtw_write8(Adapter,RegAddr, Data);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       PlatformEFIOWrite1Byte(Adapter, RegAddr, Data);\r
+#endif\r
+       \r
+}\r
+\r
+\r
+VOID\r
+ODM_Write2Byte(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u4Byte                  RegAddr,\r
+       IN      u2Byte                  Data\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       prtl8192cd_priv priv    = pDM_Odm->priv;\r
+       RTL_W16(RegAddr, Data);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       rtw_write16(Adapter,RegAddr, Data);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       PlatformEFIOWrite2Byte(Adapter, RegAddr, Data);\r
+#endif \r
+\r
+}\r
+\r
+\r
+VOID\r
+ODM_Write4Byte(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u4Byte                  RegAddr,\r
+       IN      u4Byte                  Data\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       prtl8192cd_priv priv    = pDM_Odm->priv;\r
+       RTL_W32(RegAddr, Data);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       rtw_write32(Adapter,RegAddr, Data);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       PlatformEFIOWrite4Byte(Adapter, RegAddr, Data);\r
+#endif \r
+\r
+}\r
+\r
+\r
+VOID\r
+ODM_SetMACReg( \r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       IN      u4Byte          RegAddr,\r
+       IN      u4Byte          BitMask,\r
+       IN      u4Byte          Data\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data);\r
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       PHY_SetBBReg(Adapter, RegAddr, BitMask, Data);\r
+#endif \r
+}\r
+\r
+\r
+u4Byte \r
+ODM_GetMACReg( \r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       IN      u4Byte          RegAddr,\r
+       IN      u4Byte          BitMask\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask);\r
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+       return PHY_QueryMacReg(pDM_Odm->Adapter, RegAddr, BitMask);\r
+#endif \r
+}\r
+\r
+\r
+VOID\r
+ODM_SetBBReg(  \r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       IN      u4Byte          RegAddr,\r
+       IN      u4Byte          BitMask,\r
+       IN      u4Byte          Data\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data);\r
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       PHY_SetBBReg(Adapter, RegAddr, BitMask, Data);\r
+#endif \r
+}\r
+\r
+\r
+u4Byte \r
+ODM_GetBBReg(  \r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       IN      u4Byte          RegAddr,\r
+       IN      u4Byte          BitMask\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask);\r
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       return PHY_QueryBBReg(Adapter, RegAddr, BitMask);\r
+#endif \r
+}\r
+\r
+\r
+VOID\r
+ODM_SetRFReg(  \r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      ODM_RF_RADIO_PATH_E     eRFPath,\r
+       IN      u4Byte                          RegAddr,\r
+       IN      u4Byte                          BitMask,\r
+       IN      u4Byte                          Data\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       PHY_SetRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, Data);\r
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data);\r
+#endif \r
+}\r
+\r
+\r
+u4Byte \r
+ODM_GetRFReg(  \r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      ODM_RF_RADIO_PATH_E     eRFPath,\r
+       IN      u4Byte                          RegAddr,\r
+       IN      u4Byte                          BitMask\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       return PHY_QueryRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, 1);\r
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       return PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask);\r
+#endif \r
+}\r
+\r
+\r
+\r
+\r
+//\r
+// ODM Memory relative API.\r
+//\r
+VOID\r
+ODM_AllocateMemory(    \r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       OUT     PVOID           *pPtr,\r
+       IN      u4Byte          length\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       *pPtr = kmalloc(length, GFP_ATOMIC);\r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )\r
+       *pPtr = rtw_zvmalloc(length);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       PlatformAllocateMemory(Adapter, pPtr, length);\r
+#endif \r
+}\r
+\r
+// length could be ignored, used to detect memory leakage.\r
+VOID\r
+ODM_FreeMemory(        \r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       OUT     PVOID           pPtr,\r
+       IN      u4Byte          length\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       kfree(pPtr);\r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )  \r
+       rtw_vmfree(pPtr, length);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       //PADAPTER    Adapter = pDM_Odm->Adapter;\r
+       PlatformFreeMemory(pPtr, length);\r
+#endif \r
+}\r
+\r
+VOID\r
+ODM_MoveMemory(        \r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       OUT PVOID               pDest,\r
+       IN  PVOID               pSrc,\r
+       IN  u4Byte              Length\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       memcpy(pDest, pSrc, Length);\r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )  \r
+       _rtw_memcpy(pDest, pSrc, Length);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PlatformMoveMemory(pDest, pSrc, Length);\r
+#endif \r
+}\r
+\r
+void ODM_Memory_Set\r
+       (IN     PDM_ODM_T       pDM_Odm,\r
+               IN  PVOID       pbuf,\r
+               IN  s1Byte      value,\r
+               IN  u4Byte      length)\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       \r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )  \r
+       _rtw_memset(pbuf,value, length);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PlatformFillMemory(pbuf,length,value);\r
+#endif\r
+}\r
+s4Byte ODM_CompareMemory(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      PVOID           pBuf1,\r
+       IN      PVOID           pBuf2,\r
+       IN      u4Byte          length\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       return memcmp(pBuf1,pBuf2,length);\r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )  \r
+       return _rtw_memcmp(pBuf1,pBuf2,length);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)   \r
+       return PlatformCompareMemory(pBuf1,pBuf2,length);\r
+#endif \r
+}\r
+\r
+\r
+\r
+//\r
+// ODM MISC relative API.\r
+//\r
+VOID\r
+ODM_AcquireSpinLock(   \r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      RT_SPINLOCK_TYPE        type\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       PADAPTER Adapter = pDM_Odm->Adapter;\r
+       rtw_odm_acquirespinlock(Adapter, type);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       PlatformAcquireSpinLock(Adapter, type);\r
+#endif \r
+}\r
+VOID\r
+ODM_ReleaseSpinLock(   \r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      RT_SPINLOCK_TYPE        type\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+\r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )\r
+       PADAPTER Adapter = pDM_Odm->Adapter;\r
+       rtw_odm_releasespinlock(Adapter, type);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       PlatformReleaseSpinLock(Adapter, type);\r
+#endif \r
+}\r
+\r
+//\r
+// Work item relative API. FOr MP driver only~!\r
+//\r
+VOID\r
+ODM_InitializeWorkItem(        \r
+       IN      PDM_ODM_T                                       pDM_Odm,\r
+       IN      PRT_WORK_ITEM                           pRtWorkItem,\r
+       IN      RT_WORKITEM_CALL_BACK           RtWorkItemCallback,\r
+       IN      PVOID                                           pContext,\r
+       IN      const char*                                     szID\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       PlatformInitializeWorkItem(Adapter, pRtWorkItem, RtWorkItemCallback, pContext, szID);\r
+#endif \r
+}\r
+\r
+\r
+VOID\r
+ODM_StartWorkItem(     \r
+       IN      PRT_WORK_ITEM   pRtWorkItem\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PlatformStartWorkItem(pRtWorkItem);\r
+#endif \r
+}\r
+\r
+\r
+VOID\r
+ODM_StopWorkItem(      \r
+       IN      PRT_WORK_ITEM   pRtWorkItem\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PlatformStopWorkItem(pRtWorkItem);\r
+#endif \r
+}\r
+\r
+\r
+VOID\r
+ODM_FreeWorkItem(      \r
+       IN      PRT_WORK_ITEM   pRtWorkItem\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PlatformFreeWorkItem(pRtWorkItem);\r
+#endif \r
+}\r
+\r
+\r
+VOID\r
+ODM_ScheduleWorkItem(  \r
+       IN      PRT_WORK_ITEM   pRtWorkItem\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PlatformScheduleWorkItem(pRtWorkItem);\r
+#endif \r
+}\r
+\r
+\r
+VOID\r
+ODM_IsWorkItemScheduled(       \r
+       IN      PRT_WORK_ITEM   pRtWorkItem\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PlatformIsWorkItemScheduled(pRtWorkItem);\r
+#endif \r
+}\r
+\r
+\r
+\r
+//\r
+// ODM Timer relative API.\r
+//\r
+VOID\r
+ODM_StallExecution(    \r
+       IN      u4Byte  usDelay\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       rtw_udelay_os(usDelay);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PlatformStallExecution(usDelay);\r
+#endif \r
+}\r
+\r
+VOID\r
+ODM_delay_ms(IN u4Byte ms)\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       delay_ms(ms);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       rtw_mdelay_os(ms);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       delay_ms(ms);\r
+#endif                 \r
+}\r
+\r
+VOID\r
+ODM_delay_us(IN u4Byte us)\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       delay_us(us);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       rtw_udelay_os(us);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PlatformStallExecution(us);\r
+#endif                 \r
+}\r
+\r
+VOID\r
+ODM_sleep_ms(IN u4Byte ms)\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       rtw_msleep_os(ms);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)   \r
+#endif         \r
+}\r
+\r
+VOID\r
+ODM_sleep_us(IN u4Byte us)\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       rtw_usleep_os(us);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)   \r
+#endif         \r
+}\r
+\r
+VOID\r
+ODM_SetTimer(  \r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      PRT_TIMER               pTimer, \r
+       IN      u4Byte                  msDelay\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       mod_timer(pTimer, jiffies + RTL_MILISECONDS_TO_JIFFIES(msDelay));\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       _set_timer(pTimer,msDelay ); //ms\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       PlatformSetTimer(Adapter, pTimer, msDelay);\r
+#endif \r
+\r
+}\r
+\r
+VOID\r
+ODM_InitializeTimer(\r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      PRT_TIMER                       pTimer, \r
+       IN      RT_TIMER_CALL_BACK      CallBackFunc, \r
+       IN      PVOID                           pContext,\r
+       IN      const char*                     szID\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       init_timer(pTimer);\r
+       pTimer->function = CallBackFunc;\r
+       pTimer->data = (unsigned long)pDM_Odm;\r
+       mod_timer(pTimer, jiffies+RTL_MILISECONDS_TO_JIFFIES(10));      \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       PADAPTER Adapter = pDM_Odm->Adapter;\r
+       _init_timer(pTimer,Adapter->pnetdev,CallBackFunc,pDM_Odm);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PADAPTER Adapter = pDM_Odm->Adapter;\r
+       PlatformInitializeTimer(Adapter, pTimer, CallBackFunc,pContext,szID);\r
+#endif \r
+}\r
+\r
+\r
+VOID\r
+ODM_CancelTimer(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      PRT_TIMER               pTimer\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       del_timer_sync(pTimer);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       _cancel_timer_ex(pTimer);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PADAPTER Adapter = pDM_Odm->Adapter;\r
+       PlatformCancelTimer(Adapter, pTimer);\r
+#endif\r
+}\r
+\r
+\r
+VOID\r
+ODM_ReleaseTimer(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      PRT_TIMER               pTimer\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+\r
+       PADAPTER Adapter = pDM_Odm->Adapter;\r
+\r
+    // <20120301, Kordan> If the initilization fails, InitializeAdapterXxx will return regardless of InitHalDm. \r
+    // Hence, uninitialized timers cause BSOD when the driver releases resources since the init fail.\r
+    if (pTimer == 0) \r
+    {\r
+        ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_SERIOUS, ("=====>ODM_ReleaseTimer(), The timer is NULL! Please check it!\n"));\r
+        return;\r
+    }\r
+        \r
+       PlatformReleaseTimer(Adapter, pTimer);\r
+#endif\r
+}\r
+\r
+\r
+//\r
+// ODM FW relative API.\r
+//\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+VOID\r
+ODM_FillH2CCmd(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u1Byte                  ElementID,\r
+       IN      u4Byte                  CmdLen,\r
+       IN      pu1Byte                 pCmdBuffer\r
+)\r
+{\r
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+\r
+       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
+       {\r
+               switch(ElementID)\r
+               {\r
+                       case ODM_H2C_RSSI_REPORT:\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+                               FillH2CCmd(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer);\r
+#else\r
+       #if((RTL8812A_SUPPORT==1) ||(RTL8821A_SUPPORT==1))\r
+                               FillH2CCmd_8812(Adapter, H2C_8812_RSSI_REPORT, CmdLen, pCmdBuffer);\r
+       #endif\r
+#endif\r
+                               break;\r
+                       case ODM_H2C_IQ_CALIBRATION:\r
+#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+                               FillH2CCmd(Adapter, H2C_IQ_CALIBRATION, CmdLen, pCmdBuffer);\r
+#else\r
+       #if((RTL8812A_SUPPORT==1) ||(RTL8821A_SUPPORT==1))\r
+                               FillH2CCmd_8812(Adapter, H2C_8812_IQ_CALIBRATION, CmdLen, pCmdBuffer);\r
+       #endif\r
+#endif\r
+                               break;\r
+                       default:\r
+                               break;\r
+               }\r
+\r
+       }\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8192E)\r
+       {\r
+               switch(ElementID)\r
+               {\r
+                       case ODM_H2C_RSSI_REPORT:\r
+#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+                               FillH2CCmd(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer);\r
+#else\r
+       #if(RTL8192E_SUPPORT==1)\r
+                               FillH2CCmd_8192E(Adapter, H2C_8192E_RSSI_REPORT, CmdLen, pCmdBuffer);\r
+       #endif\r
+#endif\r
+                               break;\r
+                       default:\r
+                               break;\r
+               }       \r
+       }\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+       {\r
+               switch(ElementID)\r
+               {\r
+                       case ODM_H2C_RSSI_REPORT:\r
+#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+                               FillH2CCmd(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer);\r
+#else\r
+       #if(RTL8723B_SUPPORT==1)\r
+                               FillH2CCmd8723B(Adapter, H2C_8723B_RSSI_SETTING, CmdLen, pCmdBuffer);\r
+       #endif\r
+#endif\r
+                               break;\r
+                       case ODM_H2C_WIFI_CALIBRATION:\r
+#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+                               FillH2CCmd(Adapter, H2C_WIFI_CALIBRATION, CmdLen, pCmdBuffer);\r
+#else\r
+       #if(RTL8723B_SUPPORT==1)\r
+                               FillH2CCmd8723B(Adapter, H2C_8723B_BT_WLAN_CALIBRATION, CmdLen, pCmdBuffer);\r
+       #endif\r
+#endif\r
+                               break;\r
+                       default:\r
+                               break;                     \r
+               }\r
+\r
+       }\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8188E)\r
+       {\r
+               switch(ElementID)\r
+               {\r
+                       case ODM_H2C_RSSI_REPORT:\r
+                               //if((pDM_Odm->CutVersion == ODM_CUT_I) && (!pDM_Odm->RaSupport88E)){\r
+                               if(!pDM_Odm->RaSupport88E){\r
+#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+                                       FillH2CCmd88E(Adapter, H2C_88E_RSSI_REPORT, CmdLen, pCmdBuffer);\r
+#else\r
+       #if(RTL8188E_SUPPORT==1)\r
+                                       FillH2CCmd_88E(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer);\r
+       #endif\r
+#endif                 \r
+                               }\r
+                               break;\r
+                       default:\r
+                               break;\r
+               }\r
+       }\r
+#if(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8723A)\r
+       {\r
+               switch(ElementID)\r
+               {\r
+                       case ODM_H2C_RSSI_REPORT:\r
+       #if(RTL8723A_SUPPORT==1)\r
+                               FillH2CCmd(Adapter, RSSI_SETTING_EID, CmdLen, pCmdBuffer);\r
+       #endif\r
+                               break;\r
+                       default:\r
+                               break;\r
+               }\r
+       }\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8192D)\r
+       {\r
+               switch(ElementID)\r
+               {\r
+                       case ODM_H2C_RSSI_REPORT:\r
+       #if(RTL8192D_SUPPORT==1)\r
+                       FillH2CCmd92D(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer);    \r
+       #endif\r
+                               break;\r
+                       default:\r
+                               break;\r
+               }\r
+       }\r
+#endif\r
+       else\r
+       {\r
+               switch(ElementID)\r
+               {\r
+                       case ODM_H2C_RSSI_REPORT:\r
+#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+                               FillH2CCmd92C(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer);\r
+#else\r
+       #if(RTL8192C_SUPPORT==1)\r
+                               rtl8192c_FillH2CCmd(Adapter, RSSI_SETTING_EID, CmdLen, pCmdBuffer);\r
+       #endif\r
+#endif\r
+                               break;\r
+                       default:\r
+                               break;\r
+               }\r
+       }\r
+}\r
+#else\r
+u4Byte\r
+ODM_FillH2CCmd(        \r
+       IN      pu1Byte         pH2CBuffer,\r
+       IN      u4Byte          H2CBufferLen,\r
+       IN      u4Byte          CmdNum,\r
+       IN      pu4Byte         pElementID,\r
+       IN      pu4Byte         pCmdLen,\r
+       IN      pu1Byte*                pCmbBuffer,\r
+       IN      pu1Byte         CmdStartSeq\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)   \r
+       //FillH2CCmd(pH2CBuffer, H2CBufferLen, CmdNum, pElementID, pCmdLen, pCmbBuffer, CmdStartSeq);\r
+       return  FALSE;\r
+#endif\r
+\r
+       return  TRUE;\r
+}\r
+#endif\r
+\r
+\r
+u8Byte\r
+ODM_GetCurrentTime(    \r
+       IN      PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       return  0;\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       return (u8Byte)rtw_get_current_time();\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)   \r
+       return  PlatformGetCurrentTime();\r
+#endif\r
+}\r
+\r
+u8Byte\r
+ODM_GetProgressingTime(        \r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u8Byte                  Start_Time\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       return  0;\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       return rtw_get_passing_time_ms((u4Byte)Start_Time);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)   \r
+       return   ((PlatformGetCurrentTime() - Start_Time)>>10);\r
+#endif\r
+}\r
+\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_interface.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_interface.h
new file mode 100755 (executable)
index 0000000..6a6d50c
--- /dev/null
@@ -0,0 +1,414 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+\r
+#ifndef        __ODM_INTERFACE_H__\r
+#define __ODM_INTERFACE_H__\r
+\r
+\r
+\r
+//\r
+// =========== Constant/Structure/Enum/... Define\r
+//\r
+\r
+\r
+\r
+//\r
+// =========== Macro Define\r
+//\r
+\r
+#define _reg_all(_name)                        ODM_##_name\r
+#define _reg_ic(_name, _ic)            ODM_##_name##_ic\r
+#define _bit_all(_name)                        BIT_##_name\r
+#define _bit_ic(_name, _ic)            BIT_##_name##_ic\r
+\r
+// _cat: implemented by Token-Pasting Operator.\r
+#if 0\r
+#define _cat(_name, _ic_type, _func)                                                           \\r
+       (                                                                                                                       \\r
+               _func##_all(_name)                                                                              \\r
+       )\r
+#endif\r
+\r
+/*===================================\r
+\r
+#define ODM_REG_DIG_11N                0xC50\r
+#define ODM_REG_DIG_11AC       0xDDD\r
+\r
+ODM_REG(DIG,_pDM_Odm)\r
+=====================================*/\r
+\r
+#define _reg_11N(_name)                        ODM_REG_##_name##_11N \r
+#define _reg_11AC(_name)               ODM_REG_##_name##_11AC\r
+#define _bit_11N(_name)                        ODM_BIT_##_name##_11N \r
+#define _bit_11AC(_name)               ODM_BIT_##_name##_11AC\r
+\r
+#ifdef __ECOS\r
+#define _rtk_cat(_name, _ic_type, _func)               \\r
+       (                                       \\r
+               ((_ic_type) & ODM_IC_11N_SERIES)? _func##_11N(_name):           \\r
+               _func##_11AC(_name)     \\r
+       )\r
+#else\r
+\r
+#define _cat(_name, _ic_type, _func)                                                                   \\r
+       (                                                                                                                       \\r
+               ((_ic_type) & ODM_IC_11N_SERIES)? _func##_11N(_name):           \\r
+               _func##_11AC(_name)                                                                     \\r
+       )\r
+#endif\r
+/* \r
+// only sample code\r
+//#define _cat(_name, _ic_type, _func)                                                                 \\r
+//     (                                                                                                                       \\r
+//             ((_ic_type) & ODM_RTL8192C)? _func##_ic(_name, _8192C):         \\r
+//             ((_ic_type) & ODM_RTL8192D)? _func##_ic(_name, _8192D):         \\r
+//             ((_ic_type) & ODM_RTL8192S)? _func##_ic(_name, _8192S):         \\r
+//             ((_ic_type) & ODM_RTL8723A)? _func##_ic(_name, _8723A):         \\r
+//             ((_ic_type) & ODM_RTL8188E)? _func##_ic(_name, _8188E):         \\r
+//             _func##_ic(_name, _8195)                                                                        \\r
+//     )\r
+*/\r
+\r
+// _name: name of register or bit.\r
+// Example: "ODM_REG(R_A_AGC_CORE1, pDM_Odm)" \r
+//        gets "ODM_R_A_AGC_CORE1" or "ODM_R_A_AGC_CORE1_8192C", depends on SupportICType.\r
+#ifdef __ECOS\r
+#define ODM_REG(_name, _pDM_Odm)       _rtk_cat(_name, _pDM_Odm->SupportICType, _reg)\r
+#define ODM_BIT(_name, _pDM_Odm)       _rtk_cat(_name, _pDM_Odm->SupportICType, _bit)\r
+#else\r
+#define ODM_REG(_name, _pDM_Odm)       _cat(_name, _pDM_Odm->SupportICType, _reg)\r
+#define ODM_BIT(_name, _pDM_Odm)       _cat(_name, _pDM_Odm->SupportICType, _bit)\r
+#endif\r
+typedef enum _ODM_H2C_CMD \r
+{\r
+       ODM_H2C_RSSI_REPORT = 0,\r
+       ODM_H2C_PSD_RESULT=1,   \r
+       ODM_H2C_PathDiv = 2,\r
+       ODM_H2C_WIFI_CALIBRATION = 3,\r
+       ODM_H2C_IQ_CALIBRATION = 4,\r
+       ODM_MAX_H2CCMD\r
+}ODM_H2C_CMD;\r
+\r
+\r
+//\r
+// 2012/02/17 MH For non-MP compile pass only. Linux does not support workitem.\r
+// Suggest HW team to use thread instead of workitem. Windows also support the feature.\r
+//\r
+#if (DM_ODM_SUPPORT_TYPE != ODM_WIN)\r
+typedef  void *PRT_WORK_ITEM ;\r
+typedef  void RT_WORKITEM_HANDLE,*PRT_WORKITEM_HANDLE;\r
+typedef VOID (*RT_WORKITEM_CALL_BACK)(PVOID pContext);\r
+\r
+#if 0\r
+typedef struct tasklet_struct RT_WORKITEM_HANDLE, *PRT_WORKITEM_HANDLE;\r
+\r
+typedef struct _RT_WORK_ITEM\r
+{\r
+       \r
+       RT_WORKITEM_HANDLE                      Handle;                 // Platform-dependent handle for this workitem, e.g. Ndis Workitem object.\r
+       PVOID                                           Adapter;                // Pointer to Adapter object.\r
+       PVOID                                           pContext;               // Parameter to passed to CallBackFunc(). \r
+       RT_WORKITEM_CALL_BACK           CallbackFunc;   // Callback function of the workitem.\r
+       u1Byte                                          RefCount;               // 0: driver is going to unload, 1: No such workitem scheduled, 2: one workitem is schedueled. \r
+       PVOID                                           pPlatformExt;   // Pointer to platform-dependent extension.     \r
+       BOOLEAN                                         bFree;\r
+       char                                            szID[36];               // An identity string of this workitem.\r
+}RT_WORK_ITEM, *PRT_WORK_ITEM;\r
+\r
+#endif\r
+\r
+\r
+#endif\r
+\r
+//\r
+// =========== Extern Variable ??? It should be forbidden.\r
+//\r
+\r
+\r
+//\r
+// =========== EXtern Function Prototype\r
+//\r
+\r
+\r
+u1Byte\r
+ODM_Read1Byte(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u4Byte                  RegAddr\r
+       );\r
+\r
+u2Byte\r
+ODM_Read2Byte(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u4Byte                  RegAddr\r
+       );\r
+\r
+u4Byte\r
+ODM_Read4Byte(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u4Byte                  RegAddr\r
+       );\r
+\r
+VOID\r
+ODM_Write1Byte(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u4Byte                  RegAddr,\r
+       IN      u1Byte                  Data\r
+       );\r
+\r
+VOID\r
+ODM_Write2Byte(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u4Byte                  RegAddr,\r
+       IN      u2Byte                  Data\r
+       );\r
+\r
+VOID\r
+ODM_Write4Byte(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u4Byte                  RegAddr,\r
+       IN      u4Byte                  Data\r
+       );\r
+\r
+VOID\r
+ODM_SetMACReg( \r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       IN      u4Byte          RegAddr,\r
+       IN      u4Byte          BitMask,\r
+       IN      u4Byte          Data\r
+       );\r
+\r
+u4Byte \r
+ODM_GetMACReg( \r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       IN      u4Byte          RegAddr,\r
+       IN      u4Byte          BitMask\r
+       );\r
+\r
+VOID\r
+ODM_SetBBReg(  \r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       IN      u4Byte          RegAddr,\r
+       IN      u4Byte          BitMask,\r
+       IN      u4Byte          Data\r
+       );\r
+\r
+u4Byte \r
+ODM_GetBBReg(  \r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       IN      u4Byte          RegAddr,\r
+       IN      u4Byte          BitMask\r
+       );\r
+\r
+VOID\r
+ODM_SetRFReg(  \r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      ODM_RF_RADIO_PATH_E     eRFPath,\r
+       IN      u4Byte                          RegAddr,\r
+       IN      u4Byte                          BitMask,\r
+       IN      u4Byte                          Data\r
+       );\r
+\r
+u4Byte \r
+ODM_GetRFReg(  \r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      ODM_RF_RADIO_PATH_E     eRFPath,\r
+       IN      u4Byte                          RegAddr,\r
+       IN      u4Byte                          BitMask\r
+       );\r
+\r
+\r
+//\r
+// Memory Relative Function.\r
+//\r
+VOID\r
+ODM_AllocateMemory(    \r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       OUT     PVOID           *pPtr,\r
+       IN      u4Byte          length\r
+       );\r
+VOID\r
+ODM_FreeMemory(        \r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       OUT     PVOID           pPtr,\r
+       IN      u4Byte          length\r
+       );\r
+\r
+VOID\r
+ODM_MoveMemory(        \r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       OUT PVOID               pDest,\r
+       IN  PVOID               pSrc,\r
+       IN  u4Byte              Length\r
+       );\r
+\r
+s4Byte ODM_CompareMemory(\r
+       IN      PDM_ODM_T       pDM_Odm,\r
+       IN      PVOID           pBuf1,\r
+      IN       PVOID           pBuf2,\r
+      IN       u4Byte          length\r
+       );\r
+\r
+void ODM_Memory_Set\r
+       (IN     PDM_ODM_T       pDM_Odm,\r
+               IN  PVOID       pbuf,\r
+               IN  s1Byte      value,\r
+               IN  u4Byte      length);\r
+       \r
+//\r
+// ODM MISC-spin lock relative API.\r
+//\r
+VOID\r
+ODM_AcquireSpinLock(   \r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      RT_SPINLOCK_TYPE        type\r
+       );\r
+\r
+VOID\r
+ODM_ReleaseSpinLock(   \r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      RT_SPINLOCK_TYPE        type\r
+       );\r
+\r
+\r
+//\r
+// ODM MISC-workitem relative API.\r
+//\r
+VOID\r
+ODM_InitializeWorkItem(        \r
+       IN      PDM_ODM_T                                       pDM_Odm,\r
+       IN      PRT_WORK_ITEM                           pRtWorkItem,\r
+       IN      RT_WORKITEM_CALL_BACK           RtWorkItemCallback,\r
+       IN      PVOID                                           pContext,\r
+       IN      const char*                                     szID\r
+       );\r
+\r
+VOID\r
+ODM_StartWorkItem(     \r
+       IN      PRT_WORK_ITEM   pRtWorkItem\r
+       );\r
+\r
+VOID\r
+ODM_StopWorkItem(      \r
+       IN      PRT_WORK_ITEM   pRtWorkItem\r
+       );\r
+\r
+VOID\r
+ODM_FreeWorkItem(      \r
+       IN      PRT_WORK_ITEM   pRtWorkItem\r
+       );\r
+\r
+VOID\r
+ODM_ScheduleWorkItem(  \r
+       IN      PRT_WORK_ITEM   pRtWorkItem\r
+       );\r
+\r
+VOID\r
+ODM_IsWorkItemScheduled(       \r
+       IN      PRT_WORK_ITEM   pRtWorkItem\r
+       );\r
+\r
+//\r
+// ODM Timer relative API.\r
+//\r
+VOID\r
+ODM_StallExecution(    \r
+       IN      u4Byte  usDelay\r
+       );\r
+\r
+VOID\r
+ODM_delay_ms(IN u4Byte ms);\r
+\r
+\r
+\r
+VOID\r
+ODM_delay_us(IN u4Byte us);\r
+\r
+VOID\r
+ODM_sleep_ms(IN u4Byte ms);\r
+\r
+VOID\r
+ODM_sleep_us(IN u4Byte us);\r
+\r
+VOID\r
+ODM_SetTimer(  \r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      PRT_TIMER               pTimer, \r
+       IN      u4Byte                  msDelay\r
+       );\r
+\r
+VOID\r
+ODM_InitializeTimer(\r
+       IN      PDM_ODM_T                       pDM_Odm,\r
+       IN      PRT_TIMER                       pTimer, \r
+       IN      RT_TIMER_CALL_BACK      CallBackFunc, \r
+       IN      PVOID                           pContext,\r
+       IN      const char*                     szID\r
+       );\r
+\r
+VOID\r
+ODM_CancelTimer(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      PRT_TIMER               pTimer\r
+       );\r
+\r
+VOID\r
+ODM_ReleaseTimer(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      PRT_TIMER               pTimer\r
+       );\r
+\r
+\r
+//\r
+// ODM FW relative API.\r
+//\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+VOID\r
+ODM_FillH2CCmd(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u1Byte                  ElementID,\r
+       IN      u4Byte                  CmdLen,\r
+       IN      pu1Byte                 pCmdBuffer\r
+);\r
+#else\r
+u4Byte\r
+ODM_FillH2CCmd(        \r
+       IN      pu1Byte         pH2CBuffer,\r
+       IN      u4Byte          H2CBufferLen,\r
+       IN      u4Byte          CmdNum,\r
+       IN      pu4Byte         pElementID,\r
+       IN      pu4Byte         pCmdLen,\r
+       IN      pu1Byte*                pCmbBuffer,\r
+       IN      pu1Byte         CmdStartSeq\r
+       );\r
+#endif\r
+\r
+u8Byte\r
+ODM_GetCurrentTime(    \r
+       IN      PDM_ODM_T               pDM_Odm\r
+       );\r
+u8Byte\r
+ODM_GetProgressingTime(        \r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u8Byte                  Start_Time\r
+       );\r
+\r
+#endif // __ODM_INTERFACE_H__\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_precomp.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_precomp.h
new file mode 100755 (executable)
index 0000000..5651d7e
--- /dev/null
@@ -0,0 +1,296 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+#ifndef        __ODM_PRECOMP_H__\r
+#define __ODM_PRECOMP_H__\r
+\r
+#include "phydm_types.h"\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+#include "Precomp.h"           // We need to include mp_precomp.h due to batch file setting.\r
+\r
+#else\r
+\r
+#define                TEST_FALG___            1\r
+\r
+#endif\r
+\r
+//2 Config Flags and Structs - defined by each ODM Type\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+       #include "../8192cd_cfg.h"\r
+       #include "../odm_inc.h"\r
+\r
+       #include "../8192cd.h"\r
+       #include "../8192cd_util.h"\r
+       #ifdef _BIG_ENDIAN_\r
+       #define ODM_ENDIAN_TYPE                         ODM_ENDIAN_BIG\r
+       #else\r
+       #define ODM_ENDIAN_TYPE                         ODM_ENDIAN_LITTLE\r
+       #endif\r
+\r
+       #ifdef AP_BUILD_WORKAROUND\r
+       #include "../8192cd_headers.h"\r
+       #include "../8192cd_debug.h"            \r
+       #endif\r
+       \r
+#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL)\r
+       // Flags\r
+       #include "../8192cd_cfg.h"              // OUTSRC needs ADSL config flags.\r
+       #include "../odm_inc.h"                 // OUTSRC needs some extra flags.\r
+       // Data Structure\r
+       #include "../common_types.h"    // OUTSRC and rtl8192cd both needs basic type such as UINT8 and BIT0.\r
+       #include "../8192cd.h"                  // OUTSRC needs basic ADSL struct definition.\r
+       #include "../8192cd_util.h"             // OUTSRC needs basic I/O function.\r
+       #ifdef _BIG_ENDIAN_\r
+       #define ODM_ENDIAN_TYPE                         ODM_ENDIAN_BIG\r
+       #else\r
+       #define ODM_ENDIAN_TYPE                         ODM_ENDIAN_LITTLE\r
+       #endif\r
+\r
+       #ifdef ADSL_AP_BUILD_WORKAROUND\r
+       // NESTED_INC: Functions defined outside should not be included!! Marked by Annie, 2011-10-14.\r
+       #include "../8192cd_headers.h"\r
+       #include "../8192cd_debug.h"    \r
+       #endif  \r
+       \r
+#elif (DM_ODM_SUPPORT_TYPE ==ODM_CE)\r
+       //#include <drv_conf.h>\r
+       //#include <basic_types.h>\r
+       //#include <osdep_service.h>\r
+       //#include <drv_types.h>\r
+       //#include <rtw_byteorder.h>\r
+       //#include <hal_intf.h>\r
+#define BEAMFORMING_SUPPORT 0          \r
+#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       #include "Mp_Precomp.h"\r
+       #define ODM_ENDIAN_TYPE                         ODM_ENDIAN_LITTLE\r
+#endif\r
+\r
\r
+//2 Hardware Parameter Files\r
+\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+#if (RTL8192C_SUPPORT==1)\r
+       #include "rtl8192c/Hal8192CEFWImg_AP.h"\r
+       #include "rtl8192c/Hal8192CEPHYImg_AP.h"\r
+       #include "rtl8192c/Hal8192CEMACImg_AP.h"\r
+#endif\r
+#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL)\r
+       #include "rtl8192c/Hal8192CEFWImg_ADSL.h"\r
+       #include "rtl8192c/Hal8192CEPHYImg_ADSL.h"\r
+       #include "rtl8192c/Hal8192CEMACImg_ADSL.h"\r
+\r
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+       #if(RTL8192CE_SUPPORT ==1)\r
+       #include "rtl8192c/Hal8192CEFWImg_CE.h"\r
+       #include "rtl8192c/Hal8192CEPHYImg_CE.h"\r
+       #include "rtl8192c/Hal8192CEMACImg_CE.h"\r
+       #endif\r
+       \r
+       #if(RTL8192CU_SUPPORT ==1)\r
+       #include "rtl8192c/Hal8192CUFWImg_CE.h"\r
+       #include "rtl8192c/Hal8192CUPHYImg_CE.h"\r
+       #include "rtl8192c/Hal8192CUMACImg_CE.h"\r
+       #endif\r
+       \r
+       #if(RTL8192DE_SUPPORT ==1)\r
+       #include "rtl8192d/Hal8192DEFWImg_CE.h"\r
+       #include "rtl8192d/Hal8192DEPHYImg_CE.h"\r
+       #include "rtl8192d/Hal8192DEMACImg_CE.h"        \r
+       #endif\r
+       \r
+       #if(RTL8192DU_SUPPORT ==1)\r
+       #include "rtl8192d/Hal8192DUFWImg_CE.h"\r
+       #include "rtl8192d/Hal8192DUPHYImg_CE.h"\r
+       #include "rtl8192d/Hal8192DUMACImg_CE.h"\r
+       #endif\r
+       \r
+       #if(RTL8723AS_SUPPORT==1)\r
+       #include "rtl8723a/Hal8723SHWImg_CE.h"\r
+       #endif\r
+       \r
+       #if(RTL8723AU_SUPPORT==1)\r
+       #include "rtl8723a/Hal8723UHWImg_CE.h"  \r
+       #endif  \r
+       \r
+#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+\r
+#endif\r
+\r
+\r
+//2 OutSrc Header Files\r
+#include "phydm.h"\r
+#include "phydm_HWConfig.h"\r
+#include "phydm_debug.h"\r
+#include "phydm_RegDefine11AC.h"\r
+#include "phydm_RegDefine11N.h"\r
+#include "phydm_AntDiv.h"\r
+#include "phydm_interface.h"\r
+#include "phydm_reg.h"\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+#if (RTL8192C_SUPPORT==1)\r
+       #include "rtl8192c/HalDMOutSrc8192C_AP.h"\r
+#endif\r
+#if (RTL8188E_SUPPORT==1)\r
+               #include "rtl8188e/Hal8188ERateAdaptive.h"//for  RA,Power training\r
+#endif\r
+\r
+#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL)\r
+       #include "rtl8192c/HalDMOutSrc8192C_ADSL.h"\r
+\r
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+       //#include "hal_com.h"\r
+       #include "HalPhyRf.h"\r
+       #if (RTL8192C_SUPPORT==1) \r
+       #ifdef CONFIG_INTEL_PROXIM\r
+       #include "../proxim/intel_proxim.h"     \r
+       #endif\r
+       #include  "rtl8192c/HalDMOutSrc8192C_CE.h"\r
+       #include <rtl8192c_hal.h>\r
+       #endif\r
+       \r
+       #if (RTL8192D_SUPPORT==1)\r
+       #include  "rtl8192d/HalDMOutSrc8192D_CE.h"\r
+       #include  "rtl8192d_hal.h"\r
+       #endif\r
+       \r
+       #if (RTL8723A_SUPPORT==1)\r
+               #include "rtl8192c/HalDMOutSrc8192C_CE.h" //for IQK,LCK,Power-tracking\r
+               #include "rtl8723a_hal.h"\r
+       #endif\r
+       \r
+       #if (RTL8188E_SUPPORT==1)\r
+               #include "rtl8188e/HalPhyRf_8188e.h"//for IQK,LCK,Power-tracking\r
+               #include "rtl8188e/Hal8188ERateAdaptive.h"//for  RA,Power training\r
+               #include "rtl8188e_hal.h"       \r
+       #endif\r
+       \r
+       #if (RTL8192E_SUPPORT==1)\r
+               #include "rtl8192e/HalPhyRf_8192e.h"//for IQK,LCK,Power-tracking                \r
+               #include "rtl8192e_hal.h"                       \r
+       #endif\r
+\r
+       #if (RTL8812A_SUPPORT==1)\r
+               #include "rtl8812a/HalPhyRf_8812A.h"//for IQK,LCK,Power-tracking\r
+               #include "rtl8812a_hal.h"\r
+       #endif\r
+\r
+       #if (RTL8821A_SUPPORT==1)\r
+               #include "rtl8821a/HalPhyRf_8821A.h"//for IQK,LCK,Power-tracking\r
+               #include "rtl8812a/HalPhyRf_8812A.h"//for IQK,LCK,Power-tracking\r
+               #include "rtl8812a_hal.h"\r
+               #include "rtl8821a/PhyDM_IQK_8821A.h"\r
+       #endif\r
+\r
+       #if (RTL8723B_SUPPORT==1)\r
+               #include "rtl8723b/HalPhyRf_8723B.h"//for IQK,LCK,Power-tracking\r
+               #include "rtl8723b_hal.h"\r
+       #endif\r
+#endif\r
+\r
+\r
+#if (RTL8192C_SUPPORT==1) \r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+#include "rtl8192c/Hal8192CHWImg_MAC.h"\r
+#include "rtl8192c/Hal8192CHWImg_RF.h"\r
+#include "rtl8192c/Hal8192CHWImg_BB.h"\r
+#include "rtl8192c/Hal8192CHWImg_FW.h"\r
+#endif\r
+#include "rtl8192c/phydm_RTL8192C.h"\r
+#endif\r
+#if (RTL8192D_SUPPORT==1) \r
+#include "rtl8192d/phydm_RTL8192D.h"\r
+#endif\r
+\r
+#if (RTL8723A_SUPPORT==1) \r
+#include "rtl8723a/HalHWImg8723A_MAC.h"\r
+#include "rtl8723a/HalHWImg8723A_RF.h"\r
+#include "rtl8723a/HalHWImg8723A_BB.h"\r
+#include "rtl8723a/HalHWImg8723A_FW.h"\r
+#include "rtl8723a/phydm_RegConfig8723A.h"\r
+#endif\r
+\r
+#if (RTL8188E_SUPPORT==1) \r
+#include "rtl8188e/HalHWImg8188E_MAC.h"\r
+#include "rtl8188e/HalHWImg8188E_RF.h"\r
+#include "rtl8188e/HalHWImg8188E_BB.h"\r
+#include "rtl8188e/HalHWImg8188E_FW.h"\r
+#include "rtl8188e/Hal8188EReg.h"\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+#include "rtl8188e/HalPhyRf_8188e.h"\r
+#endif\r
+\r
+#if (TESTCHIP_SUPPORT == 1) \r
+#include "rtl8188e/HalHWImg8188E_TestChip_MAC.h"\r
+#include "rtl8188e/HalHWImg8188E_TestChip_RF.h"\r
+#include "rtl8188e/HalHWImg8188E_TestChip_BB.h"\r
+#endif\r
+\r
+\r
+#include "rtl8188e/phydm_RegConfig8188E.h"\r
+#include "rtl8188e/phydm_RTL8188E.h"\r
+#endif\r
+\r
+#if (RTL8192E_SUPPORT==1) \r
+#include "rtl8192e/HalHWImg8192E_MAC.h"\r
+#include "rtl8192e/HalHWImg8192E_RF.h"\r
+#include "rtl8192e/HalHWImg8192E_BB.h"\r
+#include "rtl8192e/HalHWImg8192E_FW.h"\r
+#include "rtl8192e/Hal8192EReg.h"\r
+#include "rtl8192e/phydm_RegConfig8192E.h"\r
+#include "rtl8192e/phydm_RTL8192E.h"\r
+#endif\r
+\r
+#if (RTL8723B_SUPPORT==1) \r
+#include "rtl8723b/HalHWImg8723B_MAC.h"\r
+#include "rtl8723b/HalHWImg8723B_RF.h"\r
+#include "rtl8723b/HalHWImg8723B_BB.h"\r
+#include "rtl8723b/HalHWImg8723B_FW.h"\r
+#include "rtl8723b/HalHWImg8723B_MP.h"\r
+#include "rtl8723b/Hal8723BReg.h"\r
+#include "rtl8723b/phydm_RTL8723B.h"\r
+#include "rtl8723b/phydm_RegConfig8723B.h"\r
+#endif\r
+\r
+#if (RTL8812A_SUPPORT==1) \r
+#include "rtl8812a/HalHWImg8812A_MAC.h"\r
+#include "rtl8812a/HalHWImg8812A_RF.h"\r
+#include "rtl8812a/HalHWImg8812A_BB.h"\r
+#include "rtl8812a/HalHWImg8812A_FW.h"\r
+#include "rtl8812a/phydm_RegConfig8812A.h"\r
+#include "rtl8812a/phydm_RTL8812A.h"\r
+#endif\r
+\r
+\r
+#if (RTL8821A_SUPPORT==1) \r
+#include "rtl8821a/HalHWImg8821A_MAC.h"\r
+#include "rtl8821a/HalHWImg8821A_RF.h"\r
+#include "rtl8821a/HalHWImg8821A_BB.h"\r
+#include "rtl8821a/HalHWImg8821A_FW.h"\r
+#include "rtl8821a/phydm_RegConfig8821A.h"\r
+#include "rtl8821a/phydm_RTL8821A.h"\r
+#endif\r
+\r
+#endif // __ODM_PRECOMP_H__\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_reg.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_reg.h
new file mode 100755 (executable)
index 0000000..8deff91
--- /dev/null
@@ -0,0 +1,208 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+//============================================================\r
+// File Name: odm_reg.h\r
+//\r
+// Description:\r
+//\r
+// This file is for general register definition.\r
+//\r
+//\r
+//============================================================\r
+#ifndef        __HAL_ODM_REG_H__\r
+#define __HAL_ODM_REG_H__\r
+\r
+//\r
+// Register Definition\r
+//\r
+\r
+//MAC REG\r
+#define        ODM_BB_RESET                                    0x002\r
+#define        ODM_DUMMY                                               0x4fe\r
+#define        RF_T_METER_OLD                          0x24\r
+#define        RF_T_METER_NEW                          0x42\r
+\r
+#define        ODM_EDCA_VO_PARAM                       0x500\r
+#define        ODM_EDCA_VI_PARAM                       0x504\r
+#define        ODM_EDCA_BE_PARAM                       0x508\r
+#define        ODM_EDCA_BK_PARAM                       0x50C\r
+#define        ODM_TXPAUSE                                     0x522\r
+\r
+//BB REG\r
+#define        ODM_FPGA_PHY0_PAGE8                     0x800\r
+#define        ODM_PSD_SETTING                         0x808\r
+#define        ODM_AFE_SETTING                         0x818\r
+#define        ODM_TXAGC_B_6_18                                0x830\r
+#define        ODM_TXAGC_B_24_54                       0x834\r
+#define        ODM_TXAGC_B_MCS32_5                     0x838\r
+#define        ODM_TXAGC_B_MCS0_MCS3           0x83c\r
+#define        ODM_TXAGC_B_MCS4_MCS7           0x848\r
+#define        ODM_TXAGC_B_MCS8_MCS11          0x84c\r
+#define        ODM_ANALOG_REGISTER                     0x85c\r
+#define        ODM_RF_INTERFACE_OUTPUT         0x860\r
+#define        ODM_TXAGC_B_MCS12_MCS15 0x868\r
+#define        ODM_TXAGC_B_11_A_2_11           0x86c\r
+#define        ODM_AD_DA_LSB_MASK                      0x874\r
+#define        ODM_ENABLE_3_WIRE                       0x88c\r
+#define        ODM_PSD_REPORT                          0x8b4\r
+#define        ODM_R_ANT_SELECT                                0x90c\r
+#define        ODM_CCK_ANT_SELECT                      0xa07\r
+#define        ODM_CCK_PD_THRESH                       0xa0a\r
+#define        ODM_CCK_RF_REG1                         0xa11\r
+#define        ODM_CCK_MATCH_FILTER                    0xa20\r
+#define        ODM_CCK_RAKE_MAC                                0xa2e\r
+#define        ODM_CCK_CNT_RESET                       0xa2d\r
+#define        ODM_CCK_TX_DIVERSITY                    0xa2f\r
+#define        ODM_CCK_FA_CNT_MSB                      0xa5b\r
+#define        ODM_CCK_FA_CNT_LSB                      0xa5c\r
+#define        ODM_CCK_NEW_FUNCTION            0xa75\r
+#define        ODM_OFDM_PHY0_PAGE_C            0xc00\r
+#define        ODM_OFDM_RX_ANT                         0xc04\r
+#define        ODM_R_A_RXIQI                                   0xc14\r
+#define        ODM_R_A_AGC_CORE1                       0xc50\r
+#define        ODM_R_A_AGC_CORE2                       0xc54\r
+#define        ODM_R_B_AGC_CORE1                       0xc58\r
+#define        ODM_R_AGC_PAR                                   0xc70\r
+#define        ODM_R_HTSTF_AGC_PAR                     0xc7c\r
+#define        ODM_TX_PWR_TRAINING_A           0xc90\r
+#define        ODM_TX_PWR_TRAINING_B           0xc98\r
+#define        ODM_OFDM_FA_CNT1                                0xcf0\r
+#define        ODM_OFDM_PHY0_PAGE_D            0xd00\r
+#define        ODM_OFDM_FA_CNT2                                0xda0\r
+#define        ODM_OFDM_FA_CNT3                                0xda4\r
+#define        ODM_OFDM_FA_CNT4                                0xda8\r
+#define        ODM_TXAGC_A_6_18                                0xe00\r
+#define        ODM_TXAGC_A_24_54                       0xe04\r
+#define        ODM_TXAGC_A_1_MCS32                     0xe08\r
+#define        ODM_TXAGC_A_MCS0_MCS3           0xe10\r
+#define        ODM_TXAGC_A_MCS4_MCS7           0xe14\r
+#define        ODM_TXAGC_A_MCS8_MCS11          0xe18\r
+#define        ODM_TXAGC_A_MCS12_MCS15         0xe1c\r
+\r
+//RF REG\r
+#define        ODM_GAIN_SETTING                                0x00\r
+#define        ODM_CHANNEL                                     0x18\r
+#define        ODM_RF_T_METER                          0x24\r
+#define        ODM_RF_T_METER_92D                      0x42\r
+#define        ODM_RF_T_METER_88E                      0x42\r
+#define        ODM_RF_T_METER_92E                      0x42\r
+#define        ODM_RF_T_METER_8812                     0x42\r
+\r
+//Ant Detect Reg\r
+#define        ODM_DPDT                                                0x300\r
+\r
+//PSD Init\r
+#define        ODM_PSDREG                                      0x808\r
+\r
+//92D Path Div\r
+#define        PATHDIV_REG                                     0xB30\r
+#define        PATHDIV_TRI                                     0xBA0\r
+\r
+\r
+//\r
+// Bitmap Definition\r
+//\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP))\r
+// TX AGC \r
+#define                rTxAGC_A_CCK11_CCK1_JAguar      0xc20\r
+#define                rTxAGC_A_Ofdm18_Ofdm6_JAguar    0xc24\r
+#define                rTxAGC_A_Ofdm54_Ofdm24_JAguar   0xc28\r
+#define                rTxAGC_A_MCS3_MCS0_JAguar       0xc2c\r
+#define                rTxAGC_A_MCS7_MCS4_JAguar       0xc30\r
+#define                rTxAGC_A_MCS11_MCS8_JAguar      0xc34\r
+#define                rTxAGC_A_MCS15_MCS12_JAguar     0xc38\r
+#define                rTxAGC_A_Nss1Index3_Nss1Index0_JAguar   0xc3c\r
+#define                rTxAGC_A_Nss1Index7_Nss1Index4_JAguar   0xc40\r
+#define                rTxAGC_A_Nss2Index1_Nss1Index8_JAguar   0xc44\r
+#define                rTxAGC_A_Nss2Index5_Nss2Index2_JAguar   0xc48\r
+#define                rTxAGC_A_Nss2Index9_Nss2Index6_JAguar   0xc4c\r
+#if defined(CONFIG_WLAN_HAL_8814AE)\r
+#define                rTxAGC_A_MCS19_MCS16_JAguar     0xcd8\r
+#define                rTxAGC_A_MCS23_MCS20_JAguar     0xcdc\r
+#define                rTxAGC_A_Nss3Index3_Nss3Index0_JAguar   0xce0\r
+#define                rTxAGC_A_Nss3Index7_Nss3Index4_JAguar   0xce4\r
+#define                rTxAGC_A_Nss3Index9_Nss3Index8_JAguar   0xce8\r
+#endif\r
+#define                rTxAGC_B_CCK11_CCK1_JAguar      0xe20\r
+#define                rTxAGC_B_Ofdm18_Ofdm6_JAguar    0xe24\r
+#define                rTxAGC_B_Ofdm54_Ofdm24_JAguar   0xe28\r
+#define                rTxAGC_B_MCS3_MCS0_JAguar       0xe2c\r
+#define                rTxAGC_B_MCS7_MCS4_JAguar       0xe30\r
+#define                rTxAGC_B_MCS11_MCS8_JAguar      0xe34\r
+#define                rTxAGC_B_MCS15_MCS12_JAguar     0xe38\r
+#define                rTxAGC_B_Nss1Index3_Nss1Index0_JAguar   0xe3c\r
+#define                rTxAGC_B_Nss1Index7_Nss1Index4_JAguar   0xe40\r
+#define                rTxAGC_B_Nss2Index1_Nss1Index8_JAguar   0xe44\r
+#define                rTxAGC_B_Nss2Index5_Nss2Index2_JAguar   0xe48\r
+#define                rTxAGC_B_Nss2Index9_Nss2Index6_JAguar   0xe4c\r
+#if defined(CONFIG_WLAN_HAL_8814AE)\r
+#define                rTxAGC_B_MCS19_MCS16_JAguar     0xed8\r
+#define                rTxAGC_B_MCS23_MCS20_JAguar     0xedc\r
+#define                rTxAGC_B_Nss3Index3_Nss3Index0_JAguar   0xee0\r
+#define                rTxAGC_B_Nss3Index7_Nss3Index4_JAguar   0xee4\r
+#define                rTxAGC_B_Nss3Index9_Nss3Index8_JAguar   0xee8\r
+#define                rTxAGC_C_CCK11_CCK1_JAguar      0x1820\r
+#define                rTxAGC_C_Ofdm18_Ofdm6_JAguar    0x1824\r
+#define                rTxAGC_C_Ofdm54_Ofdm24_JAguar   0x1828\r
+#define                rTxAGC_C_MCS3_MCS0_JAguar       0x182c\r
+#define                rTxAGC_C_MCS7_MCS4_JAguar       0x1830\r
+#define                rTxAGC_C_MCS11_MCS8_JAguar      0x1834\r
+#define                rTxAGC_C_MCS15_MCS12_JAguar     0x1838\r
+#define                rTxAGC_C_Nss1Index3_Nss1Index0_JAguar   0x183c\r
+#define                rTxAGC_C_Nss1Index7_Nss1Index4_JAguar   0x1840\r
+#define                rTxAGC_C_Nss2Index1_Nss1Index8_JAguar   0x1844\r
+#define                rTxAGC_C_Nss2Index5_Nss2Index2_JAguar   0x1848\r
+#define                rTxAGC_C_Nss2Index9_Nss2Index6_JAguar   0x184c\r
+#define                rTxAGC_C_MCS19_MCS16_JAguar     0x18d8\r
+#define                rTxAGC_C_MCS23_MCS20_JAguar     0x18dc\r
+#define                rTxAGC_C_Nss3Index3_Nss3Index0_JAguar   0x18e0\r
+#define                rTxAGC_C_Nss3Index7_Nss3Index4_JAguar   0x18e4\r
+#define                rTxAGC_C_Nss3Index9_Nss3Index8_JAguar   0x18e8\r
+#define                rTxAGC_D_CCK11_CCK1_JAguar      0x1a20\r
+#define                rTxAGC_D_Ofdm18_Ofdm6_JAguar    0x1a24\r
+#define                rTxAGC_D_Ofdm54_Ofdm24_JAguar   0x1a28\r
+#define                rTxAGC_D_MCS3_MCS0_JAguar       0x1a2c\r
+#define                rTxAGC_D_MCS7_MCS4_JAguar       0x1a30\r
+#define                rTxAGC_D_MCS11_MCS8_JAguar      0x1a34\r
+#define                rTxAGC_D_MCS15_MCS12_JAguar     0x1a38\r
+#define                rTxAGC_D_Nss1Index3_Nss1Index0_JAguar   0x1a3c\r
+#define                rTxAGC_D_Nss1Index7_Nss1Index4_JAguar   0x1a40\r
+#define                rTxAGC_D_Nss2Index1_Nss1Index8_JAguar   0x1a44\r
+#define                rTxAGC_D_Nss2Index5_Nss2Index2_JAguar   0x1a48\r
+#define                rTxAGC_D_Nss2Index9_Nss2Index6_JAguar   0x1a4c\r
+#define                rTxAGC_D_MCS19_MCS16_JAguar     0x1ad8\r
+#define                rTxAGC_D_MCS23_MCS20_JAguar     0x1adc\r
+#define                rTxAGC_D_Nss3Index3_Nss3Index0_JAguar   0x1ae0\r
+#define                rTxAGC_D_Nss3Index7_Nss3Index4_JAguar   0x1ae4\r
+#define                rTxAGC_D_Nss3Index9_Nss3Index8_JAguar   0x1ae8\r
+#endif\r
+\r
+#define                bTxAGC_byte0_Jaguar     0xff\r
+#define                bTxAGC_byte1_Jaguar     0xff00\r
+#define                bTxAGC_byte2_Jaguar     0xff0000\r
+#define                bTxAGC_byte3_Jaguar     0xff000000\r
+#endif\r
+\r
+#define        BIT_FA_RESET                                    BIT0\r
+\r
+\r
+\r
+#endif\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_types.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/phydm_types.h
new file mode 100755 (executable)
index 0000000..ddeb1a8
--- /dev/null
@@ -0,0 +1,409 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *                                        
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+#ifndef __ODM_TYPES_H__
+#define __ODM_TYPES_H__
+
+
+
+
+#define ODM_RATEMCS15_SG               0x1c
+#define ODM_RATEMCS32                  0x20
+
+
+// CCK Rates, TxHT = 0
+#define ODM_RATE1M                             0x00
+#define ODM_RATE2M                             0x01
+#define ODM_RATE5_5M                   0x02
+#define ODM_RATE11M                            0x03
+// OFDM Rates, TxHT = 0
+#define ODM_RATE6M                             0x04
+#define ODM_RATE9M                             0x05
+#define ODM_RATE12M                            0x06
+#define ODM_RATE18M                            0x07
+#define ODM_RATE24M                            0x08
+#define ODM_RATE36M                            0x09
+#define ODM_RATE48M                            0x0A
+#define ODM_RATE54M                            0x0B
+// MCS Rates, TxHT = 1
+#define ODM_RATEMCS0                   0x0C
+#define ODM_RATEMCS1                   0x0D
+#define ODM_RATEMCS2                   0x0E
+#define ODM_RATEMCS3                   0x0F
+#define ODM_RATEMCS4                   0x10
+#define ODM_RATEMCS5                   0x11
+#define ODM_RATEMCS6                   0x12
+#define ODM_RATEMCS7                   0x13
+#define ODM_RATEMCS8                   0x14
+#define ODM_RATEMCS9                   0x15
+#define ODM_RATEMCS10                  0x16
+#define ODM_RATEMCS11                  0x17
+#define ODM_RATEMCS12                  0x18
+#define ODM_RATEMCS13                  0x19
+#define ODM_RATEMCS14                  0x1A
+#define ODM_RATEMCS15                  0x1B
+#define ODM_RATEMCS16                  0x1C
+#define ODM_RATEMCS17                  0x1D
+#define ODM_RATEMCS18                  0x1E
+#define ODM_RATEMCS19                  0x1F
+#define ODM_RATEMCS20                  0x20
+#define ODM_RATEMCS21                  0x21
+#define ODM_RATEMCS22                  0x22
+#define ODM_RATEMCS23                  0x23
+#define ODM_RATEMCS24                  0x24
+#define ODM_RATEMCS25                  0x25
+#define ODM_RATEMCS26                  0x26
+#define ODM_RATEMCS27                  0x27
+#define ODM_RATEMCS28                  0x28
+#define ODM_RATEMCS29                  0x29
+#define ODM_RATEMCS30                  0x2A
+#define ODM_RATEMCS31                  0x2B
+#define ODM_RATEVHTSS1MCS0             0x2C
+#define ODM_RATEVHTSS1MCS1             0x2D
+#define ODM_RATEVHTSS1MCS2             0x2E
+#define ODM_RATEVHTSS1MCS3             0x2F
+#define ODM_RATEVHTSS1MCS4             0x30
+#define ODM_RATEVHTSS1MCS5             0x31
+#define ODM_RATEVHTSS1MCS6             0x32
+#define ODM_RATEVHTSS1MCS7             0x33
+#define ODM_RATEVHTSS1MCS8             0x34
+#define ODM_RATEVHTSS1MCS9             0x35
+#define ODM_RATEVHTSS2MCS0             0x36
+#define ODM_RATEVHTSS2MCS1             0x37
+#define ODM_RATEVHTSS2MCS2             0x38
+#define ODM_RATEVHTSS2MCS3             0x39
+#define ODM_RATEVHTSS2MCS4             0x3A
+#define ODM_RATEVHTSS2MCS5             0x3B
+#define ODM_RATEVHTSS2MCS6             0x3C
+#define ODM_RATEVHTSS2MCS7             0x3D
+#define ODM_RATEVHTSS2MCS8             0x3E
+#define ODM_RATEVHTSS2MCS9             0x3F
+#define ODM_RATEVHTSS3MCS0             0x40
+#define ODM_RATEVHTSS3MCS1             0x41
+#define ODM_RATEVHTSS3MCS2             0x42
+#define ODM_RATEVHTSS3MCS3             0x43
+#define ODM_RATEVHTSS3MCS4             0x44
+#define ODM_RATEVHTSS3MCS5             0x45
+#define ODM_RATEVHTSS3MCS6             0x46
+#define ODM_RATEVHTSS3MCS7             0x47
+#define ODM_RATEVHTSS3MCS8             0x48
+#define ODM_RATEVHTSS3MCS9             0x49
+#define ODM_RATEVHTSS4MCS0             0x4A
+#define ODM_RATEVHTSS4MCS1             0x4B
+#define ODM_RATEVHTSS4MCS2             0x4C
+#define ODM_RATEVHTSS4MCS3             0x4D
+#define ODM_RATEVHTSS4MCS4             0x4E
+#define ODM_RATEVHTSS4MCS5             0x4F
+#define ODM_RATEVHTSS4MCS6             0x50
+#define ODM_RATEVHTSS4MCS7             0x51
+#define ODM_RATEVHTSS4MCS8             0x52
+#define ODM_RATEVHTSS4MCS9             0x53
+
+//
+// Define Different SW team support
+//
+#define        ODM_AP                  0x01    //BIT0 
+#define        ODM_ADSL                0x02    //BIT1
+#define        ODM_CE                  0x04    //BIT2
+#define        ODM_WIN                 0x08    //BIT3
+
+#define        DM_ODM_SUPPORT_TYPE                     ODM_CE
+
+// Deifne HW endian support
+#define        ODM_ENDIAN_BIG  0
+#define        ODM_ENDIAN_LITTLE       1
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+#define GET_PDM_ODM(__pAdapter)        ((PDM_ODM_T)(&((GET_HAL_DATA(__pAdapter))->DM_OutSrc)))
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+#define GET_PDM_ODM(__pAdapter)        ((PDM_ODM_T)(&((GET_HAL_DATA(__pAdapter))->odmpriv)))
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE != ODM_WIN)
+#define        RT_PCI_INTERFACE                                1
+#define        RT_USB_INTERFACE                                2
+#define        RT_SDIO_INTERFACE                               3
+#endif
+
+typedef enum _HAL_STATUS{
+       HAL_STATUS_SUCCESS,
+       HAL_STATUS_FAILURE,
+       /*RT_STATUS_PENDING,
+       RT_STATUS_RESOURCE,
+       RT_STATUS_INVALID_CONTEXT,
+       RT_STATUS_INVALID_PARAMETER,
+       RT_STATUS_NOT_SUPPORT,
+       RT_STATUS_OS_API_FAILED,*/
+}HAL_STATUS,*PHAL_STATUS;
+
+#if( DM_ODM_SUPPORT_TYPE == ODM_AP)
+#define                MP_DRIVER               0
+#endif
+#if(DM_ODM_SUPPORT_TYPE != ODM_WIN)
+
+#define                VISTA_USB_RX_REVISE                     0
+
+//
+// Declare for ODM spin lock defintion temporarily fro compile pass.
+//
+typedef enum _RT_SPINLOCK_TYPE{
+       RT_TX_SPINLOCK = 1,
+       RT_RX_SPINLOCK = 2,
+       RT_RM_SPINLOCK = 3,
+       RT_CAM_SPINLOCK = 4,
+       RT_SCAN_SPINLOCK = 5,
+       RT_LOG_SPINLOCK = 7, 
+       RT_BW_SPINLOCK = 8,
+       RT_CHNLOP_SPINLOCK = 9,
+       RT_RF_OPERATE_SPINLOCK = 10,
+       RT_INITIAL_SPINLOCK = 11,
+       RT_RF_STATE_SPINLOCK = 12, // For RF state. Added by Bruce, 2007-10-30.
+#if VISTA_USB_RX_REVISE
+       RT_USBRX_CONTEXT_SPINLOCK = 13,
+       RT_USBRX_POSTPROC_SPINLOCK = 14, // protect data of Adapter->IndicateW/ IndicateR
+#endif
+       //Shall we define Ndis 6.2 SpinLock Here ?
+       RT_PORT_SPINLOCK=16,
+       RT_VNIC_SPINLOCK=17,
+       RT_HVL_SPINLOCK=18,     
+       RT_H2C_SPINLOCK = 20, // For H2C cmd. Added by tynli. 2009.11.09.
+
+       RT_BTData_SPINLOCK=25,
+
+       RT_WAPI_OPTION_SPINLOCK=26,
+       RT_WAPI_RX_SPINLOCK=27,
+
+      // add for 92D CCK control issue  
+       RT_CCK_PAGEA_SPINLOCK = 28,
+       RT_BUFFER_SPINLOCK = 29,
+       RT_CHANNEL_AND_BANDWIDTH_SPINLOCK = 30,
+       RT_GEN_TEMP_BUF_SPINLOCK = 31,
+       RT_AWB_SPINLOCK = 32,
+       RT_FW_PS_SPINLOCK = 33,
+       RT_HW_TIMER_SPIN_LOCK = 34,
+       RT_MPT_WI_SPINLOCK = 35,
+       RT_P2P_SPIN_LOCK = 36,  // Protect P2P context
+       RT_DBG_SPIN_LOCK = 37,
+       RT_IQK_SPINLOCK = 38,
+       RT_PENDED_OID_SPINLOCK = 39,
+       RT_CHNLLIST_SPINLOCK = 40,      
+       RT_INDIC_SPINLOCK = 41, //protect indication    
+       RT_RFD_SPINLOCK = 42,
+       RT_LAST_SPINLOCK,
+}RT_SPINLOCK_TYPE;
+
+#endif
+
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       #define STA_INFO_T                      RT_WLAN_STA
+       #define PSTA_INFO_T                     PRT_WLAN_STA
+
+//    typedef unsigned long            u4Byte,*pu4Byte;
+#define CONFIG_HW_ANTENNA_DIVERSITY 
+#define CONFIG_SW_ANTENNA_DIVERSITY 
+
+#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)
+
+       // To let ADSL/AP project compile ok; it should be removed after all conflict are solved. Added by Annie, 2011-10-07.
+       #define ADSL_AP_BUILD_WORKAROUND
+       #define AP_BUILD_WORKAROUND
+       
+       //2 [ Configure Antenna Diversity ]
+#if defined(CONFIG_RTL_8881A_ANT_SWITCH) || defined(CONFIG_SLOT_0_ANT_SWITCH) || defined(CONFIG_SLOT_1_ANT_SWITCH)
+       #define CONFIG_HW_ANTENNA_DIVERSITY 
+       #define ODM_EVM_ENHANCE_ANTDIV
+
+        //----------
+       #if(!defined(CONFIG_NO_2G_DIVERSITY) && !defined(CONFIG_2G_CGCS_RX_DIVERSITY) && !defined(CONFIG_2G_CG_TRX_DIVERSITY) && !defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
+               #define CONFIG_NO_2G_DIVERSITY
+       #endif
+
+       #ifdef CONFIG_NO_5G_DIVERSITY_8881A
+               #define CONFIG_NO_5G_DIVERSITY
+       #elif  defined(CONFIG_5G_CGCS_RX_DIVERSITY_8881A)
+               #define CONFIG_5G_CGCS_RX_DIVERSITY
+       #elif  defined(CONFIG_5G_CG_TRX_DIVERSITY_8881A)
+               #define CONFIG_5G_CG_TRX_DIVERSITY
+       #endif
+
+       #if(!defined(CONFIG_NO_5G_DIVERSITY) && !defined(CONFIG_5G_CGCS_RX_DIVERSITY) && !defined(CONFIG_5G_CG_TRX_DIVERSITY) && !defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY))
+               #define CONFIG_NO_5G_DIVERSITY
+       #endif  
+       //----------
+       #if ( defined(CONFIG_NO_2G_DIVERSITY) && defined(CONFIG_NO_5G_DIVERSITY) )
+               #define CONFIG_NOT_SUPPORT_ANTDIV 
+       #elif( !defined(CONFIG_NO_2G_DIVERSITY) && defined(CONFIG_NO_5G_DIVERSITY) )
+               #define CONFIG_2G_SUPPORT_ANTDIV
+       #elif( defined(CONFIG_NO_2G_DIVERSITY) && !defined(CONFIG_NO_5G_DIVERSITY) )
+               #define CONFIG_5G_SUPPORT_ANTDIV
+       #elif( !defined(CONFIG_NO_2G_DIVERSITY) && !defined(CONFIG_NO_5G_DIVERSITY) )
+               #define CONFIG_2G5G_SUPPORT_ANTDIV 
+       #endif
+       //----------
+#endif
+       #ifdef AP_BUILD_WORKAROUND
+       #include "../typedef.h"
+       #else
+       typedef void                                    VOID,*PVOID;
+       typedef unsigned char                   BOOLEAN,*PBOOLEAN;
+       typedef unsigned char                   u1Byte,*pu1Byte;
+       typedef unsigned short                  u2Byte,*pu2Byte;
+       typedef unsigned int                    u4Byte,*pu4Byte;
+       typedef unsigned long long              u8Byte,*pu8Byte;
+#if 1
+/* In ARM platform, system would use the type -- "char" as "unsigned char"
+ * And we only use s1Byte/ps1Byte as INT8 now, so changes the type of s1Byte.*/
+    typedef signed char                                s1Byte,*ps1Byte;
+#else
+       typedef char                                    s1Byte,*ps1Byte;
+#endif
+       typedef short                                   s2Byte,*ps2Byte;
+       typedef long                                    s4Byte,*ps4Byte;
+       typedef long long                               s8Byte,*ps8Byte;
+       #endif
+
+       typedef struct rtl8192cd_priv   *prtl8192cd_priv;
+       typedef struct stat_info                STA_INFO_T,*PSTA_INFO_T;
+       typedef struct timer_list               RT_TIMER, *PRT_TIMER;
+       typedef  void *                         RT_TIMER_CALL_BACK;
+
+#ifdef CONFIG_PCI_HCI
+       #define DEV_BUS_TYPE            RT_PCI_INTERFACE
+#endif
+
+       #define _TRUE                           1
+       #define _FALSE                          0
+       
+#elif (DM_ODM_SUPPORT_TYPE == ODM_ADSL)
+
+       // To let ADSL/AP project compile ok; it should be removed after all conflict are solved. Added by Annie, 2011-10-07.
+       #define ADSL_AP_BUILD_WORKAROUND
+       #define ADSL_BUILD_WORKAROUND
+       //
+
+       typedef unsigned char                   BOOLEAN,*PBOOLEAN;
+       typedef unsigned char                   u1Byte,*pu1Byte;
+       typedef unsigned short                  u2Byte,*pu2Byte;
+       typedef unsigned int                    u4Byte,*pu4Byte;
+       typedef unsigned long long              u8Byte,*pu8Byte;
+#if 1
+/* In ARM platform, system would use the type -- "char" as "unsigned char"
+ * And we only use s1Byte/ps1Byte as INT8 now, so changes the type of s1Byte.*/
+    typedef signed char                                s1Byte,*ps1Byte;
+#else
+       typedef char                                    s1Byte,*ps1Byte;
+#endif
+       typedef short                                   s2Byte,*ps2Byte;
+       typedef long                                    s4Byte,*ps4Byte;
+       typedef long long                               s8Byte,*ps8Byte;
+
+       typedef struct rtl8192cd_priv   *prtl8192cd_priv;
+       typedef struct stat_info                STA_INFO_T,*PSTA_INFO_T;
+       typedef struct timer_list               RT_TIMER, *PRT_TIMER;
+       typedef  void *                         RT_TIMER_CALL_BACK;
+       
+       #define DEV_BUS_TYPE            RT_PCI_INTERFACE
+
+       #define _TRUE                           1
+       #define _FALSE                          0
+
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+       #include <drv_types.h>
+
+#if 0
+       typedef u8                                      u1Byte, *pu1Byte;
+       typedef u16                                     u2Byte,*pu2Byte;
+       typedef u32                                     u4Byte,*pu4Byte;
+       typedef u64                                     u8Byte,*pu8Byte;
+       typedef s8                                      s1Byte,*ps1Byte;
+       typedef s16                                     s2Byte,*ps2Byte;
+       typedef s32                                     s4Byte,*ps4Byte;
+       typedef s64                                     s8Byte,*ps8Byte;
+#else
+       #define u1Byte          u8
+       #define pu1Byte         u8*     
+
+       #define u2Byte          u16
+       #define pu2Byte         u16*            
+
+       #define u4Byte          u32
+       #define pu4Byte         u32*    
+
+       #define u8Byte          u64
+       #define pu8Byte         u64*
+
+       #define s1Byte          s8
+       #define ps1Byte         s8*     
+
+       #define s2Byte          s16
+       #define ps2Byte         s16*    
+
+       #define s4Byte          s32
+       #define ps4Byte         s32*    
+
+       #define s8Byte          s64
+       #define ps8Byte         s64*    
+       
+#endif
+       #ifdef CONFIG_USB_HCI
+               #define DEV_BUS_TYPE    RT_USB_INTERFACE
+       #elif defined(CONFIG_PCI_HCI)
+               #define DEV_BUS_TYPE    RT_PCI_INTERFACE
+       #elif defined(CONFIG_SDIO_HCI)
+               #define DEV_BUS_TYPE    RT_SDIO_INTERFACE
+       #elif defined(CONFIG_GSPI_HCI)
+               #define DEV_BUS_TYPE    RT_SDIO_INTERFACE
+       #endif
+       
+
+       #if defined(CONFIG_LITTLE_ENDIAN)       
+               #define ODM_ENDIAN_TYPE                 ODM_ENDIAN_LITTLE
+       #elif defined (CONFIG_BIG_ENDIAN)
+               #define ODM_ENDIAN_TYPE                 ODM_ENDIAN_BIG
+       #endif
+       
+       typedef struct timer_list               RT_TIMER, *PRT_TIMER;
+       typedef  void *                         RT_TIMER_CALL_BACK;
+       #define STA_INFO_T                      struct sta_info
+       #define PSTA_INFO_T             struct sta_info *
+               
+
+
+       #define TRUE    _TRUE   
+       #define FALSE   _FALSE
+
+
+       #define SET_TX_DESC_ANTSEL_A_88E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 24, 1, __Value)
+       #define SET_TX_DESC_ANTSEL_B_88E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 25, 1, __Value)
+       #define SET_TX_DESC_ANTSEL_C_88E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 29, 1, __Value)
+
+       //define useless flag to avoid compile warning
+       #define USE_WORKITEM 0
+       #define         FOR_BRAZIL_PRETEST 0
+       #define   FPGA_TWO_MAC_VERIFICATION     0
+       #define RTL8881A_SUPPORT        0
+#endif
+
+#define READ_NEXT_PAIR(v1, v2, i) do { if (i+2 >= ArrayLen) break; i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)
+#define COND_ELSE  2
+#define COND_ENDIF 3
+
+#endif // __ODM_TYPES_H__
+
index 89e1ae23755b4b1db55c25a5e4a1f38e313dd1bc..e528518746c19a84a65d78d650f7b4580833432a 100755 (executable)
@@ -18,8 +18,8 @@
 * \r
 ******************************************************************************/\r
 \r
-\r
-#include "../odm_precomp.h"\r
+#include "Mp_Precomp.h"\r
+#include "../phydm_precomp.h"\r
 \r
 #if (RTL8723B_SUPPORT == 1)\r
 static BOOLEAN\r
@@ -252,72 +252,69 @@ ODM_ReadAndConfig_MP_8723B_AGC_TAB(
        )\r
 {\r
     u4Byte     i         = 0;\r
+    u1Byte     cCond;\r
+    BOOLEAN bMatched = TRUE, bSkipped = FALSE;\r
+//ask by Luke.Lee\r
     u4Byte     ArrayLen    = sizeof(Array_MP_8723B_AGC_TAB)/sizeof(u4Byte);\r
     pu4Byte    Array       = Array_MP_8723B_AGC_TAB;\r
        \r
     ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_AGC_TAB\n"));\r
 \r
-    for (i = 0; i < ArrayLen; i += 2 )\r
-    {\r
-        u4Byte v1 = Array[i];\r
-        u4Byte v2 = Array[i+1];\r
-    \r
-        // This (offset, data) pair doesn't care the condition.\r
-        if ( v1 < 0x40000000 )\r
-        {\r
-           odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);\r
-           continue;\r
-        }\r
-        else\r
-        {   // This line is the beginning of branch.\r
-            BOOLEAN bMatched = TRUE;\r
-            u1Byte  cCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
-\r
-            if (cCond == COND_ELSE) { // ELSE, ENDIF\r
-                bMatched = TRUE;\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-            } else if ( ! CheckPositive(pDM_Odm, v1, v2) ) { \r
-                bMatched = FALSE;\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-            } else {\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-                if ( ! CheckNegative(pDM_Odm, v1, v2) )\r
-                    bMatched = FALSE;\r
-                else\r
-                    bMatched = TRUE;\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-            }\r
-\r
-            if ( bMatched == FALSE )\r
-            {   // Condition isn't matched. Discard the following (offset, data) pairs.\r
-                while (v1 < 0x40000000 && i < ArrayLen -2)\r
-                    READ_NEXT_PAIR(v1, v2, i);\r
-\r
-                i -= 2; // prevent from for-loop += 2\r
-            }\r
-            else // Configure matched pairs and skip to end of if-else.\r
-            {\r
-                while (v1 < 0x40000000 && i < ArrayLen-2) {\r
-                    odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);\r
-                    READ_NEXT_PAIR(v1, v2, i);\r
-                }\r
-\r
-                // Keeps reading until ENDIF.\r
-                cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
-                while (cCond != COND_ENDIF && i < ArrayLen-2) {\r
-                    READ_NEXT_PAIR(v1, v2, i);\r
-                    cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
-                }\r
-            }\r
-        } \r
-    }\r
+       while(( i+1) < ArrayLen)\r
+       {\r
+               u4Byte v1 = Array[i];\r
+               u4Byte v2 = Array[i+1];\r
+\r
+               if(v1 & (BIT31|BIT30)) //positive & negative condition\r
+               {\r
+                       if(v1 & BIT31) // positive condition\r
+                       {\r
+                               cCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
+                               if(cCond == COND_ENDIF) //end\r
+                               {\r
+                                       bMatched = TRUE;\r
+                                       bSkipped = FALSE;\r
+                               }\r
+                               else if(cCond == COND_ELSE) //else\r
+                               {\r
+                                       bMatched = bSkipped?FALSE:TRUE;\r
+                               }\r
+                               else //if , else if\r
+                               {\r
+                                       if(bSkipped)\r
+                                               bMatched = FALSE;\r
+                                       else\r
+                                       {\r
+                                               if(CheckPositive(pDM_Odm, v1, v2))\r
+                                               {\r
+                                                       bMatched = TRUE;\r
+                                                       bSkipped = TRUE;\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       bMatched = FALSE;\r
+                                                       bSkipped = FALSE;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+                       else if(v1 & BIT30){ //negative condition\r
+                       //do nothing\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(bMatched)\r
+                       odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);\r
+               }\r
+       i = i + 2;\r
+       }\r
 }\r
 \r
 u4Byte\r
 ODM_GetVersion_MP_8723B_AGC_TAB(void)\r
 {\r
-          return 11;\r
+          return 12;\r
 }\r
 \r
 /******************************************************************************\r
@@ -527,72 +524,69 @@ ODM_ReadAndConfig_MP_8723B_PHY_REG(
        )\r
 {\r
     u4Byte     i         = 0;\r
+    u1Byte     cCond;\r
+    BOOLEAN bMatched = TRUE, bSkipped = FALSE;\r
+//ask by Luke.Lee\r
     u4Byte     ArrayLen    = sizeof(Array_MP_8723B_PHY_REG)/sizeof(u4Byte);\r
     pu4Byte    Array       = Array_MP_8723B_PHY_REG;\r
        \r
     ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_PHY_REG\n"));\r
 \r
-    for (i = 0; i < ArrayLen; i += 2 )\r
-    {\r
-        u4Byte v1 = Array[i];\r
-        u4Byte v2 = Array[i+1];\r
-    \r
-        // This (offset, data) pair doesn't care the condition.\r
-        if ( v1 < 0x40000000 )\r
-        {\r
-           odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);\r
-           continue;\r
-        }\r
-        else\r
-        {   // This line is the beginning of branch.\r
-            BOOLEAN bMatched = TRUE;\r
-            u1Byte  cCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
-\r
-            if (cCond == COND_ELSE) { // ELSE, ENDIF\r
-                bMatched = TRUE;\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-            } else if ( ! CheckPositive(pDM_Odm, v1, v2) ) { \r
-                bMatched = FALSE;\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-            } else {\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-                if ( ! CheckNegative(pDM_Odm, v1, v2) )\r
-                    bMatched = FALSE;\r
-                else\r
-                    bMatched = TRUE;\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-            }\r
-\r
-            if ( bMatched == FALSE )\r
-            {   // Condition isn't matched. Discard the following (offset, data) pairs.\r
-                while (v1 < 0x40000000 && i < ArrayLen -2)\r
-                    READ_NEXT_PAIR(v1, v2, i);\r
-\r
-                i -= 2; // prevent from for-loop += 2\r
-            }\r
-            else // Configure matched pairs and skip to end of if-else.\r
-            {\r
-                while (v1 < 0x40000000 && i < ArrayLen-2) {\r
-                    odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);\r
-                    READ_NEXT_PAIR(v1, v2, i);\r
-                }\r
-\r
-                // Keeps reading until ENDIF.\r
-                cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
-                while (cCond != COND_ENDIF && i < ArrayLen-2) {\r
-                    READ_NEXT_PAIR(v1, v2, i);\r
-                    cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
-                }\r
-            }\r
-        } \r
-    }\r
+       while(( i+1) < ArrayLen)\r
+       {\r
+               u4Byte v1 = Array[i];\r
+               u4Byte v2 = Array[i+1];\r
+\r
+               if(v1 & (BIT31|BIT30)) //positive & negative condition\r
+               {\r
+                       if(v1 & BIT31) // positive condition\r
+                       {\r
+                               cCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
+                               if(cCond == COND_ENDIF) //end\r
+                               {\r
+                                       bMatched = TRUE;\r
+                                       bSkipped = FALSE;\r
+                               }\r
+                               else if(cCond == COND_ELSE) //else\r
+                               {\r
+                                       bMatched = bSkipped?FALSE:TRUE;\r
+                               }\r
+                               else //if , else if\r
+                               {\r
+                                       if(bSkipped)\r
+                                               bMatched = FALSE;\r
+                                       else\r
+                                       {\r
+                                               if(CheckPositive(pDM_Odm, v1, v2))\r
+                                               {\r
+                                                       bMatched = TRUE;\r
+                                                       bSkipped = TRUE;\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       bMatched = FALSE;\r
+                                                       bSkipped = FALSE;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+                       else if(v1 & BIT30){ //negative condition\r
+                       //do nothing\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(bMatched)\r
+                       odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);\r
+               }\r
+       i = i + 2;\r
+       }\r
 }\r
 \r
 u4Byte\r
 ODM_GetVersion_MP_8723B_PHY_REG(void)\r
 {\r
-          return 11;\r
+          return 12;\r
 }\r
 \r
 /******************************************************************************\r
index 592d15828a7808c0cf4fb478cc7b80975b7bdc39..d362242109a4b9cdac7b3a8cdbdf60417f8058fa 100755 (executable)
@@ -18,8 +18,8 @@
 * \r
 ******************************************************************************/\r
 \r
-//#include "Mp_Precomp.h"\r
-#include "../odm_precomp.h"\r
+#include "Mp_Precomp.h"\r
+#include "../phydm_precomp.h"\r
 \r
 #if (RTL8723B_SUPPORT == 1)\r
 #ifdef CONFIG_AP_WOWLAN\r
@@ -1604,16 +1604,16 @@ ODM_ReadFirmware_MP_8723B_FW_BT(
 }\r
 \r
 \r
-// v29 20140605 by Isaachsu <isaachsu@realtek.com>\r
+// v31.00 20140813 by Isaachsu <isaachsu@realtek.com>\r
 u1Byte Array_MP_8723B_FW_NIC[] = {\r
-0x01, 0x53, 0x10, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x06, 0x05, 0x10, 0x58, 0x9C, 0x6A, 0x00, 0x00, \r
-0xF8, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x02, 0x45, 0xED, 0x02, 0x77, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x79, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x78, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x01, 0x53, 0x10, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x08, 0x13, 0x23, 0x37, 0x44, 0x6D, 0x00, 0x00, \r
+0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x02, 0x45, 0xED, 0x02, 0x7F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x02, 0x80, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x02, 0x80, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x78, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x7F, 0xE7, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x88, 0x00, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, \r
+0x00, 0x00, 0x00, 0x02, 0x80, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x87, 0xDE, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x02, 0x8F, 0xD1, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, \r
 0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, \r
 0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, \r
 0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, \r
@@ -1711,1611 +1711,1654 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, \r
 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, \r
 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, \r
-0x41, 0xA1, 0xEC, 0x00, 0x41, 0xA1, 0xED, 0x00, 0x41, 0xA1, 0xEE, 0x00, 0x41, 0xA1, 0xF2, 0x00, \r
-0x01, 0x70, 0x00, 0x41, 0xA1, 0xF3, 0x00, 0x41, 0xA1, 0xF4, 0x00, 0x41, 0xA2, 0x16, 0x00, 0x00, \r
-0x5F, 0xF8, 0x67, 0xE8, 0x6F, 0xE6, 0x7F, 0x67, 0xF1, 0xBF, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0x12, 0xAA, 0x41, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xCC, 0xEF, \r
-0xF0, 0x90, 0xA1, 0xCE, 0xEB, 0xF0, 0xED, 0x60, 0x02, 0xE1, 0x5B, 0x90, 0x07, 0x6E, 0xE0, 0x44, \r
-0x08, 0xF0, 0x12, 0x9D, 0x0F, 0x90, 0xA1, 0xCE, 0xE0, 0x70, 0x3B, 0xD1, 0x96, 0x90, 0xA1, 0xCC, \r
-0xE0, 0x70, 0x2D, 0x12, 0xAA, 0x2F, 0x70, 0x12, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0x74, 0x02, 0xFE, \r
-0xEC, 0xF1, 0xE1, 0xF1, 0xB6, 0xEF, 0x54, 0xFE, 0x80, 0x11, 0x12, 0x37, 0x4E, 0xE4, 0xFE, 0x74, \r
-0x80, 0xFF, 0xE4, 0xEC, 0xF1, 0xE1, 0xF1, 0xB6, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x64, 0xD1, 0xA0, \r
-0x7F, 0x4E, 0xF1, 0xFA, 0xE1, 0xA8, 0xD1, 0x96, 0x90, 0xA1, 0xCC, 0xE0, 0x70, 0x10, 0x12, 0x8A, \r
-0x2E, 0xE4, 0xFF, 0xFE, 0xEC, 0xF1, 0xE1, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xF1, 0xF2, \r
-0xF1, 0xE7, 0x44, 0x01, 0xFD, 0x7F, 0x4F, 0xD1, 0xA0, 0x12, 0xA9, 0xF9, 0x74, 0x66, 0xFF, 0xEC, \r
-0xF1, 0xE1, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x12, 0x65, 0x50, 0x54, 0xFC, 0xFF, 0xEF, \r
-0x44, 0x01, 0xFF, 0xEC, 0xF1, 0xE1, 0x12, 0x66, 0xAA, 0x80, 0x56, 0x90, 0x07, 0x6E, 0xE0, 0x54, \r
-0xF7, 0xF0, 0x12, 0x9D, 0x17, 0x90, 0xA1, 0xCC, 0xE0, 0x70, 0x3B, 0x90, 0xA1, 0xCE, 0xE0, 0x60, \r
-0x09, 0xD1, 0x96, 0x12, 0x8A, 0x2E, 0xE4, 0xFF, 0x80, 0x21, 0x7F, 0x67, 0xF1, 0xBF, 0xEF, 0x54, \r
-0xDF, 0xFD, 0x7F, 0x67, 0xD1, 0xA0, 0x12, 0xAA, 0x2F, 0x70, 0x0B, 0x12, 0x37, 0x4E, 0xE4, 0x74, \r
-0x80, 0xFF, 0x74, 0x02, 0x80, 0x05, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0xF1, 0xE1, 0x7F, \r
-0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xF1, 0xF2, 0xF1, 0xE7, 0x54, 0xFE, 0xFD, 0x7F, 0x4F, 0xD1, \r
-0xA0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x64, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xE0, 0x90, 0xA2, 0x0C, 0x12, \r
-0xAA, 0x41, 0x90, 0xA2, 0x0C, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x9D, 0xB1, \r
-0x71, 0x90, 0xAA, 0xB9, 0x02, 0x08, 0x6D, 0xFD, 0x7F, 0x4E, 0xD1, 0xA0, 0x7F, 0x4F, 0xF1, 0xBF, \r
-0xEF, 0x22, 0x7F, 0x4E, 0xF1, 0xBF, 0xEF, 0x54, 0x7F, 0x22, 0xF1, 0xBF, 0xEF, 0x44, 0x80, 0x22, \r
-0x90, 0xA0, 0x2C, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x39, 0x12, \r
-0x45, 0xA9, 0xE0, 0xFE, 0x75, 0xF0, 0x0E, 0xEF, 0x90, 0xA0, 0x38, 0x12, 0x45, 0xA9, 0xE0, 0x90, \r
-0xA1, 0xB2, 0xF0, 0x90, 0xA1, 0xB1, 0xEE, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xAD, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, \r
-0xB1, 0xE0, 0xF5, 0x3B, 0xA3, 0xE0, 0xF5, 0x3C, 0x12, 0x36, 0x3E, 0x90, 0xA1, 0xAD, 0x12, 0x8F, \r
-0xA0, 0xA3, 0xA3, 0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0x2C, 0xE0, \r
-0x30, 0xE0, 0x5D, 0x90, 0xA0, 0x2E, 0xE0, 0x70, 0x2A, 0x7D, 0x16, 0x7F, 0x6F, 0x31, 0x1D, 0x91, \r
-0x1F, 0x51, 0x47, 0x54, 0x07, 0x75, 0xF0, 0x0E, 0x11, 0xC1, 0x51, 0x47, 0x54, 0x07, 0x12, 0xA5, \r
-0xFA, 0xE0, 0x44, 0x01, 0x12, 0x93, 0xC3, 0xA3, 0x74, 0x03, 0x11, 0x27, 0x90, 0xA0, 0x2E, 0x74, \r
-0x01, 0xF0, 0x22, 0x90, 0xA0, 0x2E, 0xE0, 0x64, 0x01, 0x70, 0x23, 0x90, 0xA0, 0x2C, 0xE0, 0x12, \r
-0xA5, 0xF5, 0xE0, 0x30, 0xE0, 0x18, 0x75, 0xF0, 0x0E, 0xEF, 0x11, 0xC1, 0xE4, 0x90, 0xA1, 0xB1, \r
-0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x01, 0x2F, 0x31, 0x28, \r
-0x22, 0x90, 0xA0, 0x3B, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x7E, 0x00, 0x7D, 0x01, 0xD3, 0x10, 0xAF, \r
-0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xB3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, \r
-0x04, 0x1D, 0xE0, 0x60, 0x1C, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, 0xB8, 0xF0, 0x7D, 0x14, 0x91, \r
-0x1B, 0xBF, 0x01, 0x02, 0x91, 0xFC, 0x90, 0xA1, 0xB8, 0xE0, 0xFF, 0x7D, 0x15, 0x31, 0x1D, 0x80, \r
-0x02, 0x91, 0xFC, 0xF1, 0x0A, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0x3B, 0x12, \r
-0x45, 0xA9, 0xE0, 0xFF, 0x7E, 0x00, 0xE4, 0xFD, 0x11, 0xCD, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, \r
-0xEF, 0xF0, 0x90, 0x9D, 0x97, 0xED, 0xF0, 0x22, 0x90, 0xA0, 0x2C, 0xE0, 0xFF, 0xC3, 0x13, 0xFE, \r
-0xEF, 0x54, 0xF1, 0xFF, 0xEE, 0x04, 0x54, 0x07, 0x25, 0xE0, 0x4F, 0xF0, 0xA3, 0xE0, 0xFF, 0x12, \r
-0xA9, 0xD2, 0xB5, 0x07, 0x04, 0xEE, 0x54, 0xF1, 0xF0, 0x11, 0x00, 0xE4, 0x90, 0xA0, 0x2E, 0xF0, \r
-0x91, 0x1F, 0x12, 0xA9, 0xD2, 0x12, 0xA9, 0x6D, 0xE0, 0xFA, 0x75, 0xF0, 0x0E, 0xED, 0xF1, 0xB6, \r
-0xFC, 0x54, 0x03, 0xFD, 0xEC, 0x13, 0x13, 0x54, 0x07, 0xFB, 0xEE, 0x12, 0xAA, 0x69, 0xAF, 0x02, \r
-0x12, 0xA4, 0x4F, 0x51, 0x47, 0x54, 0x07, 0x75, 0xF0, 0x0E, 0xF1, 0xB6, 0x12, 0xA9, 0xBE, 0xFD, \r
-0x51, 0x4E, 0x51, 0x47, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x3A, 0x12, 0x45, 0xA9, \r
-0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x0E, 0xEF, 0x31, 0x0C, 0x51, 0x47, 0x54, 0x07, 0xFD, 0xE4, 0xFF, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xE4, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, \r
-0xA3, 0xF0, 0x90, 0xA1, 0xE6, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, 0x02, 0x41, 0x42, 0x90, 0xA1, \r
-0xE5, 0xE0, 0xFE, 0x12, 0xA5, 0xC2, 0x75, 0xF0, 0x03, 0xEF, 0x12, 0xA9, 0x84, 0xE0, 0x90, 0xA1, \r
-0xE7, 0xF0, 0x90, 0xA1, 0xE4, 0xE0, 0x60, 0x24, 0x90, 0xA1, 0xE7, 0xE0, 0xFF, 0x75, 0xF0, 0x0E, \r
-0xEE, 0x12, 0xA5, 0xBC, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA1, 0xE6, 0xE0, 0xD0, 0x82, 0xD0, 0x83, \r
-0x12, 0xA9, 0x15, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x20, 0x12, 0xA9, 0xDC, 0x75, \r
-0xF0, 0x0E, 0x12, 0xA5, 0xBC, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA1, 0xE6, 0xE0, 0xD0, 0x82, 0xD0, \r
-0x83, 0x12, 0xA9, 0x15, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0xA1, 0xE7, 0xF0, \r
-0x12, 0xA9, 0xDC, 0x12, 0xA5, 0xC2, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA1, 0xE6, 0xE0, 0xD0, 0x82, \r
-0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0xA9, 0x84, 0xEF, 0xF0, 0x90, 0xA1, 0xE6, 0xE0, 0x04, 0xF0, \r
-0x21, 0xB2, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0x2C, 0xE0, 0xC3, 0x13, 0x22, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x0F, 0xED, 0xF0, 0xEF, 0x14, 0x60, 0x02, 0x61, 0x0D, \r
-0x90, 0x06, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA2, 0x0F, 0xE0, 0xC4, 0x33, 0x54, 0xE0, 0xFF, \r
-0x90, 0x04, 0x42, 0xE0, 0x54, 0x9F, 0x4F, 0xFF, 0xF0, 0x90, 0xA1, 0x60, 0x12, 0x08, 0x79, 0x00, \r
-0x00, 0x00, 0x01, 0x90, 0xA1, 0x64, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, \r
-0x08, 0x71, 0xD7, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA1, 0x64, 0x12, 0x08, 0x79, \r
-0x00, 0x00, 0x00, 0x01, 0x71, 0xD3, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x10, 0x12, 0xA9, 0x23, \r
-0x78, 0x01, 0x12, 0x08, 0x47, 0x78, 0x04, 0xF1, 0xC6, 0x7F, 0x00, 0x7E, 0x0A, 0x71, 0xD7, 0x12, \r
-0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x12, 0xA9, 0x23, 0x78, 0x0A, 0xF1, 0xC6, 0x7F, 0x00, 0x7E, \r
-0x0D, 0x71, 0xD7, 0x12, 0x08, 0x79, 0x0C, 0x00, 0x00, 0x00, 0x12, 0xA9, 0x23, 0x78, 0x1A, 0xF1, \r
-0xC6, 0x7F, 0x18, 0x7E, 0x08, 0x71, 0xD7, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA1, \r
-0x64, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xD9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, \r
-0x00, 0x90, 0xA1, 0x52, 0x12, 0x08, 0x79, 0x00, 0x00, 0x04, 0x00, 0x80, 0x58, 0x90, 0x06, 0x03, \r
-0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA1, 0x60, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA1, \r
-0x64, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x08, 0x71, 0xD7, 0x12, 0x08, \r
-0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA1, 0x64, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x71, \r
-0xD3, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA1, 0x64, 0x12, 0x08, 0x79, 0x00, 0x00, \r
-0x0C, 0x00, 0xF1, 0xD9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA1, 0x52, 0x12, 0x08, \r
-0x79, 0x00, 0x00, 0x0C, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0x12, 0xA3, 0xD7, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x5E, 0xEE, 0xF0, 0xA3, \r
-0xEF, 0xF0, 0x12, 0x37, 0x4E, 0x90, 0xA1, 0x68, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x60, 0x12, 0x45, \r
-0x71, 0x12, 0x08, 0x3A, 0x90, 0xA1, 0x68, 0xF1, 0xEF, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, \r
-0x07, 0x90, 0xA1, 0x60, 0x12, 0x45, 0x71, 0x90, 0xA1, 0x64, 0xF1, 0xEF, 0xD0, 0x03, 0xD0, 0x02, \r
-0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53, 0x90, 0xA1, 0x6C, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x6C, \r
-0x12, 0x47, 0xDF, 0x90, 0xA1, 0x5E, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, 0x45, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x7F, 0x00, 0x7E, 0x09, 0x71, 0x73, 0x90, 0xA1, 0x60, 0x22, 0x8F, 0x54, 0x7D, \r
-0x17, 0x91, 0x1B, 0x75, 0xF0, 0x0E, 0xE5, 0x54, 0x12, 0xA9, 0x71, 0xE0, 0xFC, 0xF1, 0xB1, 0xFE, \r
-0x54, 0x03, 0xFD, 0xEE, 0x13, 0x13, 0x54, 0x07, 0xFB, 0x90, 0xA0, 0x2C, 0xE0, 0xFE, 0x12, 0xAA, \r
-0x69, 0xAF, 0x04, 0x12, 0xA4, 0x4F, 0xF1, 0xB1, 0x12, 0xA9, 0xBE, 0xFD, 0x51, 0x4E, 0x75, 0xF0, \r
-0x0E, 0xE5, 0x54, 0x31, 0x0C, 0xAD, 0x54, 0xE4, 0xFF, 0x21, 0xA0, 0x7F, 0xFF, 0x31, 0x1D, 0xE4, \r
-0x90, 0xA2, 0x06, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, \r
-0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xF1, 0xCF, 0x30, 0xE0, 0x15, \r
-0xD3, 0x90, 0xA2, 0x07, 0xE0, 0x94, 0x03, 0x90, 0xA2, 0x06, 0xE0, 0x94, 0x00, 0x40, 0x02, 0x80, \r
-0x13, 0x7F, 0x01, 0x80, 0x1B, 0xD3, 0x90, 0xA2, 0x07, 0xE0, 0x94, 0xE8, 0x90, 0xA2, 0x06, 0xE0, \r
-0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, \r
-0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA2, 0x06, 0x12, 0x8F, 0x74, 0x80, 0xA9, 0x90, 0x9F, 0xD2, \r
-0xE0, 0x44, 0x02, 0xF0, 0x7D, 0x08, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
-0xA1, 0xBE, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x9D, 0x95, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, \r
-0xE0, 0x60, 0x33, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, 0xC2, 0xF0, 0x7D, 0x26, 0x91, 0x1B, 0xEF, \r
-0x64, 0x01, 0x70, 0x07, 0xD1, 0xBA, 0x20, 0xE0, 0x0F, 0x80, 0x0A, 0xF1, 0xCF, 0x30, 0xE0, 0x08, \r
-0xD1, 0xBA, 0x20, 0xE0, 0x03, 0x12, 0xA7, 0xA5, 0x90, 0xA1, 0xC2, 0xE0, 0xFF, 0x7D, 0x27, 0x31, \r
-0x1D, 0x12, 0xA8, 0x17, 0x80, 0x0B, 0x12, 0xA8, 0x17, 0xD1, 0xBA, 0x20, 0xE0, 0x03, 0x12, 0xA7, \r
-0xA5, 0x90, 0x9F, 0xCA, 0xE0, 0x30, 0xE0, 0x0B, 0xF1, 0xCF, 0x30, 0xE0, 0x06, 0xF1, 0xF5, 0x7D, \r
-0x28, 0x31, 0x1D, 0xF1, 0x0A, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xB3, 0xA3, \r
-0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0xB1, 0x56, 0x90, 0xA1, 0xB6, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, \r
-0xF0, 0xFD, 0x90, 0xA1, 0xB5, 0xE0, 0xFF, 0xF1, 0xA5, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x2C, 0xF1, \r
-0xE3, 0x44, 0x10, 0xF0, 0xF1, 0xA5, 0x44, 0x80, 0xF0, 0x12, 0x87, 0xCF, 0x30, 0xE0, 0x26, 0x12, \r
-0x85, 0xC4, 0x50, 0x0E, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, 0x2B, 0x2D, 0xF1, 0x9D, 0xEF, \r
-0xF0, 0x22, 0x74, 0x2B, 0x2D, 0xF1, 0x9D, 0x74, 0x7F, 0xF0, 0x22, 0xF1, 0xE3, 0x54, 0xEF, 0xF0, \r
-0xF1, 0xA5, 0x44, 0x40, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xF9, \r
-0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA1, 0xF8, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0xA8, 0xCB, \r
-0x7C, 0x00, 0xAD, 0x07, 0x90, 0xA1, 0xF8, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0xA1, 0xF9, 0xE0, \r
-0x60, 0x06, 0x12, 0xA9, 0x9C, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x12, 0xA9, 0x9C, 0x54, 0xC0, 0xF0, 0xAF, 0x05, \r
-0xF1, 0x8F, 0xE0, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xFA, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xEE, \r
-0x44, 0x02, 0x4B, 0xFE, 0xF1, 0x8F, 0xEE, 0xF0, 0x74, 0x11, 0x2F, 0x12, 0xAA, 0x61, 0x74, 0xFF, \r
-0xF0, 0x74, 0x29, 0x2F, 0xF1, 0xE6, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, \r
-0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xE8, 0xEF, 0xF0, 0x90, 0x04, \r
-0x1D, 0xE0, 0x60, 0x20, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, 0xEB, 0xF0, 0x7D, 0x29, 0x91, 0x1B, \r
-0xBF, 0x01, 0x06, 0x12, 0xA8, 0xDF, 0xFF, 0xB1, 0x17, 0x90, 0xA1, 0xEB, 0xE0, 0xFF, 0x7D, 0x2A, \r
-0x31, 0x1D, 0x80, 0x06, 0x12, 0xA8, 0xDF, 0xFF, 0xB1, 0x17, 0xF1, 0x0A, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xC3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
-0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1D, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, 0xC7, 0xF0, 0x7D, 0x36, \r
-0x91, 0x1B, 0xBF, 0x01, 0x03, 0x12, 0xA8, 0x82, 0x90, 0xA1, 0xC7, 0xE0, 0xFF, 0x7D, 0x37, 0x31, \r
-0x1D, 0x80, 0x03, 0x12, 0xA8, 0x82, 0xF1, 0xF5, 0x7D, 0x38, 0x31, 0x1D, 0xF1, 0x0A, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x90, 0xA1, 0x18, 0xEF, 0xF1, 0xBE, 0x90, 0xA0, 0x19, 0x12, 0x66, 0xE8, 0x20, \r
-0xE0, 0x0D, 0x90, 0xA1, 0x19, 0xE0, 0xB4, 0x01, 0x06, 0x7D, 0x36, 0x7F, 0x6F, 0x31, 0x1D, 0x90, \r
-0xA1, 0x18, 0xE0, 0x70, 0x0B, 0x90, 0xA1, 0x1A, 0xE0, 0xFF, 0x7D, 0x05, 0x91, 0x88, 0x80, 0x26, \r
-0x90, 0xA1, 0x18, 0xE0, 0xB4, 0x01, 0x09, 0x90, 0xA1, 0x1A, 0xE0, 0xFF, 0xB1, 0xD2, 0x80, 0x16, \r
-0x90, 0xA1, 0x18, 0xE0, 0xB4, 0x02, 0x0F, 0xA3, 0xE0, 0xB4, 0x01, 0x0A, 0x90, 0xA0, 0x27, 0xE0, \r
-0xFE, 0xA3, 0xE0, 0xFF, 0xD1, 0x11, 0x90, 0xA0, 0x19, 0x12, 0x66, 0xE8, 0x20, 0xE0, 0x0A, 0x90, \r
-0xA1, 0x19, 0xE0, 0x70, 0x04, 0xFD, 0xFF, 0x31, 0x1D, 0x22, 0x90, 0x9D, 0x9B, 0xE0, 0xFF, 0x90, \r
-0xA1, 0xBF, 0xE0, 0xFB, 0x7D, 0x01, 0xB1, 0x56, 0x90, 0xA1, 0xC0, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, \r
-0xF0, 0xFD, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0xB1, 0x17, 0x90, 0xA0, 0x2C, 0xE0, 0x22, 0x90, 0xA1, \r
-0x19, 0xEF, 0xF1, 0xBE, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1E, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, \r
-0x1E, 0xF0, 0x7D, 0x01, 0x91, 0x1B, 0xEF, 0x64, 0x01, 0x70, 0x02, 0xF1, 0x11, 0x90, 0xA1, 0x1E, \r
-0xE0, 0xFF, 0x7D, 0x02, 0x31, 0x1D, 0x80, 0x02, 0xF1, 0x11, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, \r
-0x22, 0x90, 0x9D, 0x9D, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0xB1, 0x56, 0x90, 0xA1, 0x1C, 0xEE, \r
-0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA1, 0x19, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, \r
-0x90, 0xA1, 0x23, 0xF0, 0x90, 0xA1, 0x20, 0xEC, 0xF1, 0xBE, 0x90, 0xA1, 0x20, 0xE0, 0xFC, 0xA3, \r
-0xE0, 0xFD, 0xB1, 0x17, 0x90, 0xA1, 0x20, 0xA3, 0xE0, 0xFF, 0xFD, 0x24, 0x0D, 0x12, 0xA9, 0x35, \r
-0x44, 0x80, 0xF0, 0x74, 0x0D, 0x2D, 0x12, 0xA9, 0x35, 0x54, 0xEF, 0xF1, 0x8E, 0xE0, 0x44, 0x02, \r
-0xF1, 0x8E, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0xA1, 0x22, 0xE0, 0xFF, 0x90, 0xA1, 0x20, 0xA3, 0xE0, \r
-0xFE, 0x24, 0x2A, 0x12, 0xA8, 0xC1, 0x90, 0xA1, 0x23, 0xE0, 0xFF, 0xF1, 0x9A, 0xEF, 0xF0, 0x74, \r
-0x2C, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x02, 0xF0, 0x22, 0xF0, 0x74, \r
-0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x74, 0x2B, 0x2E, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0xF5, 0x83, 0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
-0x22, 0x75, 0xF0, 0x0E, 0xE5, 0x54, 0x90, 0xA0, 0x30, 0x12, 0x45, 0xA9, 0xE0, 0x22, 0xF0, 0xA3, \r
-0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x22, 0x12, 0x08, 0x5A, 0x90, 0xA1, 0x64, 0x02, 0x08, 0x6D, 0x90, \r
-0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0x7F, 0x84, 0x7E, 0x08, 0x71, 0x73, 0x90, \r
-0xA1, 0x4E, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x12, \r
-0x45, 0x8D, 0x02, 0x45, 0x46, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x6F, 0xFF, 0x22, 0xD3, 0x10, 0xAF, \r
-0x01, 0xC3, 0xC0, 0xD0, 0x12, 0xA3, 0xC9, 0x20, 0xE6, 0x02, 0x01, 0xB5, 0x90, 0x00, 0x8C, 0xE0, \r
-0xF5, 0x6E, 0x7F, 0x8D, 0x12, 0x47, 0xBF, 0x90, 0x00, 0x8E, 0xE0, 0xF5, 0x6F, 0xEF, 0x24, 0xFC, \r
-0x60, 0x0D, 0x24, 0x03, 0x60, 0x02, 0x01, 0xAC, 0xAF, 0x6E, 0x12, 0xA3, 0x73, 0x80, 0x7D, 0x74, \r
-0x92, 0x25, 0x6E, 0x12, 0x75, 0x9B, 0xE0, 0xFB, 0xE4, 0xFD, 0x11, 0xFA, 0xE5, 0x6E, 0x31, 0x07, \r
-0x13, 0x13, 0x11, 0xF5, 0xE5, 0x6E, 0x31, 0x07, 0xD1, 0xCD, 0x11, 0xF7, 0xE5, 0x6E, 0x31, 0x07, \r
-0xC4, 0x11, 0xF5, 0xE5, 0x6E, 0x12, 0x77, 0x94, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x11, 0xFB, 0xE5, \r
-0x6E, 0xD1, 0xC6, 0xE0, 0xFB, 0x0D, 0x91, 0x08, 0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, \r
-0x91, 0x08, 0x54, 0x1F, 0xFB, 0x0D, 0x11, 0xE6, 0x90, 0x89, 0x00, 0x11, 0xDE, 0x90, 0x89, 0x01, \r
-0x11, 0xEE, 0x11, 0xE6, 0x90, 0x89, 0x02, 0x11, 0xEE, 0x11, 0xE6, 0x90, 0x89, 0x03, 0x11, 0xEE, \r
-0x11, 0xE6, 0x90, 0x89, 0x04, 0x11, 0xDE, 0x90, 0x89, 0x05, 0x11, 0xEE, 0x11, 0xE6, 0x90, 0x89, \r
-0x06, 0x11, 0xEE, 0x11, 0xE6, 0x90, 0x89, 0x07, 0x11, 0xEE, 0x11, 0xBA, 0x12, 0xA3, 0xC9, 0x30, \r
-0xE0, 0x03, 0x12, 0xA3, 0xD0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, \r
-0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, \r
-0x06, 0xEF, 0xB4, 0x03, 0x08, 0x74, 0xFC, 0x2D, 0x12, 0x9F, 0x40, 0xEB, 0xF0, 0x22, 0x12, 0x45, \r
-0xA9, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x11, 0xBA, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x22, 0x12, 0x45, \r
-0xA9, 0xE0, 0xFB, 0x0D, 0x22, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x11, 0xBA, 0x75, 0xF0, 0x04, \r
-0x22, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0x22, 0xE4, \r
-0xFF, 0xE4, 0xFE, 0x74, 0x12, 0x2F, 0xD1, 0x2B, 0xE0, 0x54, 0xFE, 0xF0, 0x12, 0xAA, 0x81, 0xBE, \r
-0x03, 0x0D, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xD1, 0x0E, 0x74, 0x80, 0xF0, 0x80, 0x0A, 0x12, \r
-0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xD1, 0x0E, 0xE4, 0xF0, 0x75, 0xF0, 0x08, 0xEF, 0xD1, 0x1D, 0x2E, \r
-0xD1, 0x0E, 0xE4, 0xF0, 0x0E, 0xBE, 0x10, 0xCB, 0x0F, 0xBF, 0x80, 0xC5, 0xE4, 0x90, 0xAD, 0xE2, \r
-0xF0, 0xFF, 0xE4, 0xFE, 0x75, 0xF0, 0x0A, 0xEF, 0x12, 0x7F, 0xB6, 0x75, 0xF0, 0x02, 0xEE, 0x12, \r
-0xA3, 0x55, 0xF0, 0x0E, 0xBE, 0x05, 0xED, 0x74, 0x12, 0x2F, 0x12, 0x77, 0xA9, 0x74, 0x13, 0xF0, \r
-0x74, 0x92, 0x2F, 0x12, 0x77, 0x64, 0xE4, 0xF0, 0x74, 0x01, 0x2F, 0x12, 0x75, 0xAD, 0x74, 0xC0, \r
-0x12, 0x77, 0xD5, 0xE4, 0xF0, 0xA3, 0xF0, 0x12, 0xA3, 0x5C, 0xE4, 0x12, 0x77, 0x8F, 0x74, 0x13, \r
-0xF0, 0xD1, 0xC2, 0xE4, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x91, 0x0F, 0x54, 0xE0, 0x44, 0x09, 0xF0, \r
-0x75, 0xF0, 0x04, 0xEF, 0x31, 0x07, 0x54, 0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, 0x07, 0x54, \r
-0xFC, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x91, 0x0F, 0x44, 0x20, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, \r
-0x07, 0x54, 0xCF, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, 0x07, 0x44, 0x40, 0xF0, 0x75, 0xF0, 0x04, \r
-0xEF, 0x31, 0x07, 0x54, 0x7F, 0xF0, 0xD1, 0xC2, 0xE0, 0xFE, 0x12, 0xAA, 0x81, 0x12, 0x45, 0xA9, \r
-0xEE, 0xF0, 0x74, 0x12, 0x2F, 0xD1, 0x2B, 0xE4, 0xF0, 0x0F, 0xEF, 0x64, 0x80, 0x60, 0x02, 0x21, \r
-0x52, 0x74, 0x92, 0x2F, 0x12, 0x8C, 0x4B, 0x74, 0xFF, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x7F, \r
-0xF5, 0x51, 0xF1, 0xC5, 0xFF, 0x54, 0x1F, 0xF5, 0x53, 0xEF, 0x54, 0x80, 0xD1, 0xCD, 0xF5, 0x52, \r
-0xD1, 0xBC, 0xFF, 0x54, 0x03, 0xF5, 0x54, 0xEF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xF5, 0x57, 0xD1, \r
-0xBC, 0xFF, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x55, 0xEF, 0x54, 0x80, 0xD1, 0xCD, \r
-0xF5, 0x56, 0xD1, 0xBC, 0xFF, 0x54, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xF5, 0x59, 0xEF, 0x54, \r
-0x04, 0x13, 0x13, 0x54, 0x3F, 0xF5, 0x5A, 0xE5, 0x56, 0x12, 0xAA, 0x02, 0x31, 0x01, 0x54, 0x7F, \r
-0x4F, 0xF0, 0xE5, 0x55, 0x12, 0x61, 0xBF, 0x31, 0x01, 0x54, 0xBF, 0x4F, 0xF0, 0xE5, 0x59, 0x60, \r
-0x02, 0x41, 0xE3, 0xE5, 0x53, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x91, 0x0F, 0x54, \r
-0xE0, 0x4F, 0xF0, 0xE5, 0x54, 0x54, 0x03, 0x31, 0x01, 0x54, 0xFC, 0x4F, 0xF0, 0xEF, 0x25, 0xE0, \r
-0x25, 0xE0, 0x31, 0x01, 0x54, 0xF3, 0x4F, 0xF0, 0xE5, 0x52, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, \r
-0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x91, 0x0F, 0x54, 0xDF, 0x4F, 0xF0, 0xE5, 0x57, 0x54, 0x03, \r
-0xC4, 0x54, 0xF0, 0x31, 0x01, 0x54, 0xCF, 0x4F, 0xD1, 0x26, 0xE0, 0x54, 0xFB, 0xD1, 0x26, 0xE0, \r
-0xFF, 0xE5, 0x5A, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xF0, 0xE4, 0xF5, 0x58, 0x85, 0x58, \r
-0x82, 0x75, 0x83, 0x00, 0xA3, 0xA3, 0xA3, 0x12, 0x06, 0xA2, 0xFF, 0x75, 0xF0, 0x08, 0xE5, 0x51, \r
-0xD1, 0x1D, 0x25, 0x58, 0xD1, 0x0E, 0xEF, 0xF0, 0x05, 0x58, 0xE5, 0x58, 0xB4, 0x04, 0xDF, 0xAF, \r
-0x51, 0x91, 0x17, 0x22, 0x90, 0xA0, 0xEA, 0xEF, 0xF0, 0xA3, 0x12, 0x45, 0xBE, 0x90, 0xA0, 0xEA, \r
-0xE0, 0xFF, 0x90, 0x06, 0x34, 0xF0, 0xEF, 0x12, 0x45, 0xC7, 0x53, 0x5B, 0x00, 0x53, 0x60, 0x01, \r
-0x53, 0x65, 0x02, 0x53, 0x6A, 0x10, 0x53, 0x6F, 0x11, 0x53, 0x73, 0x12, 0x53, 0x78, 0x14, 0x53, \r
-0x7D, 0x20, 0x53, 0x82, 0x21, 0x53, 0x86, 0x23, 0x53, 0x8B, 0x24, 0x53, 0x90, 0x25, 0x53, 0x95, \r
-0x27, 0x53, 0x9A, 0x28, 0x53, 0x9F, 0x40, 0x53, 0xA3, 0x42, 0x53, 0xA7, 0x60, 0x53, 0xAC, 0x61, \r
-0x53, 0xB1, 0x62, 0x53, 0xB6, 0x63, 0x53, 0xBB, 0x64, 0x53, 0xC0, 0x65, 0x53, 0xC5, 0x66, 0x53, \r
-0xCA, 0x67, 0x53, 0xCF, 0x68, 0x53, 0xD4, 0x69, 0x53, 0xD9, 0x6B, 0x53, 0xDE, 0x6C, 0x53, 0xE3, \r
-0x6D, 0x53, 0xE8, 0x6E, 0x53, 0xED, 0x6F, 0x00, 0x00, 0x53, 0xF2, 0x91, 0x02, 0x02, 0x98, 0x79, \r
-0x91, 0x02, 0x02, 0x95, 0x9B, 0x91, 0x02, 0x02, 0x98, 0xD8, 0x91, 0x02, 0x02, 0x98, 0xBE, 0x91, \r
-0x02, 0xC1, 0xED, 0x91, 0x02, 0x02, 0x9A, 0xD4, 0x91, 0x02, 0x02, 0x9A, 0xE8, 0x91, 0x02, 0x02, \r
-0x5C, 0xFD, 0x91, 0x02, 0xE1, 0xCB, 0x91, 0x02, 0x02, 0x9A, 0xF7, 0x91, 0x02, 0x02, 0x68, 0x53, \r
-0x91, 0x02, 0x02, 0x97, 0x0F, 0x91, 0x02, 0x02, 0x9A, 0xFF, 0x91, 0x02, 0x02, 0x9B, 0x27, 0x91, \r
-0x02, 0x21, 0xFB, 0x91, 0x02, 0xC1, 0x33, 0x91, 0x02, 0x02, 0x69, 0xE0, 0x91, 0x02, 0x02, 0x8B, \r
-0xB1, 0x91, 0x02, 0x02, 0x87, 0xB4, 0x91, 0x02, 0x02, 0x9B, 0x6F, 0x91, 0x02, 0x02, 0x9B, 0x9C, \r
-0x91, 0x02, 0x02, 0x9B, 0xFA, 0x91, 0x02, 0x02, 0x9C, 0x08, 0x91, 0x02, 0x02, 0x8D, 0x06, 0x91, \r
-0x02, 0x02, 0x9B, 0x83, 0x91, 0x02, 0x02, 0x9C, 0x34, 0x91, 0x02, 0x02, 0x6D, 0x10, 0x91, 0x02, \r
-0x02, 0x9C, 0xD3, 0x91, 0x02, 0x02, 0x8B, 0x49, 0x91, 0x02, 0x02, 0x9C, 0xED, 0x91, 0x02, 0x02, \r
-0x9B, 0x50, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA0, 0xEA, 0xE0, 0x90, 0x01, 0xC2, \r
-0xF0, 0x22, 0x90, 0xA0, 0xEB, 0x02, 0x45, 0xB5, 0x11, 0xBA, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, \r
-0x96, 0x14, 0x12, 0x45, 0xA9, 0xE0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, \r
-0xDC, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0x91, 0x0F, 0x54, 0x1F, 0xFB, 0x24, 0xF1, 0x50, 0x02, 0x80, \r
-0x59, 0xE4, 0xF5, 0x6B, 0x90, 0xA1, 0xDC, 0xE0, 0xFD, 0xD1, 0x1A, 0x25, 0x6B, 0xD1, 0x0E, 0xE0, \r
-0xFE, 0xEB, 0x75, 0xF0, 0x07, 0xA4, 0x24, 0x56, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE5, \r
-0x82, 0x25, 0x6B, 0xD1, 0x0E, 0xE4, 0x93, 0xFC, 0xEE, 0x5C, 0x90, 0xA1, 0xDF, 0xF0, 0x75, 0xF0, \r
-0x04, 0xED, 0x31, 0x07, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0B, 0xE5, 0x6B, 0x70, 0x07, 0x90, 0xA1, \r
-0xDF, 0xE0, 0x54, 0xF0, 0xF0, 0x90, 0xA1, 0xDF, 0xE0, 0xFF, 0xD1, 0x16, 0x25, 0x6B, 0xD1, 0x0E, \r
-0xEF, 0xF0, 0x05, 0x6B, 0xE5, 0x6B, 0x64, 0x07, 0x70, 0xAA, 0x90, 0xA1, 0xDC, 0xE0, 0x75, 0xF0, \r
-0x04, 0x31, 0x07, 0xFF, 0xC4, 0x54, 0x03, 0xFD, 0xE4, 0x90, 0xA1, 0xDD, 0xF0, 0x75, 0x6C, 0x06, \r
-0xE5, 0x6C, 0xB4, 0x06, 0x07, 0xB1, 0xFD, 0xE0, 0x54, 0x0F, 0x80, 0x07, 0xD1, 0x16, 0x25, 0x6C, \r
-0xD1, 0x0E, 0xE0, 0x90, 0xA1, 0xDE, 0xF0, 0x90, 0xA1, 0xDE, 0xE0, 0x60, 0x33, 0x75, 0x6B, 0x07, \r
-0x12, 0xAA, 0x79, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x12, 0xAA, 0x1D, 0x60, \r
-0x16, 0x12, 0xAA, 0x14, 0x90, 0xA1, 0xDD, 0xF0, 0xED, 0x60, 0x22, 0xE0, 0xD3, 0x94, 0x0B, 0x40, \r
-0x1C, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x16, 0x15, 0x6B, 0xE5, 0x6B, 0xC3, 0x94, 0x00, 0x50, 0xD0, \r
-0xE5, 0x6C, 0x60, 0x09, 0x15, 0x6C, 0xE5, 0x6C, 0xC3, 0x94, 0x00, 0x50, 0xA3, 0xE4, 0xFC, 0xF5, \r
-0x6C, 0xE5, 0x6C, 0xB4, 0x06, 0x07, 0xB1, 0xFD, 0xE0, 0x54, 0x0F, 0x80, 0x07, 0xD1, 0x16, 0x25, \r
-0x6C, 0xD1, 0x0E, 0xE0, 0x90, 0xA1, 0xDE, 0xF0, 0x90, 0xA1, 0xDE, 0xE0, 0x60, 0x2E, 0xE4, 0xF5, \r
-0x6B, 0x12, 0xAA, 0x79, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x12, 0xAA, 0x1D, \r
-0x60, 0x13, 0x12, 0xAA, 0x14, 0xFC, 0xED, 0x60, 0x1B, 0xEC, 0xD3, 0x94, 0x0B, 0x40, 0x15, 0x74, \r
-0x20, 0x2C, 0xFC, 0x80, 0x0F, 0x05, 0x6B, 0xE5, 0x6B, 0xB4, 0x08, 0xD5, 0x05, 0x6C, 0xE5, 0x6C, \r
-0x64, 0x07, 0x70, 0xAD, 0x90, 0xA1, 0xDD, 0xE0, 0xFF, 0x90, 0xA1, 0xDC, 0xE0, 0xFE, 0x75, 0xF0, \r
-0x04, 0x12, 0x77, 0x94, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0xD1, 0xC6, 0xEC, 0xF0, 0x75, 0xF0, \r
-0x10, 0xEE, 0x12, 0x7F, 0xBC, 0xFE, 0x54, 0x7F, 0xF5, 0x6D, 0xEE, 0x54, 0x80, 0xFE, 0xE5, 0x6D, \r
-0xD3, 0x9F, 0x40, 0x09, 0x90, 0xA1, 0xDD, 0xE0, 0x4E, 0xF5, 0x6D, 0x80, 0x0C, 0xE5, 0x6D, 0xC3, \r
-0x9C, 0x50, 0x06, 0xAF, 0x06, 0xEC, 0x4F, 0xF5, 0x6D, 0x90, 0xA1, 0xDC, 0xE0, 0xFF, 0x24, 0x12, \r
-0x12, 0x77, 0xA9, 0xE5, 0x6D, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, 0x07, 0x13, 0x13, 0x54, 0x03, \r
-0xF5, 0x6A, 0x90, 0xA1, 0xDC, 0xE0, 0xFF, 0xE4, 0xFB, 0xAD, 0x6D, 0x12, 0x75, 0xDD, 0x90, 0xA1, \r
-0xDC, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x03, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0x90, 0xA1, \r
-0xDD, 0xE0, 0xFE, 0xC3, 0x94, 0x0C, 0x40, 0x07, 0xD1, 0xD4, 0x74, 0x02, 0xF0, 0x80, 0x19, 0xEE, \r
-0xC3, 0x94, 0x04, 0x90, 0xA1, 0xDC, 0xE0, 0x40, 0x09, 0x24, 0x92, 0xD1, 0xD7, 0x74, 0x01, 0xF0, \r
-0x80, 0x06, 0x24, 0x92, 0xD1, 0xD7, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xFF, 0x90, 0xA1, \r
-0xDC, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, \r
-0xE4, 0x35, 0x83, 0xF5, 0x83, 0x22, 0x90, 0xA1, 0xDC, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, \r
-0x12, 0x45, 0xA9, 0xE5, 0x82, 0x22, 0xF0, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, \r
-0xF5, 0x83, 0x22, 0x12, 0x6F, 0xD2, 0x12, 0x06, 0x89, 0xF5, 0x51, 0x24, 0x12, 0xD1, 0x2B, 0xE0, \r
-0x54, 0x9C, 0xD1, 0x26, 0xC0, 0x83, 0xC0, 0x82, 0xD1, 0xDF, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, \r
-0x82, 0xD0, 0x83, 0xD1, 0x26, 0xC0, 0x83, 0xC0, 0x82, 0xD1, 0xDF, 0x54, 0x02, 0xFE, 0xEF, 0x4E, \r
-0xD0, 0x82, 0xD0, 0x83, 0xD1, 0x26, 0xC0, 0x83, 0xC0, 0x82, 0xD1, 0xDF, 0x54, 0x40, 0xFE, 0xEF, \r
-0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xD1, 0x26, 0xC0, 0x83, 0xC0, 0x82, 0xD1, 0xDF, 0x54, 0x20, 0xFE, \r
-0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x09, 0xD1, 0xBC, \r
-0x12, 0x75, 0x96, 0xEF, 0xF0, 0x80, 0x0B, 0xE5, 0x51, 0xB4, 0x80, 0x06, 0xD1, 0xBC, 0x90, 0x95, \r
-0x91, 0xF0, 0xD1, 0x27, 0xE0, 0x30, 0xE5, 0x11, 0x31, 0x02, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x12, \r
-0x75, 0x97, 0xE0, 0xFD, 0xAF, 0x51, 0x12, 0xA2, 0xAE, 0x22, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x02, \r
-0x06, 0xA2, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x13, 0x02, 0x45, 0xA9, 0xFF, 0xC4, 0x13, 0x13, \r
-0x13, 0x54, 0x01, 0x22, 0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0x22, 0xE0, \r
-0xFF, 0x90, 0xA0, 0xEE, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x02, 0x06, 0xA2, 0x12, 0x6F, 0xDF, \r
-0x12, 0x06, 0x89, 0xC4, 0x54, 0x0F, 0xFF, 0xBF, 0x0F, 0x18, 0x90, 0xA0, 0x2C, 0xE0, 0x54, 0xFE, \r
-0xF0, 0x12, 0x6F, 0x6B, 0xF1, 0xBD, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFF, 0x12, 0x4B, 0xDD, 0x02, \r
-0xA4, 0xCF, 0xF1, 0xBD, 0xF1, 0xC5, 0xFF, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, 0x12, 0xA9, 0x6D, \r
-0xEF, 0xD1, 0xBB, 0x54, 0x03, 0xFF, 0x75, 0xF0, 0x0E, 0xED, 0x12, 0x4F, 0xB6, 0x54, 0xFC, 0xD1, \r
-0xBA, 0x54, 0x1C, 0xFF, 0xEE, 0x54, 0x0F, 0xFE, 0x75, 0xF0, 0x0E, 0x12, 0x4F, 0xB6, 0x54, 0xE3, \r
-0xD1, 0xBA, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x0E, 0xEE, 0x12, 0x4F, 0xB6, 0x54, 0x1F, 0x4F, 0x12, \r
-0x6C, 0xDD, 0x12, 0xAA, 0x51, 0xE4, 0xFB, 0xF1, 0xBA, 0x12, 0x5E, 0x3B, 0x12, 0xAA, 0x51, 0x7B, \r
-0x01, 0xF1, 0xBA, 0xD1, 0xE7, 0x12, 0x9B, 0x49, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, 0xFD, 0x75, \r
-0xF0, 0x0E, 0x90, 0xA0, 0x38, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0xD1, 0xE7, 0xC4, 0x13, 0x54, 0x07, \r
-0xFF, 0x75, 0xF0, 0x0E, 0xED, 0x90, 0xA0, 0x39, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0xEE, 0xC4, 0x54, \r
-0x0F, 0xFF, 0x14, 0x6D, 0x70, 0x23, 0x90, 0xA0, 0x2D, 0xEF, 0xF0, 0x12, 0x5F, 0xE4, 0x54, 0x0F, \r
-0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA0, 0x2C, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x54, 0xF1, 0xF0, 0x44, \r
-0x01, 0xF0, 0x7D, 0x20, 0xE4, 0xFF, 0x12, 0x6F, 0x56, 0x22, 0x12, 0xA5, 0x45, 0xAB, 0x51, 0xAA, \r
-0x52, 0xA9, 0x53, 0x22, 0xF0, 0x90, 0x00, 0x01, 0x02, 0x06, 0xA2, 0xD1, 0xBC, 0xFF, 0x30, 0xE0, \r
-0x1D, 0x12, 0x06, 0x89, 0x90, 0x9F, 0xB6, 0xF1, 0xC4, 0x90, 0x9F, 0xB7, 0xF0, 0xEF, 0x54, 0xFE, \r
-0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, 0xD1, 0xE7, 0x90, 0x9F, 0xB9, 0xF0, 0x22, 0x90, 0x9F, \r
-0xB6, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, \r
-0x74, 0x05, 0xF0, 0x22, 0x7F, 0xF4, 0x12, 0x47, 0xBF, 0xEF, 0x20, 0xE5, 0x0E, 0x7F, 0xF4, 0x12, \r
-0x47, 0xBF, 0xEF, 0x7F, 0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, 0x11, 0x04, \r
-0x90, 0x9D, 0x98, 0xEF, 0xF0, 0x11, 0x5C, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, \r
-0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x17, 0x12, 0x47, 0xBF, 0xEF, 0x54, 0xFC, 0x44, 0x04, 0xFD, 0x7F, \r
-0x17, 0x12, 0x46, 0xA0, 0x12, 0xA9, 0xF0, 0x44, 0x40, 0xFD, 0x7F, 0x16, 0x12, 0x46, 0xA0, 0x7F, \r
-0x38, 0x12, 0xAA, 0x91, 0x7F, 0x38, 0x12, 0x46, 0xA0, 0x02, 0x37, 0x99, 0x11, 0x8C, 0x11, 0xBA, \r
-0x12, 0x9F, 0x53, 0x12, 0x9F, 0x72, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, 0x0F, 0x75, 0x10, 0x80, \r
-0xAD, 0x0D, 0x7F, 0x50, 0x12, 0x46, 0xA0, 0xAD, 0x0E, 0x7F, 0x51, 0x12, 0x46, 0xA0, 0xAD, 0x0F, \r
-0x7F, 0x52, 0x12, 0x46, 0xA0, 0xAD, 0x10, 0x7F, 0x53, 0x02, 0x46, 0xA0, 0x90, 0x01, 0x30, 0xE4, \r
-0x11, 0xB2, 0x90, 0x01, 0x38, 0x11, 0xB2, 0xFD, 0x7F, 0x50, 0x12, 0x46, 0xA0, 0xE4, 0xFD, 0x7F, \r
-0x51, 0x12, 0x46, 0xA0, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x46, 0xA0, 0xE4, 0xFD, 0x7F, 0x53, 0x02, \r
-0x46, 0xA0, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0x34, 0x74, 0xFF, 0x11, \r
-0xB2, 0x90, 0x01, 0x3C, 0x11, 0xB2, 0xFD, 0x7F, 0x54, 0x12, 0x46, 0xA0, 0x7D, 0xFF, 0x7F, 0x55, \r
-0x12, 0x46, 0xA0, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x46, 0xA0, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x46, \r
-0xA0, 0xEF, 0x64, 0x01, 0x70, 0x20, 0x91, 0xB9, 0x90, 0x01, 0x38, 0xE4, 0x11, 0xB2, 0x90, 0x01, \r
-0x30, 0x11, 0xB2, 0x90, 0x01, 0x30, 0x74, 0x10, 0xF0, 0x90, 0x01, 0x39, 0x74, 0x01, 0xF0, 0x90, \r
-0x00, 0x53, 0x74, 0x80, 0xF0, 0x22, 0x12, 0xA7, 0x8C, 0x90, 0x9F, 0xC7, 0xE0, 0x90, 0x01, 0x31, \r
-0xF0, 0x90, 0x9F, 0xC8, 0xE0, 0x90, 0x01, 0x32, 0xF0, 0x90, 0x9F, 0xC9, 0xE0, 0x90, 0x01, 0x33, \r
-0xF0, 0x90, 0x9F, 0xC2, 0xE0, 0x90, 0x01, 0x38, 0xF0, 0x90, 0x9F, 0xC5, 0xE0, 0x90, 0x01, 0x3B, \r
-0xF0, 0xD1, 0xB4, 0x12, 0x87, 0xC1, 0x7F, 0x01, 0x51, 0x8D, 0x7E, 0x00, 0x7F, 0xA3, 0x7D, 0x00, \r
-0x7B, 0x01, 0x7A, 0x9F, 0x79, 0x13, 0x12, 0x08, 0xAA, 0x12, 0xA9, 0x77, 0x12, 0x08, 0xAA, 0x90, \r
-0x9F, 0x16, 0x74, 0x02, 0xF0, 0x90, 0x9F, 0x1D, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0x12, \r
-0x95, 0x2F, 0x74, 0x02, 0xF0, 0x12, 0xA9, 0x4F, 0xE4, 0xFD, 0xFF, 0x51, 0x26, 0x7D, 0x0C, 0x7F, \r
-0x02, 0x51, 0x26, 0x51, 0x22, 0x90, 0x9D, 0x98, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x9F, 0x21, 0x74, \r
-0xDD, 0xF0, 0x80, 0x12, 0x90, 0x9D, 0x98, 0xE0, 0x90, 0x9F, 0x21, 0xB4, 0x03, 0x05, 0x74, 0xD4, \r
-0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x79, 0x12, 0x47, 0xBF, 0xEF, 0x54, 0x03, 0xFF, 0xBF, \r
-0x02, 0x0F, 0x7F, 0x28, 0x12, 0x47, 0xBF, 0xEF, 0x30, 0xE2, 0x06, 0x90, 0x9F, 0x4E, 0x74, 0x02, \r
-0xF0, 0x12, 0x57, 0xEE, 0x12, 0xA9, 0x4F, 0x90, 0x9F, 0xC1, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, \r
-0x38, 0xE0, 0x90, 0x9F, 0xC2, 0xF0, 0x90, 0x01, 0x39, 0xE0, 0x90, 0x9F, 0xC3, 0xF0, 0x90, 0x01, \r
-0x3A, 0xE0, 0x90, 0x9F, 0xC4, 0xF0, 0x90, 0x01, 0x3B, 0xE0, 0x90, 0x9F, 0xC5, 0xF0, 0x90, 0x01, \r
-0x30, 0xE0, 0x90, 0x9F, 0xC6, 0xF0, 0x90, 0x01, 0x31, 0xE0, 0x90, 0x9F, 0xC7, 0xF0, 0x90, 0x01, \r
-0x32, 0xE0, 0x90, 0x9F, 0xC8, 0xF0, 0x90, 0x01, 0x33, 0xE0, 0x90, 0x9F, 0xC9, 0xF0, 0x12, 0x94, \r
-0x9D, 0x7E, 0x00, 0x7F, 0x02, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0xBA, 0x12, 0x08, 0xAA, \r
-0x12, 0xAA, 0x59, 0x12, 0xAA, 0x49, 0x91, 0x9B, 0xE4, 0x90, 0x9F, 0xBC, 0xF0, 0x22, 0xE0, 0x54, \r
-0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x11, \r
-0xEF, 0xF0, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, 0x01, 0xFF, \r
-0x90, 0x9F, 0x13, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x80, 0x0C, 0x90, 0x9F, 0x1A, 0xED, 0xF0, 0x80, \r
-0x05, 0x90, 0x9F, 0x19, 0xED, 0xF0, 0x12, 0xA3, 0xC9, 0x30, 0xE4, 0x2C, 0x90, 0xA2, 0x11, 0xE0, \r
-0x14, 0x60, 0x07, 0x14, 0x60, 0x18, 0x24, 0x02, 0x70, 0x1E, 0x90, 0x9F, 0x13, 0xE0, 0x12, 0xAA, \r
-0x02, 0xFF, 0x90, 0x9F, 0x1A, 0xE0, 0x54, 0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, 0x9F, \r
-0x19, 0xE0, 0xFD, 0x7F, 0x89, 0x12, 0x46, 0xA0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x12, \r
-0xEF, 0xF0, 0xF1, 0x71, 0x90, 0xA2, 0x12, 0xE0, 0x60, 0x02, 0x91, 0x9B, 0x7D, 0x04, 0xF1, 0x53, \r
-0x74, 0x04, 0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
-0xA2, 0x13, 0xED, 0xF0, 0x90, 0x9F, 0x13, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, \r
-0x02, 0x61, 0xEB, 0xEE, 0x12, 0x56, 0xCD, 0x30, 0xE0, 0x02, 0x61, 0xEB, 0x90, 0x9F, 0x1A, 0xE0, \r
-0xFE, 0x6F, 0x70, 0x02, 0x61, 0xEB, 0xEF, 0x70, 0x02, 0x61, 0x65, 0x24, 0xFE, 0x70, 0x02, 0x61, \r
-0x9E, 0x24, 0xFE, 0x60, 0x48, 0x24, 0xFC, 0x70, 0x02, 0x61, 0xD9, 0x24, 0xFC, 0x60, 0x02, 0x61, \r
-0xEB, 0xEE, 0xB4, 0x0E, 0x02, 0x91, 0x22, 0x90, 0x9F, 0x1A, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, \r
-0x8D, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x06, 0x02, 0x91, 0x47, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x04, \r
-0x0E, 0x90, 0xA2, 0x13, 0xE0, 0xFF, 0x60, 0x05, 0x12, 0x92, 0x23, 0x80, 0x02, 0x91, 0xA1, 0x90, \r
-0x9F, 0x1A, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x61, 0xEB, 0x91, 0xAC, 0x61, 0xEB, 0x90, 0x9F, 0x1A, \r
-0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0x8D, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x06, 0x02, 0x91, 0x47, \r
-0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0xF0, 0xBF, 0x01, 0x02, 0x91, 0x22, 0x90, 0x9F, \r
-0x1A, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x61, 0xEB, 0x71, 0xF0, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x61, \r
-0xEB, 0x91, 0x6D, 0x61, 0xEB, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0xF0, 0xBF, 0x01, \r
-0x02, 0x91, 0x22, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x06, 0x02, 0x91, 0x47, 0x90, 0x9F, 0x1A, 0xE0, \r
-0xB4, 0x0C, 0x07, 0x71, 0xF0, 0xBF, 0x01, 0x02, 0x91, 0x6D, 0x90, 0x9F, 0x1A, 0xE0, 0x64, 0x04, \r
-0x70, 0x59, 0x12, 0xA6, 0xF3, 0xEF, 0x64, 0x01, 0x70, 0x51, 0x91, 0xB9, 0x80, 0x4D, 0x90, 0x9F, \r
-0x1A, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0xF0, 0xBF, 0x01, 0x02, 0x91, 0x22, 0x90, 0x9F, 0x1A, 0xE0, \r
-0xB4, 0x06, 0x02, 0x91, 0x47, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x0C, 0x07, 0x71, 0xF0, 0xBF, 0x01, \r
-0x02, 0x91, 0x6D, 0x90, 0x9F, 0x1A, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0x8D, 0x90, 0x9F, 0x1A, \r
-0xE0, 0xB4, 0x04, 0x17, 0x12, 0x9A, 0xBD, 0x80, 0x12, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x0C, 0x0B, \r
-0x90, 0x9F, 0x14, 0x12, 0x6E, 0xBB, 0x30, 0xE0, 0x02, 0xF1, 0x1C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
-0x90, 0x9F, 0xCA, 0xE0, 0x30, 0xE0, 0x0D, 0x90, 0x9F, 0xD1, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, \r
-0xE0, 0x08, 0x80, 0x1B, 0x12, 0x6F, 0x9C, 0xBF, 0x01, 0x15, 0x90, 0x9F, 0x13, 0x12, 0x66, 0xE8, \r
-0x20, 0xE0, 0x0C, 0x90, 0x9F, 0x19, 0xE0, 0xD3, 0x94, 0x04, 0x50, 0x03, 0x7F, 0x01, 0x22, 0x7F, \r
-0x00, 0x22, 0x90, 0x9F, 0x14, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, 0x51, 0x22, 0x80, 0x12, 0x12, \r
-0xA8, 0x77, 0xF1, 0xEA, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x9F, 0x12, 0x74, 0x04, \r
-0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x1D, 0x90, 0x9F, 0x14, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, \r
-0x07, 0xE0, 0x44, 0x40, 0xF1, 0xEA, 0x80, 0x0F, 0x51, 0x1E, 0x90, 0x05, 0x27, 0xE0, 0x54, 0x7F, \r
-0xF0, 0x90, 0x9F, 0x12, 0x74, 0x0C, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x1D, 0x12, 0x91, 0x23, \r
-0x70, 0x22, 0x90, 0x9F, 0x14, 0xE0, 0x54, 0xFD, 0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x12, 0x49, 0x1D, \r
-0x12, 0x4C, 0x7D, 0xBF, 0x01, 0x0E, 0x90, 0x9F, 0x13, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0xF1, \r
-0x53, 0x74, 0x0E, 0xF0, 0x22, 0xE4, 0xFD, 0x7F, 0x0C, 0x51, 0xA8, 0xE4, 0xFD, 0xFF, 0x02, 0x49, \r
-0x1D, 0x12, 0xAA, 0x59, 0x91, 0x9B, 0x7D, 0x0C, 0x7F, 0x01, 0x41, 0x26, 0xF1, 0x71, 0x91, 0x9B, \r
-0x51, 0x22, 0x90, 0x9F, 0x12, 0x74, 0x0C, 0xF0, 0x22, 0x7D, 0x2D, 0x12, 0x4C, 0x1B, 0x90, 0x01, \r
-0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0xD1, 0xB8, 0x12, 0x62, 0x52, 0xE4, 0xFD, 0x7F, 0x01, \r
-0x51, 0x26, 0xE4, 0x90, 0x9F, 0x12, 0xF0, 0x22, 0x90, 0x9F, 0xCA, 0xE0, 0x20, 0xE0, 0x1D, 0x90, \r
-0x9F, 0x17, 0xE0, 0x64, 0x01, 0x70, 0x15, 0x12, 0x8F, 0xEE, 0x12, 0x6F, 0x95, 0x60, 0x05, 0x91, \r
-0x95, 0x02, 0x93, 0x8A, 0x90, 0x9F, 0x1A, 0xE0, 0x70, 0x02, 0x51, 0xA4, 0x22, 0x12, 0x6F, 0xD2, \r
-0x12, 0x06, 0x89, 0xFF, 0x54, 0x7F, 0x90, 0x9F, 0x17, 0xF0, 0xEF, 0x12, 0x56, 0xCD, 0xA3, 0x12, \r
-0x57, 0xC4, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x9F, 0x15, 0xE0, 0x54, 0xF0, 0x4E, \r
-0xF0, 0x12, 0x56, 0xE7, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0x9F, 0x13, 0xE0, 0x54, 0xFD, 0x4E, \r
-0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x12, 0x6F, 0x95, 0x12, 0x56, 0xBA, 0x90, 0x9F, \r
-0x16, 0xF0, 0xF1, 0xE4, 0x30, 0xE0, 0x52, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, 0x90, \r
-0x9F, 0x29, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x2A, 0x74, 0x03, 0xF0, 0xD1, 0x32, 0xE9, 0x24, 0x06, \r
-0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0xFF, 0x74, 0x03, 0x24, 0xFD, 0xFE, 0xEF, 0xC4, 0x54, \r
-0x0F, 0xFD, 0xEF, 0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F, 0xFE, 0xC4, 0x54, 0xF0, 0x4F, 0x12, \r
-0x06, 0xCF, 0xD1, 0x32, 0xF1, 0xE4, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x9F, 0x1F, \r
-0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0xD1, 0x32, 0x12, 0x6C, 0xDE, 0xFD, 0x7F, \r
-0x02, 0x51, 0x26, 0xD1, 0x32, 0xD1, 0x3B, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x9F, 0xBB, 0x12, 0x6D, \r
-0x01, 0xD1, 0x39, 0x12, 0x6C, 0xF7, 0x90, 0x9F, 0xBB, 0x12, 0x6F, 0x03, 0xD1, 0x38, 0x12, 0x6F, \r
-0x27, 0x90, 0x9F, 0xBB, 0x12, 0x6F, 0x0C, 0xD1, 0x38, 0x12, 0x6D, 0xE5, 0x4E, 0x90, 0x9F, 0xBB, \r
-0xF0, 0x12, 0x69, 0xCD, 0x20, 0xE0, 0x29, 0xEF, 0xC3, 0x13, 0x20, 0xE0, 0x0B, 0x75, 0x52, 0x01, \r
-0x90, 0xA0, 0x0C, 0xE0, 0x60, 0x0B, 0x80, 0x0E, 0xE4, 0xF5, 0x52, 0x90, 0xA0, 0x0C, 0xE0, 0x60, \r
-0x05, 0xE4, 0xF5, 0x51, 0x80, 0x03, 0x75, 0x51, 0x01, 0xAD, 0x52, 0xAF, 0x51, 0x12, 0x62, 0xCD, \r
-0xD1, 0x32, 0x90, 0xA0, 0xF1, 0x12, 0x45, 0xBE, 0x12, 0xA6, 0xA2, 0x90, 0x9F, 0x17, 0xE0, 0xFF, \r
-0xD1, 0x41, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x13, 0x90, 0xA0, 0xF1, 0x12, 0x45, 0xB5, 0x12, 0x57, \r
-0xC5, 0x54, 0x0F, 0xFF, 0x12, 0x56, 0xBC, 0xFD, 0x12, 0xA6, 0xC3, 0x22, 0x90, 0xA0, 0xEE, 0x12, \r
-0x45, 0xBE, 0x90, 0xA0, 0xEE, 0x02, 0x45, 0xB5, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x02, 0x06, \r
-0xA2, 0xEF, 0x70, 0x31, 0x7D, 0x78, 0x7F, 0x02, 0xF1, 0x65, 0x7D, 0x02, 0x7F, 0x03, 0xF1, 0x65, \r
-0x7D, 0xC8, 0x7F, 0x02, 0x12, 0x6F, 0x6F, 0x12, 0x91, 0xD0, 0x90, 0x9E, 0x8D, 0xE0, 0x70, 0x0A, \r
-0xD1, 0xC5, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x06, 0x7D, 0x01, 0x7F, 0x0C, 0x51, 0xA8, \r
-0xD1, 0xC9, 0x02, 0xAA, 0x49, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, \r
-0x78, 0xFF, 0xD1, 0xB8, 0x7D, 0x02, 0x7F, 0x03, 0xD1, 0xB8, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, \r
-0x12, 0x95, 0x37, 0x90, 0x9E, 0x8D, 0xE0, 0xB4, 0x01, 0x10, 0x12, 0x97, 0x49, 0x90, 0x9F, 0x1A, \r
-0xE0, 0x20, 0xE2, 0x09, 0x7D, 0x01, 0x7F, 0x04, 0x41, 0xA8, 0x12, 0x91, 0xB6, 0x22, 0x7D, 0x02, \r
-0x7F, 0x02, 0xD1, 0xB8, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, \r
-0x74, 0x30, 0x02, 0x6F, 0x60, 0xF1, 0x71, 0x91, 0xA1, 0x90, 0x9F, 0x13, 0xE0, 0x54, 0xF7, 0xF0, \r
-0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xAC, 0x07, 0xEF, 0x54, 0x01, 0xFE, 0x90, 0x9F, \r
-0xBD, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x64, 0x01, 0x70, 0x22, 0x90, 0x01, 0x53, 0xF0, 0x90, \r
-0x9F, 0xBF, 0xE0, 0x60, 0x0C, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x6F, 0x56, 0x12, 0x97, 0x51, 0x80, \r
-0x16, 0x12, 0xA9, 0xC8, 0x12, 0x6F, 0x6F, 0xF1, 0x5B, 0xF1, 0x1C, 0x80, 0x0A, 0x12, 0xA9, 0xC8, \r
-0x12, 0x6F, 0x56, 0xD1, 0xAE, 0x91, 0xAC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7D, 0x2F, 0x12, 0x62, \r
-0x4D, 0x7D, 0x08, 0xF1, 0x53, 0x74, 0x08, 0xF0, 0x22, 0x90, 0x9F, 0xBD, 0xE0, 0x30, 0xE0, 0x22, \r
-0x12, 0x97, 0x51, 0x90, 0x9F, 0xC0, 0xE0, 0x60, 0x04, 0x14, 0xF0, 0x80, 0xDF, 0x90, 0x9F, 0xBE, \r
-0xE0, 0x14, 0x90, 0x9F, 0xC0, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0xD1, 0xD1, \r
-0xD1, 0xAE, 0x22, 0x7F, 0x01, 0x51, 0x26, 0x90, 0x9F, 0x12, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0xF1, \r
-0x65, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x12, 0xAA, 0x89, 0xFE, 0xF6, 0x74, 0x30, 0x02, 0x6F, \r
-0x60, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, \r
-0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, \r
-0x12, 0x66, 0xE4, 0x30, 0xE0, 0x05, 0x7F, 0x03, 0x12, 0x62, 0x14, 0x90, 0x9F, 0xE6, 0xE0, 0x20, \r
-0xE0, 0x32, 0x12, 0x97, 0x07, 0x30, 0xE0, 0x2C, 0x90, 0xA0, 0x0C, 0xE0, 0x60, 0x07, 0xE4, 0x90, \r
-0xA2, 0x02, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0x02, 0x74, 0x01, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x07, \r
-0x90, 0xA2, 0x03, 0x30, 0xE0, 0x05, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA2, \r
-0x02, 0x12, 0x62, 0xC8, 0x12, 0x63, 0xED, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x12, 0x46, 0xA0, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x06, 0x02, 0x06, 0xA2, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0x41, \r
-0x26, 0x75, 0xE8, 0x07, 0x75, 0xA8, 0x85, 0x22, 0x7F, 0x81, 0x12, 0x47, 0xBF, 0xEF, 0x54, 0xFE, \r
-0xFD, 0x7F, 0x81, 0x12, 0x46, 0xA0, 0x7F, 0x80, 0x12, 0x47, 0xFA, 0xFD, 0x7F, 0x80, 0x12, 0x46, \r
-0xA0, 0x12, 0x9F, 0x97, 0x12, 0x3E, 0x11, 0x31, 0xCD, 0x12, 0xA0, 0x38, 0x7F, 0x01, 0x12, 0x43, \r
-0xA5, 0x90, 0xA0, 0x2B, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x43, 0xA5, 0x90, 0xA0, 0x2B, 0xE0, 0x04, \r
-0xF0, 0x12, 0x58, 0x1E, 0x11, 0x90, 0x7F, 0x80, 0x12, 0xAA, 0x91, 0x7F, 0x80, 0x12, 0x46, 0xA0, \r
-0x75, 0x28, 0xFF, 0x12, 0x5F, 0xF1, 0x12, 0x9F, 0xBD, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xDD, 0x51, \r
-0x0D, 0xEF, 0x64, 0x01, 0x70, 0x22, 0x90, 0xA0, 0xDD, 0xE0, 0x54, 0x07, 0xF0, 0xE0, 0xFF, 0x64, \r
-0x07, 0x60, 0x04, 0xEF, 0xB4, 0x04, 0x11, 0x12, 0x9F, 0x48, 0xBF, 0x01, 0x0B, 0x12, 0xA9, 0xF0, \r
-0x44, 0x60, 0xFD, 0x7F, 0x16, 0x12, 0x46, 0xA0, 0x7F, 0x81, 0x12, 0x47, 0xBF, 0xEF, 0x44, 0x04, \r
-0xFD, 0x7F, 0x81, 0x12, 0x46, 0xA0, 0x12, 0xA0, 0x42, 0x31, 0xEB, 0xE4, 0xFF, 0x02, 0x44, 0x2E, \r
-0x12, 0xA6, 0x7D, 0x12, 0x9D, 0x83, 0x12, 0x51, 0x0F, 0x12, 0xA6, 0x83, 0x12, 0x59, 0x3A, 0x31, \r
-0xC7, 0x12, 0xA4, 0xCF, 0x7E, 0x00, 0x7F, 0x19, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0xFD, \r
-0x12, 0x08, 0xAA, 0x12, 0x9B, 0xED, 0x90, 0xA0, 0x04, 0x12, 0x45, 0x71, 0x90, 0xA0, 0x00, 0x12, \r
-0x08, 0x6D, 0x90, 0x9D, 0x98, 0xE0, 0xFF, 0x64, 0x02, 0x70, 0x22, 0x31, 0xB8, 0x30, 0xE0, 0x02, \r
-0x7E, 0x01, 0x90, 0xA0, 0x0C, 0xEE, 0xF0, 0x31, 0xB8, 0x30, 0xE1, 0x02, 0x7E, 0x01, 0x90, 0xA0, \r
-0x0D, 0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x90, 0x02, 0xFB, 0xF0, 0x80, 0x3A, 0xEF, 0x64, 0x01, \r
-0x70, 0x15, 0x31, 0x51, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0xA0, 0x0C, 0xEF, 0xF0, 0x31, 0x51, \r
-0x30, 0xE1, 0x02, 0x7F, 0x01, 0x80, 0x1B, 0x90, 0x9D, 0x98, 0xE0, 0x64, 0x03, 0x70, 0x18, 0x31, \r
-0x4A, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0xA0, 0x0C, 0xEF, 0xF0, 0x31, 0x4A, 0x30, 0xE1, 0x02, \r
-0x7F, 0x01, 0x90, 0xA0, 0x0D, 0xEF, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x02, 0xF0, 0x7F, 0x01, \r
-0x51, 0x14, 0x31, 0x58, 0x12, 0x98, 0x24, 0x90, 0x9F, 0xE4, 0x74, 0x01, 0xF0, 0x90, 0xA0, 0x19, \r
-0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x04, 0x8F, 0xE4, 0xF0, 0x22, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, \r
-0x22, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x22, 0x7E, 0x00, 0x7F, 0x33, 0x7D, 0x00, 0x7B, 0x01, \r
-0x7A, 0x9F, 0x79, 0xCA, 0x12, 0x08, 0xAA, 0x90, 0x9F, 0xCB, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, \r
-0xF0, 0x90, 0x9D, 0x98, 0xE0, 0xFC, 0x64, 0x02, 0x70, 0x14, 0x31, 0xB8, 0x30, 0xE2, 0x02, 0x7E, \r
-0x01, 0xEE, 0x31, 0xBF, 0xFE, 0x90, 0x9F, 0xCD, 0xE0, 0x54, 0xBF, 0x4E, 0xF0, 0x22, 0xEC, 0x64, \r
-0x01, 0x70, 0x09, 0x31, 0x51, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x80, 0x0F, 0x90, 0x9D, 0x98, 0xE0, \r
-0x64, 0x03, 0x70, 0x13, 0x31, 0x4A, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0xEF, 0x31, 0xBF, 0xFF, 0x90, \r
-0x9F, 0xCD, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x22, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x22, 0x54, \r
-0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0x22, 0x12, 0xA9, 0x77, 0x02, 0x08, 0xAA, 0x90, 0x01, 0x01, \r
-0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x12, 0x8F, 0x90, 0x90, 0x01, 0x99, \r
-0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, 0x22, 0x7B, 0x01, 0x7A, 0xA0, 0x79, \r
-0xDE, 0x51, 0x0D, 0xBF, 0x01, 0x16, 0x90, 0xA0, 0xDE, 0xE0, 0x54, 0x30, 0xFF, 0xBF, 0x20, 0x07, \r
-0x90, 0xA0, 0x59, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0x59, 0xF0, 0x22, 0x7F, 0xFB, 0x7E, \r
-0x01, 0x02, 0x34, 0xC1, 0x90, 0x9F, 0xF0, 0xD1, 0xE8, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, \r
-0x09, 0xF0, 0x22, 0x90, 0x9F, 0xCF, 0xE0, 0x30, 0xE0, 0x1D, 0xEF, 0x24, 0xFD, 0x60, 0x0E, 0x24, \r
-0xFA, 0x60, 0x0E, 0x24, 0xFC, 0x60, 0x0E, 0x24, 0x0C, 0x7F, 0x02, 0x80, 0x0A, 0x7F, 0x03, 0x80, \r
-0x06, 0x7F, 0x0B, 0x80, 0x02, 0x7F, 0x0E, 0x90, 0x07, 0x78, 0xEF, 0xF0, 0x22, 0x7F, 0xFF, 0x12, \r
-0x49, 0x1D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x4C, 0x1F, 0x71, 0xED, 0x71, 0xD7, \r
-0x71, 0xD7, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x12, 0x46, 0xA0, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, \r
-0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xD1, 0xE4, 0x30, 0xE0, 0x04, \r
-0x7F, 0x01, 0x51, 0x14, 0x12, 0x97, 0x07, 0x30, 0xE0, 0x31, 0x90, 0xA0, 0x0C, 0xE0, 0x60, 0x08, \r
-0x90, 0xA2, 0x04, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x04, 0xF0, 0xEF, 0xC4, 0x13, \r
-0x54, 0x07, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA2, 0x05, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0x05, 0x74, \r
-0x02, 0xF0, 0x90, 0xA2, 0x04, 0x51, 0xC8, 0x7F, 0x01, 0x51, 0x14, 0x90, 0x9F, 0xBA, 0xE0, 0x60, \r
-0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xD3, 0x10, 0xAF, \r
-0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x26, 0x8D, 0x27, 0x90, 0x9F, 0xCD, 0x12, 0x4F, 0xD2, 0x30, 0xE0, \r
-0x02, 0x61, 0xBE, 0x90, 0xA0, 0x0D, 0xE0, 0x70, 0x59, 0xE5, 0x26, 0x64, 0x02, 0x60, 0x26, 0xE5, \r
-0x27, 0x70, 0x22, 0x71, 0xC3, 0xE5, 0x26, 0x90, 0xA1, 0x9D, 0xB4, 0x01, 0x05, 0x12, 0x45, 0x71, \r
-0x80, 0x07, 0xD1, 0xC9, 0xEE, 0x44, 0x02, 0xFE, 0xEC, 0x71, 0xD1, 0x12, 0x47, 0xDC, 0x7F, 0x48, \r
-0x7E, 0x09, 0x12, 0x38, 0x45, 0xE5, 0x27, 0x64, 0x02, 0x70, 0x02, 0x61, 0xBE, 0xE5, 0x27, 0x70, \r
-0x02, 0x61, 0xBE, 0x71, 0xC3, 0x90, 0xA0, 0x0C, 0xE0, 0x90, 0xA1, 0x9D, 0x60, 0x04, 0xD1, 0xC9, \r
-0x80, 0x07, 0x12, 0x45, 0x71, 0xEE, 0x44, 0x02, 0xFE, 0x71, 0xD0, 0x12, 0x47, 0xDC, 0x7F, 0x48, \r
-0x80, 0x77, 0xE5, 0x26, 0x64, 0x02, 0x60, 0x25, 0xB1, 0x50, 0x54, 0xFC, 0xFF, 0x71, 0xD0, 0xE5, \r
-0x26, 0x90, 0xA1, 0x9D, 0xB4, 0x01, 0x08, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x01, 0x80, 0x06, 0x12, \r
-0x45, 0x71, 0xEF, 0x44, 0x02, 0xFF, 0x71, 0xD0, 0x12, 0x47, 0xDC, 0xD1, 0xAA, 0xE5, 0x27, 0x64, \r
-0x02, 0x60, 0x4B, 0x12, 0xA9, 0xF9, 0xFF, 0x71, 0xD0, 0xE5, 0x27, 0x70, 0x09, 0xD1, 0xC1, 0x44, \r
-0x77, 0xFF, 0x71, 0xD0, 0x80, 0x2E, 0xD1, 0xC1, 0x44, 0x66, 0xFF, 0x71, 0xD0, 0xB1, 0x50, 0x54, \r
-0xFC, 0xD1, 0xB1, 0x90, 0xA0, 0x0C, 0xE0, 0x90, 0xA1, 0xA1, 0x60, 0x08, 0x12, 0x45, 0x71, 0xEF, \r
-0x44, 0x02, 0x80, 0x06, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x01, 0xD1, 0xB1, 0x90, 0xA1, 0xA1, 0x12, \r
-0x47, 0xDF, 0xD1, 0xAA, 0x12, 0x47, 0xDC, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xEE, 0x54, 0xF0, 0xFE, \r
-0xEC, 0x90, 0xA1, 0x9D, 0x02, 0x08, 0x6D, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x12, 0x46, 0xA0, 0x7F, \r
-0x02, 0x12, 0x47, 0xBF, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x12, 0x46, 0xA0, 0x7F, 0x02, 0x12, \r
-0x47, 0xBF, 0xEF, 0x22, 0xAD, 0x07, 0xED, 0x70, 0x19, 0xD1, 0xB9, 0x70, 0x02, 0x80, 0x17, 0xBC, \r
-0x01, 0x02, 0x80, 0x19, 0xD1, 0xB9, 0xBC, 0x02, 0x02, 0x80, 0x1B, 0xEC, 0x64, 0x03, 0x70, 0x21, \r
-0x80, 0x1B, 0xD1, 0xD1, 0x70, 0x04, 0x7F, 0x01, 0x80, 0x15, 0xBC, 0x01, 0x04, 0x7F, 0x03, 0x80, \r
-0x0E, 0xD1, 0xD1, 0xBC, 0x02, 0x04, 0x7F, 0x09, 0x80, 0x05, 0xBC, 0x03, 0x04, 0x7F, 0x0D, 0x51, \r
-0x14, 0x90, 0xA0, 0x19, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x41, 0xED, 0x70, 0x1F, 0xA3, \r
-0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA1, 0x18, 0xF0, 0x80, 0x06, 0x90, \r
-0xA1, 0x18, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0xFD, 0xE4, 0xFF, 0x80, 0x1D, 0x90, 0xA0, \r
-0x1A, 0x12, 0x4F, 0xD2, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA1, 0x18, 0xF0, 0x80, 0x06, 0x90, 0xA1, \r
-0x18, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0xFD, 0x7F, 0x01, 0x51, 0xCD, 0x22, 0x90, 0xA1, \r
-0x29, 0xEF, 0xF0, 0x90, 0xA0, 0x0D, 0xE0, 0x70, 0x4D, 0x12, 0x8A, 0x2E, 0xEE, 0x54, 0x0F, 0xFE, \r
-0xE4, 0xFD, 0xFC, 0x90, 0xA1, 0x2A, 0x12, 0x08, 0x6D, 0xE4, 0x7F, 0x80, 0xB1, 0x42, 0x70, 0x05, \r
-0x90, 0x9F, 0xEC, 0x80, 0x1B, 0xE4, 0xFF, 0xFE, 0xB1, 0x44, 0x70, 0x0A, 0x90, 0x9F, 0xEC, 0x04, \r
-0xF0, 0xE4, 0xA3, 0xF0, 0x80, 0x4C, 0xE4, 0xFF, 0xB1, 0x42, 0x70, 0x09, 0x90, 0x9F, 0xEC, 0x04, \r
-0xF0, 0xA3, 0xF0, 0x80, 0x3D, 0xE4, 0x7F, 0x80, 0xFE, 0xB1, 0x44, 0x70, 0x35, 0x90, 0x9F, 0xEC, \r
-0xF0, 0xA3, 0x04, 0xF0, 0x80, 0x2C, 0xB1, 0x50, 0x54, 0x02, 0xD1, 0xFE, 0x60, 0x08, 0x90, 0x9F, \r
-0xEC, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x9F, 0xEC, 0xF0, 0x7F, 0x30, 0xB1, 0x52, 0x54, \r
-0x01, 0xD1, 0xFE, 0x60, 0x07, 0xE4, 0x90, 0x9F, 0xED, 0xF0, 0x80, 0x06, 0x90, 0x9F, 0xED, 0x74, \r
-0x01, 0xF0, 0x90, 0x9F, 0xE6, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x11, 0x51, 0x4D, 0x90, 0x07, 0x78, \r
-0xE0, 0x90, 0x9F, 0xEB, 0xF0, 0xF1, 0xBF, 0x51, 0xCD, 0x90, 0xA1, 0x29, 0xE0, 0xFD, 0x70, 0x02, \r
-0x80, 0x1C, 0xED, 0xB4, 0x01, 0x06, 0xB1, 0x59, 0x44, 0x20, 0xF0, 0x22, 0x90, 0xA1, 0x29, 0xE0, \r
-0xFD, 0xB4, 0x02, 0x06, 0xB1, 0x59, 0x44, 0x60, 0xF0, 0x22, 0xED, 0xB4, 0x03, 0x03, 0xB1, 0x59, \r
-0xF0, 0x22, 0x7E, 0x02, 0xFD, 0xFC, 0x90, 0xA1, 0x2A, 0x12, 0x45, 0x8D, 0xC3, 0x02, 0x45, 0x60, \r
-0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, 0x22, 0x90, 0x9F, 0xE6, 0xE0, 0x54, 0x1F, 0x22, \r
-0x90, 0xA1, 0x18, 0xEF, 0xF0, 0x90, 0xA1, 0x1A, 0x74, 0x02, 0xF0, 0x7F, 0x01, 0x12, 0x97, 0xD0, \r
-0x90, 0x9F, 0xCE, 0x12, 0x6E, 0xBB, 0x30, 0xE0, 0x21, 0x90, 0xA1, 0x18, 0xE0, 0xB4, 0x02, 0x04, \r
-0x7D, 0x07, 0x80, 0x09, 0x90, 0xA1, 0x18, 0xE0, 0xB4, 0x05, 0x07, 0x7D, 0x0D, 0x7F, 0xFF, 0x12, \r
-0x49, 0x1D, 0x12, 0x4C, 0x1F, 0xBF, 0x01, 0x02, 0x51, 0x52, 0x90, 0x9F, 0xCE, 0xE0, 0x12, 0x56, \r
-0xCD, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x02, 0x7F, 0x01, 0x51, 0x14, 0x90, 0xA1, 0x18, 0xE0, \r
-0xB4, 0x02, 0x0D, 0x90, 0x9F, 0xCB, 0xE0, 0x24, 0x03, 0xFF, 0x90, 0x9F, 0xDB, 0x12, 0x82, 0x98, \r
-0x90, 0x9F, 0xCA, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA1, 0x19, 0xF0, 0x80, 0x06, \r
-0x90, 0xA1, 0x19, 0x74, 0x01, 0xF0, 0x12, 0xAA, 0x38, 0x20, 0xE0, 0x13, 0x90, 0xA0, 0x0C, 0xE0, \r
-0x60, 0x08, 0x90, 0xA1, 0x1A, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0x1A, 0xF0, 0x90, \r
-0xA1, 0x1A, 0xE0, 0xFF, 0x90, 0xA1, 0x19, 0xE0, 0xFD, 0x51, 0xCD, 0xE4, 0x90, 0x9F, 0xDD, 0xF0, \r
-0x90, 0xA1, 0x18, 0xE0, 0xFF, 0xB4, 0x02, 0x05, 0x12, 0x82, 0xB2, 0x80, 0x09, 0xEF, 0xB4, 0x05, \r
-0x05, 0xE4, 0x90, 0x9F, 0xDE, 0xF0, 0x12, 0x86, 0x1B, 0x30, 0xE0, 0x17, 0x90, 0xA1, 0x18, 0xE0, \r
-0xB4, 0x02, 0x04, 0x7D, 0x08, 0x80, 0x4D, 0x90, 0xA1, 0x18, 0xE0, 0x64, 0x05, 0x70, 0x4A, 0x7D, \r
-0x0E, 0x80, 0x41, 0x12, 0x86, 0x13, 0x30, 0xE0, 0x1F, 0x12, 0x87, 0xCF, 0x20, 0xE0, 0x02, 0xD1, \r
-0xDA, 0x90, 0xA1, 0x18, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x09, 0x80, 0x28, 0x90, 0xA1, 0x18, 0xE0, \r
-0x64, 0x05, 0x70, 0x25, 0x7D, 0x0F, 0x80, 0x1C, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x1B, 0xD1, 0xDA, \r
-0x90, 0xA1, 0x18, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x0A, 0x80, 0x09, 0x90, 0xA1, 0x18, 0xE0, 0xB4, \r
-0x05, 0x07, 0x7D, 0x10, 0x7F, 0x6F, 0x12, 0x49, 0x1D, 0x90, 0x9F, 0xCD, 0xE0, 0x30, 0xE0, 0x03, \r
-0x12, 0x5C, 0x9B, 0x90, 0x9F, 0xCD, 0xE0, 0x12, 0x56, 0xCD, 0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, \r
-0x8F, 0xCD, 0x90, 0x9F, 0xCE, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x0E, 0x90, 0x06, 0xCD, 0xE0, 0x54, \r
-0xEF, 0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x7F, 0x2C, 0x7E, 0x09, 0x02, 0x38, \r
-0x45, 0xFF, 0xEC, 0x90, 0xA1, 0xA1, 0x02, 0x08, 0x6D, 0x90, 0xA0, 0x1A, 0xE0, 0x54, 0x03, 0xFC, \r
-0x22, 0x90, 0xA1, 0x9D, 0x12, 0x45, 0x71, 0xEF, 0x22, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x80, 0xFF, \r
-0x22, 0x90, 0xA0, 0x1A, 0xE0, 0xC4, 0x54, 0x03, 0xFC, 0x22, 0x90, 0x9F, 0x19, 0xE0, 0xFF, 0xE4, \r
-0xFD, 0x02, 0x5A, 0xA8, 0xF0, 0x90, 0x9F, 0xBB, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, 0x7D, \r
-0x12, 0x7F, 0xFF, 0x12, 0x49, 0x1D, 0x7F, 0x01, 0x51, 0x14, 0xF1, 0xBF, 0x41, 0xCD, 0xFF, 0xE4, \r
-0xFE, 0xFD, 0xFC, 0x90, 0xA1, 0x2A, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x2A, 0x12, 0x45, 0x71, 0xEC, \r
-0x4D, 0x4E, 0x4F, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x20, 0xE0, 0xB4, \r
-0x01, 0x02, 0x80, 0x43, 0x90, 0xA0, 0x20, 0xE0, 0xB4, 0x02, 0x11, 0xF1, 0x89, 0x7F, 0x01, 0x12, \r
-0x97, 0xD0, 0x71, 0xF4, 0x90, 0xA0, 0x20, 0x74, 0x03, 0xF0, 0x80, 0x3E, 0x90, 0xA0, 0x20, 0xE0, \r
-0x64, 0x03, 0x70, 0x1C, 0x90, 0xA0, 0x23, 0xF1, 0x8C, 0xE4, 0xFF, 0x12, 0x97, 0xD0, 0x71, 0xF4, \r
-0xF1, 0x7F, 0xE4, 0xFB, 0xFD, 0x12, 0x4E, 0x53, 0x90, 0xA0, 0x20, 0x74, 0x04, 0xF0, 0x80, 0x1A, \r
-0x90, 0xA0, 0x20, 0xE0, 0xB4, 0x04, 0x13, 0xF1, 0x7F, 0x7B, 0x01, 0x7D, 0x01, 0x12, 0x4E, 0x53, \r
-0x90, 0xA0, 0x20, 0x74, 0x02, 0xF0, 0x90, 0xA0, 0x1E, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, \r
-0xA0, 0x19, 0xE0, 0xC3, 0x13, 0x54, 0x03, 0xFF, 0x22, 0x90, 0xA0, 0x25, 0xE0, 0xFE, 0xA3, 0xE0, \r
-0xFF, 0xAD, 0x07, 0xEE, 0xFF, 0x90, 0x01, 0x6F, 0xE4, 0xF0, 0x8F, 0x35, 0xAF, 0x05, 0x8F, 0x36, \r
-0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x3C, 0xB1, 0x90, 0x01, 0x6F, 0x74, 0x05, 0xF0, 0x22, \r
-0x7D, 0x20, 0x51, 0x4D, 0x90, 0x9F, 0x11, 0x74, 0x02, 0xF0, 0x22, 0x51, 0x52, 0x80, 0xF5, 0x90, \r
-0xA0, 0x0C, 0xE0, 0xFF, 0xE4, 0xFD, 0x22, 0x12, 0x9A, 0x83, 0x7D, 0x23, 0x51, 0x4D, 0x80, 0xE4, \r
-0x90, 0x9F, 0xE6, 0xE0, 0x30, 0xE0, 0x04, 0xD1, 0xEF, 0x80, 0x03, 0x12, 0x85, 0xD6, 0x90, 0xA0, \r
-0x19, 0xE0, 0x30, 0xE0, 0x02, 0xF1, 0x14, 0x22, 0xE4, 0x90, 0xA0, 0xE0, 0xF0, 0x90, 0xA0, 0xE0, \r
-0xE0, 0x64, 0x01, 0xF0, 0x24, 0xE8, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x67, 0xA3, 0xF0, 0x12, 0x3E, \r
-0x44, 0xBF, 0x01, 0x03, 0x12, 0x31, 0xFC, 0xC2, 0xAF, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x0E, 0x90, \r
-0x9F, 0x1A, 0xE0, 0xFF, 0x90, 0x9F, 0x19, 0xE0, 0x6F, 0x60, 0x02, 0x11, 0x3E, 0xC2, 0xAF, 0x12, \r
-0xA0, 0x0F, 0xBF, 0x01, 0x03, 0x12, 0x8E, 0xDD, 0xD2, 0xAF, 0xD2, 0xAF, 0x90, 0xA0, 0x59, 0xE0, \r
-0xB4, 0x01, 0x03, 0x12, 0xA6, 0x03, 0x12, 0x4F, 0xFD, 0x12, 0x42, 0xDD, 0x80, 0xAF, 0x90, 0x9F, \r
-0x0E, 0xE0, 0x90, 0x9F, 0x19, 0x30, 0xE0, 0x04, 0xE0, 0xFF, 0xE1, 0xB5, 0xE0, 0xFF, 0x7D, 0x01, \r
-0x02, 0x5A, 0xA8, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0xDF, 0x90, 0x05, 0x27, 0xE0, \r
-0xF5, 0x54, 0xB1, 0xF7, 0x90, 0x9F, 0x0E, 0xB1, 0x01, 0x91, 0xF2, 0x90, 0x9F, 0x0E, 0xF1, 0x03, \r
-0x91, 0xEC, 0xF1, 0x27, 0x90, 0x9F, 0x0E, 0xF1, 0x0C, 0x91, 0xEC, 0xFE, 0x54, 0x40, 0xFD, 0xEF, \r
-0x54, 0xBF, 0x4D, 0x90, 0x9F, 0x0E, 0xF0, 0xEE, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0x21, 0x0F, 0xE0, \r
-0x30, 0xE0, 0x6A, 0x75, 0x54, 0x21, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x04, 0xD1, 0x25, 0x80, \r
-0x0D, 0xE4, 0x90, 0x9F, 0x0F, 0xF0, 0xA3, 0xF0, 0x7D, 0x40, 0xFF, 0x12, 0x5F, 0x65, 0x31, 0xD5, \r
-0x30, 0xE0, 0x03, 0x43, 0x54, 0x12, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x14, \r
-0x90, 0x9F, 0x0E, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x80, 0x90, 0x9F, \r
-0x0E, 0x12, 0x4F, 0xD2, 0x20, 0xE0, 0x03, 0x43, 0x54, 0x40, 0x31, 0xC3, 0x90, 0x9F, 0x11, 0xE0, \r
-0x70, 0x05, 0x7F, 0x01, 0x12, 0x99, 0x15, 0x31, 0xCA, 0x30, 0xE0, 0x04, 0x7F, 0x04, 0x80, 0x1A, \r
-0xD1, 0x19, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80, 0x11, 0x7F, 0x02, 0x80, 0x0D, 0x31, 0xC0, 0x90, \r
-0x9F, 0x11, 0xE0, 0x64, 0x04, 0x60, 0x02, 0x21, 0xA3, 0xFF, 0x12, 0x99, 0x15, 0x21, 0xA3, 0x90, \r
-0x9F, 0x0E, 0xE0, 0xFF, 0x30, 0xE0, 0x65, 0x43, 0x54, 0x31, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, \r
-0x04, 0xD1, 0x25, 0x80, 0x07, 0x7D, 0x40, 0xE4, 0xFF, 0x12, 0x5F, 0x65, 0x31, 0xD5, 0x30, 0xE0, \r
-0x03, 0x43, 0x54, 0x02, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x04, 0x31, 0xC3, \r
-0x31, 0xCA, 0x30, 0xE0, 0x0A, 0xD1, 0xE5, 0x60, 0x5A, 0xE4, 0xFD, 0x7F, 0x02, 0x80, 0x1E, 0x12, \r
-0x9A, 0x83, 0x90, 0x9F, 0x12, 0xE0, 0xB4, 0x02, 0x19, 0x12, 0x9A, 0xAE, 0xD1, 0x19, 0xBF, 0x01, \r
-0x09, 0x90, 0x9F, 0x19, 0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x03, 0xE4, 0xFD, 0xFF, 0x12, 0x5A, 0xA8, \r
-0x80, 0x31, 0x90, 0x9F, 0x1A, 0xE0, 0x90, 0x9F, 0x12, 0xF0, 0x80, 0x27, 0x31, 0xC0, 0x90, 0x9F, \r
-0x12, 0xE0, 0xB4, 0x02, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, 0x9F, 0x12, 0xE0, 0xB4, \r
-0x08, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x5A, 0xA8, 0xF1, 0x1E, 0x90, 0x9F, 0x19, 0x11, 0x4C, \r
-0x12, 0xA6, 0x83, 0x90, 0x9F, 0x13, 0xE0, 0x20, 0xE0, 0x08, 0x90, 0x05, 0x58, 0x74, 0x01, 0xF0, \r
-0x80, 0x03, 0x12, 0x95, 0x38, 0x90, 0x05, 0x40, 0x74, 0x22, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
-0x75, 0x54, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x22, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0xC4, \r
-0x13, 0x13, 0x54, 0x03, 0x22, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0xD2, 0xB1, 0xF7, 0x90, 0x9F, 0xCA, 0xB1, 0x01, \r
-0x91, 0xF2, 0x90, 0x9F, 0xCA, 0x91, 0xE4, 0xD1, 0x0F, 0x90, 0x9F, 0xCA, 0xB1, 0xE3, 0x91, 0xEC, \r
-0xD1, 0x07, 0x90, 0x9F, 0xCA, 0xF0, 0x12, 0x56, 0xE7, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x9F, 0xCD, \r
-0xB1, 0x01, 0xFF, 0xF0, 0x12, 0x56, 0xE7, 0x91, 0xF7, 0x90, 0x9F, 0xCD, 0xF0, 0xEE, 0x54, 0x10, \r
-0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x56, 0xE7, 0xD1, 0x0F, 0x90, 0x9F, 0xCD, 0xB1, \r
-0xE3, 0x4E, 0xFF, 0xF0, 0x12, 0x56, 0xE7, 0xD1, 0x07, 0x90, 0x9F, 0xCD, 0x91, 0xDD, 0xFF, 0x54, \r
-0x20, 0xFE, 0x90, 0x9F, 0xCE, 0xE0, 0x54, 0xDF, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xEE, \r
-0x54, 0xBF, 0x4F, 0x91, 0xDC, 0xFE, 0x54, 0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0xFF, 0x90, 0x9F, \r
-0xCE, 0xF0, 0xEE, 0x54, 0x01, 0xFE, 0xEF, 0x54, 0xFE, 0x4E, 0x91, 0xDC, 0x91, 0xF7, 0x90, 0x9F, \r
-0xCE, 0xF0, 0xEE, 0x54, 0x02, 0xFE, 0xEF, 0x54, 0xFD, 0x4E, 0x91, 0xDC, 0xF1, 0x27, 0x90, 0x9F, \r
-0xCE, 0xF1, 0x03, 0x4E, 0xF0, 0xD1, 0xBB, 0x20, 0xE0, 0x06, 0x12, 0x5F, 0x71, 0x12, 0x5C, 0x9B, \r
-0x12, 0x5E, 0x32, 0x12, 0x06, 0x89, 0x20, 0xE0, 0x02, 0x61, 0xDE, 0x90, 0x05, 0x54, 0xE0, 0x90, \r
-0x9F, 0xDC, 0xF0, 0xE0, 0xC3, 0x13, 0x90, 0x9F, 0xDB, 0x12, 0x84, 0xA9, 0x30, 0xE0, 0x0F, 0x12, \r
-0x57, 0xC5, 0x90, 0x9F, 0xCB, 0x12, 0x56, 0xBB, 0x90, 0x9F, 0xCC, 0xF0, 0x80, 0x42, 0x12, 0x57, \r
-0xC5, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0x9F, 0xCB, 0x50, 0x05, \r
-0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x9F, 0xCB, 0x74, 0x2A, 0xF0, 0x12, \r
-0x56, 0xBC, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0x9F, 0xCC, 0x50, \r
-0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x9F, 0xCC, 0x74, 0x2A, 0xF0, \r
-0x12, 0x4F, 0xCF, 0x30, 0xE0, 0x3C, 0x90, 0x9F, 0xCB, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0x9F, \r
-0xD4, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, 0x9F, 0xCC, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, \r
-0x9F, 0xD6, 0xF0, 0x90, 0x9F, 0xCB, 0xE0, 0xC3, 0x13, 0x90, 0x9F, 0xD7, 0xF0, 0x90, 0x9F, 0xCC, \r
-0xE0, 0xC3, 0x13, 0x90, 0x9F, 0xD8, 0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, \r
-0xF1, 0x56, 0xE4, 0x90, 0xA0, 0x0A, 0xF0, 0x12, 0x56, 0xE1, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, \r
-0xE0, 0x39, 0x90, 0x9F, 0xCA, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x07, 0xEF, 0x12, 0x56, 0xCD, \r
-0x30, 0xE0, 0x28, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0xA0, \r
-0x0C, 0xE0, 0x60, 0x08, 0x80, 0x0B, 0x90, 0xA0, 0x0C, 0xE0, 0x60, 0x05, 0x75, 0x51, 0x01, 0x80, \r
-0x03, 0xE4, 0xF5, 0x51, 0x7D, 0x02, 0xAF, 0x51, 0x12, 0x62, 0xCD, 0x12, 0x86, 0x13, 0x30, 0xE0, \r
-0x12, 0x12, 0x87, 0xCF, 0x30, 0xE0, 0x07, 0x7D, 0x04, 0x7F, 0x02, 0x12, 0x5A, 0x26, 0xB1, 0xFF, \r
-0x74, 0x11, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0x9F, 0xD3, 0xE0, 0xFF, 0xB4, 0x01, \r
-0x08, 0x90, 0x9F, 0xDE, 0x74, 0x01, 0xF0, 0x80, 0x1E, 0xEF, 0xB4, 0x04, 0x08, 0x90, 0x9F, 0xDE, \r
-0x74, 0x04, 0xF0, 0x80, 0x12, 0xEF, 0xB4, 0x06, 0x08, 0x90, 0x9F, 0xDE, 0x74, 0x02, 0xF0, 0x80, \r
-0x06, 0xEF, 0xB4, 0x07, 0x02, 0xF1, 0xD8, 0xE4, 0x90, 0x9F, 0xD3, 0xF0, 0x80, 0x4A, 0x12, 0x56, \r
-0xE1, 0x31, 0xCE, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x02, 0x80, 0x10, 0x12, 0x06, 0x89, 0x31, 0xD9, \r
-0x30, 0xE0, 0x05, 0x75, 0x52, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x52, 0x12, 0x98, 0x24, 0x7D, 0x2C, \r
-0x7F, 0x40, 0x12, 0x46, 0xA0, 0x12, 0x56, 0xE1, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x04, \r
-0x7F, 0x03, 0x80, 0x02, 0x7F, 0x01, 0x12, 0x62, 0x14, 0xAD, 0x52, 0x7F, 0x02, 0x12, 0x62, 0xCD, \r
-0x12, 0x5C, 0x9B, 0xB1, 0xFF, 0x74, 0x43, 0xF0, 0x12, 0xAA, 0x26, 0x90, 0x9F, 0xDD, 0xF0, 0x90, \r
-0x9F, 0xCD, 0xE0, 0x12, 0x56, 0xCD, 0x30, 0xE0, 0x09, 0x90, 0x9F, 0xFD, 0xE0, 0x44, 0x02, 0xF0, \r
-0x80, 0x0C, 0x7F, 0x01, 0x12, 0x8F, 0xCD, 0x90, 0x9F, 0xFD, 0xE0, 0x54, 0xFD, 0xF0, 0x7F, 0x03, \r
-0x12, 0x97, 0xD0, 0x90, 0x9F, 0xCA, 0xE0, 0x20, 0xE0, 0x07, 0x90, 0x9F, 0xCE, 0xE0, 0x54, 0xBF, \r
-0xF0, 0x90, 0x9F, 0xCF, 0xE0, 0x20, 0xE0, 0x6F, 0x12, 0x5E, 0x32, 0x12, 0x5E, 0x3B, 0x30, 0xE0, \r
-0x66, 0x90, 0x00, 0x40, 0xE0, 0x54, 0xBF, 0x44, 0xA0, 0xFD, 0x7F, 0x40, 0x12, 0x46, 0xA0, 0x90, \r
-0x00, 0x41, 0xE0, 0x44, 0x04, 0xFD, 0x7F, 0x41, 0x12, 0x46, 0xA0, 0x90, 0x00, 0x6A, 0xE0, 0x54, \r
-0xFB, 0xFD, 0x7F, 0x6A, 0x12, 0x46, 0xA0, 0x90, 0x07, 0x6E, 0x74, 0x55, 0xF0, 0xA3, 0x74, 0x12, \r
-0xF0, 0x90, 0x07, 0x78, 0xE0, 0x54, 0xF2, 0x44, 0x02, 0xF0, 0x90, 0x06, 0xCC, 0xE0, 0x44, 0x03, \r
-0xF0, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xF5, 0xF0, 0x90, 0x05, 0x23, 0xE0, 0x54, 0x7F, 0xF0, 0xE4, \r
-0xFD, 0x7F, 0x66, 0x12, 0x46, 0xA0, 0x12, 0x5E, 0x32, 0x12, 0x5E, 0x3B, 0x54, 0x01, 0xFF, 0x90, \r
-0x9F, 0xCF, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xFF, 0xF0, 0x90, 0x00, \r
-0x04, 0x02, 0x06, 0xA2, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x02, \r
-0x06, 0x89, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, \r
-0x22, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0x22, \r
-0xB1, 0xF7, 0x90, 0xA0, 0x19, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x06, 0xFF, 0xEE, \r
-0x54, 0xF9, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, \r
-0xFF, 0x90, 0xA0, 0x19, 0x91, 0xE4, 0xF1, 0x0E, 0x4E, 0x90, 0xA0, 0x19, 0x12, 0x57, 0xC4, 0xFF, \r
-0x54, 0x03, 0xFE, 0x90, 0xA0, 0x1A, 0xE0, 0x54, 0xFC, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, \r
-0xEE, 0x54, 0xFB, 0x4F, 0xFF, 0x12, 0x57, 0xC4, 0xFE, 0x54, 0x30, 0xFD, 0xEF, 0x54, 0xCF, 0x4D, \r
-0xFF, 0x90, 0xA0, 0x1A, 0xB1, 0xE3, 0x4E, 0x12, 0x56, 0xBB, 0x90, 0xA0, 0x1B, 0xF0, 0x12, 0x56, \r
-0xE7, 0x90, 0xA0, 0x1C, 0x91, 0xDD, 0x90, 0xA0, 0x1D, 0xF0, 0x90, 0xA0, 0x1B, 0xB1, 0xEC, 0xEF, \r
-0x78, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA0, 0x23, 0xEE, 0xF0, 0xA3, \r
-0xEF, 0xF0, 0x90, 0xA0, 0x1C, 0xB1, 0xEC, 0xEF, 0x78, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, \r
-0xF9, 0xFF, 0x90, 0xA0, 0x25, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA0, 0x1D, 0xB1, 0xEC, 0x90, \r
-0xA0, 0x27, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA0, 0x19, 0xE0, 0x30, 0xE0, 0x14, 0x90, 0xA0, \r
-0x1E, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0xA3, 0x12, 0x8E, 0xC3, 0x90, 0x07, 0x83, 0xE0, 0x44, 0x20, \r
-0xF0, 0x22, 0xE4, 0x90, 0xA0, 0x1E, 0x12, 0x58, 0xB2, 0xA3, 0xF0, 0x90, 0x07, 0x83, 0xE0, 0x54, \r
-0xDF, 0xF0, 0x22, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x22, 0xE0, 0xFF, 0x7E, 0x00, \r
-0x7C, 0x01, 0x7D, 0x40, 0x02, 0x07, 0x03, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x22, 0x90, \r
-0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x22, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x22, 0xFE, \r
-0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x22, 0x90, 0x05, 0x43, 0xE0, 0x7F, 0x00, 0x30, \r
-0xE7, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x5E, \r
-0xB8, 0x43, 0x54, 0x08, 0x22, 0x90, 0x9F, 0x13, 0x31, 0xCD, 0x30, 0xE0, 0x24, 0xEF, 0x54, 0xBF, \r
-0xF1, 0x15, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x90, \r
-0x9F, 0xD1, 0x12, 0x86, 0x27, 0x30, 0xE0, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x02, 0x5A, 0xA8, 0x11, \r
-0x3E, 0x22, 0x90, 0x9F, 0x13, 0xE0, 0x12, 0x56, 0xCC, 0x30, 0xE0, 0x1A, 0xEF, 0x54, 0x7F, 0xF1, \r
-0x15, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x9F, \r
-0x17, 0xE0, 0x60, 0x02, 0x11, 0x3E, 0x90, 0x9F, 0xCE, 0x31, 0xCD, 0x30, 0xE0, 0x22, 0x90, 0x9F, \r
-0xD2, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x18, 0xEF, 0x54, 0xFD, 0xF0, 0x90, 0x04, 0xE0, 0xE0, \r
-0x90, 0x9F, 0xD2, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFB, 0xF0, \r
-0x90, 0x04, 0xE0, 0xE0, 0x30, 0xE1, 0x03, 0x12, 0xA5, 0xCB, 0x22, 0xE0, 0xFF, 0x13, 0x13, 0x54, \r
-0x3F, 0x22, 0x90, 0x9F, 0x13, 0xD1, 0xBB, 0x30, 0xE0, 0x09, 0x12, 0x91, 0xF6, 0x54, 0x07, 0x70, \r
-0x13, 0x80, 0x0F, 0x12, 0x95, 0x42, 0x40, 0x0A, 0x90, 0x9E, 0x8D, 0xE0, 0xB4, 0x01, 0x05, 0x02, \r
-0x97, 0x49, 0x11, 0x3E, 0x22, 0x90, 0x9F, 0x12, 0xE0, 0x64, 0x02, 0x22, 0x31, 0xCA, 0x30, 0xE0, \r
-0x0B, 0xD1, 0xE5, 0x60, 0x07, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x5A, 0xA8, 0xD1, 0xE5, 0x60, 0x02, \r
-0xF1, 0x76, 0x22, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x22, 0xF0, 0xEE, 0x54, 0x20, \r
-0xFE, 0xEF, 0x54, 0xDF, 0x22, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x9F, 0x14, 0x22, 0xF1, 0x9C, \r
-0xEF, 0x70, 0x03, 0x12, 0x5C, 0xD8, 0x22, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, \r
-0x22, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x0F, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x03, 0x02, 0x93, \r
-0x8A, 0x12, 0x5E, 0xC9, 0x11, 0x3E, 0x22, 0xEF, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, \r
-0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, \r
-0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x7D, 0x20, 0xE4, 0xFF, 0x74, \r
-0x1D, 0x12, 0xAA, 0x89, 0x80, 0xE6, 0x90, 0x9F, 0x17, 0xE0, 0x64, 0x02, 0x60, 0x0F, 0xF1, 0x95, \r
-0x60, 0x0B, 0xF1, 0x9C, 0xEF, 0x70, 0x06, 0xFD, 0x7F, 0x0C, 0x12, 0x5A, 0xA8, 0x22, 0x90, 0x9F, \r
-0x1B, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x9F, 0x15, 0xE0, 0x54, 0x0F, 0x22, 0x90, 0x04, 0x1A, 0xE0, \r
-0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, \r
-0x60, 0x02, 0x7F, 0x00, 0x22, 0xAE, 0x07, 0xD1, 0x19, 0xBF, 0x01, 0x13, 0x90, 0x9F, 0x0E, 0x12, \r
-0x4F, 0xD2, 0x20, 0xE0, 0x0A, 0xAF, 0x06, 0x7D, 0x01, 0x12, 0x5A, 0xA8, 0x7F, 0x01, 0x22, 0x7F, \r
-0x00, 0x22, 0x90, 0xA0, 0xEE, 0x02, 0x45, 0xBE, 0x90, 0x9F, 0xDE, 0x74, 0x05, 0xF0, 0x22, 0x8B, \r
-0x51, 0x8A, 0x52, 0x89, 0x53, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x44, 0xDE, 0x90, \r
-0xA0, 0xE9, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x9D, 0x93, 0xE0, 0x60, 0xEA, 0xC2, 0xAF, 0x30, 0xE0, \r
-0x0A, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12, 0x7E, 0xDA, 0x11, 0x30, 0xB1, 0xC7, 0x30, 0xE1, 0x06, \r
-0x54, 0xFD, 0xF0, 0x12, 0x9D, 0x1F, 0xB1, 0xC7, 0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, 0x9E, \r
-0xD2, 0xB1, 0xC7, 0x30, 0xE6, 0x06, 0x54, 0xBF, 0xF0, 0x12, 0x87, 0x85, 0xD2, 0xAF, 0x80, 0xC6, \r
-0xE4, 0xF5, 0x51, 0x74, 0x8D, 0x25, 0x51, 0x12, 0x95, 0xF8, 0xE0, 0x70, 0x02, 0xA1, 0x7C, 0x12, \r
-0x51, 0x02, 0x12, 0x56, 0xCC, 0x30, 0xE0, 0x02, 0xA1, 0x7C, 0xE5, 0x51, 0xF1, 0xD7, 0xE0, 0xFE, \r
-0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0x02, 0xA1, 0x7C, 0xE5, 0x51, 0x75, 0xF0, \r
-0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x90, 0xA0, 0xED, 0x12, \r
-0x45, 0xBE, 0xE5, 0x51, 0xF1, 0xD7, 0xE0, 0xF5, 0x56, 0xA3, 0xE0, 0xF5, 0x57, 0x74, 0x12, 0x25, \r
-0x51, 0x12, 0xA3, 0x5F, 0xE0, 0xFF, 0x90, 0xA0, 0xF0, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x00, \r
-0x02, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x12, 0x07, 0x80, 0x2F, 0xFF, 0xE5, 0xF0, 0x3E, 0xFE, \r
-0x90, 0x00, 0x04, 0xB1, 0xBE, 0xFE, 0x90, 0x00, 0x06, 0xB1, 0xBE, 0xFE, 0x90, 0x00, 0x08, 0xB1, \r
-0xBE, 0x90, 0xA0, 0xF2, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x07, 0x80, 0xFF, 0xC3, 0x90, 0xA0, 0xF3, \r
-0xE0, 0x9F, 0xFE, 0x90, 0xA0, 0xF2, 0xE0, 0x95, 0xF0, 0x90, 0xA0, 0xF4, 0xF0, 0xA3, 0xCE, 0xF0, \r
-0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0xFD, 0xAC, 0xF0, 0x25, 0xE0, 0xFF, 0xEC, 0x33, 0xFE, 0xEF, \r
-0x2D, 0xFD, 0xEE, 0x3C, 0xFC, 0x90, 0x00, 0x04, 0x12, 0x07, 0xAB, 0x25, 0xE0, 0xFF, 0xE5, 0xF0, \r
-0x33, 0xFE, 0x90, 0x00, 0x02, 0xB1, 0xBE, 0xCF, 0x2D, 0xFD, 0xEF, 0x3C, 0xFC, 0xB1, 0xA3, 0xF1, \r
-0x5A, 0xAE, 0xF0, 0x78, 0x02, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x2D, 0xFF, 0xEC, 0x3E, \r
-0x90, 0xA0, 0xF6, 0x12, 0xAA, 0x71, 0xE5, 0x51, 0x12, 0x7F, 0xBC, 0xF5, 0x52, 0x54, 0x7F, 0xF5, \r
-0x53, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0xF1, 0x94, 0xE0, 0x90, 0xA0, 0xF8, 0xF0, 0x12, 0x51, 0x02, \r
-0xFF, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA0, 0xF9, 0xF0, 0xB1, 0x8A, 0xE0, 0xC3, 0x94, 0x05, 0x40, \r
-0x02, 0x61, 0xB4, 0x90, 0xA0, 0xF8, 0xE0, 0xFF, 0xE5, 0x53, 0x9F, 0x40, 0x08, 0x8F, 0x53, 0x53, \r
-0x52, 0x80, 0xEF, 0x42, 0x52, 0xE5, 0x53, 0x90, 0x41, 0x5F, 0x93, 0xB1, 0x96, 0xE0, 0xC3, 0x9F, \r
-0xE5, 0x53, 0x40, 0x05, 0x90, 0x41, 0x37, 0x80, 0x03, 0x90, 0x41, 0x4B, 0x93, 0xF5, 0x58, 0x90, \r
-0xA0, 0x0E, 0xE0, 0x60, 0x7D, 0xE5, 0x53, 0x64, 0x13, 0x60, 0x05, 0xE5, 0x53, 0xB4, 0x0B, 0x05, \r
-0x90, 0xA0, 0x10, 0x80, 0x23, 0xE5, 0x53, 0x64, 0x12, 0x60, 0x05, 0xE5, 0x53, 0xB4, 0x0A, 0x05, \r
-0x90, 0xA0, 0x11, 0x80, 0x13, 0xE5, 0x53, 0x64, 0x11, 0x60, 0x05, 0xE5, 0x53, 0xB4, 0x09, 0x05, \r
-0x90, 0xA0, 0x12, 0x80, 0x03, 0x90, 0xA0, 0x0F, 0xE0, 0xF5, 0x5C, 0xE5, 0x5C, 0xC3, 0x94, 0x80, \r
-0x50, 0x28, 0xE5, 0x5C, 0x94, 0x1B, 0x40, 0x02, 0x80, 0x13, 0xE5, 0x58, 0x25, 0x5C, 0xFF, 0xE4, \r
-0x33, 0xFE, 0xD3, 0xEF, 0x94, 0x1B, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, 0x05, 0x75, 0x58, 0x1B, \r
-0x80, 0x20, 0xE5, 0x5C, 0x25, 0x58, 0xF5, 0x58, 0x80, 0x18, 0xC3, 0xE4, 0x95, 0x5C, 0xF5, 0x5C, \r
-0xE5, 0x58, 0xD3, 0x95, 0x5C, 0x40, 0x08, 0xE5, 0x58, 0x95, 0x5C, 0xF5, 0x58, 0x80, 0x03, 0xE4, \r
-0xF5, 0x58, 0xE5, 0x58, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x95, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0xFA, \r
-0x7B, 0xFF, 0x90, 0xA0, 0xEA, 0x12, 0x45, 0xBE, 0xC3, 0xE5, 0x57, 0x94, 0x0F, 0xE5, 0x56, 0x94, \r
-0x00, 0x50, 0x7B, 0xB1, 0xA3, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0xF1, 0x5A, \r
-0x2F, 0xFD, 0xE5, 0xF0, 0x3E, 0xFC, 0xB1, 0xB5, 0xFF, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x02, \r
-0x61, 0x8C, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFD, \r
-0xAC, 0x06, 0xB1, 0xB5, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0xB1, 0xA3, 0x12, 0x07, 0x80, 0xD3, 0x9F, \r
-0xE5, 0xF0, 0x9E, 0x50, 0x02, 0x61, 0x93, 0xE5, 0x53, 0xD3, 0x94, 0x38, 0x50, 0x0A, 0xB1, 0x97, \r
-0xE0, 0xC3, 0x94, 0x0F, 0x50, 0x02, 0x61, 0x93, 0xE5, 0x53, 0xD3, 0x94, 0x3A, 0x50, 0x0A, 0xB1, \r
-0x97, 0xE0, 0xC3, 0x94, 0x14, 0x50, 0x02, 0x61, 0x93, 0xE5, 0x53, 0xD3, 0x94, 0x3C, 0x40, 0x02, \r
-0x61, 0x75, 0xB1, 0x97, 0xE0, 0xC3, 0x94, 0x19, 0x50, 0x02, 0x61, 0x93, 0x61, 0x75, 0xE5, 0x51, \r
-0x70, 0x3C, 0xB1, 0xA3, 0xF1, 0x5A, 0xFD, 0xAC, 0xF0, 0xB1, 0xB5, 0xFF, 0xC3, 0xED, 0x9F, 0xEC, \r
-0x9E, 0x50, 0x08, 0x90, 0x9D, 0x92, 0x74, 0x01, 0xF0, 0x80, 0x23, 0xE5, 0x57, 0xAE, 0x56, 0x78, \r
-0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFB, 0xAA, 0x06, 0xB1, 0xB5, 0x2B, 0xFF, 0xEE, \r
-0x3A, 0xFE, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x05, 0xE4, 0x90, 0x9D, 0x92, 0xF0, 0xF1, 0x85, \r
-0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, 0xD3, 0xE5, 0x57, 0x94, 0xC8, 0xE5, 0x56, 0x94, 0x00, \r
-0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, 0xE4, 0xF5, 0x59, 0xE5, 0x51, 0xF1, 0x50, 0xF5, 0x83, \r
-0xE0, 0xF5, 0x54, 0xA3, 0xE0, 0xF5, 0x55, 0xE4, 0xF5, 0x5D, 0xB1, 0xA3, 0x75, 0xF0, 0x02, 0xE5, \r
-0x5D, 0x12, 0xA9, 0x5E, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA0, \r
-0xEA, 0x12, 0x45, 0xB5, 0x85, 0x5D, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0x12, 0xA9, 0x3E, \r
-0x05, 0x5D, 0xE5, 0x5D, 0xB4, 0x05, 0xD3, 0x90, 0xA0, 0xEA, 0x12, 0x45, 0xB5, 0x12, 0x5E, 0x3B, \r
-0xFD, 0x7C, 0x00, 0xF1, 0x74, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, \r
-0x07, 0x03, 0xD3, 0xE5, 0x55, 0x9F, 0xE5, 0x54, 0x9E, 0x40, 0x0C, 0xE5, 0x55, 0x9F, 0xF5, 0x55, \r
-0xE5, 0x54, 0x9E, 0xF5, 0x54, 0x80, 0x05, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0xE5, 0x51, 0xF1, 0x50, \r
-0xF5, 0x83, 0x12, 0x9C, 0xCB, 0xAE, 0x54, 0xFF, 0xE4, 0xFC, 0xFD, 0xE5, 0x53, 0xF1, 0xE3, 0xC3, \r
-0x12, 0x45, 0x60, 0x50, 0x07, 0xAF, 0x51, 0x12, 0x7A, 0xE4, 0x80, 0x17, 0xE5, 0x53, 0xF1, 0xB1, \r
-0xD3, 0x74, 0x01, 0x93, 0x95, 0x55, 0xE4, 0x93, 0x95, 0x54, 0x40, 0x07, 0x7D, 0x01, 0xAF, 0x51, \r
-0x12, 0x7B, 0xEF, 0xE5, 0x51, 0xF1, 0x50, 0xF5, 0x83, 0xA3, 0xE0, 0x90, 0xA1, 0x3B, 0xF0, 0x90, \r
-0xA1, 0x3A, 0xE5, 0x52, 0xF0, 0xAB, 0x51, 0xE4, 0xFD, 0xFF, 0x12, 0x8B, 0xE5, 0xE4, 0xF5, 0x54, \r
-0xF5, 0x55, 0xA1, 0x60, 0xB1, 0x8A, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, 0x81, 0x6F, 0xAD, 0x53, \r
-0xAF, 0x51, 0x12, 0xA2, 0x78, 0xF1, 0xC9, 0xEF, 0xB1, 0xD1, 0xE0, 0x54, 0x07, 0xF5, 0x5B, 0xB1, \r
-0x97, 0xE0, 0xFF, 0xC3, 0x94, 0x30, 0x50, 0x06, 0xE4, 0xB1, 0x88, 0xE4, 0x80, 0x4E, 0xF1, 0xC9, \r
-0xE0, 0x64, 0x01, 0x70, 0x5E, 0xF1, 0x60, 0xE0, 0x64, 0x0A, 0x60, 0x23, 0xEF, 0x24, 0x05, 0xFF, \r
-0xE4, 0x33, 0xFE, 0xF1, 0xBD, 0xE0, 0xFD, 0xF1, 0x9B, 0x50, 0x14, 0xED, 0x24, 0x05, 0xFF, 0xE4, \r
-0x33, 0xFE, 0xB1, 0x97, 0xF1, 0x9A, 0x50, 0x07, 0xF1, 0xA5, 0xE0, 0x65, 0x53, 0x60, 0x29, 0xE5, \r
+0x41, 0xA2, 0x14, 0x00, 0x41, 0xA2, 0x15, 0x00, 0x41, 0xA2, 0x16, 0x00, 0x41, 0xA2, 0x1A, 0x00, \r
+0x01, 0x70, 0x00, 0x41, 0xA2, 0x1B, 0x00, 0x41, 0xA2, 0x1C, 0x00, 0x41, 0xA2, 0x3D, 0x00, 0x00, \r
+0x5F, 0xFB, 0x67, 0xEE, 0x70, 0x07, 0x7F, 0x67, 0xF1, 0xAF, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF1, 0xFD, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xF4, 0xEF, 0xF0, \r
+0x90, 0xA1, 0xF6, 0xEB, 0xF0, 0xED, 0x60, 0x02, 0xE1, 0x5A, 0x90, 0x07, 0x6E, 0xE0, 0x44, 0x08, \r
+0xF0, 0x12, 0x9F, 0xA2, 0x90, 0xA1, 0xF6, 0xE0, 0x70, 0x43, 0xD1, 0x96, 0x90, 0xA1, 0xF4, 0xE0, \r
+0x70, 0x35, 0x12, 0xAC, 0xE0, 0x70, 0x16, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0x74, 0x02, 0xFE, 0xEC, \r
+0xF1, 0xD0, 0xF1, 0xD6, 0x7F, 0x64, 0xF1, 0xAF, 0xEF, 0x54, 0xFE, 0x80, 0x15, 0x12, 0x37, 0x4E, \r
+0xE4, 0xFE, 0x74, 0x80, 0xFF, 0xE4, 0xEC, 0xF1, 0xD0, 0xF1, 0xD6, 0x7F, 0x64, 0xF1, 0xAF, 0xEF, \r
+0x44, 0x01, 0xFD, 0x7F, 0x64, 0xD1, 0xA0, 0x7F, 0x4E, 0xF1, 0xF7, 0xE1, 0xA1, 0xD1, 0x96, 0x90, \r
+0xA1, 0xF4, 0xE0, 0x70, 0x0A, 0xF1, 0xF0, 0xE4, 0xFF, 0xFE, 0xEC, 0xF1, 0xD0, 0xF1, 0xD6, 0xF1, \r
+0xE8, 0xF1, 0xDD, 0x44, 0x01, 0xFD, 0x7F, 0x4F, 0xD1, 0xA0, 0x12, 0x97, 0x6E, 0xE4, 0x74, 0x66, \r
+0xFF, 0xEC, 0xF1, 0xD0, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x12, 0xAB, 0x8D, 0xEF, 0x44, \r
+0x01, 0xFF, 0xEC, 0xF1, 0xD0, 0x12, 0x67, 0xD1, 0x80, 0x50, 0x90, 0x07, 0x6E, 0xE0, 0x54, 0xF7, \r
+0xF0, 0x12, 0x9F, 0xAA, 0x90, 0xA1, 0xF4, 0xE0, 0x70, 0x35, 0x90, 0xA1, 0xF6, 0xE0, 0x60, 0x08, \r
+0xD1, 0x96, 0xF1, 0xF0, 0xE4, 0xFF, 0x80, 0x21, 0x7F, 0x67, 0xF1, 0xAF, 0xEF, 0x54, 0xDF, 0xFD, \r
+0x7F, 0x67, 0xD1, 0xA0, 0x12, 0xAC, 0xE0, 0x70, 0x0B, 0x12, 0x37, 0x4E, 0xE4, 0x74, 0x80, 0xFF, \r
+0x74, 0x02, 0x80, 0x05, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0xF1, 0xD0, 0xF1, 0xD6, 0xF1, \r
+0xE8, 0xF1, 0xDD, 0x54, 0xFE, 0xFD, 0x7F, 0x4F, 0xD1, 0xA0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xE0, 0x90, 0xA2, 0x32, 0xF1, \r
+0xFD, 0x90, 0xA2, 0x32, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xC5, 0xB1, 0x71, \r
+0x90, 0xAA, 0xB9, 0x02, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x02, 0x38, 0x45, 0xFD, 0x7F, 0x4E, \r
+0xD1, 0xA0, 0x7F, 0x4F, 0xF1, 0xAF, 0xEF, 0x22, 0x7F, 0x4E, 0xF1, 0xAF, 0xEF, 0x54, 0x7F, 0x22, \r
+0x7F, 0x48, 0x7E, 0x09, 0x02, 0x37, 0x4E, 0xF1, 0xAF, 0xEF, 0x44, 0x80, 0x22, 0xF0, 0x7F, 0x10, \r
+0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90, 0xA0, 0xC1, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, \r
+0x0E, 0x90, 0xA0, 0xCE, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x75, 0xF0, 0x0E, 0xEF, 0x90, 0xA0, 0xCD, \r
+0x12, 0x45, 0xA9, 0xE0, 0x90, 0xA1, 0xDA, 0xF0, 0x90, 0xA1, 0xD9, 0xEE, 0xF0, 0xE4, 0xFB, 0xFD, \r
+0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xD5, 0xEE, 0xF0, \r
+0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xD9, 0xE0, 0xF5, 0x3B, 0xA3, 0xE0, 0xF5, 0x3C, 0x12, 0x36, 0x3E, \r
+0x90, 0xA1, 0xD5, 0x12, 0x97, 0x97, 0xA3, 0xA3, 0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0x90, 0xA0, 0xC1, 0xE0, 0x30, 0xE0, 0x5D, 0x90, 0xA0, 0xC3, 0xE0, 0x70, 0x2A, 0x7D, 0x16, \r
+0x7F, 0x6F, 0x31, 0x22, 0x91, 0x22, 0x51, 0x4C, 0x54, 0x07, 0x75, 0xF0, 0x0E, 0x11, 0xC6, 0x51, \r
+0x4C, 0x54, 0x07, 0x12, 0xA4, 0xFC, 0xE0, 0x44, 0x01, 0x12, 0xA9, 0x18, 0xA3, 0x74, 0x03, 0x11, \r
+0x2C, 0x90, 0xA0, 0xC3, 0x74, 0x01, 0xF0, 0x22, 0x90, 0xA0, 0xC3, 0xE0, 0x64, 0x01, 0x70, 0x23, \r
+0x90, 0xA0, 0xC1, 0xE0, 0x12, 0xA4, 0xF7, 0xE0, 0x30, 0xE0, 0x18, 0x75, 0xF0, 0x0E, 0xEF, 0x11, \r
+0xC6, 0xE4, 0x90, 0xA1, 0xD9, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, \r
+0x01, 0x01, 0x34, 0x31, 0x2D, 0x22, 0x90, 0xA0, 0xD0, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x7E, 0x00, \r
+0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xDB, 0xEE, 0xF0, 0xA3, 0xEF, \r
+0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1C, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, \r
+0xE0, 0xF0, 0x7D, 0x13, 0x91, 0x1E, 0xBF, 0x01, 0x02, 0x91, 0xFF, 0x90, 0xA1, 0xE0, 0xE0, 0xFF, \r
+0x7D, 0x15, 0x31, 0x22, 0x80, 0x02, 0x91, 0xFF, 0xF1, 0x09, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0x90, 0xA0, 0xD0, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x7E, 0x00, 0xE4, 0xFD, 0x11, 0xD2, 0xE4, \r
+0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, 0xF0, 0x90, 0x9E, 0x96, 0xED, 0xF0, 0x22, 0x90, 0xA0, 0xC1, \r
+0xE0, 0xFF, 0xC3, 0x13, 0xFE, 0xEF, 0x54, 0xF1, 0xFF, 0xEE, 0x04, 0x54, 0x07, 0x25, 0xE0, 0x4F, \r
+0xF0, 0xA3, 0xE0, 0xFF, 0x12, 0xAC, 0x6F, 0xB5, 0x07, 0x04, 0xEE, 0x54, 0xF1, 0xF0, 0x11, 0x05, \r
+0xE4, 0x90, 0xA0, 0xC3, 0xF0, 0x91, 0x22, 0x12, 0xAC, 0x6F, 0x12, 0xAB, 0xD9, 0xE0, 0xFA, 0x75, \r
+0xF0, 0x0E, 0xED, 0xF1, 0xB7, 0xFC, 0x54, 0x03, 0xFD, 0xEC, 0x13, 0x13, 0x54, 0x07, 0xFB, 0xEE, \r
+0x12, 0xAC, 0xF1, 0xAF, 0x02, 0x12, 0xA6, 0x91, 0x51, 0x4C, 0x54, 0x07, 0x75, 0xF0, 0x0E, 0xF1, \r
+0xB7, 0x12, 0xAC, 0x65, 0xFD, 0x51, 0x53, 0x51, 0x4C, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0E, 0x90, \r
+0xA0, 0xCF, 0x12, 0x45, 0xA9, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x0E, 0xEF, 0x31, 0x11, 0x51, 0x4C, \r
+0x54, 0x07, 0xFD, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x0C, 0xEF, \r
+0xF0, 0xA3, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA2, 0x0E, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, \r
+0x02, 0x41, 0x47, 0x90, 0xA2, 0x0D, 0xE0, 0xFE, 0x12, 0xA8, 0x09, 0x75, 0xF0, 0x03, 0xEF, 0x12, \r
+0xAC, 0x02, 0xE0, 0x90, 0xA2, 0x0F, 0xF0, 0x90, 0xA2, 0x0C, 0xE0, 0x60, 0x24, 0x90, 0xA2, 0x0F, \r
+0xE0, 0xFF, 0x75, 0xF0, 0x0E, 0xEE, 0x12, 0xA7, 0x8B, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA2, 0x0E, \r
+0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x12, 0x78, 0xEE, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, \r
+0x20, 0x12, 0xAC, 0x79, 0x75, 0xF0, 0x0E, 0x12, 0xA7, 0x8B, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA2, \r
+0x0E, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x12, 0x78, 0xEE, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, \r
+0x5F, 0x90, 0xA2, 0x0F, 0xF0, 0x12, 0xAC, 0x79, 0x12, 0xA8, 0x09, 0xC0, 0x83, 0xC0, 0x82, 0x90, \r
+0xA2, 0x0E, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0xAC, 0x02, 0xEF, 0xF0, 0x90, \r
+0xA2, 0x0E, 0xE0, 0x04, 0xF0, 0x21, 0xB7, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0xC1, 0xE0, \r
+0xC3, 0x13, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x36, 0xED, 0xF0, 0xEF, \r
+0x14, 0x60, 0x02, 0x61, 0x10, 0x90, 0x06, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA2, 0x36, 0xE0, \r
+0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x90, 0x04, 0x42, 0xE0, 0x54, 0x9F, 0x4F, 0xFF, 0xF0, 0x90, 0xA1, \r
+0x88, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA1, 0x8C, 0x12, 0x08, 0x79, 0x00, 0x00, \r
+0x00, 0x01, 0x71, 0xD6, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA1, 0x8C, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0x71, 0xDA, 0x12, 0x08, 0x79, 0x00, 0x00, \r
+0x00, 0x10, 0x12, 0xAB, 0x52, 0x78, 0x01, 0x12, 0x08, 0x47, 0x78, 0x04, 0xF1, 0xC7, 0x7F, 0x00, \r
+0x7E, 0x0A, 0x71, 0xDA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x12, 0xAB, 0x52, 0x78, 0x0A, \r
+0xF1, 0xC7, 0x7F, 0x00, 0x7E, 0x0D, 0x71, 0xDA, 0x12, 0x08, 0x79, 0x0C, 0x00, 0x00, 0x00, 0x12, \r
+0xAB, 0x52, 0x78, 0x1A, 0xF1, 0xC7, 0x7F, 0x18, 0x71, 0xD8, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, \r
+0x00, 0x90, 0xA1, 0x8C, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xDA, 0x12, 0x08, 0x79, \r
+0x00, 0x00, 0x0C, 0x00, 0x90, 0xA1, 0x7A, 0x12, 0x08, 0x79, 0x00, 0x00, 0x04, 0x00, 0x80, 0x58, \r
+0x90, 0x06, 0x03, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA1, 0x88, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, \r
+0x01, 0x90, 0xA1, 0x8C, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x71, 0xD6, 0x12, 0x08, 0x79, \r
+0x00, 0x00, 0x00, 0x01, 0x90, 0xA1, 0x8C, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, \r
+0x7E, 0x09, 0x71, 0xDA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA1, 0x8C, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x0C, 0x00, 0xF1, 0xDA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA1, \r
+0x7A, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0x12, 0xA6, \r
+0x19, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x86, \r
+0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x37, 0x4E, 0x90, 0xA1, 0x90, 0x12, 0x08, 0x6D, 0x90, 0xA1, \r
+0x88, 0x12, 0x45, 0x71, 0x12, 0x08, 0x3A, 0x90, 0xA1, 0x90, 0xF1, 0xF0, 0xC0, 0x04, 0xC0, 0x05, \r
+0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA1, 0x88, 0x12, 0x45, 0x71, 0x90, 0xA1, 0x8C, 0xF1, 0xF0, 0xD0, \r
+0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53, 0x90, 0xA1, 0x94, 0x12, 0x08, 0x6D, \r
+0x90, 0xA1, 0x94, 0x12, 0x47, 0xCE, 0x90, 0xA1, 0x86, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, \r
+0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x00, 0x7E, 0x08, 0x71, 0x76, 0x90, 0xA1, 0x88, 0x22, \r
+0x8F, 0x54, 0x7D, 0x17, 0x91, 0x1E, 0x75, 0xF0, 0x0E, 0xE5, 0x54, 0x12, 0xAB, 0xDD, 0xE0, 0xFC, \r
+0xF1, 0xB2, 0xFE, 0x54, 0x03, 0xFD, 0xEE, 0x13, 0x13, 0x54, 0x07, 0xFB, 0x90, 0xA0, 0xC1, 0xE0, \r
+0xFE, 0x12, 0xAC, 0xF1, 0xAF, 0x04, 0x12, 0xA6, 0x91, 0xF1, 0xB2, 0x12, 0xAC, 0x65, 0xFD, 0x51, \r
+0x53, 0x75, 0xF0, 0x0E, 0xE5, 0x54, 0x31, 0x11, 0xAD, 0x54, 0xE4, 0xFF, 0x21, 0xA5, 0x7F, 0xFF, \r
+0x31, 0x22, 0xE4, 0x90, 0xA2, 0x2C, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, \r
+0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xF1, 0xD0, \r
+0x30, 0xE0, 0x15, 0xD3, 0x90, 0xA2, 0x2D, 0xE0, 0x94, 0x03, 0x90, 0xA2, 0x2C, 0xE0, 0x94, 0x00, \r
+0x40, 0x02, 0x80, 0x13, 0x7F, 0x01, 0x80, 0x1B, 0xD3, 0x90, 0xA2, 0x2D, 0xE0, 0x94, 0xE8, 0x90, \r
+0xA2, 0x2C, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, \r
+0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA2, 0x2C, 0x12, 0x96, 0x39, 0x80, 0xA9, \r
+0x90, 0xA0, 0x66, 0xE0, 0x44, 0x02, 0xF0, 0x7D, 0x08, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
+0xC0, 0xD0, 0x90, 0xA1, 0xE6, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x9E, 0x94, 0xE0, 0x04, 0xF0, \r
+0x90, 0x04, 0x1D, 0xE0, 0x60, 0x33, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, 0xEA, 0xF0, 0x7D, 0x26, \r
+0x91, 0x1E, 0xEF, 0x64, 0x01, 0x70, 0x07, 0xD1, 0xB9, 0x20, 0xE0, 0x0F, 0x80, 0x0A, 0xF1, 0xD0, \r
+0x30, 0xE0, 0x08, 0xD1, 0xB9, 0x20, 0xE0, 0x03, 0x12, 0xA9, 0xC1, 0x90, 0xA1, 0xEA, 0xE0, 0xFF, \r
+0x7D, 0x27, 0x31, 0x22, 0x12, 0xAA, 0x45, 0x80, 0x0B, 0x12, 0xAA, 0x45, 0xD1, 0xB9, 0x20, 0xE0, \r
+0x03, 0x12, 0xA9, 0xC1, 0x90, 0xA0, 0x5F, 0xE0, 0x30, 0xE0, 0x0B, 0xF1, 0xD0, 0x30, 0xE0, 0x06, \r
+0xF1, 0xF6, 0x7D, 0x28, 0x31, 0x22, 0xF1, 0x09, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, \r
+0xA1, 0xDB, 0xA3, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0xB1, 0x59, 0x90, 0xA1, 0xDE, 0xEE, 0xF0, \r
+0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA1, 0xDD, 0xE0, 0xFF, 0xF1, 0xA6, 0x54, 0x3F, 0xF0, 0xEF, \r
+0x60, 0x2C, 0xF1, 0xE4, 0x44, 0x10, 0xF0, 0xF1, 0xA6, 0x44, 0x80, 0xF0, 0x12, 0x9B, 0xBB, 0x30, \r
+0xE0, 0x26, 0x12, 0x86, 0xCA, 0x50, 0x0E, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, 0x2B, 0x2D, \r
+0xF1, 0x92, 0xEF, 0xF0, 0x22, 0x74, 0x2B, 0x2D, 0xF1, 0x92, 0x74, 0x7F, 0xF0, 0x22, 0xF1, 0xE4, \r
+0x54, 0xEF, 0xF0, 0xF1, 0xA6, 0x44, 0x40, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0x90, 0xA2, 0x21, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA2, 0x20, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, \r
+0x12, 0xAA, 0xF9, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0xA2, 0x20, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, \r
+0xA2, 0x21, 0xE0, 0x60, 0x06, 0x12, 0xAC, 0x32, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x12, 0xAC, 0x32, 0x54, 0xC0, \r
+0xF0, 0xAF, 0x05, 0xF1, 0x9B, 0xE0, 0x54, 0x01, 0xFE, 0x90, 0xA2, 0x22, 0xE0, 0x25, 0xE0, 0x25, \r
+0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0xF1, 0x9B, 0xEE, 0xF0, 0x74, 0x11, 0x2F, 0x12, 0xAA, \r
+0x3D, 0x74, 0xFF, 0xF0, 0x74, 0x29, 0x2F, 0xF1, 0xE7, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x10, 0xEF, \r
+0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1F, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA2, 0x13, 0xF0, 0x7D, \r
+0x29, 0x91, 0x1E, 0xBF, 0x01, 0x05, 0x12, 0xAB, 0x1B, 0xB1, 0x1A, 0x90, 0xA2, 0x13, 0xE0, 0xFF, \r
+0x7D, 0x2A, 0x31, 0x22, 0x80, 0x05, 0x12, 0xAB, 0x1B, 0xB1, 0x1A, 0xF1, 0x09, 0xD0, 0xD0, 0x92, \r
+0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xEB, 0xEE, 0xF0, 0xA3, 0xEF, \r
+0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1D, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, 0xEF, 0xF0, 0x7D, \r
+0x36, 0x91, 0x1E, 0xBF, 0x01, 0x03, 0x12, 0xAA, 0xB0, 0x90, 0xA1, 0xEF, 0xE0, 0xFF, 0x7D, 0x37, \r
+0x31, 0x22, 0x80, 0x03, 0x12, 0xAA, 0xB0, 0xF1, 0xF6, 0x7D, 0x38, 0x31, 0x22, 0xF1, 0x09, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x2B, 0xEF, 0xF1, 0xBF, 0x12, 0xAD, 0x19, 0x54, 0x1F, 0x20, \r
+0xE0, 0x0D, 0x90, 0xA1, 0x2C, 0xE0, 0xB4, 0x01, 0x06, 0x7D, 0x36, 0x7F, 0x6F, 0x31, 0x22, 0x90, \r
+0xA1, 0x2B, 0xE0, 0x70, 0x0B, 0x90, 0xA1, 0x2D, 0xE0, 0xFF, 0x7D, 0x05, 0x91, 0x8B, 0x80, 0x26, \r
+0x90, 0xA1, 0x2B, 0xE0, 0xB4, 0x01, 0x09, 0x90, 0xA1, 0x2D, 0xE0, 0xFF, 0xB1, 0xD5, 0x80, 0x16, \r
+0x90, 0xA1, 0x2B, 0xE0, 0xB4, 0x02, 0x0F, 0xA3, 0xE0, 0xB4, 0x01, 0x0A, 0x90, 0xA0, 0xBB, 0xE0, \r
+0xFE, 0xA3, 0xE0, 0xFF, 0xD1, 0x12, 0x12, 0xAD, 0x19, 0x54, 0x1F, 0x20, 0xE0, 0x0A, 0x90, 0xA1, \r
+0x2C, 0xE0, 0x70, 0x04, 0xFD, 0xFF, 0x31, 0x22, 0x22, 0x90, 0x9E, 0x9A, 0xE0, 0xFF, 0x90, 0xA1, \r
+0xE7, 0xE0, 0xFB, 0x7D, 0x01, 0xB1, 0x59, 0x90, 0xA1, 0xE8, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, \r
+0xFD, 0x90, 0xA1, 0xE6, 0xE0, 0xFF, 0xB1, 0x1A, 0x90, 0xA0, 0xC1, 0xE0, 0x22, 0x90, 0xA1, 0x2C, \r
+0xEF, 0xF1, 0xBF, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1E, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, 0x31, \r
+0xF0, 0x7D, 0x01, 0x91, 0x1E, 0xEF, 0x64, 0x01, 0x70, 0x02, 0xF1, 0x10, 0x90, 0xA1, 0x31, 0xE0, \r
+0xFF, 0x7D, 0x02, 0x31, 0x22, 0x80, 0x02, 0xF1, 0x10, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, \r
+0x90, 0x9E, 0x9C, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0xB1, 0x59, 0x90, 0xA1, 0x2F, 0xEE, 0xF0, \r
+0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA1, 0x2C, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, \r
+0xA1, 0x36, 0xF0, 0x90, 0xA1, 0x33, 0xEC, 0xF1, 0xBF, 0x90, 0xA1, 0x33, 0xE0, 0xFC, 0xA3, 0xE0, \r
+0xFD, 0xB1, 0x1A, 0x90, 0xA1, 0x33, 0xA3, 0xE0, 0xFF, 0xFD, 0x24, 0x0D, 0x12, 0xAA, 0x35, 0xE0, \r
+0x44, 0x80, 0xF0, 0x74, 0x0D, 0x2D, 0x12, 0xAA, 0x35, 0xE0, 0x54, 0xEF, 0xF1, 0x9A, 0xE0, 0x44, \r
+0x02, 0xF1, 0x9A, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0xA1, 0x35, 0xE0, 0xFF, 0x90, 0xA1, 0x33, 0xA3, \r
+0xE0, 0xFE, 0x24, 0x2A, 0x12, 0xAA, 0xEF, 0x90, 0xA1, 0x36, 0xE0, 0xFF, 0xF1, 0x8F, 0xEF, 0xF0, \r
+0x74, 0x2C, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x02, 0xF0, 0x22, 0x74, \r
+0x2B, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
+0xE0, 0x22, 0x75, 0xF0, 0x0E, 0xE5, 0x54, 0x90, 0xA0, 0xC5, 0x12, 0x45, 0xA9, 0xE0, 0x22, 0xF0, \r
+0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x22, 0x12, 0x08, 0x5A, 0x90, 0xA1, 0x8C, 0x02, 0x08, 0x6D, \r
+0x90, 0xA0, 0x63, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0x7F, 0x84, 0x7E, 0x08, 0x71, 0x76, \r
+0x90, 0xA1, 0x76, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, \r
+0x12, 0x45, 0x8D, 0x02, 0x45, 0x46, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x6F, 0xFF, 0x22, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x7E, 0xE8, 0x20, 0xE6, 0x02, 0x01, 0xDB, 0x90, 0x00, 0x8C, \r
+0xE0, 0xF5, 0x6E, 0x7F, 0x8D, 0x12, 0x47, 0xAF, 0x90, 0x00, 0x8E, 0xE0, 0xF5, 0x6F, 0xEF, 0x24, \r
+0xFC, 0x60, 0x0D, 0x24, 0x03, 0x60, 0x02, 0x01, 0xD2, 0xAF, 0x6E, 0x12, 0x7E, 0x96, 0x01, 0xD2, \r
+0x74, 0x11, 0x25, 0x6E, 0x12, 0x76, 0x3C, 0xE0, 0xFB, 0xE4, 0xFD, 0x31, 0x0A, 0x31, 0x19, 0x13, \r
+0x13, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0x31, 0x0A, 0x31, 0x19, 0xD1, 0xE5, 0xFB, 0x0D, 0xE4, 0x31, \r
+0x0A, 0x31, 0x19, 0xC4, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0x31, 0x0A, 0xF1, 0xEF, 0xE0, 0xFB, 0xE4, \r
+0xFD, 0x0F, 0x31, 0x0B, 0x90, 0x96, 0x12, 0x11, 0xE0, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0xD1, 0x3C, \r
+0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0x31, 0x0B, 0xD1, 0x3C, 0x54, 0x1F, 0xFB, 0x0D, \r
+0x11, 0xE6, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x00, 0xD1, 0xF7, 0x75, 0xF0, 0x08, 0xE5, \r
+0x6E, 0x90, 0x89, 0x01, 0x11, 0xE0, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x02, 0x11, 0xE0, \r
+0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x03, 0x11, 0xE0, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, \r
+0x89, 0x04, 0xD1, 0xF7, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x05, 0x11, 0xE0, 0x75, 0xF0, \r
+0x08, 0xE5, 0x6E, 0x90, 0x89, 0x06, 0x11, 0xE0, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x07, \r
+0x11, 0xE0, 0x12, 0x7E, 0xE8, 0x30, 0xE0, 0x03, 0x12, 0x7F, 0x58, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x12, 0x45, 0xA9, 0xE0, 0xFB, 0x0D, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, \r
+0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, \r
+0x08, 0x74, 0xFC, 0x2D, 0x12, 0xA1, 0x89, 0xEB, 0xF0, 0x22, 0xFF, 0x11, 0xE6, 0x75, 0xF0, 0x04, \r
+0xE5, 0x6E, 0x22, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x14, 0x12, 0x45, 0xA9, 0xE0, \r
+0x22, 0x12, 0x06, 0x89, 0x54, 0x7F, 0xF5, 0x51, 0x12, 0x6A, 0x87, 0xFF, 0x54, 0x1F, 0xF5, 0x53, \r
+0xEF, 0x54, 0x80, 0xD1, 0xE5, 0xF5, 0x52, 0xD1, 0xDE, 0xFF, 0x54, 0x03, 0xF5, 0x54, 0xEF, 0x54, \r
+0x30, 0xC4, 0x54, 0x0F, 0xF5, 0x57, 0xD1, 0xDE, 0xFF, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, \r
+0xF5, 0x55, 0xEF, 0x54, 0x80, 0xD1, 0xE5, 0xF5, 0x56, 0xD1, 0xDE, 0xFF, 0x54, 0x08, 0x13, 0x13, \r
+0x13, 0x54, 0x1F, 0xF5, 0x59, 0xEF, 0x54, 0x04, 0x13, 0x13, 0x54, 0x3F, 0xF5, 0x5A, 0xE5, 0x56, \r
+0x12, 0xAC, 0xB3, 0x31, 0x13, 0x54, 0x7F, 0x4F, 0xF0, 0xE5, 0x55, 0x12, 0x61, 0xC8, 0x31, 0x13, \r
+0x54, 0xBF, 0x4F, 0xF0, 0xE5, 0x59, 0x70, 0x74, 0xE5, 0x53, 0x54, 0x1F, 0xD1, 0x36, 0x54, 0xE0, \r
+0x4F, 0xF0, 0xE5, 0x54, 0x54, 0x03, 0x31, 0x13, 0x54, 0xFC, 0x4F, 0xF0, 0xEF, 0x25, 0xE0, 0x25, \r
+0xE0, 0x31, 0x13, 0x54, 0xF3, 0x4F, 0xF0, 0xE5, 0x52, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xD1, \r
+0x36, 0x54, 0xDF, 0x4F, 0xF0, 0xE5, 0x57, 0x54, 0x03, 0xC4, 0x54, 0xF0, 0x31, 0x13, 0x54, 0xCF, \r
+0x4F, 0xD1, 0x54, 0xE0, 0x54, 0xFB, 0xD1, 0x54, 0xE0, 0xFF, 0xE5, 0x5A, 0x25, 0xE0, 0x25, 0xE0, \r
+0xFE, 0xEF, 0x4E, 0xF0, 0xE4, 0xF5, 0x58, 0x85, 0x58, 0x82, 0x75, 0x83, 0x00, 0xA3, 0xA3, 0xA3, \r
+0x12, 0x06, 0xA2, 0xFF, 0x75, 0xF0, 0x08, 0xE5, 0x51, 0xD1, 0x4B, 0x25, 0x58, 0xB1, 0x36, 0xEF, \r
+0xF0, 0x05, 0x58, 0xE5, 0x58, 0xB4, 0x04, 0xDF, 0xAF, 0x51, 0x71, 0x22, 0x22, 0x90, 0xA0, 0xFE, \r
+0x12, 0x45, 0xBE, 0x90, 0xA0, 0xFD, 0xEF, 0xF0, 0x12, 0x45, 0xC7, 0x52, 0x6F, 0x00, 0x52, 0x74, \r
+0x01, 0x52, 0x79, 0x02, 0x52, 0x7E, 0x10, 0x52, 0x83, 0x11, 0x52, 0x87, 0x12, 0x52, 0x8C, 0x14, \r
+0x52, 0x91, 0x20, 0x52, 0x96, 0x21, 0x52, 0x9B, 0x23, 0x52, 0xA0, 0x24, 0x52, 0xA5, 0x25, 0x52, \r
+0xAA, 0x27, 0x52, 0xAF, 0x28, 0x52, 0xB4, 0x40, 0x52, 0xB8, 0x42, 0x52, 0xBC, 0x60, 0x52, 0xC1, \r
+0x61, 0x52, 0xC6, 0x62, 0x52, 0xCB, 0x63, 0x52, 0xD0, 0x64, 0x52, 0xD5, 0x65, 0x52, 0xDA, 0x66, \r
+0x52, 0xDF, 0x67, 0x52, 0xE4, 0x68, 0x52, 0xE9, 0x69, 0x52, 0xEE, 0x6B, 0x52, 0xF3, 0x6C, 0x52, \r
+0xF8, 0x6D, 0x52, 0xFD, 0x6E, 0x53, 0x02, 0x6F, 0x53, 0x07, 0x70, 0x00, 0x00, 0x53, 0x0C, 0x71, \r
+0x1C, 0x02, 0x6D, 0x37, 0x71, 0x1C, 0x02, 0x7F, 0x6D, 0x71, 0x1C, 0x02, 0x9C, 0x55, 0x71, 0x1C, \r
+0x02, 0x9C, 0x93, 0x71, 0x1C, 0xE1, 0x0F, 0x71, 0x1C, 0x02, 0x9A, 0x35, 0x71, 0x1C, 0x02, 0x9C, \r
+0xB6, 0x71, 0x1C, 0x02, 0x69, 0x41, 0x71, 0x1C, 0x02, 0x9C, 0xC5, 0x71, 0x1C, 0x02, 0x9D, 0x04, \r
+0x71, 0x1C, 0x02, 0x5C, 0xDE, 0x71, 0x1C, 0x02, 0x9D, 0x0C, 0x71, 0x1C, 0x02, 0x89, 0x61, 0x71, \r
+0x1C, 0x02, 0x9D, 0x4F, 0x71, 0x1C, 0x21, 0x21, 0x71, 0x1C, 0xC1, 0x61, 0x71, 0x1C, 0x02, 0x6A, \r
+0x8D, 0x71, 0x1C, 0x02, 0x93, 0x0A, 0x71, 0x1C, 0x02, 0x6F, 0xCB, 0x71, 0x1C, 0x02, 0x9D, 0xFC, \r
+0x71, 0x1C, 0x02, 0x9E, 0x29, 0x71, 0x1C, 0x02, 0x9E, 0x87, 0x71, 0x1C, 0x02, 0x6E, 0x45, 0x71, \r
+0x1C, 0x02, 0x98, 0x97, 0x71, 0x1C, 0x02, 0x9E, 0x10, 0x71, 0x1C, 0x02, 0x6D, 0x70, 0x71, 0x1C, \r
+0x02, 0x9E, 0x95, 0x71, 0x1C, 0x02, 0x6F, 0x00, 0x71, 0x1C, 0x02, 0x92, 0xBB, 0x71, 0x1C, 0x02, \r
+0x9F, 0x80, 0x71, 0x1C, 0x02, 0x9D, 0x78, 0x71, 0x1C, 0x02, 0x9F, 0xB2, 0x90, 0x01, 0xC0, 0xE0, \r
+0x44, 0x01, 0xF0, 0x90, 0xA0, 0xFD, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0x90, 0xA0, 0xFE, 0x02, \r
+0x45, 0xB5, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x04, 0xEF, 0xF0, 0x75, 0xF0, \r
+0x04, 0xD1, 0x3C, 0x54, 0x1F, 0xFB, 0x60, 0x12, 0x64, 0x02, 0x60, 0x0E, 0xEB, 0x64, 0x04, 0x60, \r
+0x09, 0xEB, 0x64, 0x09, 0x60, 0x04, 0xEB, 0xB4, 0x0C, 0x0A, 0x12, 0xAC, 0x0E, 0xF5, 0x83, 0x74, \r
+0x02, 0xF0, 0x80, 0x08, 0x12, 0xAC, 0x0E, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0xE4, 0xF5, 0x6B, 0x90, \r
+0xA2, 0x04, 0xE0, 0xFD, 0xD1, 0x48, 0x25, 0x6B, 0xB1, 0x36, 0xE0, 0xFE, 0xEB, 0x75, 0xF0, 0x07, \r
+0xA4, 0x24, 0x56, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x6B, 0xB1, 0x36, \r
+0xE4, 0x93, 0xFC, 0xEE, 0x5C, 0x90, 0xA2, 0x07, 0xF0, 0x75, 0xF0, 0x04, 0xED, 0x31, 0x19, 0x54, \r
+0x03, 0xFF, 0xBF, 0x02, 0x0B, 0xE5, 0x6B, 0x70, 0x07, 0x90, 0xA2, 0x07, 0xE0, 0x54, 0xF0, 0xF0, \r
+0x90, 0xA2, 0x07, 0xE0, 0xFF, 0xD1, 0x44, 0x25, 0x6B, 0xB1, 0x36, 0xEF, 0xF0, 0x05, 0x6B, 0xE5, \r
+0x6B, 0x64, 0x07, 0x70, 0xAA, 0x90, 0xA2, 0x04, 0xE0, 0x75, 0xF0, 0x04, 0x31, 0x19, 0xFF, 0xC4, \r
+0x54, 0x03, 0xFD, 0xE4, 0x90, 0xA2, 0x05, 0xF0, 0x75, 0x6C, 0x06, 0xE5, 0x6C, 0xB4, 0x06, 0x07, \r
+0xB1, 0x25, 0xE0, 0x54, 0x0F, 0x80, 0x07, 0xD1, 0x44, 0x25, 0x6C, 0xB1, 0x36, 0xE0, 0x90, 0xA2, \r
+0x06, 0xF0, 0x90, 0xA2, 0x06, 0xE0, 0x60, 0x33, 0x75, 0x6B, 0x07, 0x12, 0xAC, 0xF9, 0x80, 0x05, \r
+0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x12, 0xAC, 0xC5, 0x60, 0x16, 0x12, 0xAC, 0xBC, 0x90, \r
+0xA2, 0x05, 0xF0, 0xED, 0x60, 0x22, 0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x1C, 0xE0, 0x24, 0x20, 0xF0, \r
+0x80, 0x16, 0x15, 0x6B, 0xE5, 0x6B, 0xC3, 0x94, 0x00, 0x50, 0xD0, 0xE5, 0x6C, 0x60, 0x09, 0x15, \r
+0x6C, 0xE5, 0x6C, 0xC3, 0x94, 0x00, 0x50, 0xA3, 0xE4, 0xFC, 0xF5, 0x6C, 0xE5, 0x6C, 0xB4, 0x06, \r
+0x07, 0xB1, 0x25, 0xE0, 0x54, 0x0F, 0x80, 0x07, 0xD1, 0x44, 0x25, 0x6C, 0xB1, 0x36, 0xE0, 0x90, \r
+0xA2, 0x06, 0xF0, 0x90, 0xA2, 0x06, 0xE0, 0x60, 0x2E, 0xE4, 0xF5, 0x6B, 0x12, 0xAC, 0xF9, 0x80, \r
+0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x12, 0xAC, 0xC5, 0x60, 0x13, 0x12, 0xAC, 0xBC, \r
+0xFC, 0xED, 0x60, 0x1B, 0xEC, 0xD3, 0x94, 0x0B, 0x40, 0x15, 0x74, 0x20, 0x2C, 0xFC, 0x80, 0x0F, \r
+0x05, 0x6B, 0xE5, 0x6B, 0xB4, 0x08, 0xD5, 0x05, 0x6C, 0xE5, 0x6C, 0x64, 0x07, 0x70, 0xAD, 0x90, \r
+0xA2, 0x05, 0xE0, 0xFF, 0x90, 0xA2, 0x04, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0xF1, 0xEF, 0xEF, 0xF0, \r
+0x75, 0xF0, 0x04, 0xEE, 0xD1, 0xF1, 0xEC, 0xF0, 0x75, 0xF0, 0x10, 0xEE, 0x12, 0x7B, 0x91, 0xE0, \r
+0xFE, 0x54, 0x7F, 0xF5, 0x6D, 0xEE, 0x54, 0x80, 0xFE, 0xE5, 0x6D, 0xD3, 0x9F, 0x40, 0x09, 0x90, \r
+0xA2, 0x05, 0xE0, 0x4E, 0xF5, 0x6D, 0x80, 0x0C, 0xE5, 0x6D, 0xC3, 0x9C, 0x50, 0x06, 0xAF, 0x06, \r
+0xEC, 0x4F, 0xF5, 0x6D, 0x90, 0xA2, 0x04, 0xE0, 0xFF, 0x24, 0x91, 0x12, 0xAB, 0x85, 0xE5, 0x6D, \r
+0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, 0x19, 0x12, 0x7B, 0xA3, 0x90, 0xA2, 0x04, 0xE0, 0xFF, 0xE4, \r
+0xFB, 0xAD, 0x6D, 0x12, 0x77, 0x89, 0x90, 0xA2, 0x04, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x12, 0x79, \r
+0x4E, 0xE4, 0xF0, 0x90, 0xA2, 0x05, 0xE0, 0xFE, 0xC3, 0x94, 0x0C, 0x40, 0x08, 0x12, 0xA5, 0xA8, \r
+0x74, 0x02, 0xF0, 0x80, 0x1B, 0xEE, 0xC3, 0x94, 0x04, 0x90, 0xA2, 0x04, 0xE0, 0x40, 0x0A, 0x24, \r
+0x91, 0x12, 0xA5, 0xAB, 0x74, 0x01, 0xF0, 0x80, 0x07, 0x24, 0x91, 0x12, 0xA5, 0xAB, 0xE4, 0xF0, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xFF, 0x90, 0xA2, 0x04, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, \r
+0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE4, 0xFF, \r
+0xE4, 0xFE, 0x74, 0x91, 0x2F, 0xD1, 0x59, 0xE0, 0x54, 0xFE, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, \r
+0x81, 0x00, 0xBE, 0x03, 0x0D, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xB1, 0x36, 0x74, 0x80, 0xF0, \r
+0x80, 0x0A, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xB1, 0x36, 0xE4, 0xF0, 0x75, 0xF0, 0x08, 0xEF, \r
+0xD1, 0x4B, 0x2E, 0xB1, 0x36, 0xE4, 0xF0, 0x0E, 0xBE, 0x10, 0xC7, 0x0F, 0xBF, 0x80, 0xC1, 0xE4, \r
+0x90, 0xAD, 0xE2, 0xF0, 0xFF, 0xE4, 0xFE, 0x75, 0xF0, 0x0A, 0xEF, 0x12, 0x7A, 0x8A, 0x75, 0xF0, \r
+0x02, 0xEE, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0x0E, 0xBE, 0x05, 0xEA, 0x74, 0x91, 0x2F, \r
+0x12, 0xAB, 0x85, 0x74, 0x13, 0xF0, 0x74, 0x11, 0x2F, 0x12, 0xAB, 0x65, 0xE4, 0xF0, 0x74, 0x01, \r
+0x2F, 0x12, 0x76, 0x14, 0x74, 0xC0, 0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, \r
+0x83, 0xE4, 0x12, 0x7A, 0xC0, 0x12, 0xAB, 0xAA, 0xF1, 0xEA, 0x74, 0x13, 0xD1, 0xEC, 0xE4, 0xF0, \r
+0x75, 0xF0, 0x04, 0xEF, 0xD1, 0x3C, 0x54, 0xE0, 0x44, 0x09, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, \r
+0x19, 0x54, 0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, 0x19, 0x54, 0xFC, 0xF0, 0x75, 0xF0, 0x04, \r
+0xEF, 0xD1, 0x3C, 0x44, 0x20, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, 0x19, 0x54, 0xCF, 0xF0, 0x75, \r
+0xF0, 0x04, 0xEF, 0x31, 0x19, 0x44, 0x40, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x31, 0x19, 0x54, 0x7F, \r
+0xD1, 0xEC, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x12, 0x7B, 0x91, 0xEE, 0xF0, 0x74, 0x91, 0x2F, \r
+0xD1, 0x59, 0xE4, 0xF0, 0x0F, 0xEF, 0x64, 0x80, 0x60, 0x02, 0xA1, 0x85, 0x74, 0x11, 0x2F, 0x12, \r
+0x98, 0x8F, 0x74, 0xFF, 0xF0, 0x22, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x13, 0x12, \r
+0x45, 0xA9, 0xE0, 0x22, 0x90, 0xA2, 0x04, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, \r
+0xA9, 0xE5, 0x82, 0x22, 0xF0, 0x74, 0x91, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, \r
+0x22, 0x12, 0x6F, 0x66, 0x12, 0x06, 0x89, 0xF5, 0x51, 0x24, 0x91, 0xD1, 0x59, 0xE0, 0x54, 0x9C, \r
+0xD1, 0x54, 0xC0, 0x83, 0xC0, 0x82, 0xF1, 0x01, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, \r
+0x83, 0xD1, 0x54, 0xC0, 0x83, 0xC0, 0x82, 0xF1, 0x01, 0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, \r
+0xD0, 0x83, 0xD1, 0x54, 0xC0, 0x83, 0xC0, 0x82, 0xF1, 0x01, 0x54, 0x40, 0xFE, 0xEF, 0x4E, 0xD0, \r
+0x82, 0xD0, 0x83, 0xD1, 0x54, 0xC0, 0x83, 0xC0, 0x82, 0xF1, 0x01, 0x54, 0x20, 0xFE, 0xEF, 0x4E, \r
+0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x08, 0xD1, 0xDE, 0xFF, 0x12, \r
+0x76, 0x38, 0xEF, 0xF0, 0xD1, 0x55, 0xE0, 0x30, 0xE5, 0x11, 0x31, 0x14, 0x13, 0x13, 0x54, 0x03, \r
+0xFB, 0x12, 0x76, 0x38, 0xE0, 0xFD, 0xAF, 0x51, 0x12, 0xA5, 0xB3, 0x22, 0x4F, 0xF0, 0x90, 0x00, \r
+0x02, 0x02, 0x06, 0xA2, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x22, 0xF0, 0x75, 0xF0, 0x04, \r
+0xEF, 0x90, 0x96, 0x12, 0x02, 0x45, 0xA9, 0x12, 0x45, 0xA9, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x01, \r
+0xE6, 0xE0, 0xFF, 0x90, 0xA1, 0x01, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x02, 0x06, 0xA2, 0x12, \r
+0x7F, 0xC2, 0x12, 0x06, 0x89, 0xC4, 0x54, 0x0F, 0xFF, 0xBF, 0x0F, 0x18, 0x90, 0xA0, 0xC1, 0xE0, \r
+0x54, 0xFE, 0xF0, 0x12, 0x88, 0xA9, 0xF1, 0xE3, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFF, 0x12, 0x4B, \r
+0xE0, 0x02, 0xA7, 0x11, 0xF1, 0xE3, 0x12, 0x6A, 0x87, 0xFF, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, \r
+0x12, 0xAB, 0xD9, 0xEF, 0xD1, 0xDD, 0x54, 0x03, 0xFF, 0x75, 0xF0, 0x0E, 0xED, 0x12, 0x4F, 0xB7, \r
+0x54, 0xFC, 0xD1, 0xDC, 0x54, 0x1C, 0xFF, 0xEE, 0x54, 0x0F, 0xFE, 0x75, 0xF0, 0x0E, 0x12, 0x4F, \r
+0xB7, 0x54, 0xE3, 0xD1, 0xDC, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x0E, 0xEE, 0x12, 0x4F, 0xB7, 0x54, \r
+0x1F, 0x4F, 0x12, 0x6D, 0x27, 0x12, 0xAC, 0xE9, 0xE4, 0xFB, 0x12, 0xA7, 0x9B, 0xF1, 0xE3, 0x12, \r
+0x6A, 0x7A, 0x12, 0xAC, 0xE9, 0x7B, 0x01, 0x12, 0xA7, 0x9B, 0xF1, 0xE3, 0xF1, 0x09, 0x12, 0x9D, \r
+0x71, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, 0xFD, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0xCD, 0x12, 0x45, \r
+0xA9, 0xEF, 0xF0, 0xF1, 0x09, 0xC4, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0E, 0xED, 0x90, 0xA0, \r
+0xCE, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0xEE, 0xC4, 0x54, 0x0F, 0xFF, 0x14, 0x6D, 0x70, 0x23, 0x90, \r
+0xA0, 0xC2, 0xEF, 0xF0, 0x12, 0x6A, 0x80, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA0, 0xC1, \r
+0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x54, 0xF1, 0xF0, 0x44, 0x01, 0xF0, 0x7D, 0x20, 0xE4, 0xFF, 0x12, \r
+0x88, 0xD0, 0x22, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x22, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, \r
+0x96, 0x11, 0x02, 0x45, 0xA9, 0x7F, 0xF4, 0x12, 0x47, 0xAF, 0xEF, 0x20, 0xE5, 0x0E, 0x7F, 0xF4, \r
+0x12, 0x47, 0xAF, 0xEF, 0x7F, 0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, 0x12, \r
+0x57, 0xF5, 0x90, 0x9E, 0x97, 0xEF, 0xF0, 0x11, 0x4E, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, \r
+0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x17, 0x12, 0x47, 0xAF, 0xEF, 0x54, 0xFC, 0x44, 0x04, \r
+0xFD, 0x7F, 0x17, 0x12, 0x46, 0xA0, 0x12, 0xAC, 0xA1, 0x44, 0x40, 0xFD, 0x7F, 0x16, 0x12, 0x46, \r
+0xA0, 0x7F, 0x38, 0x12, 0xAD, 0x39, 0x7F, 0x38, 0x12, 0x46, 0xA0, 0x02, 0x37, 0x99, 0x11, 0x7E, \r
+0x11, 0xAC, 0x12, 0xA1, 0x9C, 0x12, 0xA1, 0xBB, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, 0x0F, 0x75, \r
+0x10, 0x80, 0xAD, 0x0D, 0x7F, 0x50, 0x12, 0x46, 0xA0, 0xAD, 0x0E, 0x7F, 0x51, 0x12, 0x46, 0xA0, \r
+0xAD, 0x0F, 0x7F, 0x52, 0x12, 0x46, 0xA0, 0xAD, 0x10, 0x7F, 0x53, 0x02, 0x46, 0xA0, 0x90, 0x01, \r
+0x30, 0xE4, 0x11, 0xA4, 0x90, 0x01, 0x38, 0x11, 0xA4, 0xFD, 0x7F, 0x50, 0x12, 0x46, 0xA0, 0xE4, \r
+0xFD, 0x7F, 0x51, 0x12, 0x46, 0xA0, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x46, 0xA0, 0xE4, 0xFD, 0x7F, \r
+0x53, 0x02, 0x46, 0xA0, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0x34, 0x74, \r
+0xFF, 0x11, 0xA4, 0x90, 0x01, 0x3C, 0x11, 0xA4, 0xFD, 0x7F, 0x54, 0x12, 0x46, 0xA0, 0x7D, 0xFF, \r
+0x7F, 0x55, 0x12, 0x46, 0xA0, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x46, 0xA0, 0x7D, 0xFF, 0x7F, 0x57, \r
+0x02, 0x46, 0xA0, 0xEF, 0x64, 0x01, 0x70, 0x20, 0x91, 0xA7, 0x90, 0x01, 0x38, 0xE4, 0x11, 0xA4, \r
+0x90, 0x01, 0x30, 0x11, 0xA4, 0x90, 0x01, 0x30, 0x74, 0x10, 0xF0, 0x90, 0x01, 0x39, 0x74, 0x01, \r
+0xF0, 0x90, 0x00, 0x53, 0x74, 0x80, 0xF0, 0x22, 0x12, 0x97, 0xAD, 0x90, 0xA0, 0x5C, 0xE0, 0x90, \r
+0x01, 0x31, 0xF0, 0x90, 0xA0, 0x5D, 0xE0, 0x90, 0x01, 0x32, 0xF0, 0x90, 0xA0, 0x5E, 0xE0, 0x90, \r
+0x01, 0x33, 0xF0, 0x90, 0xA0, 0x57, 0xE0, 0x90, 0x01, 0x38, 0xF0, 0x90, 0xA0, 0x5A, 0xE0, 0x90, \r
+0x01, 0x3B, 0x91, 0xC6, 0x7F, 0x01, 0x51, 0x85, 0x7E, 0x00, 0x7F, 0xA8, 0x7D, 0x00, 0x7B, 0x01, \r
+0x7A, 0x9F, 0x79, 0xA3, 0x12, 0x08, 0xAA, 0x12, 0xAB, 0xE3, 0x12, 0x08, 0xAA, 0x90, 0x9F, 0xA6, \r
+0x74, 0x02, 0xF0, 0x90, 0x9F, 0xAD, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0x9F, \r
+0xB3, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0x12, 0xAB, 0xBA, 0xE4, 0xFD, 0xFF, 0x51, 0x1E, 0x7D, 0x0C, \r
+0x7F, 0x02, 0x51, 0x1E, 0x51, 0x1A, 0x90, 0x9E, 0x97, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x9F, 0xB2, \r
+0x74, 0xDD, 0xF0, 0x80, 0x12, 0x90, 0x9E, 0x97, 0xE0, 0x90, 0x9F, 0xB2, 0xB4, 0x03, 0x05, 0x74, \r
+0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x79, 0x12, 0x47, 0xAF, 0xEF, 0x54, 0x03, 0xFF, \r
+0xBF, 0x02, 0x0F, 0x7F, 0x28, 0x12, 0x47, 0xAF, 0xEF, 0x30, 0xE2, 0x06, 0x90, 0x9F, 0xDD, 0x74, \r
+0x02, 0xF0, 0x12, 0x9C, 0xF1, 0x74, 0x05, 0x12, 0xAB, 0xBA, 0x90, 0xA0, 0x56, 0xE0, 0x54, 0xFE, \r
+0xF0, 0x90, 0x01, 0x38, 0xE0, 0x90, 0xA0, 0x57, 0xF0, 0x90, 0x01, 0x39, 0xE0, 0x90, 0xA0, 0x58, \r
+0xF0, 0x90, 0x01, 0x3A, 0xE0, 0x90, 0xA0, 0x59, 0xF0, 0x90, 0x01, 0x3B, 0xE0, 0x90, 0xA0, 0x5A, \r
+0xF0, 0x90, 0x01, 0x30, 0xE0, 0x90, 0xA0, 0x5B, 0xF0, 0x90, 0x01, 0x31, 0xE0, 0x90, 0xA0, 0x5C, \r
+0xF0, 0x90, 0x01, 0x32, 0xE0, 0x90, 0xA0, 0x5D, 0xF0, 0x90, 0x01, 0x33, 0xE0, 0x90, 0xA0, 0x5E, \r
+0xF0, 0x7F, 0x01, 0x12, 0x8F, 0x8A, 0x7E, 0x00, 0x7F, 0x02, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA0, \r
+0x79, 0x4F, 0x12, 0x08, 0xAA, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0x12, 0xAC, 0xAA, 0x91, 0x93, \r
+0xE4, 0x90, 0xA0, 0x51, 0xF0, 0x22, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x38, 0xEF, 0xF0, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, \r
+0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, 0x01, 0xFF, 0x90, 0x9F, 0xA3, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, \r
+0x80, 0x0C, 0x90, 0x9F, 0xAA, 0xED, 0xF0, 0x80, 0x05, 0x90, 0x9F, 0xA9, 0xED, 0xF0, 0x12, 0x7E, \r
+0xE8, 0x30, 0xE4, 0x2C, 0x90, 0xA2, 0x38, 0xE0, 0x14, 0x60, 0x07, 0x14, 0x60, 0x18, 0x24, 0x02, \r
+0x70, 0x1E, 0x90, 0x9F, 0xA3, 0xE0, 0x12, 0xAC, 0xB3, 0xFF, 0x90, 0x9F, 0xAA, 0xE0, 0x54, 0x7F, \r
+0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, 0x9F, 0xA9, 0xE0, 0xFD, 0x7F, 0x89, 0x12, 0x46, 0xA0, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x39, 0xEF, 0xF0, 0x12, 0x64, 0xAA, 0x90, 0xA2, 0x39, \r
+0xE0, 0x60, 0x02, 0x91, 0x93, 0x7D, 0x04, 0xD1, 0xE8, 0x74, 0x04, 0xF0, 0x22, 0x7D, 0x01, 0x7F, \r
+0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x3A, 0xED, 0xF0, 0x90, 0x9F, 0xA3, \r
+0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x61, 0xE3, 0xEE, 0x12, 0x56, 0xE5, \r
+0x30, 0xE0, 0x02, 0x61, 0xE3, 0x90, 0x9F, 0xAA, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x61, 0xE3, 0xEF, \r
+0x70, 0x02, 0x61, 0x5D, 0x24, 0xFE, 0x70, 0x02, 0x61, 0x96, 0x24, 0xFE, 0x60, 0x47, 0x24, 0xFC, \r
+0x70, 0x02, 0x61, 0xD1, 0x24, 0xFC, 0x60, 0x02, 0x61, 0xE3, 0xEE, 0xB4, 0x0E, 0x02, 0x91, 0x19, \r
+0x90, 0x9F, 0xAA, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0x85, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, 0x06, \r
+0x02, 0x91, 0x3E, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, 0x04, 0x0D, 0x90, 0xA2, 0x3A, 0xE0, 0xFF, 0x60, \r
+0x04, 0xD1, 0xFD, 0x80, 0x02, 0xF1, 0x92, 0x90, 0x9F, 0xAA, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x61, \r
+0xE3, 0x91, 0x99, 0x61, 0xE3, 0x90, 0x9F, 0xAA, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0x85, 0x90, \r
+0x9F, 0xAA, 0xE0, 0xB4, 0x06, 0x02, 0x91, 0x3E, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, 0x0E, 0x07, 0x71, \r
+0xE8, 0xBF, 0x01, 0x02, 0x91, 0x19, 0x90, 0x9F, 0xAA, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x61, 0xE3, \r
+0x71, 0xE8, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x61, 0xE3, 0x91, 0x64, 0x61, 0xE3, 0x90, 0x9F, 0xAA, \r
+0xE0, 0xB4, 0x0E, 0x07, 0x71, 0xE8, 0xBF, 0x01, 0x02, 0x91, 0x19, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, \r
+0x06, 0x02, 0x91, 0x3E, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, 0x0C, 0x07, 0x71, 0xE8, 0xBF, 0x01, 0x02, \r
+0x91, 0x64, 0x90, 0x9F, 0xAA, 0xE0, 0x64, 0x04, 0x70, 0x59, 0x12, 0xA3, 0x9E, 0xEF, 0x64, 0x01, \r
+0x70, 0x51, 0x91, 0xA7, 0x80, 0x4D, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0xE8, 0xBF, \r
+0x01, 0x02, 0x91, 0x19, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, 0x06, 0x02, 0x91, 0x3E, 0x90, 0x9F, 0xAA, \r
+0xE0, 0xB4, 0x0C, 0x07, 0x71, 0xE8, 0xBF, 0x01, 0x02, 0x91, 0x64, 0x90, 0x9F, 0xAA, 0xE0, 0x70, \r
+0x04, 0x7F, 0x01, 0x51, 0x85, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, 0x04, 0x17, 0x12, 0xA9, 0xA2, 0x80, \r
+0x12, 0x90, 0x9F, 0xAA, 0xE0, 0xB4, 0x0C, 0x0B, 0x90, 0x9F, 0xA4, 0x12, 0x8D, 0x05, 0x30, 0xE0, \r
+0x02, 0xD1, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0x5F, 0xE0, 0x30, 0xE0, 0x0D, 0x90, \r
+0xA0, 0x65, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x80, 0x1A, 0x12, 0xA3, 0x35, 0xBF, \r
+0x01, 0x14, 0x12, 0xA9, 0x1F, 0x54, 0x1F, 0x20, 0xE0, 0x0C, 0x90, 0x9F, 0xA9, 0xE0, 0xD3, 0x94, \r
+0x04, 0x50, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x9F, 0xA4, 0xE0, 0xC3, 0x13, 0x20, \r
+0xE0, 0x04, 0x51, 0x1A, 0x80, 0x12, 0x12, 0xAA, 0xA5, 0xD1, 0xD4, 0x90, 0x05, 0x27, 0xE0, 0x44, \r
+0x80, 0xF0, 0x90, 0x9F, 0xA2, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x22, 0x90, 0x9F, \r
+0xA4, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x07, 0xE0, 0x44, 0x40, 0xD1, 0xD4, 0x80, 0x0F, 0x51, \r
+0x16, 0x90, 0x05, 0x27, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x9F, 0xA2, 0x74, 0x0C, 0xF0, 0xE4, 0xFD, \r
+0xFF, 0x02, 0x49, 0x22, 0xF1, 0x8C, 0x64, 0x01, 0x70, 0x22, 0x90, 0x9F, 0xA4, 0xE0, 0x54, 0xFD, \r
+0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x12, 0x49, 0x22, 0x12, 0x4C, 0x80, 0xBF, 0x01, 0x0E, 0x90, 0x9F, \r
+0xA3, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0xD1, 0xE8, 0x74, 0x0E, 0xF0, 0x22, 0xE4, 0xFD, 0x7F, \r
+0x0C, 0x51, 0xA1, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x22, 0x12, 0x64, 0xAA, 0x91, 0x93, 0x51, 0x1A, \r
+0x90, 0x9F, 0xA2, 0x74, 0x0C, 0xF0, 0x22, 0x7D, 0x2D, 0x12, 0x4C, 0x1E, 0x90, 0x01, 0x37, 0x74, \r
+0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x91, 0xD1, 0x12, 0x63, 0x05, 0xE4, 0xFD, 0x7F, 0x01, 0x51, 0x1E, \r
+0xE4, 0x90, 0x9F, 0xA2, 0xF0, 0x22, 0xF0, 0x7D, 0x01, 0x7F, 0x02, 0x91, 0xD1, 0x7D, 0x02, 0x7F, \r
+0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x02, 0x88, 0xB6, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x7F, 0xC2, 0x90, 0x05, 0x27, 0xE0, 0xF5, 0x54, 0x12, 0x8F, \r
+0xC9, 0x90, 0x9F, 0x9E, 0x12, 0x6F, 0x44, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x12, 0x6D, 0x2E, 0xFF, \r
+0x90, 0x9F, 0x9E, 0x12, 0x6F, 0x7C, 0x12, 0x6F, 0xB4, 0x12, 0x6F, 0x8D, 0x90, 0x9F, 0x9E, 0x12, \r
+0x9F, 0x77, 0x12, 0x6F, 0xB4, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0x90, 0x9F, 0x9E, \r
+0xF0, 0xEE, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0xA1, 0xB3, 0xE0, 0x30, 0xE0, 0x74, 0x12, 0x88, 0xCC, \r
+0x75, 0x54, 0x21, 0x12, 0xAC, 0xD7, 0x30, 0xE0, 0x04, 0xD1, 0x60, 0x80, 0x0C, 0xE4, 0x90, 0x9F, \r
+0x9F, 0xF0, 0xA3, 0xF0, 0x7D, 0x40, 0xFF, 0xF1, 0xAB, 0x90, 0x9F, 0x9E, 0xE0, 0xD1, 0xCD, 0x30, \r
+0xE0, 0x03, 0x43, 0x54, 0x12, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x14, 0x90, \r
+0x9F, 0x9E, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x80, 0x90, 0x9F, 0x9E, \r
+0x12, 0x4F, 0xD3, 0x20, 0xE0, 0x03, 0x43, 0x54, 0x40, 0xD1, 0x59, 0x90, 0x9F, 0xA1, 0xE0, 0x70, \r
+0x05, 0x7F, 0x01, 0x12, 0x84, 0x59, 0x12, 0x6F, 0xA1, 0x30, 0xE0, 0x04, 0x7F, 0x04, 0x80, 0x0C, \r
+0x12, 0x82, 0xF0, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0x84, 0x59, 0xC1, \r
+0x22, 0xD1, 0x56, 0x90, 0x9F, 0xA1, 0xE0, 0x64, 0x04, 0x60, 0x02, 0xC1, 0x51, 0xFF, 0x12, 0x84, \r
+0x59, 0xC1, 0x51, 0x90, 0x9F, 0x9E, 0xE0, 0x30, 0xE0, 0x70, 0x12, 0x88, 0xCC, 0x43, 0x54, 0x31, \r
+0x12, 0xAC, 0xD7, 0x30, 0xE0, 0x04, 0xD1, 0x60, 0x80, 0x06, 0x7D, 0x40, 0xE4, 0xFF, 0xF1, 0xAB, \r
+0x90, 0x9F, 0x9E, 0xE0, 0xD1, 0xCD, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x02, 0xEF, 0xC4, 0x54, 0x0F, \r
+0x30, 0xE0, 0x03, 0x43, 0x54, 0x04, 0xD1, 0x59, 0x12, 0x6F, 0xA1, 0x30, 0xE0, 0x0B, 0x12, 0xA2, \r
+0xFD, 0x60, 0x2F, 0xE4, 0xFD, 0x7F, 0x02, 0x80, 0x1D, 0xF1, 0xD6, 0x90, 0x9F, 0xA2, 0xE0, 0xB4, \r
+0x02, 0x18, 0xD1, 0xDB, 0x12, 0x82, 0xF0, 0xBF, 0x01, 0x09, 0x90, 0x9F, 0xA9, 0xE0, 0xFF, 0x7D, \r
+0x01, 0x80, 0x03, 0xE4, 0xFD, 0xFF, 0x51, 0xA1, 0x80, 0x08, 0x90, 0x9F, 0xAA, 0xE0, 0x90, 0x9F, \r
+0xA2, 0xF0, 0x90, 0x05, 0x40, 0x74, 0x22, 0xF0, 0x80, 0x27, 0xD1, 0x56, 0x90, 0x9F, 0xA2, 0xE0, \r
+0xB4, 0x02, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, 0x9F, 0xA2, 0xE0, 0xB4, 0x08, 0x06, \r
+0x7D, 0x01, 0x7F, 0x0C, 0x51, 0xA1, 0x12, 0xA3, 0x4E, 0x90, 0x9F, 0xA9, 0xF1, 0xEE, 0x12, 0xA8, \r
+0x8C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0x54, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x22, \r
+0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x91, 0xD1, 0x43, 0x54, 0x08, 0x22, 0x90, \r
+0xA0, 0x5F, 0xE0, 0x20, 0xE0, 0x1D, 0x90, 0x9F, 0xA7, 0xE0, 0x64, 0x01, 0x70, 0x15, 0x12, 0x84, \r
+0x33, 0x12, 0x69, 0x3A, 0x60, 0x05, 0x91, 0x8D, 0x02, 0xA8, 0xE1, 0x90, 0x9F, 0xAA, 0xE0, 0x70, \r
+0x02, 0x51, 0x9D, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, \r
+0xFF, 0x91, 0xD1, 0x7D, 0x02, 0x7F, 0x03, 0x91, 0xD1, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0x12, \r
+0xAC, 0x3E, 0xE4, 0xFF, 0xF1, 0x2F, 0xBF, 0x01, 0x10, 0x12, 0x8C, 0xF1, 0x90, 0x9F, 0xAA, 0xE0, \r
+0x20, 0xE2, 0x09, 0x7D, 0x01, 0x7F, 0x04, 0x41, 0xA1, 0x12, 0xAB, 0xFA, 0x22, 0xFF, 0x13, 0x13, \r
+0x13, 0x54, 0x1F, 0x22, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0x41, 0x1E, 0x91, 0x93, 0xD1, 0xD5, 0xF1, \r
+0xD6, 0x90, 0x9F, 0xA2, 0x74, 0x04, 0xF0, 0x22, 0x7F, 0x01, 0x51, 0x1E, 0x90, 0x9F, 0xA2, 0x22, \r
+0x7D, 0x2F, 0x12, 0x63, 0x00, 0x7D, 0x08, 0xD1, 0xE8, 0x74, 0x08, 0xF0, 0x22, 0xEF, 0x60, 0x2E, \r
+0xF1, 0x8C, 0x64, 0x01, 0x70, 0x28, 0x90, 0x9F, 0xA4, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x2B, 0x7F, \r
+0x0F, 0x12, 0x49, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xF1, 0xE5, 0xBF, 0x01, 0x0E, \r
+0x90, 0x9F, 0xA3, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0xD1, 0xE8, 0x74, 0x06, 0xF0, 0x22, 0x12, \r
+0x86, 0xD3, 0xFE, 0xEF, 0x54, 0x07, 0xFF, 0x12, 0x62, 0x14, 0xE0, 0xFD, 0x7C, 0x00, 0x12, 0x7C, \r
+0xC7, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, \r
+0x5D, 0x4E, 0x7F, 0x00, 0x60, 0x02, 0x7F, 0x01, 0x22, 0xEF, 0x70, 0x2E, 0x7D, 0x78, 0x7F, 0x02, \r
+0xF1, 0xAB, 0x7D, 0x02, 0x7F, 0x03, 0xF1, 0xAB, 0x7D, 0xC8, 0x7F, 0x02, 0x12, 0x88, 0xAD, 0x12, \r
+0x82, 0xC4, 0xF1, 0x8C, 0x70, 0x05, 0x12, 0xAB, 0x6D, 0x80, 0x06, 0x7D, 0x01, 0x7F, 0x0C, 0x51, \r
+0xA1, 0x90, 0x9F, 0xA3, 0xE0, 0x54, 0xF7, 0x02, 0xAC, 0xAA, 0xC1, 0x94, 0xE4, 0xFF, 0xF1, 0x2F, \r
+0xEF, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x91, 0x93, 0x7D, 0x0C, 0x7F, 0x01, 0x41, \r
+0x1E, 0x7D, 0x02, 0x7F, 0x02, 0xF1, 0xAB, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x12, 0xAD, 0x31, \r
+0xFE, 0xF6, 0x74, 0x30, 0x02, 0x88, 0xB6, 0x12, 0xA8, 0xE1, 0x90, 0x9F, 0xAA, 0xE0, 0x64, 0x0C, \r
+0x60, 0x04, 0x91, 0x8D, 0xF1, 0xE5, 0x22, 0x91, 0x93, 0x90, 0x9F, 0xA1, 0x74, 0x01, 0xF0, 0x22, \r
+0x91, 0x93, 0xF1, 0xD6, 0x80, 0xF3, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x12, 0x64, \r
+0xAA, 0x91, 0x93, 0x80, 0xE4, 0x7D, 0x08, 0xE4, 0xFF, 0x02, 0x4C, 0x8B, 0x80, 0xDB, 0xE0, 0xFF, \r
+0x7D, 0x01, 0x41, 0xA1, 0x75, 0xE8, 0x07, 0x75, 0xA8, 0x85, 0x22, 0x7F, 0x81, 0x12, 0x47, 0xAF, \r
+0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81, 0x12, 0x46, 0xA0, 0x7F, 0x80, 0x12, 0x47, 0xF7, 0xFD, 0x7F, \r
+0x80, 0x12, 0x46, 0xA0, 0x12, 0xA1, 0xE0, 0x12, 0x3E, 0x11, 0x51, 0x7C, 0x12, 0xA2, 0x21, 0x7F, \r
+0x01, 0x12, 0x43, 0xA5, 0x90, 0xA0, 0xC0, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x43, 0xA5, 0x90, 0xA0, \r
+0xC0, 0xE0, 0x04, 0xF0, 0x12, 0x58, 0x0F, 0x11, 0x93, 0x7F, 0x80, 0x12, 0xAD, 0x39, 0x7F, 0x80, \r
+0x12, 0x46, 0xA0, 0x75, 0x28, 0xFF, 0x12, 0x5F, 0xF4, 0x12, 0x96, 0x89, 0x7B, 0x01, 0x7A, 0xA0, \r
+0x79, 0xF0, 0x51, 0xBC, 0xEF, 0x64, 0x01, 0x70, 0x22, 0x90, 0xA0, 0xF0, 0xE0, 0x54, 0x07, 0xF0, \r
+0xE0, 0xFF, 0x64, 0x07, 0x60, 0x04, 0xEF, 0xB4, 0x04, 0x11, 0x12, 0xA1, 0x91, 0xBF, 0x01, 0x0B, \r
+0x12, 0xAC, 0xA1, 0x44, 0x60, 0xFD, 0x7F, 0x16, 0x12, 0x46, 0xA0, 0x7F, 0x81, 0x12, 0x47, 0xAF, \r
+0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x12, 0x46, 0xA0, 0x12, 0xA2, 0x2B, 0x51, 0x9A, 0xE4, 0xFF, \r
+0x02, 0x44, 0x2E, 0x31, 0xD0, 0x12, 0xA0, 0x19, 0x12, 0x55, 0x3E, 0x12, 0xA8, 0x8C, 0x12, 0x59, \r
+0x28, 0x51, 0x76, 0x12, 0xA7, 0x11, 0x7E, 0x00, 0x7F, 0x19, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA0, \r
+0x79, 0x91, 0x12, 0x08, 0xAA, 0x12, 0x9E, 0x7A, 0x90, 0xA0, 0x98, 0x12, 0x45, 0x71, 0x90, 0xA0, \r
+0x94, 0x12, 0x08, 0x6D, 0x90, 0x9E, 0x97, 0xE0, 0xFF, 0x64, 0x02, 0x70, 0x22, 0x31, 0xC1, 0x30, \r
+0xE0, 0x02, 0x7E, 0x01, 0x90, 0xA0, 0xA0, 0xEE, 0xF0, 0x31, 0xC1, 0x30, 0xE1, 0x02, 0x7E, 0x01, \r
+0x90, 0xA0, 0xA1, 0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x90, 0x02, 0xFB, 0xF0, 0x80, 0x3A, 0xEF, \r
+0x64, 0x01, 0x70, 0x15, 0x31, 0x5A, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0xA0, 0xA0, 0xEF, 0xF0, \r
+0x31, 0x5A, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x80, 0x1B, 0x90, 0x9E, 0x97, 0xE0, 0x64, 0x03, 0x70, \r
+0x18, 0x31, 0x53, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0xA0, 0xA0, 0xEF, 0xF0, 0x31, 0x53, 0x30, \r
+0xE1, 0x02, 0x7F, 0x01, 0x90, 0xA0, 0xA1, 0xEF, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x02, 0xF0, \r
+0x7F, 0x01, 0x51, 0xC3, 0x31, 0x61, 0x12, 0x9B, 0xD6, 0x90, 0xA0, 0x78, 0x74, 0x01, 0xF0, 0x90, \r
+0xA0, 0xAD, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x04, 0x8F, 0xE4, 0xF0, 0x90, 0xA0, 0xBF, 0xE0, 0x54, \r
+0xFE, 0xF0, 0x22, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x22, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, \r
+0x22, 0x7E, 0x00, 0x7F, 0x32, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0x5F, 0x12, 0x08, 0xAA, \r
+0x90, 0xA0, 0x60, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0x9E, 0x97, 0xE0, 0xFC, 0x64, \r
+0x02, 0x70, 0x14, 0x31, 0xC1, 0x30, 0xE2, 0x02, 0x7E, 0x01, 0xEE, 0x31, 0xC8, 0xFE, 0x90, 0xA0, \r
+0x62, 0xE0, 0x54, 0xBF, 0x4E, 0xF0, 0x22, 0xEC, 0x64, 0x01, 0x70, 0x09, 0x31, 0x5A, 0x30, 0xE2, \r
+0x02, 0x7F, 0x01, 0x80, 0x0F, 0x90, 0x9E, 0x97, 0xE0, 0x64, 0x03, 0x70, 0x13, 0x31, 0x53, 0x30, \r
+0xE2, 0x02, 0x7F, 0x01, 0xEF, 0x31, 0xC8, 0xFF, 0x90, 0xA0, 0x62, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, \r
+0x22, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x22, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0x22, \r
+0xE4, 0xFD, 0xFF, 0x12, 0x86, 0xD3, 0xFE, 0xEF, 0x54, 0x07, 0xFF, 0xED, 0x70, 0x12, 0x51, 0x14, \r
+0xC0, 0x83, 0xC0, 0x82, 0x51, 0x0C, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5E, 0x80, 0x0F, \r
+0x51, 0x14, 0xC0, 0x83, 0xC0, 0x82, 0x51, 0x0C, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4E, 0xD0, \r
+0x82, 0xD0, 0x83, 0xF0, 0x51, 0x1F, 0x90, 0x9F, 0x9C, 0xEF, 0xF0, 0x22, 0xE0, 0xFE, 0x74, 0x01, \r
+0xA8, 0x07, 0x08, 0x22, 0x74, 0x8C, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0x22, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7D, 0x10, 0xED, 0x14, 0xF9, 0x24, 0x8C, 0x51, 0x17, 0xE0, \r
+0x60, 0x3B, 0x7C, 0x08, 0xEC, 0x14, 0x90, 0xA2, 0x34, 0xF0, 0x74, 0x8C, 0x29, 0x51, 0x17, 0xE0, \r
+0xFB, 0x7A, 0x00, 0x90, 0xA2, 0x34, 0x12, 0x7C, 0xC5, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, \r
+0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5A, 0xFE, 0xEF, 0x5B, 0x4E, 0x60, 0x0F, 0xE9, 0x75, 0xF0, 0x08, \r
+0xA4, 0xFF, 0x90, 0xA2, 0x34, 0xE0, 0x2F, 0x04, 0xFF, 0x80, 0x06, 0xDC, 0xC7, 0xDD, 0xB9, 0x7F, \r
+0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0xAB, 0xE3, 0x02, 0x08, 0xAA, 0x90, 0x01, 0x01, 0xE0, \r
+0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x12, 0x96, 0xF8, 0x90, 0x01, 0x99, 0xE0, \r
+0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, 0x22, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xF1, \r
+0x51, 0xBC, 0xBF, 0x01, 0x16, 0x90, 0xA0, 0xF1, 0xE0, 0x54, 0x30, 0xFF, 0xBF, 0x20, 0x07, 0x90, \r
+0xA0, 0xEE, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0xEE, 0xF0, 0x22, 0x7F, 0xFB, 0x7E, 0x01, \r
+0x02, 0x34, 0xC1, 0x90, 0xA0, 0x84, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, \r
+0x07, 0x78, 0x74, 0x09, 0xF0, 0x22, 0x90, 0xA0, 0xBF, 0xE0, 0x30, 0xE0, 0x1D, 0xEF, 0x24, 0xFD, \r
+0x60, 0x0E, 0x24, 0xFA, 0x60, 0x0E, 0x24, 0xFC, 0x60, 0x0E, 0x24, 0x0C, 0x7F, 0x02, 0x80, 0x0A, \r
+0x7F, 0x03, 0x80, 0x06, 0x7F, 0x0B, 0x80, 0x02, 0x7F, 0x0E, 0x90, 0x07, 0x78, 0xEF, 0xF0, 0x22, \r
+0x7F, 0xFF, 0x12, 0x49, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x4C, 0x22, 0x91, \r
+0xA3, 0x91, 0x8D, 0x91, 0x8D, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x12, 0x46, 0xA0, 0x90, 0x01, 0x00, \r
+0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0x12, 0x9D, \r
+0x47, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x04, 0x7F, 0x01, 0x51, 0xC3, 0x12, 0x9D, 0x3F, 0x30, 0xE0, \r
+0x31, 0x90, 0xA0, 0xA0, 0xE0, 0x60, 0x08, 0x90, 0xA2, 0x2A, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, \r
+0x90, 0xA2, 0x2A, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA2, 0x2B, \r
+0xF0, 0x80, 0x06, 0x90, 0xA2, 0x2B, 0x74, 0x02, 0xF0, 0x90, 0xA2, 0x2A, 0x71, 0x7F, 0x7F, 0x01, \r
+0x51, 0xC3, 0x90, 0xA0, 0x4F, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, \r
+0xFF, 0xA3, 0xE0, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x26, 0x8D, 0x27, 0x90, \r
+0xA0, 0x62, 0x12, 0x4F, 0xD3, 0x30, 0xE0, 0x02, 0x81, 0x74, 0x90, 0xA0, 0xA1, 0xE0, 0x70, 0x57, \r
+0xE5, 0x26, 0x64, 0x02, 0x60, 0x23, 0xE5, 0x27, 0x70, 0x1F, 0x91, 0x79, 0xE5, 0x26, 0x90, 0xA1, \r
+0xC5, 0xB4, 0x01, 0x05, 0x12, 0x45, 0x71, 0x80, 0x08, 0x12, 0xAD, 0x29, 0xEE, 0x44, 0x02, 0xFE, \r
+0xEC, 0x91, 0x87, 0x12, 0x47, 0xCB, 0x12, 0x47, 0xD6, 0xE5, 0x27, 0x64, 0x02, 0x70, 0x02, 0x81, \r
+0x74, 0xE5, 0x27, 0x70, 0x02, 0x81, 0x74, 0x91, 0x79, 0x90, 0xA0, 0xA0, 0xE0, 0x90, 0xA1, 0xC5, \r
+0x60, 0x05, 0x12, 0xAD, 0x29, 0x80, 0x07, 0x12, 0x45, 0x71, 0xEE, 0x44, 0x02, 0xFE, 0x91, 0x86, \r
+0x12, 0x47, 0xCB, 0x7F, 0x48, 0x80, 0x78, 0xE5, 0x26, 0x64, 0x02, 0x60, 0x23, 0x12, 0xAB, 0x8D, \r
+0x91, 0x86, 0xE5, 0x26, 0x90, 0xA1, 0xC5, 0xB4, 0x01, 0x08, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x01, \r
+0x80, 0x06, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x02, 0xFF, 0x91, 0x86, 0x12, 0x47, 0xCB, 0xF1, 0xD1, \r
+0xE5, 0x27, 0x64, 0x02, 0x60, 0x4E, 0x12, 0x97, 0x6E, 0xE4, 0xFF, 0x91, 0x86, 0xE5, 0x27, 0x70, \r
+0x0A, 0x12, 0xAD, 0x21, 0x44, 0x77, 0xFF, 0x91, 0x86, 0x80, 0x2F, 0x12, 0xAD, 0x21, 0x44, 0x66, \r
+0xFF, 0x91, 0x86, 0x12, 0xAB, 0x8D, 0xF1, 0xD8, 0x90, 0xA0, 0xA0, 0xE0, 0x90, 0xA1, 0xC9, 0x60, \r
+0x08, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x02, 0x80, 0x06, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x01, 0xFF, \r
+0xF1, 0xD8, 0x90, 0xA1, 0xC9, 0x12, 0x47, 0xCE, 0xF1, 0xD1, 0x12, 0x47, 0xCB, 0x7F, 0x30, 0x7E, \r
+0x09, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, \r
+0xE4, 0xFF, 0xEE, 0x54, 0xF0, 0xFE, 0xEC, 0x90, 0xA1, 0xC5, 0x02, 0x08, 0x6D, 0x54, 0xFE, 0xFD, \r
+0x7F, 0x02, 0x12, 0x46, 0xA0, 0x7F, 0x02, 0x12, 0x47, 0xAF, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, \r
+0x12, 0x46, 0xA0, 0x7F, 0x02, 0x12, 0x47, 0xAF, 0xEF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, \r
+0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0x12, 0x9D, 0x47, 0x13, 0x54, 0x1F, 0x30, \r
+0xE0, 0x04, 0x7F, 0x03, 0x51, 0xC3, 0x90, 0xA0, 0x7A, 0xE0, 0x20, 0xE0, 0x31, 0x12, 0x9D, 0x3F, \r
+0x30, 0xE0, 0x2B, 0x90, 0xA0, 0xA0, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA2, 0x28, 0xF0, 0x80, 0x06, \r
+0x90, 0xA2, 0x28, 0x74, 0x01, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x07, 0x90, 0xA2, 0x29, 0x30, 0xE0, \r
+0x05, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA2, 0x28, 0x71, 0x7F, 0x91, 0xA3, \r
+0x44, 0x01, 0xFD, 0x7F, 0x02, 0x12, 0x46, 0xA0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xF0, 0xEF, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0xFF, 0x12, \r
+0x8A, 0x84, 0x90, 0xA0, 0x63, 0x12, 0x8D, 0x05, 0x30, 0xE0, 0x02, 0x91, 0xAA, 0x90, 0xA0, 0x63, \r
+0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x01, 0x80, 0x37, 0x90, 0xA0, 0x5F, 0x12, 0x4F, 0xD3, 0x30, 0xE0, \r
+0x04, 0x7F, 0x0D, 0x80, 0x2A, 0x90, 0xA0, 0x62, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x10, \r
+0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x04, 0x7F, 0x09, 0x80, 0x13, 0x7F, 0x03, 0x80, 0x0F, \r
+0x90, 0xA0, 0x62, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x02, 0x7F, 0x09, 0x51, \r
+0xC3, 0x90, 0xA1, 0xF0, 0xE0, 0x64, 0x03, 0x70, 0x6B, 0x12, 0x4F, 0xD0, 0x30, 0xE0, 0x60, 0x90, \r
+0xA0, 0x69, 0xE0, 0xFF, 0x90, 0xA0, 0x74, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x37, 0xEE, 0x75, 0xF0, \r
+0x03, 0xA4, 0xFF, 0x90, 0xA0, 0x6B, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0xFF, 0x24, 0x03, 0xFD, 0xE4, \r
+0x33, 0xFC, 0x90, 0xA0, 0x61, 0xE0, 0xFE, 0xD3, 0x9D, 0xEC, 0x12, 0xAB, 0xF3, 0x40, 0x08, 0xEE, \r
+0x9F, 0x90, 0xA1, 0xF3, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xF3, 0x74, 0x03, 0xF0, 0x90, 0xA1, 0xF3, \r
+0xF1, 0x98, 0x80, 0x14, 0x90, 0xA0, 0x6C, 0xE0, 0xFF, 0xD1, 0xEC, 0x90, 0xA0, 0x67, 0x74, 0x04, \r
+0xF0, 0xE4, 0x90, 0xA0, 0x72, 0x12, 0x8E, 0xBF, 0xE4, 0x90, 0xA0, 0x74, 0xF0, 0x80, 0x05, 0x90, \r
+0xA0, 0x61, 0xF1, 0x98, 0x90, 0xA0, 0x5F, 0x12, 0x56, 0xE4, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA1, \r
+0xF2, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xF2, 0x74, 0x01, 0xF0, 0x12, 0x9B, 0xCD, 0x20, 0xE0, 0x13, \r
+0x90, 0xA0, 0xA0, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA1, 0xF1, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xF1, \r
+0x74, 0x01, 0xF0, 0x90, 0xA1, 0xF1, 0x71, 0x7F, 0x90, 0xA0, 0x71, 0x74, 0x01, 0xF0, 0x12, 0x9B, \r
+0xC4, 0x30, 0xE0, 0x0D, 0x90, 0xA1, 0xF0, 0xE0, 0x70, 0x3B, 0xFD, 0xFF, 0x12, 0x49, 0x22, 0x80, \r
+0x34, 0x12, 0x9B, 0xB3, 0x30, 0xE0, 0x1A, 0x90, 0xA0, 0x65, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0xA0, \r
+0x51, 0xE0, 0x60, 0x04, 0x7D, 0x01, 0x80, 0x18, 0x12, 0x5C, 0x93, 0x7D, 0x01, 0x7F, 0x0C, 0x80, \r
+0x11, 0x90, 0xA1, 0xF0, 0xE0, 0xB4, 0x03, 0x0D, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x07, 0xE4, 0xFD, \r
+0x7F, 0x04, 0x12, 0x5A, 0xA1, 0x90, 0xA0, 0x51, 0xE0, 0x60, 0x18, 0x90, 0xA1, 0xF0, 0xE0, 0x70, \r
+0x04, 0x7D, 0x04, 0x80, 0x0A, 0x90, 0xA1, 0xF0, 0xE0, 0x64, 0x03, 0x70, 0x31, 0x7D, 0x0B, 0x7F, \r
+0x6F, 0x80, 0x28, 0x90, 0xA1, 0xF0, 0xE0, 0x70, 0x04, 0xFD, 0xFF, 0x80, 0x1E, 0x90, 0xA1, 0xF0, \r
+0xE0, 0xB4, 0x03, 0x1A, 0x90, 0xA0, 0x5F, 0x12, 0x8F, 0xB4, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, \r
+0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x6F, 0xDF, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x22, 0x90, 0xA0, \r
+0x62, 0x12, 0x56, 0xE4, 0x30, 0xE0, 0x05, 0x7F, 0x01, 0x12, 0x97, 0xC6, 0x90, 0xA0, 0x63, 0xE0, \r
+0xC3, 0x13, 0x30, 0xE0, 0x0E, 0x90, 0x06, 0xCD, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x06, 0xCF, 0xE0, \r
+0x44, 0x10, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0xC3, 0x9F, 0xFF, 0xE4, 0x90, 0xA1, 0xD9, \r
+0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x02, 0x48, 0x34, 0xAD, 0x07, \r
+0xED, 0x70, 0x19, 0xF1, 0x87, 0x70, 0x02, 0x80, 0x17, 0xBC, 0x01, 0x02, 0x80, 0x19, 0xF1, 0x87, \r
+0xBC, 0x02, 0x02, 0x80, 0x1B, 0xEC, 0x64, 0x03, 0x70, 0x21, 0x80, 0x1B, 0xF1, 0x8F, 0x70, 0x04, \r
+0x7F, 0x01, 0x80, 0x15, 0xBC, 0x01, 0x04, 0x7F, 0x03, 0x80, 0x0E, 0xF1, 0x8F, 0xBC, 0x02, 0x04, \r
+0x7F, 0x09, 0x80, 0x05, 0xBC, 0x03, 0x04, 0x7F, 0x0D, 0x51, 0xC3, 0x90, 0xA0, 0xAD, 0xE0, 0xC4, \r
+0x13, 0x54, 0x07, 0x30, 0xE0, 0x39, 0xED, 0x70, 0x1B, 0xA3, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, \r
+0xE0, 0x07, 0xE4, 0x90, 0xA1, 0x2B, 0xF0, 0x80, 0x02, 0xF1, 0x80, 0x90, 0xA1, 0x2B, 0xE0, 0xFD, \r
+0xE4, 0xFF, 0x80, 0x19, 0x90, 0xA0, 0xAE, 0x12, 0x4F, 0xD3, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA1, \r
+0x2B, 0xF0, 0x80, 0x02, 0xF1, 0x80, 0x90, 0xA1, 0x2B, 0xE0, 0xFD, 0x7F, 0x01, 0x71, 0x84, 0x22, \r
+0x90, 0xA1, 0x2B, 0x74, 0x01, 0xF0, 0x22, 0x90, 0xA0, 0xAE, 0xE0, 0x54, 0x03, 0xFC, 0x22, 0x90, \r
+0xA0, 0xAE, 0xE0, 0xC4, 0x54, 0x03, 0xFC, 0x22, 0xE0, 0xFF, 0xD1, 0xEC, 0x90, 0xA0, 0x72, 0xE0, \r
+0x04, 0xF0, 0x22, 0x7D, 0x12, 0x7F, 0xFF, 0x12, 0x49, 0x22, 0x7F, 0x01, 0x51, 0xC3, 0x12, 0x97, \r
+0x7D, 0x61, 0x84, 0x90, 0xA0, 0x7A, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xE1, 0xF0, 0x90, 0xA0, 0x7F, \r
+0xE0, 0xFF, 0x51, 0xC3, 0x90, 0xA0, 0x80, 0x71, 0x7F, 0x91, 0xAA, 0xE4, 0xFD, 0xFF, 0x02, 0x49, \r
+0x22, 0x7F, 0x2C, 0x7E, 0x09, 0x02, 0x38, 0x45, 0xEC, 0x90, 0xA1, 0xC9, 0x02, 0x08, 0x6D, 0x7D, \r
+0x20, 0x71, 0x00, 0x90, 0x9F, 0xA1, 0x74, 0x02, 0xF0, 0x22, 0x71, 0x05, 0x80, 0xF5, 0xE4, 0x90, \r
+0xA0, 0xF3, 0xF0, 0x90, 0xA0, 0xF3, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xEE, 0x90, 0x01, 0xC4, 0xF0, \r
+0x74, 0x67, 0xA3, 0xF0, 0x12, 0x3E, 0x44, 0xBF, 0x01, 0x03, 0x12, 0x31, 0xFC, 0xC2, 0xAF, 0x90, \r
+0x9F, 0xA7, 0xE0, 0x60, 0x0E, 0x90, 0x9F, 0xAA, 0xE0, 0xFF, 0x90, 0x9F, 0xA9, 0xE0, 0x6F, 0x60, \r
+0x02, 0x11, 0x44, 0xC2, 0xAF, 0x12, 0xA1, 0xED, 0xBF, 0x01, 0x03, 0x12, 0x95, 0x3F, 0xD2, 0xAF, \r
+0xD2, 0xAF, 0x90, 0xA0, 0xEE, 0xE0, 0xB4, 0x01, 0x03, 0x12, 0xA8, 0x12, 0x12, 0x4F, 0xFE, 0x12, \r
+0x42, 0xDD, 0x80, 0xAF, 0x90, 0x9F, 0x9E, 0xE0, 0x90, 0x9F, 0xA9, 0x30, 0xE0, 0x05, 0xE0, 0xFF, \r
+0x02, 0xA8, 0xC3, 0x02, 0x5F, 0xEE, 0xE4, 0xFF, 0x12, 0x5F, 0x2F, 0xBF, 0x01, 0x0E, 0x90, 0x9F, \r
+0xA7, 0xE0, 0x60, 0x08, 0x11, 0x6D, 0x54, 0x07, 0x70, 0x02, 0x11, 0x44, 0x22, 0x90, 0x9F, 0xAB, \r
+0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xE4, 0xF5, 0x63, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x63, 0x54, 0xC0, \r
+0x70, 0x07, 0x11, 0x6D, 0x54, 0xFD, 0xF0, 0x80, 0xBB, 0xE5, 0x63, 0x30, 0xE6, 0x17, 0x90, 0x9F, \r
+0xA7, 0xE0, 0x64, 0x01, 0x70, 0x11, 0x31, 0x33, 0x64, 0x02, 0x60, 0x04, 0xF1, 0xDF, 0x80, 0x07, \r
+0x12, 0x5F, 0xB7, 0x80, 0x02, 0x11, 0x6D, 0xE5, 0x63, 0x90, 0x9F, 0xAB, 0x30, 0xE7, 0x0D, 0xF1, \r
+0xBA, 0x12, 0x48, 0x2C, 0x90, 0x9F, 0xA3, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, \r
+0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0xA1, 0x1D, 0xF0, 0xE0, 0xFD, 0x54, 0xC0, 0x70, 0x04, 0x11, \r
+0x6D, 0x80, 0x5C, 0xED, 0x30, 0xE6, 0x3E, 0x90, 0x9F, 0xA7, 0xE0, 0x64, 0x02, 0x70, 0x27, 0x90, \r
+0x9F, 0xA3, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x09, 0x90, 0x9F, 0xAB, 0xE0, 0x44, 0x01, 0xF0, \r
+0x80, 0x1A, 0x31, 0x3A, 0x64, 0x01, 0x70, 0x1F, 0x90, 0x9F, 0xAB, 0xE0, 0x44, 0x04, 0xF0, 0x7F, \r
+0x01, 0x12, 0x4D, 0xD5, 0x80, 0x11, 0x31, 0x33, 0x64, 0x02, 0x60, 0x04, 0xF1, 0xDF, 0x80, 0x07, \r
+0x12, 0x5F, 0xB7, 0x80, 0x02, 0x11, 0x6D, 0x90, 0xA1, 0x1D, 0xE0, 0x90, 0x9F, 0xAB, 0x30, 0xE7, \r
+0x0D, 0xF1, 0xBA, 0x12, 0x48, 0x2C, 0x90, 0x9F, 0xA3, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, \r
+0xFD, 0xF0, 0x22, 0x90, 0x9F, 0xAB, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x9F, 0xA5, 0xE0, 0x54, 0x0F, \r
+0x22, 0xF1, 0x66, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x7F, 0x90, 0x9F, 0xA7, 0xF0, 0xEF, 0x12, 0x56, \r
+0xE5, 0xA3, 0x51, 0x86, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x9F, 0xA5, 0xE0, 0x54, \r
+0xF0, 0x4E, 0xF0, 0x12, 0x57, 0x09, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0x9F, 0xA3, 0xE0, 0x54, \r
+0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x31, 0x3A, 0x12, 0x56, 0xDC, 0x90, \r
+0x9F, 0xA6, 0xF0, 0x51, 0x80, 0x30, 0xE0, 0x52, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, \r
+0x90, 0x9F, 0xBA, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x2A, 0x74, 0x03, 0xF0, 0x51, 0x73, 0xE9, 0x24, \r
+0x06, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0xFF, 0x74, 0x03, 0x24, 0xFD, 0xFE, 0xEF, 0xC4, \r
+0x54, 0x0F, 0xFD, 0xEF, 0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F, 0xFE, 0xC4, 0x54, 0xF0, 0x4F, \r
+0x12, 0x06, 0xCF, 0x51, 0x73, 0x51, 0x80, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x9F, \r
+0xAF, 0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x51, 0x73, 0xB1, 0x28, 0xFD, 0x7F, \r
+0x02, 0x12, 0x5A, 0x1E, 0x51, 0x73, 0x51, 0x7A, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA0, 0x50, 0xF1, \r
+0x44, 0xFF, 0x51, 0x79, 0xB1, 0x2E, 0xFF, 0x90, 0xA0, 0x50, 0xF1, 0x7C, 0x4E, 0xFF, 0x51, 0x79, \r
+0xF1, 0x8D, 0x90, 0xA0, 0x50, 0x12, 0x9F, 0x77, 0x4E, 0xFF, 0x51, 0x79, 0xF1, 0x3D, 0x4E, 0x90, \r
+0xA0, 0x50, 0xF0, 0xF1, 0xA4, 0x20, 0xE0, 0x29, 0xEF, 0xC3, 0x13, 0x20, 0xE0, 0x0B, 0x75, 0x52, \r
+0x01, 0x90, 0xA0, 0xA0, 0xE0, 0x60, 0x0B, 0x80, 0x0E, 0xE4, 0xF5, 0x52, 0x90, 0xA0, 0xA0, 0xE0, \r
+0x60, 0x05, 0xE4, 0xF5, 0x51, 0x80, 0x03, 0x75, 0x51, 0x01, 0xAD, 0x52, 0xAF, 0x51, 0x12, 0x63, \r
+0x84, 0x51, 0x73, 0x90, 0xA1, 0x04, 0x12, 0x45, 0xBE, 0x12, 0xA9, 0x27, 0x90, 0x9F, 0xA7, 0xE0, \r
+0xFF, 0x12, 0x5F, 0x59, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x12, 0x90, 0xA1, 0x04, 0x12, 0x45, 0xB5, \r
+0x51, 0x87, 0x54, 0x0F, 0xFF, 0x12, 0x56, 0xDE, 0xFD, 0x12, 0xA9, 0x4C, 0x22, 0x90, 0xA1, 0x01, \r
+0x12, 0x45, 0xBE, 0x90, 0xA1, 0x01, 0x02, 0x45, 0xB5, 0xF0, 0x90, 0x00, 0x05, 0x02, 0x06, 0xA2, \r
+0x90, 0x00, 0x06, 0x02, 0x06, 0xA2, 0xF0, 0x90, 0x00, 0x01, 0x02, 0x06, 0xA2, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0x66, 0x12, 0x8F, 0xC9, 0x90, 0xA0, 0x5F, 0xF1, 0x44, 0xFF, 0xF0, \r
+0x12, 0x06, 0x89, 0xB1, 0x2E, 0xFF, 0x90, 0xA0, 0x5F, 0xF1, 0xAC, 0xF1, 0x97, 0x90, 0xA0, 0x5F, \r
+0xF1, 0x3B, 0xF1, 0xB4, 0xF1, 0x74, 0x90, 0xA0, 0x5F, 0xF0, 0x12, 0x57, 0x09, 0xFF, 0x54, 0x01, \r
+0xFE, 0x90, 0xA0, 0x62, 0xF1, 0x44, 0xFF, 0xF0, 0x12, 0x57, 0x09, 0xB1, 0x2E, 0xFF, 0x90, 0xA0, \r
+0x62, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x57, 0x09, 0xF1, \r
+0x97, 0x90, 0xA0, 0x62, 0xF1, 0x3B, 0x4E, 0xFF, 0xF0, 0x12, 0x57, 0x09, 0xF1, 0x74, 0x90, 0xA0, \r
+0x62, 0xB1, 0x27, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0xA0, 0x63, 0xE0, 0x54, 0xDF, 0x4E, 0xFE, 0xF0, \r
+0xEF, 0x54, 0x40, 0xFF, 0xEE, 0x54, 0xBF, 0x4F, 0xB1, 0x26, 0xFE, 0x54, 0x80, 0xFD, 0xEF, 0x54, \r
+0x7F, 0x4D, 0xFF, 0x90, 0xA0, 0x63, 0xF0, 0xEE, 0x54, 0x01, 0xFE, 0xEF, 0x54, 0xFE, 0x4E, 0xB1, \r
+0x26, 0xB1, 0x2E, 0xFF, 0x90, 0xA0, 0x63, 0xF0, 0xEE, 0x54, 0x02, 0xFE, 0xEF, 0x54, 0xFD, 0x4E, \r
+0xB1, 0x26, 0xF1, 0x8D, 0x90, 0xA0, 0x63, 0xF1, 0x7C, 0x4E, 0xF0, 0x12, 0x8D, 0x05, 0x20, 0xE0, \r
+0x06, 0x12, 0x64, 0xAA, 0x12, 0x5C, 0x93, 0x51, 0x73, 0x12, 0x06, 0x89, 0x20, 0xE0, 0x02, 0x81, \r
+0x93, 0x90, 0x05, 0x54, 0xE0, 0x90, 0xA0, 0x70, 0xF0, 0xE0, 0xC3, 0x13, 0x90, 0xA0, 0x6F, 0x12, \r
+0x85, 0xA7, 0x30, 0xE0, 0x0E, 0x51, 0x87, 0x90, 0xA0, 0x60, 0x12, 0x56, 0xDD, 0x90, 0xA0, 0x61, \r
+0xF0, 0x80, 0x41, 0x51, 0x87, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, \r
+0xA0, 0x60, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA0, 0x60, \r
+0x74, 0x2A, 0xF0, 0x12, 0x56, 0xDE, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, \r
+0x90, 0xA0, 0x61, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA0, \r
+0x61, 0x74, 0x2A, 0xF0, 0x12, 0x4F, 0xD0, 0x30, 0xE0, 0x3D, 0x90, 0xA0, 0x60, 0xE0, 0x75, 0xF0, \r
+0x03, 0x84, 0x90, 0xA0, 0x68, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, 0xA0, 0x61, 0xE0, 0x75, \r
+0xF0, 0x03, 0x84, 0x90, 0xA0, 0x6A, 0xF0, 0x90, 0xA0, 0x60, 0xE0, 0xC3, 0x13, 0x90, 0xA0, 0x6B, \r
+0xF0, 0x90, 0xA0, 0x61, 0xE0, 0xC3, 0x13, 0x90, 0xA0, 0x6C, 0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, \r
+0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x88, 0xD0, 0xE4, 0x90, 0xA0, 0x9E, 0xF0, 0x12, 0x57, 0x03, 0xC4, \r
+0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x39, 0x90, 0xA0, 0x5F, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, \r
+0x07, 0xEF, 0x12, 0x56, 0xE5, 0x30, 0xE0, 0x28, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
+0x30, 0xE0, 0x08, 0x90, 0xA0, 0xA0, 0xE0, 0x60, 0x08, 0x80, 0x0B, 0x90, 0xA0, 0xA0, 0xE0, 0x60, \r
+0x05, 0x75, 0x51, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x51, 0x7D, 0x02, 0xAF, 0x51, 0x12, 0x63, 0x84, \r
+0x12, 0x9B, 0xB3, 0x30, 0xE0, 0x12, 0x12, 0x9B, 0xBB, 0x30, 0xE0, 0x07, 0x7D, 0x04, 0x7F, 0x02, \r
+0x12, 0x5A, 0x1E, 0xF1, 0x6C, 0x74, 0x11, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0xA0, \r
+0x67, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA0, 0x72, 0x74, 0x01, 0xF0, 0x80, 0x1E, 0xEF, 0xB4, \r
+0x04, 0x08, 0x90, 0xA0, 0x72, 0x74, 0x04, 0xF0, 0x80, 0x12, 0xEF, 0xB4, 0x06, 0x08, 0x90, 0xA0, \r
+0x72, 0x74, 0x02, 0xF0, 0x80, 0x06, 0xEF, 0xB4, 0x07, 0x02, 0xF1, 0xD1, 0xE4, 0x90, 0xA0, 0x67, \r
+0xF0, 0x80, 0x56, 0x12, 0x57, 0x03, 0xF1, 0xA5, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x02, 0x80, 0x11, \r
+0x12, 0x06, 0x89, 0x12, 0x5E, 0xCD, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x01, 0x80, 0x03, 0xE4, 0xF5, \r
+0x52, 0x12, 0x9B, 0xD6, 0x90, 0xA0, 0xBF, 0xE0, 0x30, 0xE0, 0x04, 0x7D, 0xAC, 0x80, 0x02, 0x7D, \r
+0x2C, 0x7F, 0x40, 0x12, 0x46, 0xA0, 0x12, 0x57, 0x03, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, \r
+0x04, 0x7F, 0x03, 0x80, 0x02, 0x7F, 0x01, 0x12, 0x62, 0xC3, 0xAD, 0x52, 0x7F, 0x02, 0x12, 0x63, \r
+0x84, 0x12, 0x5C, 0x93, 0xF1, 0x6C, 0x74, 0x43, 0xF0, 0x12, 0xAC, 0xCE, 0x90, 0xA0, 0x71, 0xF0, \r
+0x90, 0xA0, 0x62, 0x12, 0x56, 0xE4, 0x30, 0xE0, 0x09, 0x90, 0xA0, 0x91, 0xE0, 0x44, 0x02, 0xF0, \r
+0x80, 0x0C, 0x7F, 0x01, 0x12, 0x97, 0xC6, 0x90, 0xA0, 0x91, 0xE0, 0x54, 0xFD, 0xF0, 0x7F, 0x03, \r
+0x12, 0x8A, 0x84, 0x90, 0xA0, 0x5F, 0xE0, 0x20, 0xE0, 0x07, 0x90, 0xA0, 0x63, 0xE0, 0x54, 0xBF, \r
+0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x02, 0x06, 0xA2, 0xFE, 0x54, \r
+0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0x22, 0x90, 0x02, 0x09, 0x12, 0x9C, 0xAD, 0x90, 0x9E, 0x98, \r
+0x51, 0x86, 0x25, 0x51, 0x90, 0x9E, 0x99, 0x12, 0x56, 0xDD, 0x25, 0x51, 0x90, 0x9E, 0x9A, 0xF0, \r
+0x12, 0x57, 0x09, 0x25, 0x51, 0x90, 0x9E, 0x9B, 0xB1, 0x27, 0x25, 0x51, 0x90, 0x9E, 0x9C, 0x51, \r
+0x79, 0x25, 0x51, 0x90, 0x9E, 0x9D, 0xF0, 0x51, 0x80, 0x25, 0x51, 0x90, 0x9E, 0x9E, 0xF0, 0x22, \r
+0x12, 0x06, 0x89, 0xF5, 0x51, 0x51, 0x87, 0xF5, 0x54, 0x12, 0x56, 0xDE, 0xF5, 0x55, 0x12, 0x57, \r
+0x09, 0xF5, 0x56, 0xB1, 0x28, 0xF5, 0x57, 0x51, 0x7A, 0xF5, 0x58, 0x51, 0x80, 0xF5, 0x59, 0xE5, \r
+0x51, 0x12, 0x45, 0xC7, 0x6D, 0xAD, 0x00, 0x6D, 0xB5, 0x01, 0x6D, 0xBD, 0x02, 0x6D, 0xC5, 0x03, \r
+0x6D, 0xCD, 0x04, 0x6D, 0xD5, 0x05, 0x6D, 0xDD, 0x06, 0x00, 0x00, 0x6D, 0xF0, 0x75, 0x52, 0x02, \r
+0x75, 0x53, 0x29, 0x80, 0x41, 0x75, 0x52, 0x06, 0x75, 0x53, 0x2A, 0x80, 0x39, 0x75, 0x52, 0x01, \r
+0x75, 0x53, 0x31, 0x80, 0x31, 0x75, 0x52, 0x01, 0x75, 0x53, 0x32, 0x80, 0x29, 0x75, 0x52, 0x06, \r
+0x75, 0x53, 0x33, 0x80, 0x21, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54, 0xC1, 0x6D, 0x90, 0xA0, 0xA2, \r
+0x12, 0xAD, 0x09, 0xA3, 0xE5, 0x56, 0xF0, 0xA3, 0xE5, 0x57, 0xF0, 0xA3, 0xE5, 0x58, 0xF0, 0x22, \r
+0x75, 0x52, 0x01, 0x75, 0x53, 0xFF, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54, 0xAD, 0x52, 0xAF, 0x53, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xE1, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, \r
+0x12, 0x45, 0xBE, 0x12, 0xAB, 0x37, 0x70, 0x22, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x13, 0x90, \r
+0xA1, 0xE1, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0x12, 0x45, 0xB5, 0x12, 0x9D, 0x9A, 0x7F, 0x01, \r
+0x80, 0x0E, 0x7F, 0x01, 0xF1, 0x53, 0x7F, 0x02, 0x80, 0x06, 0x7F, 0x02, 0xF1, 0x53, 0x7F, 0x03, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x51, 0x6D, 0x12, 0x06, 0x89, 0x90, 0xA0, 0xAA, 0x51, 0x86, 0x90, \r
+0xA0, 0xAB, 0x12, 0x56, 0xDD, 0x90, 0xA0, 0xAC, 0xF0, 0x90, 0xA0, 0x87, 0xE0, 0x44, 0x01, 0xF0, \r
+0x51, 0x73, 0xF1, 0x85, 0xB4, 0x02, 0x05, 0x7F, 0x40, 0x12, 0x98, 0x0D, 0x22, 0x90, 0xA1, 0x01, \r
+0x74, 0x0A, 0xF0, 0x90, 0xA1, 0x0F, 0x74, 0x06, 0xF0, 0x12, 0x06, 0x89, 0x90, 0xA1, 0x03, 0x51, \r
+0x86, 0x90, 0xA1, 0x04, 0x12, 0x56, 0xDD, 0x90, 0xA1, 0x05, 0xF0, 0x12, 0x57, 0x09, 0x90, 0xA1, \r
+0x06, 0xB1, 0x27, 0x90, 0xA1, 0x07, 0x51, 0x79, 0x90, 0xA1, 0x08, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, \r
+0x79, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0x87, 0xE0, 0xFF, 0x70, 0x06, \r
+0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9F, 0x88, 0xE0, 0xB5, 0x07, 0x04, \r
+0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, \r
+0x80, 0x29, 0xC0, 0x01, 0x90, 0x9F, 0x88, 0xE0, 0x12, 0xA1, 0x59, 0xA8, 0x01, 0xFC, 0x7D, 0x01, \r
+0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0x9F, 0x88, 0xF1, 0xD8, 0xB4, 0x0A, \r
+0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9F, 0x88, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x51, 0x6D, 0x12, 0x06, 0x89, 0x90, 0xA0, 0xBD, 0x51, 0x86, 0x90, 0xA0, 0xBE, 0xF0, 0x51, 0x73, \r
+0x7D, 0x02, 0x7F, 0x38, 0xC1, 0x00, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xB6, \r
+0x74, 0x15, 0xF0, 0x90, 0xA1, 0xC4, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xB8, 0xEF, 0xF0, 0x7B, 0x01, \r
+0x7A, 0xA1, 0x79, 0xB6, 0xD1, 0xA2, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF0, 0xEE, 0x54, 0x40, 0xFE, \r
+0xEF, 0x54, 0xBF, 0x22, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, \r
+0xFD, 0x4F, 0x22, 0xF1, 0x16, 0x7F, 0x04, 0x8F, 0x71, 0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, 0x9E, \r
+0x92, 0xE0, 0x45, 0x71, 0xF0, 0x22, 0x90, 0xA1, 0x01, 0x02, 0x45, 0xBE, 0x90, 0x05, 0x00, 0x74, \r
+0x1C, 0xF0, 0xA3, 0x22, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x22, 0xF0, 0xEE, 0x54, 0x08, \r
+0xFE, 0xEF, 0x54, 0xF7, 0x22, 0x7D, 0x03, 0x7F, 0x11, 0xD1, 0x00, 0xEF, 0x22, 0xFE, 0x54, 0x10, \r
+0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x22, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, \r
+0x22, 0x90, 0x9F, 0x9E, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0xF0, 0xEE, 0x54, 0x10, \r
+0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x02, 0x06, 0x89, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0x90, \r
+0xA1, 0xD9, 0xF0, 0x90, 0xA0, 0x4C, 0xE0, 0x90, 0xA1, 0xDA, 0x22, 0x7D, 0x01, 0x7F, 0x17, 0xC1, \r
+0x00, 0x90, 0xA0, 0x72, 0x74, 0x05, 0xF0, 0x22, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0x22, 0x90, \r
+0xA0, 0x50, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x1D, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x17, 0x90, \r
+0x9E, 0x99, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x12, 0x4D, 0x59, 0x90, 0xA2, 0x30, 0xEE, 0xF0, \r
+0xA3, 0xEF, 0xF0, 0x12, 0x4F, 0x09, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x44, 0xDE, \r
+0x90, 0xA0, 0xFC, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x9E, 0x92, 0xE0, 0xFF, 0x70, 0x04, 0xA3, 0xE0, \r
+0x60, 0xE5, 0xC2, 0xAF, 0xEF, 0x30, 0xE0, 0x0E, 0x90, 0x9E, 0x92, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, \r
+0xFF, 0x12, 0x79, 0x54, 0x11, 0x5B, 0xD1, 0x2E, 0x30, 0xE1, 0x06, 0x54, 0xFD, 0xF0, 0x12, 0x7E, \r
+0xEF, 0xD1, 0x2E, 0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, 0xA0, 0xF3, 0xD1, 0x2E, 0x30, 0xE6, \r
+0x06, 0x54, 0xBF, 0xF0, 0x12, 0x97, 0xE7, 0xD2, 0xAF, 0x80, 0xBC, 0xE4, 0xF5, 0x51, 0x90, 0x9F, \r
+0x9C, 0xE0, 0xFF, 0xE5, 0x51, 0xC3, 0x9F, 0x40, 0x02, 0xA1, 0xFB, 0xAF, 0x51, 0x12, 0x5F, 0x2F, \r
+0xEF, 0x70, 0x02, 0xA1, 0xF7, 0x12, 0x51, 0x14, 0x12, 0x56, 0xE5, 0x30, 0xE0, 0x02, 0xA1, 0xF7, \r
+0x90, 0x04, 0xA0, 0xE0, 0xFF, 0xA3, 0xE0, 0xFE, 0xEF, 0x64, 0x01, 0x70, 0x2D, 0xE5, 0x51, 0x6E, \r
+0x70, 0x28, 0xA3, 0xE0, 0xF5, 0x52, 0xA3, 0xE0, 0x90, 0xA1, 0x0C, 0x12, 0x7B, 0x8B, 0xE5, 0x52, \r
+0xF0, 0x75, 0xF0, 0x10, 0x12, 0x78, 0xE8, 0xE0, 0x54, 0xFC, 0xFF, 0x90, 0xA1, 0x0C, 0xE0, 0x12, \r
+0xAD, 0x11, 0xE5, 0x51, 0x12, 0x78, 0xE8, 0xEF, 0xF0, 0x22, 0xE5, 0x51, 0x12, 0x7A, 0xC2, 0xE0, \r
+0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0x02, 0xA1, 0xF7, 0xE5, 0x51, 0x75, \r
+0xF0, 0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x90, 0xA1, 0x00, \r
+0x12, 0x45, 0xBE, 0xE5, 0x51, 0x12, 0x7A, 0xC2, 0xE0, 0xF5, 0x56, 0xA3, 0xE0, 0xF5, 0x57, 0x74, \r
+0x91, 0x25, 0x51, 0x12, 0x7F, 0xD8, 0xE0, 0xFF, 0x90, 0xA1, 0x03, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0x90, 0x00, 0x02, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x12, 0x07, 0x80, 0x2F, 0xFF, 0xE5, 0xF0, \r
+0x3E, 0xFE, 0x90, 0x00, 0x04, 0xD1, 0x25, 0xFE, 0x90, 0x00, 0x06, 0xD1, 0x25, 0xFE, 0x90, 0x00, \r
+0x08, 0xD1, 0x25, 0x90, 0xA1, 0x05, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x07, 0x80, 0xFF, 0xC3, 0x90, \r
+0xA1, 0x06, 0xE0, 0x9F, 0xFE, 0x90, 0xA1, 0x05, 0xE0, 0x95, 0xF0, 0x90, 0xA1, 0x07, 0xF0, 0xA3, \r
+0xCE, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0xFD, 0xAC, 0xF0, 0x25, 0xE0, 0xFF, 0xEC, 0x33, \r
+0xFE, 0xEF, 0x2D, 0xFD, 0xEE, 0x3C, 0xFC, 0x90, 0x00, 0x04, 0x12, 0x07, 0xAB, 0x25, 0xE0, 0xFF, \r
+0xE5, 0xF0, 0x33, 0xFE, 0x90, 0x00, 0x02, 0xD1, 0x25, 0xCF, 0x2D, 0xFD, 0xEF, 0x3C, 0xFC, 0xD1, \r
+0x0A, 0x12, 0xAC, 0x5F, 0xAE, 0xF0, 0x78, 0x02, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x2D, \r
+0xFF, 0xEC, 0x3E, 0x90, 0xA1, 0x09, 0xF0, 0xA3, 0xEF, 0x12, 0x7B, 0x8B, 0xE0, 0xF5, 0x52, 0x54, \r
+0x7F, 0xF5, 0x53, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x12, 0x57, 0xEF, 0xE0, 0x90, 0xA1, 0x0B, 0xF0, \r
+0x12, 0x51, 0x14, 0xFF, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA1, 0x0C, 0xF0, 0xB1, 0xFE, 0xE0, 0xC3, \r
+0x94, 0x05, 0x40, 0x02, 0x81, 0x1C, 0x90, 0xA1, 0x0B, 0xE0, 0xFF, 0xE5, 0x53, 0x9F, 0x40, 0x08, \r
+0x8F, 0x53, 0x53, 0x52, 0x80, 0xEF, 0x42, 0x52, 0xE5, 0x53, 0x90, 0x41, 0x5F, 0x93, 0xFF, 0xD1, \r
+0x38, 0xE0, 0xC3, 0x9F, 0xE5, 0x53, 0x40, 0x05, 0x90, 0x41, 0x37, 0x80, 0x03, 0x90, 0x41, 0x4B, \r
+0x93, 0xF5, 0x58, 0x90, 0xA0, 0xA2, 0xE0, 0x60, 0x7D, 0xE5, 0x53, 0x64, 0x13, 0x60, 0x05, 0xE5, \r
+0x53, 0xB4, 0x0B, 0x05, 0x90, 0xA0, 0xA4, 0x80, 0x23, 0xE5, 0x53, 0x64, 0x12, 0x60, 0x05, 0xE5, \r
+0x53, 0xB4, 0x0A, 0x05, 0x90, 0xA0, 0xA5, 0x80, 0x13, 0xE5, 0x53, 0x64, 0x11, 0x60, 0x05, 0xE5, \r
+0x53, 0xB4, 0x09, 0x05, 0x90, 0xA0, 0xA6, 0x80, 0x03, 0x90, 0xA0, 0xA3, 0xE0, 0xF5, 0x5C, 0xE5, \r
+0x5C, 0xC3, 0x94, 0x80, 0x50, 0x28, 0xE5, 0x5C, 0x94, 0x1B, 0x40, 0x02, 0x80, 0x13, 0xE5, 0x58, \r
+0x25, 0x5C, 0xFF, 0xE4, 0x33, 0xFE, 0xD3, 0xEF, 0x94, 0x1B, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, \r
+0x05, 0x75, 0x58, 0x1B, 0x80, 0x20, 0xE5, 0x5C, 0x25, 0x58, 0xF5, 0x58, 0x80, 0x18, 0xC3, 0xE4, \r
+0x95, 0x5C, 0xF5, 0x5C, 0xE5, 0x58, 0xD3, 0x95, 0x5C, 0x40, 0x08, 0xE5, 0x58, 0x95, 0x5C, 0xF5, \r
+0x58, 0x80, 0x03, 0xE4, 0xF5, 0x58, 0xE5, 0x58, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x95, 0xF9, 0x74, \r
+0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x90, 0xA0, 0xFD, 0x12, 0x45, 0xBE, 0xC3, 0xE5, 0x57, 0x94, \r
+0x0F, 0xE5, 0x56, 0x94, 0x00, 0x50, 0x4E, 0xD1, 0x0A, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0xFF, \r
+0xAE, 0xF0, 0x12, 0xAC, 0x5F, 0x2F, 0xFD, 0xE5, 0xF0, 0x3E, 0xFC, 0xD1, 0x1C, 0xFF, 0xD3, 0xED, \r
+0x9F, 0xEC, 0x9E, 0x40, 0x05, 0x12, 0x7D, 0x5B, 0x61, 0xFD, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x02, \r
+0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0xD1, 0x1C, 0x2D, 0xFF, 0xEE, 0x3C, \r
+0xFE, 0xD1, 0x0A, 0x12, 0x07, 0x80, 0xD3, 0x9F, 0xE5, 0xF0, 0x9E, 0x50, 0x02, 0x61, 0xFD, 0xAF, \r
+0x51, 0xD1, 0x7A, 0x61, 0xFD, 0xE5, 0x51, 0x70, 0x3D, 0xD1, 0x0A, 0x12, 0xAC, 0x5F, 0xFD, 0xAC, \r
+0xF0, 0xD1, 0x1C, 0xFF, 0xC3, 0xED, 0x9F, 0xEC, 0x9E, 0x50, 0x08, 0x90, 0x9E, 0x91, 0x74, 0x01, \r
+0xF0, 0x80, 0x23, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, \r
+0xFB, 0xAA, 0x06, 0xD1, 0x1C, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, \r
+0x05, 0xE4, 0x90, 0x9E, 0x91, 0xF0, 0x12, 0xAC, 0x83, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, \r
+0xD3, 0xE5, 0x57, 0x94, 0xC8, 0xE5, 0x56, 0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, \r
+0xE4, 0xF5, 0x59, 0xE5, 0x51, 0xD1, 0x6E, 0xE0, 0xF5, 0x54, 0xA3, 0xE0, 0xF5, 0x55, 0xE4, 0xF5, \r
+0x5D, 0xD1, 0x0A, 0x75, 0xF0, 0x02, 0xE5, 0x5D, 0x12, 0xAB, 0xCA, 0x80, 0x05, 0xCE, 0xC3, 0x13, \r
+0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA0, 0xFD, 0x12, 0x45, 0xB5, 0x85, 0x5D, 0x82, 0x75, 0x83, \r
+0x00, 0x12, 0x06, 0xA2, 0x12, 0xAB, 0x99, 0x05, 0x5D, 0xE5, 0x5D, 0xB4, 0x05, 0xD3, 0x90, 0xA0, \r
+0xFD, 0x12, 0x45, 0xB5, 0x12, 0x6A, 0x7A, 0xFD, 0x7C, 0x00, 0x12, 0xAD, 0x01, 0x80, 0x05, 0xCE, \r
+0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x07, 0x03, 0xD3, 0xE5, 0x55, 0x9F, 0xE5, 0x54, \r
+0x9E, 0x40, 0x0C, 0xE5, 0x55, 0x9F, 0xF5, 0x55, 0xE5, 0x54, 0x9E, 0xF5, 0x54, 0x80, 0x05, 0xE4, \r
+0xF5, 0x54, 0xF5, 0x55, 0xE5, 0x51, 0xD1, 0x6E, 0x12, 0xAD, 0x09, 0xAE, 0x54, 0x12, 0x7C, 0xED, \r
+0xC3, 0x12, 0x45, 0x60, 0x50, 0x06, 0xAF, 0x51, 0xD1, 0x7A, 0x80, 0x12, 0x12, 0xAB, 0x0D, 0xD3, \r
+0x74, 0x01, 0x93, 0x95, 0x55, 0xE4, 0x93, 0x95, 0x54, 0x40, 0x09, 0x12, 0x7D, 0x5B, 0xD1, 0x50, \r
+0xE4, 0xF0, 0x80, 0x29, 0xD1, 0x50, 0xE0, 0x04, 0xF0, 0xD1, 0x50, 0xE0, 0xC3, 0x94, 0x05, 0x40, \r
+0x1C, 0xD1, 0x50, 0xE4, 0xF0, 0x12, 0xAB, 0x0D, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0x12, 0x7C, \r
+0xED, 0x12, 0x7F, 0xD0, 0xE5, 0x51, 0xD1, 0x6E, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x51, 0xD1, \r
+0x6E, 0xA3, 0xE0, 0x90, 0xA1, 0x63, 0xF0, 0x90, 0xA1, 0x62, 0xE5, 0x52, 0xF0, 0xAB, 0x51, 0xE4, \r
+0xFD, 0xFF, 0x12, 0x98, 0x28, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0xA1, 0xDB, 0xB1, 0xFE, 0xE0, 0xFC, \r
+0x64, 0x05, 0x60, 0x02, 0x81, 0xE3, 0xAD, 0x53, 0xAF, 0x51, 0x12, 0xA5, 0x74, 0x12, 0xAC, 0x26, \r
+0xEF, 0xD1, 0x44, 0xE0, 0x54, 0x07, 0xF5, 0x5B, 0xD1, 0x38, 0xE0, 0xFF, 0xC3, 0x94, 0x30, 0x50, \r
+0x06, 0xE4, 0xB1, 0xFC, 0xE4, 0x80, 0x56, 0x12, 0xAC, 0x26, 0xE0, 0x64, 0x01, 0x70, 0x66, 0x12, \r
+0xAB, 0x61, 0xE0, 0x64, 0x0A, 0x60, 0x28, 0xEF, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0x12, 0xAC, \r
+0x1A, 0xE0, 0xFD, 0x12, 0xAB, 0xF0, 0x50, 0x17, 0xED, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0xD1, \r
+0x38, 0xE0, 0x12, 0xAB, 0xF0, 0x50, 0x08, 0x12, 0xAB, 0x81, 0xE0, 0x65, 0x53, 0x60, 0x2A, 0xE5, \r
 0x5B, 0x70, 0x05, 0x75, 0x5B, 0x01, 0x80, 0x0D, 0xE5, 0x5B, 0xB4, 0x01, 0x05, 0x75, 0x5B, 0x03, \r
-0x80, 0x03, 0x75, 0x5B, 0x05, 0xB1, 0x97, 0xE0, 0xFF, 0xF1, 0xBD, 0xEF, 0xF0, 0x74, 0x92, 0x25, \r
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0x80, 0x17, 0xB1, 0x8A, 0xE4, 0xF0, 0xF1, 0x60, 0xE0, 0x04, \r
-0xF0, 0x80, 0x10, 0xE4, 0xF5, 0x5B, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, \r
-0x83, 0xE4, 0xF0, 0xF1, 0xA5, 0xE5, 0x53, 0xF0, 0x12, 0x51, 0x02, 0xC4, 0x13, 0x13, 0x54, 0x03, \r
-0x20, 0xE0, 0x02, 0xA1, 0x50, 0xF1, 0x60, 0xE4, 0xF0, 0xB1, 0x88, 0xE4, 0xF0, 0xA1, 0x50, 0xEC, \r
-0x64, 0x06, 0x60, 0x02, 0xA1, 0x60, 0xF5, 0x54, 0xF5, 0x55, 0xB1, 0xD2, 0xE0, 0x54, 0x07, 0xF5, \r
-0x5B, 0xF1, 0x85, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, 0xD3, 0xE5, 0x57, 0x94, 0xFA, 0xE5, \r
-0x56, 0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, 0xE4, 0xF5, 0x59, 0xF1, 0x74, 0x80, \r
-0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x42, 0x24, 0xE4, 0x93, 0xFD, 0x7C, \r
-0x00, 0x12, 0x07, 0x03, 0x90, 0xA0, 0xFB, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x5A, 0xB1, \r
-0xA3, 0x75, 0xF0, 0x02, 0xE5, 0x5A, 0x12, 0xA9, 0x5E, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, \r
-0xD8, 0xF9, 0xFF, 0xE5, 0x5A, 0x90, 0x42, 0x1F, 0x93, 0x12, 0xA9, 0x3E, 0xC3, 0x90, 0xA0, 0xFC, \r
-0xE0, 0x95, 0x55, 0x90, 0xA0, 0xFB, 0xE0, 0x95, 0x54, 0x40, 0x07, 0x05, 0x5A, 0xE5, 0x5A, 0xB4, \r
-0x05, 0xCD, 0xE5, 0x5A, 0xC3, 0x13, 0xF5, 0x5A, 0xE5, 0x5B, 0x24, 0x01, 0x12, 0xA2, 0xF3, 0xFF, \r
-0xD3, 0x95, 0x5A, 0x40, 0x06, 0xEF, 0x95, 0x5A, 0xFF, 0x80, 0x02, 0xE4, 0xFF, 0xB1, 0xA9, 0xE0, \r
-0xC3, 0x13, 0xFE, 0xEF, 0xC4, 0x33, 0x54, 0xE0, 0x2E, 0x04, 0xFE, 0xB1, 0xA9, 0xEE, 0xF0, 0xB1, \r
-0xA9, 0xE0, 0xC3, 0x94, 0xC0, 0x40, 0x05, 0xB1, 0xA9, 0x74, 0xC0, 0xF0, 0xB1, 0xA9, 0x12, 0x4F, \r
-0xD2, 0x25, 0xE0, 0xFF, 0x70, 0x04, 0xF5, 0x5B, 0x80, 0x04, 0xEF, 0x14, 0xF5, 0x5B, 0xD3, 0x90, \r
-0xA0, 0xF1, 0xE0, 0x94, 0x03, 0x90, 0xA0, 0xF0, 0xE0, 0x94, 0x00, 0x40, 0x03, 0xE4, 0xF5, 0x5B, \r
-0xB1, 0xD2, 0xE0, 0x54, 0xF8, 0x90, 0xA0, 0xFD, 0xF0, 0x45, 0x5B, 0xFF, 0xB1, 0xD1, 0xEF, 0xF0, \r
-0xB1, 0x8A, 0xE0, 0xD3, 0x94, 0x05, 0x74, 0x92, 0x50, 0x07, 0xB1, 0x8C, 0xE0, 0x04, 0xF0, 0x80, \r
-0x04, 0xB1, 0x8C, 0xE4, 0xF0, 0xE4, 0xFD, 0xAF, 0x51, 0x12, 0xA2, 0xFC, 0x05, 0x51, 0xE5, 0x51, \r
-0xC3, 0x94, 0x80, 0x50, 0x02, 0x01, 0x33, 0x22, 0xF5, 0x5B, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, \r
-0xE4, 0x34, 0x9B, 0xF5, 0x83, 0x22, 0xFF, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, \r
-0xF5, 0x83, 0x22, 0x90, 0xA0, 0xED, 0x02, 0x45, 0xB5, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, \r
-0x34, 0x93, 0xF5, 0x83, 0x22, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0x22, 0x12, 0x07, \r
-0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0x22, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9D, 0x93, 0xE0, 0xFF, \r
-0x22, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x02, 0x45, 0xA9, 0xD3, 0x10, 0xAF, \r
-0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x67, 0x8D, 0x68, 0x8B, 0x69, 0xE4, 0x90, 0xA1, 0xAA, 0xF0, 0xE5, \r
-0x67, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0xA1, 0xA5, 0xF0, 0xE5, 0x67, 0x54, 0x07, 0x90, 0xA1, \r
-0xA7, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0xB1, 0xD7, 0xE0, 0x90, 0xA1, 0xA8, 0xF1, 0x8F, 0xE0, 0x54, \r
-0x7F, 0x90, 0xA1, 0xAB, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x67, 0x12, 0x56, 0xC6, 0xE0, 0x90, 0xA1, \r
-0xAC, 0xF0, 0xF1, 0x7C, 0xE5, 0x69, 0x70, 0x24, 0xE0, 0xFB, 0xF1, 0xB1, 0xE4, 0x93, 0xFE, 0x74, \r
-0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0xEB, 0xF1, 0xE3, 0x12, 0x45, 0x39, 0x78, 0x01, 0x12, 0x08, \r
-0x47, 0xE5, 0x67, 0xF1, 0x50, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xAB, 0xE0, \r
-0xFF, 0x90, 0xA1, 0xA6, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x0B, 0xE5, 0x68, 0x54, 0x80, 0xFD, 0xEF, \r
-0x4D, 0xF5, 0x68, 0x80, 0x0C, 0x90, 0xA1, 0xAC, 0xE0, 0xFF, 0xEE, 0xC3, 0x9F, 0x50, 0x02, 0x8F, \r
-0x68, 0xF1, 0x7C, 0xE5, 0x68, 0x54, 0x80, 0x90, 0xA1, 0xA9, 0xF0, 0xE5, 0x69, 0x70, 0x2A, 0x90, \r
-0xA1, 0xA5, 0xE0, 0x24, 0x81, 0xF1, 0x6C, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA1, 0xA7, \r
-0x12, 0xA9, 0x1B, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, \r
-0x90, 0xA1, 0xA8, 0xE0, 0x54, 0x7F, 0xF0, 0x80, 0x45, 0x90, 0xA1, 0xA5, 0xE0, 0x24, 0x81, 0xF1, \r
-0x6C, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA1, 0xA7, 0x12, 0xA9, 0x1B, 0x80, 0x02, 0xC3, \r
-0x33, 0xD8, 0xFC, 0x4F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0xB1, 0xD7, \r
-0xE0, 0x54, 0x07, 0xFF, 0x90, 0xA1, 0xA8, 0xF0, 0x90, 0xA1, 0xA6, 0xE0, 0x90, 0x41, 0xF7, 0x93, \r
-0xFE, 0x33, 0x33, 0x33, 0x54, 0xF8, 0x4F, 0x90, 0xA1, 0xA8, 0xF0, 0x44, 0x80, 0xF0, 0x75, 0xF0, \r
-0x10, 0xE5, 0x67, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x68, 0xF0, 0xE5, 0x67, 0x70, 0x06, \r
-0x90, 0x01, 0xC8, 0xE5, 0x68, 0xF0, 0x90, 0xA1, 0xA8, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xE5, 0x67, \r
-0xB1, 0xD7, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x12, 0x7A, 0x7D, 0x54, 0xFC, 0xFF, 0xE5, \r
-0x6A, 0x54, 0x03, 0x4F, 0xFF, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, \r
-0xEF, 0xF0, 0x7D, 0x01, 0xAF, 0x67, 0x12, 0xA2, 0xFC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE9, 0x25, \r
-0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x7D, 0xEB, \r
-0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0x22, 0x90, 0x00, 0x08, 0x02, 0x07, 0xAB, \r
-0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0x22, 0xF5, 0x82, 0xE4, 0x34, \r
-0x94, 0xF5, 0x83, 0x22, 0xE5, 0x57, 0xAE, 0x56, 0xA8, 0x59, 0x08, 0x22, 0xE5, 0x68, 0x54, 0x7F, \r
-0x90, 0xA1, 0xA6, 0xF0, 0x22, 0xD3, 0xE5, 0x57, 0x94, 0xE8, 0xE5, 0x56, 0x94, 0x03, 0x22, 0xF0, \r
-0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x12, 0x02, 0x45, 0xA9, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, \r
-0xF8, 0x74, 0x80, 0x98, 0x22, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, \r
-0x22, 0x25, 0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x22, 0x74, 0x01, 0x25, \r
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, \r
-0x34, 0x9A, 0xF5, 0x83, 0x22, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, \r
-0xF5, 0x83, 0x22, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, \r
-0x02, 0x45, 0x99, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, \r
-0xC0, 0x07, 0x7D, 0xF3, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x77, 0x11, 0x1A, 0xD0, 0x07, 0xD0, \r
-0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, \r
-0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, \r
-0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x27, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x78, 0x11, \r
-0x1A, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, \r
+0x80, 0x03, 0x75, 0x5B, 0x05, 0xD1, 0x38, 0xE0, 0xFF, 0x12, 0xAC, 0x1A, 0xEF, 0xF0, 0x74, 0x11, \r
+0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0x80, 0x18, 0xB1, 0xFE, 0xE4, 0xF0, 0x12, 0xAB, 0x61, \r
+0xE0, 0x04, 0xF0, 0x80, 0x10, 0xE4, 0xF5, 0x5B, 0x74, 0x11, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, \r
+0x9C, 0xF5, 0x83, 0xE4, 0xF0, 0x12, 0xAB, 0x81, 0xE5, 0x53, 0xF0, 0x12, 0x51, 0x14, 0xC4, 0x13, \r
+0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0xA1, 0xCB, 0x12, 0xAB, 0x61, 0xE4, 0xF0, 0xB1, 0xFC, 0xE4, \r
+0xF0, 0xA1, 0xCB, 0xEC, 0x64, 0x06, 0x60, 0x02, 0xA1, 0xDB, 0xF5, 0x54, 0xF5, 0x55, 0xD1, 0x45, \r
+0xE0, 0x54, 0x07, 0xF5, 0x5B, 0x12, 0xAC, 0x83, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, 0xD3, \r
+0xE5, 0x57, 0x94, 0xFA, 0xE5, 0x56, 0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, 0xE4, \r
+0xF5, 0x59, 0x12, 0xAD, 0x01, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, \r
+0x42, 0x24, 0xE4, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0x90, 0xA1, 0x0E, 0xEE, 0xF0, 0xA3, \r
+0xEF, 0xF0, 0xE4, 0xF5, 0x5A, 0xD1, 0x0A, 0x75, 0xF0, 0x02, 0xE5, 0x5A, 0x12, 0xAB, 0xCA, 0x80, \r
+0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xE5, 0x5A, 0x90, 0x42, 0x1F, 0x93, 0x12, \r
+0xAB, 0x99, 0xC3, 0x90, 0xA1, 0x0F, 0xE0, 0x95, 0x55, 0x90, 0xA1, 0x0E, 0xE0, 0x95, 0x54, 0x40, \r
+0x07, 0x05, 0x5A, 0xE5, 0x5A, 0xB4, 0x05, 0xCD, 0xE5, 0x5A, 0xC3, 0x13, 0xF5, 0x5A, 0xE5, 0x5B, \r
+0x24, 0x01, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0xFF, 0xD3, 0x95, 0x5A, 0x40, 0x06, \r
+0xEF, 0x95, 0x5A, 0xFF, 0x80, 0x02, 0xE4, 0xFF, 0xD1, 0x10, 0xE0, 0xC3, 0x13, 0xFE, 0xEF, 0xC4, \r
+0x33, 0x54, 0xE0, 0x2E, 0x04, 0xFE, 0xD1, 0x10, 0xEE, 0xF0, 0xD1, 0x10, 0xE0, 0xC3, 0x94, 0xC0, \r
+0x40, 0x05, 0xD1, 0x10, 0x74, 0xC0, 0xF0, 0xD1, 0x10, 0x12, 0x4F, 0xD3, 0x25, 0xE0, 0xFF, 0x70, \r
+0x04, 0xF5, 0x5B, 0x80, 0x04, 0xEF, 0x14, 0xF5, 0x5B, 0xD3, 0x90, 0xA1, 0x04, 0xE0, 0x94, 0x03, \r
+0x90, 0xA1, 0x03, 0xE0, 0x94, 0x00, 0x40, 0x03, 0xE4, 0xF5, 0x5B, 0xD1, 0x45, 0xE0, 0x54, 0xF8, \r
+0x90, 0xA1, 0x10, 0xF0, 0x45, 0x5B, 0xFF, 0xD1, 0x44, 0xEF, 0xF0, 0xB1, 0xFE, 0xE0, 0xD3, 0x94, \r
+0x05, 0x74, 0x11, 0x50, 0x07, 0xD1, 0x00, 0xE0, 0x04, 0xF0, 0x80, 0x04, 0xD1, 0x00, 0xE4, 0xF0, \r
+0xE4, 0xFD, 0xAF, 0x51, 0x12, 0x78, 0xFC, 0x05, 0x51, 0x01, 0x5E, 0x22, 0xF5, 0x5B, 0x74, 0x11, \r
+0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x22, 0x90, 0xA1, 0x00, 0x02, 0x45, 0xB5, \r
+0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x22, 0xE5, 0x56, 0xC3, 0x13, \r
+0xFE, 0xE5, 0x57, 0x13, 0x22, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0x22, 0xD2, 0xAF, \r
+0xC2, 0xAF, 0x90, 0x9E, 0x92, 0xE0, 0xFF, 0x22, 0x74, 0x11, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, \r
+0x9A, 0xF5, 0x83, 0x22, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x02, 0x45, 0xA9, \r
+0x74, 0x11, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0x22, 0xE9, 0x25, 0xE0, 0x25, \r
+0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x7D, 0xEB, 0x25, 0xE0, \r
+0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0xAB, 0x07, 0x75, 0xF0, 0x10, 0xEB, \r
+0x12, 0x7B, 0x91, 0xE0, 0xF5, 0x5E, 0xE4, 0xF5, 0x62, 0xE5, 0x5E, 0x54, 0x7F, 0xF9, 0xE5, 0x5E, \r
+0x54, 0x80, 0xFA, 0x75, 0xF0, 0x04, 0xEB, 0x12, 0x57, 0xEF, 0xE0, 0xF5, 0x60, 0x75, 0xF0, 0x04, \r
+0xEB, 0x12, 0x51, 0x19, 0xFF, 0xC4, 0x54, 0x03, 0xF5, 0x61, 0xD1, 0x5C, 0xEE, 0xF0, 0xA3, 0xEF, \r
+0xF0, 0xE5, 0x5E, 0x4A, 0xFF, 0x74, 0x91, 0x2B, 0x12, 0x7D, 0x53, 0xEF, 0xF0, 0x75, 0xF0, 0x04, \r
+0xEB, 0x12, 0x51, 0x19, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x5F, 0x74, 0x91, 0x2B, 0x12, 0xAC, 0x54, \r
+0xE9, 0x64, 0x2C, 0x70, 0x2A, 0x75, 0xF0, 0x04, 0xEB, 0x12, 0x51, 0x19, 0xFF, 0x54, 0x03, 0xFE, \r
+0xE5, 0x5F, 0xC3, 0x9E, 0x50, 0x19, 0x05, 0x5F, 0x12, 0x7E, 0x8D, 0xFE, 0x75, 0xF0, 0x04, 0xEB, \r
+0x90, 0x96, 0x14, 0x12, 0x45, 0xA9, 0xEF, 0x54, 0xF3, 0x4E, 0xF0, 0x89, 0x5E, 0xE1, 0x80, 0xE9, \r
+0xC3, 0x95, 0x60, 0x50, 0x48, 0xE9, 0x04, 0xFD, 0xED, 0xD3, 0x95, 0x60, 0x50, 0x72, 0xED, 0x12, \r
+0xAC, 0x97, 0xEB, 0x12, 0x55, 0x2D, 0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xED, 0x54, 0x07, 0x12, \r
+0x7C, 0xC6, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x12, 0xAC, 0x8D, 0x60, \r
+0x19, 0xB9, 0x13, 0x10, 0x79, 0x18, 0x89, 0x5E, 0x74, 0x91, 0x2B, 0x12, 0x56, 0x59, 0xE0, 0x44, \r
+0x04, 0xF0, 0x80, 0x3C, 0xA9, 0x05, 0x89, 0x5E, 0x80, 0x36, 0x0D, 0x80, 0xBB, 0xE9, 0x65, 0x60, \r
+0x70, 0x23, 0x75, 0xF0, 0x04, 0xEB, 0x12, 0x56, 0x3C, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, \r
+0x0C, 0xE5, 0x5E, 0x20, 0xE7, 0x07, 0xE9, 0x44, 0x80, 0xF5, 0x5E, 0x80, 0x13, 0xD1, 0x5C, 0xEE, \r
+0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x74, 0x91, 0x2B, 0x12, 0x7D, 0x53, 0xE5, 0x60, 0xF0, 0xF5, 0x5E, \r
+0xAF, 0x03, 0x85, 0x5F, 0x6A, 0x7B, 0x01, 0xAD, 0x5E, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0x8F, 0x67, 0x8D, 0x68, 0x8B, 0x69, 0xE4, 0x90, 0xA1, 0xD2, 0xF0, 0xE5, 0x67, 0x13, 0x13, 0x13, \r
+0x54, 0x1F, 0x90, 0xA1, 0xCD, 0xF0, 0xE5, 0x67, 0x54, 0x07, 0x90, 0xA1, 0xCF, 0xF0, 0x75, 0xF0, \r
+0x10, 0xEF, 0xD1, 0x4A, 0xE0, 0x90, 0xA1, 0xD0, 0x12, 0x57, 0xEA, 0xE0, 0x54, 0x7F, 0x90, 0xA1, \r
+0xD3, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x67, 0x12, 0x56, 0xF1, 0xE0, 0x90, 0xA1, 0xD4, 0xF0, 0x12, \r
+0x7C, 0xE4, 0xE5, 0x69, 0x70, 0x1F, 0xE0, 0xFB, 0x12, 0xAB, 0x0F, 0xE4, 0x93, 0xFE, 0x74, 0x01, \r
+0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0xEB, 0x12, 0x7C, 0xF3, 0x12, 0x7F, 0xD0, 0xE5, 0x67, 0xD1, 0x6E, \r
+0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xD3, 0xE0, 0xFF, 0x90, 0xA1, 0xCE, 0xE0, 0xFE, 0xD3, \r
+0x9F, 0x40, 0x0B, 0xE5, 0x68, 0x54, 0x80, 0xFD, 0xEF, 0x4D, 0xF5, 0x68, 0x80, 0x0C, 0x90, 0xA1, \r
+0xD4, 0xE0, 0xFF, 0xEE, 0xC3, 0x9F, 0x50, 0x02, 0x8F, 0x68, 0x91, 0xE4, 0xE5, 0x68, 0x54, 0x80, \r
+0x90, 0xA1, 0xD1, 0xF0, 0xE5, 0x69, 0x70, 0x29, 0x90, 0xA1, 0xCD, 0xE0, 0x24, 0x81, 0x11, 0xDA, \r
+0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA1, 0xCF, 0x11, 0xF4, 0x80, 0x02, 0xC3, 0x33, 0xD8, \r
+0xFC, 0xF4, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA1, 0xD0, 0xE0, 0x54, 0x7F, 0xF0, 0x80, \r
+0x45, 0x90, 0xA1, 0xCD, 0xE0, 0x24, 0x81, 0x11, 0xDA, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, \r
+0xA1, 0xCF, 0x11, 0xF4, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, \r
+0x75, 0xF0, 0x10, 0xE5, 0x67, 0x12, 0x76, 0x4A, 0xE0, 0x54, 0x07, 0xFF, 0x90, 0xA1, 0xD0, 0xF0, \r
+0x90, 0xA1, 0xCE, 0xE0, 0x90, 0x41, 0xF7, 0x93, 0xFE, 0x33, 0x33, 0x33, 0x54, 0xF8, 0x4F, 0x90, \r
+0xA1, 0xD0, 0xF0, 0x44, 0x80, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x71, 0x91, 0xE5, 0x68, 0xF0, \r
+0xE5, 0x67, 0x70, 0x06, 0x90, 0x01, 0xC8, 0xE5, 0x68, 0xF0, 0x90, 0xA1, 0xD0, 0xE0, 0xFF, 0x75, \r
+0xF0, 0x10, 0xE5, 0x67, 0x12, 0x76, 0x4A, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x11, 0xE8, \r
+0xE0, 0x54, 0xFC, 0xFF, 0xE5, 0x6A, 0x12, 0xAD, 0x11, 0xE5, 0x67, 0x11, 0xE8, 0xEF, 0xF0, 0x7D, \r
+0x01, 0xAF, 0x67, 0x11, 0xFC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, \r
+0x83, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x02, 0x45, 0xA9, 0x75, 0xF0, \r
+0x03, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x22, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0xED, 0x60, 0x27, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x31, 0x3E, 0x90, \r
+0x8D, 0x03, 0x31, 0x3E, 0x90, 0x8D, 0x05, 0x31, 0x3E, 0x90, 0x8D, 0x07, 0x31, 0x3E, 0x90, 0x8D, \r
+0x09, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0x51, 0xC0, 0x12, 0xAB, 0xAA, 0xF0, 0x31, 0x4A, 0xE0, \r
+0x54, 0xBF, 0x44, 0x80, 0xFE, 0x31, 0x4A, 0xEE, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x45, \r
+0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x22, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, \r
+0x03, 0x02, 0x45, 0xA9, 0x90, 0xA1, 0x4A, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, 0x10, 0x7D, 0x00, 0x7B, \r
+0x01, 0x7A, 0xA1, 0x79, 0x4C, 0x12, 0x08, 0xAA, 0x90, 0x9F, 0x9C, 0xE0, 0x90, 0xA1, 0x5E, 0xF0, \r
+0xE4, 0x90, 0xA1, 0x4B, 0xF0, 0x90, 0xA1, 0x5E, 0xE0, 0xFE, 0x90, 0xA1, 0x4B, 0xE0, 0xFD, 0xC3, \r
+0x9E, 0x50, 0x40, 0xED, 0x51, 0xAA, 0xED, 0x54, 0x07, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xED, 0x31, \r
+0x4E, 0xE0, 0x30, 0xE7, 0x09, 0x74, 0x81, 0x2D, 0x51, 0x90, 0xE4, 0xF0, 0x80, 0x1D, 0xAF, 0x05, \r
+0x91, 0xDD, 0x51, 0xCE, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA1, 0x5D, 0x11, 0xF4, 0x80, \r
+0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA1, 0x4B, 0xE0, 0x04, \r
+0xF0, 0x80, 0xB2, 0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xE4, 0x90, 0xA1, 0x4B, 0xF0, 0x90, \r
+0xA1, 0x5E, 0xE0, 0xFF, 0x90, 0xA1, 0x4B, 0xE0, 0xFE, 0xC3, 0x9F, 0x40, 0x02, 0x41, 0x89, 0xEE, \r
+0x51, 0xAA, 0xEE, 0x54, 0x07, 0xA3, 0xF0, 0x91, 0xC5, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, \r
+0xCE, 0xD8, 0xF9, 0x4E, 0x7F, 0x00, 0x70, 0x02, 0x7F, 0x01, 0x51, 0xCE, 0xE0, 0x5F, 0x60, 0x02, \r
+0x41, 0x81, 0x51, 0x98, 0x90, 0x81, 0x06, 0x51, 0xA1, 0xEF, 0x90, 0x81, 0x07, 0x51, 0xB4, 0xFC, \r
+0x51, 0xC2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0A, 0x51, 0xA1, \r
+0xEC, 0x90, 0x81, 0x0B, 0x51, 0xB4, 0x75, 0xF0, 0x0A, 0x51, 0x8A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0x7F, 0x01, 0x90, 0xA1, 0x4B, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x0B, 0x12, 0x55, 0x30, \r
+0xE0, 0xFD, 0x75, 0xF0, 0x0A, 0xEE, 0x51, 0x8A, 0x75, 0xF0, 0x02, 0xEF, 0x12, 0x45, 0xA9, 0xE4, \r
+0xF0, 0xA3, 0xED, 0xF0, 0x0F, 0xEF, 0xB4, 0x05, 0xD9, 0x51, 0x98, 0x90, 0x81, 0x09, 0x12, 0x45, \r
+0xA9, 0xE0, 0xFE, 0x74, 0x91, 0x2F, 0xF1, 0xD8, 0xEE, 0xF0, 0x90, 0xA1, 0x4B, 0xE0, 0xFF, 0x90, \r
+0xA1, 0x4A, 0xE0, 0xFD, 0x11, 0xFC, 0x90, 0xA1, 0x4B, 0xE0, 0x24, 0x81, 0x51, 0x90, 0x74, 0x01, \r
+0xF0, 0x90, 0xA1, 0x4B, 0xE0, 0x04, 0xF0, 0x21, 0xCF, 0x22, 0x90, 0x8D, 0x01, 0x02, 0x45, 0xA9, \r
+0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x22, 0x90, 0xA1, 0x4B, 0xE0, 0xFF, 0x75, 0xF0, 0x10, \r
+0x22, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0x22, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, \r
+0xA1, 0x5C, 0xF0, 0x22, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA1, 0x4B, 0xE0, 0x22, \r
+0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0x90, 0xA1, \r
+0x5C, 0xE0, 0x24, 0x4C, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0x22, 0xE4, 0xF5, 0x63, 0x90, \r
+0x9F, 0x9C, 0xE0, 0xFF, 0xE5, 0x63, 0xC3, 0x9F, 0x40, 0x02, 0x61, 0x8A, 0xAF, 0x63, 0x12, 0x5F, \r
+0x2F, 0xEF, 0x70, 0x02, 0x61, 0x86, 0xE5, 0x63, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x63, \r
+0x54, 0x07, 0xFE, 0x74, 0x81, 0x2F, 0x11, 0xDA, 0xE0, 0xFD, 0xAF, 0x06, 0x91, 0xC7, 0x08, 0x80, \r
+0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x60, 0x69, 0x75, 0xF0, 0x10, \r
+0xE5, 0x63, 0x12, 0x76, 0x4A, 0xE0, 0x20, 0xE7, 0x02, 0x80, 0x10, 0x75, 0xF0, 0x10, 0xE5, 0x63, \r
+0x90, 0x81, 0x02, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x20, 0xE7, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, \r
+0x20, 0xF0, 0x80, 0x42, 0xEF, 0x30, 0xE6, 0x12, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x71, 0x91, 0x71, \r
+0xAA, 0x12, 0x51, 0x19, 0x71, 0xA3, 0xE4, 0xFB, 0x80, 0x27, 0x71, 0x97, 0xE0, 0x04, 0xF0, 0x71, \r
+0x97, 0xE0, 0xD3, 0x94, 0x01, 0x40, 0x0A, 0xAF, 0x63, 0xB1, 0x03, 0x71, 0x97, 0xE4, 0xF0, 0x80, \r
+0x15, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x71, 0x91, 0x71, 0xAA, 0x12, 0x51, 0x19, 0x71, 0xA3, 0x7B, \r
+0x01, 0xAF, 0x63, 0x12, 0x77, 0x89, 0x05, 0x63, 0x41, 0xDF, 0x22, 0xF0, 0x75, 0xF0, 0x10, 0xE5, \r
+0x51, 0x90, 0x81, 0x00, 0x02, 0x45, 0xA9, 0x74, 0x11, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x9D, \r
+0xF5, 0x83, 0x22, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x6A, 0x22, 0xE0, 0xFD, 0x75, 0xF0, 0x04, 0xE5, \r
+0x63, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA2, 0x26, 0xF0, 0x90, 0xA2, 0x26, 0xE0, \r
+0xFD, 0x70, 0x02, 0x81, 0xBB, 0x90, 0x9E, 0xEF, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, \r
+0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9E, 0xF0, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, \r
+0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA2, 0x1B, \r
+0x91, 0xC5, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, \r
+0x02, 0x81, 0x9E, 0xE4, 0x90, 0xA2, 0x27, 0xF0, 0x90, 0xA2, 0x27, 0xE0, 0xF9, 0xC3, 0x94, 0x04, \r
+0x50, 0x41, 0x91, 0xBD, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, \r
+0x74, 0xD0, 0x91, 0xCE, 0xF1, 0x49, 0xE5, 0x82, 0x29, 0x12, 0x55, 0x36, 0xEF, 0x91, 0xBC, 0xA4, \r
+0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xF0, 0x91, 0xCE, 0x75, 0xF0, 0x08, 0x90, 0x9E, 0xA3, \r
+0x12, 0x45, 0xA9, 0xE5, 0x82, 0x29, 0x12, 0x55, 0x36, 0xEF, 0xF0, 0x90, 0xA2, 0x27, 0xE0, 0x04, \r
+0xF0, 0x80, 0xB5, 0x90, 0xA2, 0x26, 0xE0, 0xFF, 0x90, 0xA2, 0x1B, 0x11, 0xF4, 0x80, 0x02, 0xC3, \r
+0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0xA2, 0x26, 0xF0, 0x90, 0xA2, 0x1B, 0xE0, 0xFF, 0x74, 0x01, \r
+0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0xA2, 0x1B, \r
+0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x9E, 0xF0, 0x12, 0x6F, 0xD8, 0xB4, 0x0A, 0x02, \r
+0x7F, 0x01, 0xEF, 0x70, 0x02, 0x61, 0xBC, 0xE4, 0x90, 0x9E, 0xF0, 0xF0, 0x61, 0xBC, 0x90, 0x01, \r
+0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0xA2, 0x1B, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0x91, 0xBC, \r
+0x90, 0x01, 0xD0, 0x12, 0x45, 0xA9, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0xF0, 0x90, 0xA2, 0x1B, \r
+0xE0, 0x75, 0xF0, 0x04, 0x22, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x22, 0x2F, 0xF5, \r
+0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9E, 0xF0, 0xE0, 0x22, 0x31, 0x4A, 0xE0, \r
+0x44, 0x40, 0xF0, 0x22, 0xE5, 0x68, 0x54, 0x7F, 0x90, 0xA1, 0xCE, 0xF0, 0x22, 0xFF, 0xE4, 0xFC, \r
+0xFD, 0xE5, 0x53, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, \r
+0x02, 0x45, 0x99, 0x75, 0xF0, 0x04, 0xEF, 0x12, 0x51, 0x19, 0xFE, 0x13, 0x13, 0x54, 0x03, 0xFC, \r
+0x12, 0x57, 0xEB, 0xE0, 0xFB, 0xB1, 0x50, 0xE0, 0x54, 0x7F, 0xFD, 0x64, 0x2C, 0x70, 0x1C, 0xEE, \r
+0x54, 0x03, 0xFE, 0xEC, 0xD3, 0x9E, 0x50, 0x13, 0xEC, 0x60, 0x10, 0x1C, 0xEC, 0xD1, 0x8F, 0xFE, \r
+0x75, 0xF0, 0x04, 0xEF, 0x12, 0x51, 0x19, 0x54, 0xF3, 0x4E, 0xF0, 0xED, 0xD3, 0x9B, 0x40, 0x02, \r
+0xAD, 0x03, 0xB1, 0x50, 0xE0, 0x54, 0x80, 0x42, 0x05, 0x8C, 0x6A, 0xE4, 0xFB, 0x02, 0x77, 0x89, \r
+0x74, 0x91, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0x22, 0x7D, 0x01, 0xAF, 0x51, 0xAA, \r
+0x07, 0xAB, 0x05, 0x75, 0xF0, 0x10, 0xEA, 0x71, 0x91, 0xE0, 0xF5, 0x5E, 0x54, 0x7F, 0xF5, 0x60, \r
+0x75, 0xF0, 0x04, 0xEA, 0x12, 0x56, 0xF1, 0xE0, 0x90, 0xA1, 0x13, 0xF0, 0x75, 0xF0, 0x04, 0xEA, \r
+0x12, 0x57, 0xEF, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xEA, 0x12, 0x51, 0x19, 0x13, 0x13, 0x54, 0x03, \r
+0xF5, 0x5F, 0xE5, 0x60, 0x12, 0xAB, 0x0F, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xEA, 0x12, \r
+0x76, 0x6E, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x75, 0xF0, 0x04, 0xEA, 0x12, 0x51, 0x19, 0xFE, 0xC4, \r
+0x54, 0x03, 0x90, 0xA1, 0x11, 0xF0, 0x74, 0x91, 0x2A, 0xB1, 0x53, 0xE5, 0x60, 0xF0, 0x74, 0x91, \r
+0x2A, 0x12, 0xAC, 0x54, 0xE5, 0x60, 0xD3, 0x9F, 0x40, 0x04, 0x8F, 0x60, 0x8F, 0x5E, 0xEB, 0x70, \r
+0x02, 0xC1, 0x81, 0xAF, 0x03, 0x8F, 0x61, 0xE5, 0x5E, 0x30, 0xE7, 0x05, 0x85, 0x60, 0x5E, 0x15, \r
+0x61, 0xE5, 0x61, 0x70, 0x02, 0xC1, 0x81, 0xE5, 0x60, 0x64, 0x2C, 0x70, 0x20, 0xE5, 0x5F, 0xD3, \r
+0x94, 0x00, 0x40, 0x19, 0xE5, 0x5F, 0xD3, 0x94, 0x02, 0x50, 0x12, 0x15, 0x5F, 0xD1, 0x8D, 0xFF, \r
+0x75, 0xF0, 0x04, 0xEA, 0x12, 0x51, 0x19, 0x54, 0xF3, 0x4F, 0xF0, 0x15, 0x61, 0xE5, 0x61, 0x60, \r
+0x70, 0x90, 0xA1, 0x13, 0xE0, 0xFF, 0xE5, 0x60, 0xD3, 0x9F, 0x40, 0x5F, 0xE4, 0x90, 0xA1, 0x12, \r
+0xF0, 0x85, 0x60, 0x5E, 0xAD, 0x5E, 0xE5, 0x60, 0x14, 0xFC, 0x90, 0xA1, 0x13, 0xE0, 0xFF, 0xEC, \r
+0xC3, 0x9F, 0x40, 0x41, 0xEC, 0x12, 0xAC, 0x97, 0xEA, 0x12, 0x55, 0x2D, 0xE0, 0xF5, 0x82, 0x75, \r
+0x83, 0x00, 0xEC, 0x54, 0x07, 0x91, 0xC6, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, \r
+0xF9, 0x12, 0xAC, 0x8D, 0x60, 0x1C, 0xE5, 0x60, 0xAD, 0x04, 0xB4, 0x14, 0x02, 0x7D, 0x0C, 0x90, \r
+0xA1, 0x12, 0xE0, 0x04, 0xF0, 0xE0, 0x65, 0x61, 0x60, 0x0B, 0xA3, 0xE0, 0xFF, 0xED, 0xD3, 0x9F, \r
+0x40, 0x03, 0x1C, 0x80, 0xB5, 0xAF, 0x05, 0x8F, 0x5E, 0x80, 0x06, 0x90, 0xA1, 0x13, 0xE0, 0xF5, \r
+0x5E, 0xAF, 0x02, 0x85, 0x5F, 0x6A, 0xE4, 0xFB, 0xAD, 0x5E, 0x02, 0x77, 0x89, 0xE5, 0x5F, 0x54, \r
+0x03, 0x25, 0xE0, 0x25, 0xE0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x2E, \r
+0xEF, 0xF0, 0xD1, 0xE8, 0x30, 0xE6, 0x3C, 0x7F, 0x8D, 0x12, 0x47, 0xAF, 0xEF, 0x64, 0x01, 0x70, \r
+0x32, 0x90, 0xA2, 0x2F, 0xF0, 0x90, 0xA2, 0x2F, 0xE0, 0xFD, 0x90, 0xA2, 0x2E, 0xE0, 0x75, 0xF0, \r
+0x10, 0x71, 0x91, 0xE5, 0x82, 0x2D, 0x12, 0x55, 0x36, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x50, 0xE6, \r
+0x90, 0xA2, 0x2F, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD9, 0xD1, 0xE8, 0x30, 0xE0, \r
+0x02, 0xF1, 0x58, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x8F, 0x12, 0x47, 0xAF, 0xEF, 0x22, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9E, 0xF0, 0xE0, 0xFF, 0x90, 0x9E, 0xEF, 0xE0, 0xB5, \r
+0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x39, 0x90, 0x9E, 0xEF, 0xE0, 0xFE, \r
+0xF1, 0x49, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0xA0, 0xF9, 0x74, 0x9E, 0x35, 0xF0, \r
+0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x51, 0xFD, 0x90, 0x9E, 0xEF, 0x12, 0x6F, 0xD8, 0xB4, 0x0A, \r
+0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9E, 0xEF, 0xF0, 0x71, 0xB2, 0x90, 0x9E, 0x92, \r
+0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0xF0, 0x08, 0x90, 0x9E, 0x9F, 0x02, \r
+0x45, 0xA9, 0x41, 0xDC, 0xE4, 0xFF, 0x21, 0x54, 0xE4, 0xFD, 0x7F, 0x8D, 0x02, 0x46, 0xA0, 0x11, \r
+0xE2, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x11, 0xE2, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xF1, 0xC2, 0x12, \r
+0x6A, 0x87, 0xFF, 0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x56, \r
+0xDE, 0xF5, 0x56, 0x80, 0x02, 0x8F, 0x56, 0x85, 0x55, 0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, \r
+0x22, 0x12, 0x57, 0xE3, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFD, 0xAF, 0x54, 0x12, 0x61, 0xD3, 0xAF, \r
+0x54, 0x12, 0x5F, 0x2F, 0xEF, 0xAF, 0x54, 0x70, 0x04, 0xF1, 0x66, 0x80, 0x02, 0xF1, 0x5F, 0x05, \r
+0x54, 0x80, 0xD7, 0xE5, 0x55, 0x70, 0x0A, 0xFF, 0x12, 0x5F, 0x2F, 0xEF, 0x70, 0x03, 0x12, 0xAB, \r
+0x6D, 0x22, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x22, 0x71, 0xB2, 0x7F, 0x02, 0x02, 0x6F, 0x57, \r
+0x12, 0x45, 0x39, 0x78, 0x01, 0x02, 0x08, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0x22, \r
+0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, \r
+0xE0, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x7F, 0x12, 0x80, 0x08, 0xD0, 0x07, 0xD0, 0x05, 0xD0, \r
+0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, \r
+0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, \r
+0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x15, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x80, 0x11, 0x08, 0xD0, \r
+0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, \r
+0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, \r
+0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x3C, 0xF0, 0x74, \r
+0x80, 0xA3, 0xF0, 0x11, 0xAE, 0xE5, 0x14, 0x30, 0xE7, 0x02, 0x11, 0x92, 0x74, 0x3C, 0x04, 0x90, \r
+0x01, 0xC4, 0xF0, 0x74, 0x80, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, \r
+0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, \r
+0xE0, 0x32, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x7F, 0xF2, 0x12, 0x47, 0xAF, 0xEF, 0x20, \r
+0xE6, 0x0B, 0x7F, 0x05, 0x12, 0x47, 0xF7, 0xFD, 0x7F, 0x05, 0x12, 0x46, 0xA0, 0x22, 0x7F, 0x54, \r
+0x12, 0x47, 0xAF, 0xE5, 0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, 0x12, 0x47, 0xAF, 0xE5, 0x0E, 0x5F, \r
+0xF5, 0x12, 0x7F, 0x56, 0x12, 0x47, 0xAF, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0x12, 0x47, \r
+0xAF, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD, 0x11, 0x7F, 0x54, 0x12, 0x46, 0xA0, 0xAD, 0x12, 0x7F, \r
+0x55, 0x12, 0x46, 0xA0, 0xAD, 0x13, 0x7F, 0x56, 0x12, 0x46, 0xA0, 0xAD, 0x14, 0x7F, 0x57, 0x12, \r
+0x46, 0xA0, 0x53, 0x91, 0xEF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, \r
+0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, \r
+0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xF6, 0xF0, 0x74, 0x80, 0xA3, 0xF0, 0x12, 0xA2, 0x35, \r
+0xE5, 0x19, 0x30, 0xE1, 0x02, 0x31, 0xB1, 0xE5, 0x19, 0x30, 0xE4, 0x03, 0x12, 0x7F, 0xC9, 0xE5, \r
+0x19, 0x30, 0xE5, 0x03, 0x12, 0xA2, 0x92, 0xE5, 0x19, 0x30, 0xE6, 0x03, 0x12, 0xA2, 0xCE, 0xE5, \r
+0x1B, 0x30, 0xE0, 0x02, 0x51, 0x49, 0xE5, 0x1B, 0x30, 0xE1, 0x03, 0x12, 0x95, 0x5F, 0xE5, 0x1B, \r
+0x30, 0xE2, 0x03, 0x12, 0xA2, 0xDB, 0xE5, 0x1B, 0x30, 0xE3, 0x02, 0x51, 0x33, 0xE5, 0x1B, 0x30, \r
+0xE4, 0x02, 0x51, 0xA6, 0xE5, 0x1B, 0x30, 0xE5, 0x03, 0x12, 0xA4, 0x0D, 0xE5, 0x1B, 0x30, 0xE6, \r
+0x03, 0x12, 0x68, 0x56, 0xE5, 0x1C, 0x30, 0xE1, 0x02, 0x51, 0xD0, 0xE5, 0x1C, 0x30, 0xE4, 0x03, \r
+0x12, 0x7F, 0x54, 0xE5, 0x1C, 0x30, 0xE5, 0x03, 0x12, 0x7F, 0x52, 0x74, 0xF6, 0x04, 0x90, 0x01, \r
+0xC4, 0xF0, 0x74, 0x80, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, \r
+0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, \r
+0x32, 0xE4, 0xFF, 0x90, 0xA1, 0x1B, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x64, 0xA3, 0xE0, \r
+0xF5, 0x65, 0x65, 0x64, 0x60, 0x6C, 0x90, 0xA1, 0x1C, 0x74, 0x03, 0xF0, 0x90, 0xA1, 0x2A, 0x74, \r
+0x08, 0xF0, 0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5, 0x66, 0xE4, 0xF5, 0x63, 0xE5, 0x66, 0x75, 0xF0, \r
+0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x63, 0x12, \r
+0x55, 0x36, 0xE0, 0xFF, 0x74, 0x1E, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xEF, \r
+0xF0, 0x05, 0x63, 0xE5, 0x63, 0xB4, 0x08, 0xD4, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x1C, 0x12, 0x6E, \r
+0xA2, 0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5, 0x65, 0xB4, 0x0F, 0x03, 0xE4, 0xF5, 0x65, 0x90, 0x04, \r
+0x7F, 0xE5, 0x65, 0xF0, 0x90, 0xA1, 0x1B, 0xE0, 0x7F, 0x04, 0x70, 0x03, 0x02, 0x6F, 0x57, 0x12, \r
+0x98, 0x0D, 0x22, 0x12, 0x5F, 0x8C, 0x64, 0x01, 0x70, 0x0E, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x08, \r
+0x51, 0xC4, 0x12, 0x6F, 0xBE, 0x12, 0x48, 0x2C, 0x22, 0x90, 0x9F, 0x9E, 0xE0, 0x30, 0xE0, 0x10, \r
+0xA3, 0x74, 0x01, 0xF0, 0x90, 0x9F, 0x9E, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x51, 0xFC, \r
+0x71, 0x8D, 0x90, 0xA0, 0x5F, 0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0x65, 0x1D, 0x22, 0x71, \r
+0x20, 0x12, 0x5C, 0xCD, 0x51, 0x62, 0x90, 0xA0, 0x52, 0xE0, 0x30, 0xE0, 0x28, 0x12, 0x97, 0x85, \r
+0x90, 0xA0, 0x55, 0xE0, 0x60, 0x05, 0x14, 0xF0, 0x02, 0x5E, 0xF0, 0x90, 0xA0, 0x53, 0xE0, 0x14, \r
+0x90, 0xA0, 0x55, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0x12, 0x88, 0xD8, 0x12, \r
+0x5C, 0xCD, 0x12, 0x8F, 0xC2, 0x22, 0x12, 0x5F, 0x8C, 0x64, 0x01, 0x70, 0x16, 0x90, 0x9F, 0xA7, \r
+0xE0, 0x60, 0x10, 0x51, 0xC4, 0x90, 0x9F, 0xA3, 0xE0, 0x12, 0x8F, 0x7F, 0x54, 0x07, 0x70, 0x03, \r
+0x12, 0x68, 0x44, 0x22, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x22, \r
+0x90, 0x9F, 0xA7, 0xE0, 0x70, 0x07, 0x90, 0x9F, 0x9E, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0x9F, 0x9E, \r
+0xE0, 0x30, 0xE0, 0x08, 0x51, 0xF0, 0xBF, 0x01, 0x06, 0x02, 0xA3, 0x1C, 0x12, 0x5E, 0x6F, 0x22, \r
+0x90, 0x05, 0x43, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0x9D, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x04, 0x80, 0x0B, 0x51, 0xF0, \r
+0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x91, 0x59, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0xE4, 0x90, 0xA1, 0x2B, 0xF0, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x61, 0x12, 0x5F, 0x8C, 0x64, 0x01, \r
+0x70, 0x5A, 0xF1, 0xD6, 0xF1, 0xC3, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x12, \r
+0xAC, 0x49, 0xF0, 0x12, 0x67, 0x80, 0xE4, 0x90, 0x9F, 0xAE, 0xF0, 0x90, 0x9F, 0x9E, 0xE0, 0x30, \r
+0xE0, 0x15, 0x90, 0x9F, 0xA2, 0xE0, 0xB4, 0x02, 0x05, 0xE4, 0x90, 0xA1, 0x2B, 0xF0, 0x51, 0xF0, \r
+0xEF, 0x70, 0x04, 0x90, 0xA1, 0x2B, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0x60, 0x1F, 0x90, 0x9F, 0xAB, \r
+0xE0, 0x44, 0x10, 0x12, 0xA9, 0x18, 0x90, 0x9F, 0xAF, 0xE0, 0x90, 0xA1, 0xDA, 0x12, 0x48, 0x2C, \r
+0x90, 0x9F, 0xAA, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x5A, 0x9D, 0x91, 0x33, 0x22, 0xE4, 0xF5, 0x63, \r
+0x90, 0x9F, 0xA7, 0xE0, 0x70, 0x02, 0x81, 0x28, 0x12, 0x5F, 0x8C, 0x64, 0x01, 0x60, 0x02, 0x81, \r
+0x28, 0xF1, 0xC4, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x12, 0xAC, 0x49, 0xD1, \r
+0xF5, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0x9F, 0xAE, 0xE0, 0x14, 0xF0, \r
+0xE0, 0xFF, 0x60, 0x06, 0x90, 0x9F, 0xB0, 0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0x9F, 0xAD, \r
+0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x63, 0x01, 0x90, 0x9F, 0x9E, 0xE0, 0x30, 0xE0, 0x11, 0x90, \r
+0x9F, 0xA2, 0xE0, 0xB4, 0x02, 0x03, 0xE4, 0xF5, 0x63, 0x51, 0xF0, 0xEF, 0x70, 0x02, 0xF5, 0x63, \r
+0xE5, 0x63, 0x60, 0x34, 0x90, 0x9F, 0xAB, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x9F, 0xB0, 0xE0, 0x60, \r
+0x03, 0xB4, 0x01, 0x04, 0x91, 0x29, 0x80, 0x08, 0x91, 0x29, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, \r
+0xFF, 0x90, 0x9F, 0xAF, 0xE0, 0x2F, 0x90, 0xA1, 0xDA, 0x12, 0x48, 0x2C, 0x90, 0x9F, 0xAA, 0xE0, \r
+0x20, 0xE2, 0x03, 0x12, 0x5A, 0x9D, 0x91, 0x33, 0x22, 0xE4, 0x90, 0xA1, 0xD9, 0xF0, 0x90, 0x9F, \r
+0xB0, 0xE0, 0x22, 0x12, 0x9D, 0x3F, 0x30, 0xE0, 0x1F, 0xD1, 0xD3, 0x20, 0xE0, 0x1A, 0xB1, 0xA8, \r
+0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x0E, 0x12, 0x9D, 0x48, 0x54, 0x3F, 0x30, 0xE0, 0x04, 0x7F, \r
+0x0D, 0x80, 0x02, 0x7F, 0x09, 0x12, 0x62, 0xC3, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0x90, 0x9F, 0xA1, 0xE0, 0x90, 0xA2, 0x37, 0xF0, 0x6F, 0x70, 0x02, 0xA1, 0x67, 0xEF, 0x14, 0x60, \r
+0x42, 0x14, 0x60, 0x70, 0x14, 0x70, 0x02, 0xA1, 0x12, 0x14, 0x70, 0x02, 0xA1, 0x3E, 0x24, 0x04, \r
+0x60, 0x02, 0xA1, 0x67, 0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x04, 0x04, 0xB1, 0x86, 0xA1, 0x67, 0x90, \r
+0xA2, 0x37, 0xE0, 0xB4, 0x02, 0x04, 0xB1, 0x92, 0xA1, 0x67, 0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x03, \r
+0x04, 0xB1, 0x9C, 0xA1, 0x67, 0x90, 0xA2, 0x37, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x67, 0xB1, \r
+0x89, 0xA1, 0x67, 0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0x5F, 0xD0, 0xA1, 0x67, 0x90, \r
+0xA2, 0x37, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0x5F, 0xDE, 0xA1, 0x67, 0x90, 0xA2, 0x37, 0xE0, 0xB4, \r
+0x03, 0x05, 0x12, 0x5F, 0xC7, 0xA1, 0x67, 0x90, 0xA2, 0x37, 0xE0, 0x60, 0x02, 0xA1, 0x67, 0x12, \r
+0x5F, 0xEC, 0xA1, 0x67, 0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0xA8, 0xB8, 0x80, 0x77, \r
+0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x01, 0x05, 0x12, 0x67, 0xDF, 0x80, 0x6B, 0x90, 0xA2, 0x37, 0xE0, \r
+0xB4, 0x03, 0x05, 0x12, 0x67, 0xEA, 0x80, 0x5F, 0x90, 0xA2, 0x37, 0xE0, 0x70, 0x59, 0xF1, 0xD0, \r
+0x80, 0x55, 0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0xA8, 0xAB, 0x80, 0x49, 0x90, 0xA2, \r
+0x37, 0xE0, 0xB4, 0x01, 0x04, 0xB1, 0x78, 0x80, 0x3E, 0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x02, 0x04, \r
+0xB1, 0x97, 0x80, 0x33, 0x90, 0xA2, 0x37, 0xE0, 0x70, 0x2D, 0xB1, 0x75, 0x80, 0x29, 0x90, 0xA2, \r
+0x37, 0xE0, 0xB4, 0x03, 0x04, 0xB1, 0xA1, 0x80, 0x1E, 0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x01, 0x04, \r
+0xB1, 0x6F, 0x80, 0x13, 0x90, 0xA2, 0x37, 0xE0, 0xB4, 0x02, 0x04, 0xD1, 0xDA, 0x80, 0x08, 0x90, \r
+0xA2, 0x37, 0xE0, 0x70, 0x02, 0xB1, 0x6C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x5F, 0xEC, 0x7D, \r
+0x1F, 0xD1, 0xE3, 0xF0, 0x22, 0x12, 0x5F, 0xEC, 0x7D, 0x21, 0x7F, 0xFF, 0x12, 0x49, 0x22, 0x90, \r
+0x9F, 0xA1, 0x74, 0x03, 0xF0, 0x22, 0x12, 0x5F, 0xD0, 0x12, 0xA9, 0xB9, 0xE4, 0x90, 0x9F, 0xA1, \r
+0xF0, 0x22, 0x12, 0x5F, 0xDE, 0x80, 0xF2, 0x12, 0x64, 0xAA, 0x80, 0xE3, 0x12, 0x5F, 0xC7, 0x80, \r
+0xE8, 0x7D, 0x25, 0xD1, 0xE3, 0xF0, 0x22, 0xF0, 0x90, 0xA0, 0x62, 0xE0, 0xC4, 0x54, 0x0F, 0x22, \r
+0x90, 0xA1, 0x2B, 0xEF, 0xF0, 0x7F, 0x03, 0x12, 0x66, 0xEC, 0xB1, 0xA8, 0x90, 0xA0, 0x72, 0x30, \r
+0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0xA0, 0x63, 0x12, 0x8F, 0xB4, \r
+0x20, 0xE0, 0x05, 0xD1, 0xD3, 0x30, 0xE0, 0x37, 0xB1, 0xA8, 0x30, 0xE0, 0x0A, 0x90, 0xA0, 0x60, \r
+0xE0, 0xFF, 0x90, 0xA0, 0x70, 0x80, 0x21, 0x90, 0xA1, 0x2B, 0xE0, 0xFC, 0xB4, 0x01, 0x0D, 0x90, \r
+0xA0, 0x60, 0xE0, 0xFE, 0x90, 0xA0, 0x6F, 0xE0, 0xC3, 0x9E, 0x80, 0x0F, 0xEC, 0xB4, 0x04, 0x0F, \r
+0x90, 0xA0, 0x61, 0xE0, 0xFF, 0x90, 0xA0, 0x6F, 0xE0, 0xC3, 0x9F, 0x90, 0xA0, 0x76, 0xF0, 0x12, \r
+0x9B, 0xC4, 0x30, 0xE0, 0x21, 0x12, 0x9B, 0xBB, 0x20, 0xE0, 0x02, 0xC1, 0x9E, 0xD1, 0xCA, 0x50, \r
+0x0A, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, \r
+0xFF, 0x12, 0x4E, 0xDD, 0x80, 0x68, 0x12, 0x9B, 0xB3, 0x30, 0xE0, 0x49, 0x12, 0xAC, 0xCE, 0xFD, \r
+0x7F, 0x04, 0x12, 0x5A, 0xA1, 0x12, 0x4F, 0xD0, 0x30, 0xE0, 0x3A, 0x90, 0xA0, 0x66, 0xE0, 0x44, \r
+0x02, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA0, 0x75, 0xF0, 0x90, 0xA0, 0x72, 0xF0, 0x90, 0xA1, \r
+0x2B, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA0, 0x67, 0x74, 0x06, 0xF0, 0x80, 0x0A, 0xEF, 0xB4, \r
+0x04, 0x06, 0x90, 0xA0, 0x67, 0x74, 0x07, 0xF0, 0x90, 0xA0, 0x51, 0xE0, 0x60, 0x07, 0x90, 0xA0, \r
+0x66, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x06, 0x80, 0x09, \r
+0x90, 0xA1, 0x2B, 0xE0, 0xB4, 0x04, 0x07, 0x7D, 0x0C, 0x7F, 0x6F, 0x12, 0x49, 0x22, 0x90, 0xA0, \r
+0x63, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x15, 0xD1, 0xCA, 0x50, 0x0A, 0xEF, 0x7F, \r
+0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x80, 0x04, 0x7F, 0xFF, 0x7E, 0x7F, 0x12, 0x4E, 0x12, 0x90, \r
+0xA0, 0x62, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x5C, 0x93, 0x22, 0x90, 0xA0, 0x76, 0xE0, 0xFF, 0xC3, \r
+0x94, 0x20, 0x22, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, 0x12, 0x64, 0xAA, 0x7D, 0x24, 0xD1, \r
+0xE3, 0xF0, 0x22, 0x7F, 0x6F, 0x12, 0x49, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, \r
+0x9F, 0xA1, 0x74, 0x04, 0x22, 0xF0, 0x90, 0x9F, 0xA5, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x22, 0xF1, \r
+0xC4, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0x1B, 0xEE, 0xF0, \r
+0xA3, 0xEF, 0xF0, 0x12, 0x5F, 0x8C, 0x64, 0x01, 0x60, 0x02, 0xE1, 0xB6, 0x90, 0x9F, 0xA7, 0xE0, \r
+0x70, 0x02, 0xE1, 0xB6, 0xD1, 0xF6, 0x64, 0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x9F, \r
+0xAE, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x9F, 0xAD, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, \r
+0x9F, 0xAD, 0xE0, 0xFE, 0xFF, 0x80, 0x00, 0x90, 0x9F, 0xAE, 0xEF, 0xF0, 0x12, 0x8B, 0x78, 0x12, \r
+0xAB, 0xFA, 0xE4, 0x90, 0x9F, 0xB0, 0x12, 0xAC, 0x3E, 0x51, 0xC4, 0x12, 0x8F, 0x82, 0x54, 0xEF, \r
+0xD1, 0xF5, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x0F, 0x90, 0x9F, 0x9E, 0xE0, 0x30, 0xE0, 0x05, 0x12, \r
+0x68, 0xC1, 0x80, 0x03, 0x12, 0x68, 0x75, 0x90, 0x9F, 0xA4, 0xE0, 0x12, 0x5E, 0xCD, 0x30, 0xE0, \r
+0x35, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x2C, 0x90, 0x9F, 0xAD, 0xE0, 0xFF, 0xA3, \r
+0xE0, 0x6F, 0x70, 0x22, 0x90, 0x9F, 0xA4, 0xE0, 0x44, 0x40, 0xF0, 0xF1, 0xD6, 0xF0, 0x90, 0x01, \r
+0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x88, 0xD0, 0x12, 0x5F, 0xA7, 0x12, 0x8F, 0xBB, \r
+0x90, 0x9F, 0xAE, 0xE0, 0x14, 0xF0, 0x90, 0x9F, 0x9E, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x03, 0x12, \r
+0xAB, 0xFA, 0x22, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x22, \r
+0x12, 0x5F, 0xEC, 0x02, 0x67, 0xDF, 0x90, 0x9F, 0xAD, 0xE0, 0x90, 0x05, 0x73, 0x22, 0xC0, 0xE0, \r
 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, \r
-0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x4E, \r
-0xF0, 0x74, 0x78, 0xA3, 0xF0, 0x11, 0xC0, 0xE5, 0x14, 0x30, 0xE7, 0x02, 0x11, 0xA4, 0x74, 0x4E, \r
-0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x78, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, \r
-0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, \r
-0xF0, 0xD0, 0xE0, 0x32, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x7F, 0xF2, 0x12, 0x47, 0xBF, \r
-0xEF, 0x20, 0xE6, 0x0B, 0x7F, 0x05, 0x12, 0x47, 0xFA, 0xFD, 0x7F, 0x05, 0x12, 0x46, 0xA0, 0x22, \r
-0x7F, 0x54, 0x12, 0x47, 0xBF, 0xE5, 0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, 0x12, 0x47, 0xBF, 0xE5, \r
-0x0E, 0x5F, 0xF5, 0x12, 0x7F, 0x56, 0x12, 0x47, 0xBF, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, \r
-0x12, 0x47, 0xBF, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD, 0x11, 0x7F, 0x54, 0x12, 0x46, 0xA0, 0xAD, \r
-0x12, 0x7F, 0x55, 0x12, 0x46, 0xA0, 0xAD, 0x13, 0x7F, 0x56, 0x12, 0x46, 0xA0, 0xAD, 0x14, 0x7F, \r
-0x57, 0x12, 0x46, 0xA0, 0x53, 0x91, 0xEF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, \r
-0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, \r
-0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x08, 0xF0, 0x74, 0x79, 0xA3, 0xF0, 0x12, \r
-0xA0, 0x4C, 0xE5, 0x19, 0x30, 0xE1, 0x02, 0xD1, 0x56, 0xE5, 0x19, 0x30, 0xE4, 0x02, 0xD1, 0x40, \r
-0xE5, 0x19, 0x30, 0xE5, 0x03, 0x12, 0xA0, 0xA9, 0xE5, 0x19, 0x30, 0xE6, 0x03, 0x12, 0xA0, 0xE5, \r
-0xE5, 0x1B, 0x30, 0xE0, 0x03, 0x12, 0x87, 0x43, 0xE5, 0x1B, 0x30, 0xE1, 0x03, 0x12, 0x96, 0x00, \r
-0xE5, 0x1B, 0x30, 0xE2, 0x03, 0x12, 0x92, 0x54, 0xE5, 0x1B, 0x30, 0xE3, 0x03, 0x12, 0x91, 0xBE, \r
-0xE5, 0x1B, 0x30, 0xE4, 0x03, 0x12, 0x91, 0xDC, 0xE5, 0x1B, 0x30, 0xE5, 0x03, 0x12, 0x97, 0x95, \r
-0xE5, 0x1B, 0x30, 0xE6, 0x03, 0x12, 0x97, 0x7E, 0xE5, 0x1C, 0x30, 0xE1, 0x03, 0x12, 0xA0, 0xF2, \r
-0xE5, 0x1C, 0x30, 0xE4, 0x02, 0xD1, 0xD8, 0xE5, 0x1C, 0x30, 0xE5, 0x02, 0x31, 0xC4, 0x74, 0x08, \r
-0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x79, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, \r
-0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, \r
-0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0xF5, 0x63, 0x74, 0x8D, 0x25, 0x63, 0x12, 0x95, 0xF8, 0xE0, 0x70, \r
-0x02, 0x41, 0x53, 0xE5, 0x63, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x63, 0x54, 0x07, 0xFE, \r
-0x74, 0x81, 0x2F, 0x12, 0x77, 0x6C, 0xE0, 0xFD, 0xAF, 0x06, 0xB1, 0x23, 0x80, 0x05, 0xC3, 0x33, \r
-0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x60, 0x59, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x12, \r
-0x75, 0xD7, 0xE0, 0x20, 0xE7, 0x02, 0x80, 0x10, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x02, \r
-0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x20, 0xE7, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x80, \r
-0x32, 0xEF, 0x30, 0xE6, 0x0A, 0x51, 0x6B, 0x54, 0x03, 0xF5, 0x6A, 0xE4, 0xFB, 0x80, 0x1F, 0x51, \r
-0x5F, 0xE0, 0x04, 0xF0, 0x51, 0x5F, 0xE0, 0xD3, 0x94, 0x03, 0x40, 0x0A, 0xAF, 0x63, 0x51, 0x85, \r
-0x51, 0x5F, 0xE4, 0xF0, 0x80, 0x0D, 0x51, 0x6B, 0x54, 0x03, 0xF5, 0x6A, 0x7B, 0x01, 0xAF, 0x63, \r
-0x12, 0x75, 0xDD, 0x05, 0x63, 0xE5, 0x63, 0xC3, 0x94, 0x80, 0x50, 0x02, 0x21, 0xC7, 0x22, 0x74, \r
-0x92, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x22, 0x75, 0xF0, 0x10, 0xE5, 0x63, \r
-0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x05, \r
-0x12, 0x45, 0xA9, 0xE0, 0x22, 0x75, 0xF0, 0x10, 0xEF, 0x51, 0x7D, 0x54, 0x03, 0xFE, 0x12, 0x77, \r
-0x90, 0xE0, 0xFC, 0x51, 0xD9, 0xE0, 0x54, 0x7F, 0xFD, 0x64, 0x2C, 0x70, 0x27, 0x75, 0xF0, 0x04, \r
-0xEF, 0x12, 0x51, 0x07, 0xF9, 0x54, 0x03, 0xFB, 0xEE, 0xD3, 0x9B, 0x50, 0x17, 0xEE, 0x60, 0x14, \r
-0x1E, 0xEE, 0xB1, 0x19, 0xFB, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE9, \r
-0x54, 0xF3, 0x4B, 0xF0, 0xED, 0xD3, 0x9C, 0x40, 0x02, 0xAD, 0x04, 0x51, 0xD9, 0xE0, 0x54, 0x80, \r
-0x42, 0x05, 0x8E, 0x6A, 0xE4, 0xFB, 0x02, 0x75, 0xDD, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
-0x9D, 0xF5, 0x83, 0x22, 0xAB, 0x07, 0x75, 0xF0, 0x10, 0xEB, 0xF1, 0xBC, 0xF5, 0x5E, 0xE4, 0xF5, \r
-0x62, 0xE5, 0x5E, 0x54, 0x7F, 0xF9, 0xE5, 0x5E, 0x54, 0x80, 0xFA, 0x75, 0xF0, 0x04, 0xEB, 0x12, \r
-0x77, 0x94, 0xE0, 0xF5, 0x60, 0x75, 0xF0, 0x04, 0xEB, 0x12, 0x51, 0x07, 0xFF, 0xC4, 0x54, 0x03, \r
-0xF5, 0x61, 0x12, 0x77, 0x3E, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x5E, 0x4A, 0xFF, \r
-0x74, 0x12, 0x2B, 0x51, 0xDC, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEB, 0x51, 0x7D, 0x54, 0x03, 0xF5, \r
-0x5F, 0x74, 0x12, 0x2B, 0x12, 0xA9, 0xB3, 0xE9, 0x64, 0x2C, 0x70, 0x29, 0x75, 0xF0, 0x04, 0xEB, \r
-0x12, 0x51, 0x07, 0xFF, 0x54, 0x03, 0xFE, 0xE5, 0x5F, 0xC3, 0x9E, 0x50, 0x18, 0x05, 0x5F, 0xB1, \r
-0x17, 0xFE, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xEF, 0x54, 0xF3, 0x4E, \r
-0xF0, 0x89, 0x5E, 0x80, 0x7E, 0xE9, 0xC3, 0x95, 0x60, 0x50, 0x43, 0xE9, 0x04, 0xFD, 0xED, 0xD3, \r
-0x95, 0x60, 0x50, 0x6F, 0xED, 0x12, 0xA9, 0xE6, 0xEB, 0x12, 0x56, 0x05, 0xE0, 0xF5, 0x82, 0x75, \r
-0x83, 0x00, 0xED, 0xB1, 0x20, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xF1, 0xDD, \r
-0x60, 0x19, 0xB9, 0x13, 0x10, 0x79, 0x18, 0x89, 0x5E, 0x74, 0x12, 0x2B, 0x12, 0x56, 0x2B, 0xE0, \r
-0x44, 0x04, 0xF0, 0x80, 0x3E, 0xA9, 0x05, 0x89, 0x5E, 0x80, 0x38, 0x0D, 0x80, 0xC0, 0xE9, 0x65, \r
-0x60, 0x70, 0x26, 0x75, 0xF0, 0x04, 0xEB, 0x12, 0x54, 0x0F, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, \r
-0xE0, 0x0C, 0xE5, 0x5E, 0x20, 0xE7, 0x07, 0xE9, 0x44, 0x80, 0xF5, 0x5E, 0x80, 0x15, 0x12, 0x77, \r
-0x3E, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x74, 0x12, 0x2B, 0x51, 0xDC, 0xE5, 0x60, \r
-0xF0, 0xF5, 0x5E, 0xAF, 0x03, 0x85, 0x5F, 0x6A, 0x7B, 0x01, 0xAD, 0x5E, 0x02, 0x75, 0xDD, 0xAA, \r
-0x07, 0xAB, 0x05, 0x75, 0xF0, 0x10, 0xEA, 0xF1, 0xBC, 0xF5, 0x5E, 0x54, 0x7F, 0xF5, 0x60, 0x75, \r
-0xF0, 0x04, 0xEA, 0x12, 0x56, 0xC6, 0xE0, 0x90, 0xA1, 0x00, 0xF0, 0x75, 0xF0, 0x04, 0xEA, 0x12, \r
-0x77, 0x94, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEA, 0x51, 0x7D, 0x54, 0x03, 0xF5, 0x5F, 0xE5, 0x60, \r
-0x12, 0x77, 0xB1, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xEA, 0x12, 0x77, 0x50, 0xF5, 0x83, \r
-0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x75, 0xF0, 0x04, 0xEA, 0x12, 0x51, 0x07, 0xFE, 0xC4, 0x54, 0x03, \r
-0x90, 0xA0, 0xFE, 0xF0, 0x74, 0x12, 0x2A, 0x51, 0xDC, 0xE5, 0x60, 0xF0, 0x74, 0x12, 0x2A, 0x12, \r
-0xA9, 0xB3, 0xE5, 0x60, 0xD3, 0x9F, 0x40, 0x04, 0x8F, 0x60, 0x8F, 0x5E, 0xEB, 0x70, 0x02, 0xA1, \r
-0x0B, 0xAF, 0x03, 0x8F, 0x61, 0xE5, 0x5E, 0x30, 0xE7, 0x05, 0x85, 0x60, 0x5E, 0x15, 0x61, 0xE5, \r
-0x61, 0x70, 0x02, 0xA1, 0x0B, 0xE5, 0x60, 0x64, 0x2C, 0x70, 0x20, 0xE5, 0x5F, 0xD3, 0x94, 0x00, \r
-0x40, 0x19, 0xE5, 0x5F, 0xD3, 0x94, 0x02, 0x50, 0x12, 0x15, 0x5F, 0xB1, 0x17, 0xFF, 0x75, 0xF0, \r
-0x04, 0xEA, 0x12, 0x51, 0x07, 0x54, 0xF3, 0x4F, 0xF0, 0x15, 0x61, 0xE5, 0x61, 0x60, 0x6C, 0x90, \r
-0xA1, 0x00, 0xE0, 0xFF, 0xE5, 0x60, 0xD3, 0x9F, 0x40, 0x5B, 0xE4, 0x90, 0xA0, 0xFF, 0xF0, 0x85, \r
-0x60, 0x5E, 0xAD, 0x5E, 0xE5, 0x60, 0x14, 0xFC, 0x90, 0xA1, 0x00, 0xE0, 0xFF, 0xEC, 0xC3, 0x9F, \r
-0x40, 0x3D, 0xEC, 0x12, 0xA9, 0xE6, 0xEA, 0x12, 0x56, 0x05, 0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, \r
-0xEC, 0xB1, 0x20, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xF1, 0xDD, 0x60, 0x1C, \r
-0xE5, 0x60, 0xAD, 0x04, 0xB4, 0x14, 0x02, 0x7D, 0x0C, 0x90, 0xA0, 0xFF, 0xE0, 0x04, 0xF0, 0xE0, \r
-0x65, 0x61, 0x60, 0x0B, 0xA3, 0xE0, 0xFF, 0xED, 0xD3, 0x9F, 0x40, 0x03, 0x1C, 0x80, 0xB9, 0xAF, \r
-0x05, 0x8F, 0x5E, 0x80, 0x06, 0x90, 0xA1, 0x00, 0xE0, 0xF5, 0x5E, 0xAF, 0x02, 0x85, 0x5F, 0x6A, \r
-0xE4, 0xFB, 0xAD, 0x5E, 0x02, 0x75, 0xDD, 0xE5, 0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0x22, \r
-0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, \r
-0x0F, 0x90, 0xA1, 0xFE, 0xF0, 0x90, 0xA1, 0xFE, 0xE0, 0xFD, 0x70, 0x02, 0xC1, 0x36, 0x90, 0x9D, \r
-0xF0, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9D, \r
-0xF1, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, \r
-0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA1, 0xF3, 0xE0, 0xB1, 0x22, 0x80, 0x05, 0xC3, 0x33, \r
-0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0xC1, 0x19, 0xE4, 0x90, 0xA1, 0xFF, \r
-0xF0, 0x90, 0xA1, 0xFF, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x42, 0xD1, 0x38, 0xA4, 0xFF, 0xE9, \r
-0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0xD1, 0x47, 0x12, 0x9D, 0x7A, \r
-0xE5, 0x82, 0x29, 0x12, 0x56, 0x0E, 0xEF, 0xD1, 0x37, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, \r
-0x74, 0xF0, 0xD1, 0x47, 0x75, 0xF0, 0x08, 0x90, 0x9D, 0xA4, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x29, \r
-0x12, 0x56, 0x0E, 0xEF, 0xF0, 0x90, 0xA1, 0xFF, 0xE0, 0x04, 0xF0, 0x80, 0xB4, 0x90, 0xA1, 0xFE, \r
-0xE0, 0xFF, 0x90, 0xA1, 0xF3, 0x12, 0xA9, 0x1B, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, \r
-0x90, 0xA1, 0xFE, 0xF0, 0x90, 0xA1, 0xF3, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, \r
-0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0xA1, 0xF3, 0xE0, 0x04, 0xF0, 0xE0, 0x54, \r
-0x03, 0xF0, 0x90, 0x9D, 0xF1, 0x12, 0x8F, 0x7B, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, \r
-0xA1, 0x35, 0xE4, 0x90, 0x9D, 0xF1, 0xF0, 0xA1, 0x35, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, \r
-0x90, 0xA1, 0xF3, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0xD1, 0x37, 0x90, 0x01, 0xD0, 0x12, 0x45, \r
-0xA9, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0xF0, 0x90, 0xA1, 0xF3, 0xE0, 0x75, 0xF0, 0x04, 0x22, \r
-0xB1, 0x2B, 0x7F, 0x02, 0x02, 0x86, 0x68, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, \r
-0xFF, 0x90, 0x9D, 0xF1, 0xE0, 0x22, 0xE4, 0xFF, 0x90, 0xA1, 0x08, 0xEF, 0xF0, 0x90, 0x04, 0x7E, \r
-0xE0, 0xF5, 0x64, 0xA3, 0xE0, 0xF5, 0x65, 0x65, 0x64, 0x60, 0x6C, 0x90, 0xA1, 0x09, 0x74, 0x03, \r
-0xF0, 0x90, 0xA1, 0x17, 0x74, 0x08, 0xF0, 0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5, 0x66, 0xE4, 0xF5, \r
-0x63, 0xE5, 0x66, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, \r
-0xE5, 0x82, 0x25, 0x63, 0x12, 0x56, 0x0E, 0xE0, 0xFF, 0x74, 0x0B, 0x25, 0x63, 0xF5, 0x82, 0xE4, \r
-0x34, 0xA1, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x63, 0xE5, 0x63, 0xB4, 0x08, 0xD4, 0x7B, 0x01, 0x7A, \r
-0xA1, 0x79, 0x09, 0x12, 0x8A, 0xE4, 0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5, 0x65, 0xB4, 0x0F, 0x03, \r
-0xE4, 0xF5, 0x65, 0x90, 0x04, 0x7F, 0xE5, 0x65, 0xF0, 0x90, 0xA1, 0x08, 0xE0, 0x7F, 0x04, 0x70, \r
-0x03, 0x02, 0x86, 0x68, 0x12, 0x8B, 0xCF, 0x22, 0xE4, 0xFF, 0x90, 0xA0, 0x5B, 0xEF, 0xF0, 0xE4, \r
-0xA3, 0xF0, 0x12, 0xAA, 0x0B, 0x50, 0x2B, 0xF1, 0xAB, 0xE4, 0xF0, 0x12, 0xA3, 0x67, 0x90, 0xA0, \r
-0x5C, 0x30, 0xE7, 0x07, 0x12, 0xA9, 0xA8, 0xE4, 0xF0, 0x80, 0x0F, 0xE0, 0xFF, 0xF1, 0xD6, 0x90, \r
-0xA0, 0x5C, 0xE0, 0x24, 0x5D, 0xF1, 0xAE, 0x74, 0x01, 0xF0, 0x90, 0xA0, 0x5C, 0xE0, 0x04, 0xF0, \r
-0x80, 0xD0, 0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xE4, 0x90, 0xA0, 0x5C, 0xF0, 0x12, 0xAA, \r
-0x0B, 0x40, 0x02, 0xE1, 0xAA, 0xF1, 0xAB, 0xE0, 0x60, 0x78, 0xF1, 0xCD, 0x90, 0x81, 0x06, 0xF1, \r
-0xC4, 0xEF, 0x90, 0x81, 0x07, 0x12, 0xA9, 0x90, 0xFC, 0x12, 0x77, 0xD7, 0xEE, 0x12, 0xAA, 0x71, \r
-0xEC, 0x90, 0x81, 0x0A, 0xF1, 0xC4, 0xEC, 0x90, 0x81, 0x0B, 0x12, 0xA9, 0x90, 0x75, 0xF0, 0x0A, \r
-0xF1, 0xB6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7F, 0x01, 0x90, 0xA0, 0x5C, 0xE0, 0xFE, 0x75, 0xF0, \r
-0x10, 0x90, 0x81, 0x0B, 0x12, 0x56, 0x08, 0xE0, 0xFD, 0x75, 0xF0, 0x0A, 0xEE, 0xF1, 0xB6, 0x75, \r
-0xF0, 0x02, 0xEF, 0x12, 0xA3, 0x55, 0xED, 0xF0, 0x0F, 0xEF, 0xB4, 0x05, 0xDC, 0xF1, 0xCD, 0x90, \r
-0x81, 0x09, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x12, 0xA3, 0x5C, 0xEE, 0xF0, 0x90, 0xA0, 0x5C, 0xE0, \r
-0xFF, 0x90, 0xA0, 0x5B, 0xE0, 0xFD, 0x12, 0xA2, 0xFC, 0x90, 0xA0, 0x5C, 0x12, 0xA9, 0xA8, 0x74, \r
-0x01, 0xF0, 0x90, 0xA0, 0x5C, 0xE0, 0x04, 0xF0, 0xE1, 0x1E, 0x22, 0x74, 0x5D, 0x2F, 0xF5, 0x82, \r
-0xE4, 0x34, 0xA0, 0xF5, 0x83, 0x22, 0x90, 0x8D, 0x01, 0x02, 0x45, 0xA9, 0x90, 0x81, 0x00, 0x12, \r
-0x45, 0xA9, 0xE0, 0x22, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0x22, 0x90, 0xA0, 0x5C, \r
-0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x22, 0x12, 0xA3, 0x67, 0x44, 0x40, 0xF0, 0x22, 0xFF, 0xEE, 0x55, \r
-0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, \r
-0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, \r
-0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xE7, 0xF0, 0x74, 0x7F, 0xA3, 0xF0, 0x12, 0xA0, \r
-0x79, 0xE5, 0x21, 0x30, 0xE1, 0x03, 0x12, 0xA1, 0x13, 0xE5, 0x21, 0x30, 0xE2, 0x03, 0x12, 0x6F, \r
-0x31, 0xE5, 0x21, 0x30, 0xE5, 0x02, 0x11, 0xA4, 0xE5, 0x22, 0x30, 0xE0, 0x03, 0x12, 0x95, 0x5B, \r
-0xE5, 0x23, 0x30, 0xE1, 0x03, 0x12, 0xA1, 0x67, 0xE5, 0x23, 0x30, 0xE0, 0x03, 0x12, 0xA1, 0x1F, \r
-0xE5, 0x23, 0x30, 0xE3, 0x02, 0xF1, 0xB3, 0xE5, 0x23, 0x30, 0xE2, 0x0A, 0x12, 0xA1, 0xB0, 0x90, \r
-0x07, 0x8F, 0xE0, 0x44, 0x10, 0xF0, 0xE5, 0x24, 0x30, 0xE1, 0x04, 0x7F, 0x04, 0xD1, 0x68, 0xE5, \r
-0x24, 0x30, 0xE4, 0x02, 0x11, 0xB7, 0xE5, 0x24, 0x30, 0xE5, 0x03, 0x12, 0x6E, 0x35, 0xE5, 0x24, \r
-0x30, 0xE6, 0x03, 0x12, 0x6E, 0x62, 0xE5, 0x24, 0x30, 0xE7, 0x03, 0x12, 0x67, 0xD0, 0x74, 0xE7, \r
-0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x7F, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, \r
+0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xDE, \r
+0xF0, 0x74, 0x87, 0xA3, 0xF0, 0x12, 0xA2, 0x62, 0xE5, 0x21, 0x30, 0xE1, 0x02, 0x11, 0xC1, 0xE5, \r
+0x21, 0x30, 0xE2, 0x02, 0x31, 0x46, 0xE5, 0x21, 0x30, 0xE5, 0x02, 0x11, 0x97, 0xE5, 0x22, 0x30, \r
+0xE0, 0x02, 0x51, 0xD8, 0xE5, 0x23, 0x30, 0xE1, 0x03, 0x12, 0xA4, 0x29, 0xE5, 0x23, 0x30, 0xE0, \r
+0x03, 0x12, 0xA3, 0x57, 0xE5, 0x23, 0x30, 0xE3, 0x02, 0xF1, 0xB3, 0xE5, 0x23, 0x30, 0xE2, 0x09, \r
+0x31, 0xB6, 0x90, 0x07, 0x8F, 0xE0, 0x44, 0x10, 0xF0, 0xE5, 0x24, 0x30, 0xE1, 0x05, 0x7F, 0x04, \r
+0x12, 0x6F, 0x57, 0xE5, 0x24, 0x30, 0xE4, 0x03, 0x12, 0x82, 0x6F, 0xE5, 0x24, 0x30, 0xE5, 0x02, \r
+0x31, 0x87, 0xE5, 0x24, 0x30, 0xE6, 0x03, 0x12, 0xA4, 0x72, 0xE5, 0x24, 0x30, 0xE7, 0x02, 0x31, \r
+0x2E, 0x74, 0xDE, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x87, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, \r
+0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, \r
+0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0xA0, 0xC1, 0xE0, 0x30, 0xE0, 0x0A, 0x11, 0xA9, \r
+0xE4, 0x90, 0xA0, 0xC3, 0xF0, 0x12, 0x48, 0x05, 0x22, 0x7D, 0x20, 0xE4, 0xFF, 0x74, 0x1D, 0x12, \r
+0xAD, 0x31, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, \r
+0x22, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x02, 0x91, 0x97, 0x02, 0x48, 0x61, 0x7D, 0x03, 0x7F, 0x02, \r
+0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0x80, 0xDA, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xAC, \r
+0x07, 0xEF, 0x54, 0x01, 0xFE, 0x90, 0xA0, 0x52, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x64, 0x01, \r
+0x70, 0x21, 0x90, 0x01, 0x53, 0xF0, 0x90, 0xA0, 0x54, 0xE0, 0x60, 0x0B, 0x7D, 0x10, 0x7F, 0x03, \r
+0x11, 0xD0, 0x12, 0x97, 0x85, 0x80, 0x18, 0x31, 0x24, 0x11, 0xAD, 0x12, 0x5F, 0xA1, 0x12, 0x5E, \r
+0xF0, 0x80, 0x0C, 0x31, 0x24, 0x11, 0xD0, 0x12, 0x5C, 0xCD, 0xF1, 0xC2, 0x12, 0x5C, 0x99, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x53, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, 0x22, 0x90, 0xA0, \r
+0x7A, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0x67, 0xA3, 0x80, 0x02, 0xF1, 0x3F, 0x90, 0xA0, 0xAD, 0xE0, \r
+0x30, 0xE0, 0x02, 0x31, 0xE8, 0x22, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x14, 0x90, 0x06, 0x92, 0xE0, \r
+0x30, 0xE1, 0x03, 0x02, 0xA8, 0xE1, 0x90, 0x9F, 0xA3, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x68, 0x44, \r
+0x22, 0xF1, 0xC9, 0x90, 0xA0, 0x52, 0x12, 0x6F, 0x44, 0x12, 0x6A, 0x86, 0x90, 0xA0, 0x53, 0x12, \r
+0x56, 0xDD, 0x90, 0xA0, 0x54, 0xF0, 0x90, 0xA0, 0x53, 0xE0, 0x90, 0xA0, 0x55, 0xF0, 0x90, 0xA0, \r
+0x52, 0xE0, 0x54, 0x01, 0xFF, 0x01, 0xD8, 0x90, 0x9F, 0xA3, 0x12, 0x6F, 0xA4, 0x30, 0xE0, 0x25, \r
+0xEF, 0x54, 0xBF, 0x12, 0xA5, 0x05, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, \r
+0x54, 0xFE, 0xF0, 0x90, 0xA0, 0x65, 0xF1, 0xB4, 0x30, 0xE0, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x02, \r
+0x5A, 0xA1, 0x12, 0x68, 0x44, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0xAD, \r
+0xE0, 0x30, 0xE0, 0x1F, 0x90, 0xA0, 0xB2, 0xE0, 0xB4, 0x01, 0x0C, 0xA3, 0xE0, 0xB4, 0x01, 0x13, \r
+0x74, 0x02, 0xF0, 0x51, 0x53, 0x80, 0x0C, 0x90, 0xA0, 0xB2, 0xE0, 0xB4, 0x02, 0x05, 0x74, 0x03, \r
+0xF0, 0x31, 0xE8, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
+0xA0, 0xB4, 0xE0, 0xB4, 0x01, 0x02, 0x80, 0x43, 0x90, 0xA0, 0xB4, 0xE0, 0xB4, 0x02, 0x11, 0x51, \r
+0x53, 0x7F, 0x01, 0x51, 0x84, 0x12, 0x66, 0xFE, 0x90, 0xA0, 0xB4, 0x74, 0x03, 0xF0, 0x80, 0x3E, \r
+0x90, 0xA0, 0xB4, 0xE0, 0x64, 0x03, 0x70, 0x1C, 0x90, 0xA0, 0xB7, 0x51, 0x56, 0xE4, 0xFF, 0x51, \r
+0x84, 0x12, 0x66, 0xFE, 0x51, 0x7A, 0xE4, 0xFB, 0xFD, 0x12, 0x4E, 0x54, 0x90, 0xA0, 0xB4, 0x74, \r
+0x04, 0xF0, 0x80, 0x1A, 0x90, 0xA0, 0xB4, 0xE0, 0xB4, 0x04, 0x13, 0x51, 0x7A, 0x7B, 0x01, 0x7D, \r
+0x01, 0x12, 0x4E, 0x54, 0x90, 0xA0, 0xB4, 0x74, 0x02, 0xF0, 0x90, 0xA0, 0xB2, 0xF0, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0x90, 0xA0, 0xB9, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xAD, 0x07, 0xEE, 0xFF, 0x90, \r
+0x01, 0x6F, 0xE4, 0xF0, 0x8F, 0x35, 0xAF, 0x05, 0x8F, 0x36, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, \r
+0x12, 0x3C, 0xB1, 0x90, 0x01, 0x6F, 0x74, 0x05, 0xF0, 0x22, 0x90, 0xA0, 0xAD, 0xE0, 0xC3, 0x13, \r
+0x54, 0x03, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xB4, 0x03, 0x10, 0x90, \r
+0xA0, 0x62, 0x12, 0x4F, 0xD3, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x35, 0xE4, 0xF0, 0x80, 0x34, 0x90, \r
+0xA0, 0x63, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0C, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0, \r
+0x80, 0x03, 0x74, 0x03, 0xF0, 0x90, 0xA0, 0xAD, 0xE0, 0x30, 0xE0, 0x17, 0xC4, 0x54, 0x0F, 0x30, \r
+0xE0, 0x0B, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0, 0x80, 0x08, 0x80, 0x03, 0x90, 0x06, 0xCC, \r
+0x74, 0x03, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0xA5, 0x0E, 0x90, 0xA1, 0x2B, 0xEF, 0xF0, \r
+0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x5A, 0x1E, 0x90, 0xA1, \r
+0x2B, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, \r
+0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x91, 0xF9, 0x90, 0x9F, 0xC0, 0xE0, 0xFB, 0xAC, 0x07, 0x90, \r
+0x9F, 0xA3, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x9F, 0xDD, 0xE0, 0x24, 0x04, 0x90, 0x9F, 0xBC, 0xF0, \r
+0x90, 0x9F, 0xDD, 0xE0, 0x24, 0x03, 0x90, 0x9F, 0xBB, 0xF0, 0x80, 0x0B, 0x90, 0x9F, 0xBC, 0x74, \r
+0x02, 0xF0, 0x90, 0x9F, 0xBB, 0x14, 0xF0, 0x90, 0x9F, 0xBB, 0xE0, 0xFA, 0x90, 0x9F, 0xBA, 0xE0, \r
+0xD3, 0x9A, 0x50, 0x09, 0x90, 0x9F, 0xAF, 0xEB, 0x71, 0x70, 0x2C, 0x80, 0x0B, 0xAD, 0x02, 0xC3, \r
+0xED, 0x9D, 0x2B, 0x90, 0x9F, 0xAF, 0x71, 0x70, 0x90, 0x9F, 0xBF, 0xF0, 0x90, 0x9F, 0xBF, 0xE0, \r
+0xFF, 0x7E, 0x00, 0x90, 0x9F, 0xB3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x05, 0x58, 0xF0, 0x22, \r
+0xF0, 0x90, 0x9F, 0xBC, 0xE0, 0xC3, 0x9D, 0x22, 0xE4, 0xFD, 0xF9, 0xFC, 0x90, 0x05, 0x62, 0xE0, \r
+0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFB, 0xEB, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, \r
+0xFF, 0xEE, 0x54, 0x3F, 0x90, 0x9F, 0xE0, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, \r
+0xFF, 0x90, 0x9F, 0xE0, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3, 0x9F, 0xEA, 0x9E, 0x40, 0x21, 0xEB, \r
+0x9F, 0xFF, 0x90, 0x9F, 0xBF, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F, 0xF9, 0xC3, 0x94, 0x19, \r
+0x50, 0x0E, 0x74, 0xC4, 0x29, 0x91, 0x64, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0xBD, 0xE0, 0x04, 0xF0, \r
+0x90, 0x9F, 0xBD, 0xE0, 0xC3, 0x94, 0x64, 0x50, 0x02, 0x81, 0x60, 0xE4, 0xFC, 0xFD, 0x91, 0x61, \r
+0xE0, 0x2C, 0xFC, 0xD3, 0x94, 0x05, 0x40, 0x07, 0x90, 0xA1, 0x1D, 0xED, 0xF0, 0x80, 0x05, 0x0D, \r
+0xED, 0xB4, 0x19, 0xEA, 0xE4, 0xFC, 0xFD, 0x91, 0x61, 0xE0, 0x2C, 0xFC, 0xD3, 0x94, 0x5F, 0x40, \r
+0x07, 0x90, 0xA1, 0x1E, 0xED, 0xF0, 0x80, 0x05, 0x0D, 0xED, 0xB4, 0x19, 0xEA, 0x90, 0xA1, 0x1D, \r
+0xE0, 0x90, 0x9F, 0xC2, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x90, 0x9F, 0xC3, 0x91, 0x6C, 0x94, 0x0B, \r
+0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0x9F, 0xBA, 0xF0, 0xE4, 0x80, 0x09, 0xE4, 0x90, 0x9F, 0xBA, \r
+0x91, 0x6C, 0x74, 0x0A, 0x9F, 0x90, 0x9F, 0xB9, 0xF0, 0x90, 0x9F, 0xC2, 0xE0, 0xFF, 0xA3, 0xE0, \r
+0xC3, 0x9F, 0x90, 0x9F, 0xC0, 0xF0, 0xC3, 0x94, 0x08, 0x50, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x9F, \r
+0xBA, 0xE0, 0xFD, 0x90, 0x9F, 0xC0, 0xE0, 0xFB, 0xE4, 0xFF, 0x71, 0x0D, 0xE4, 0xFF, 0xF1, 0x8A, \r
+0x22, 0x74, 0xC4, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0x22, 0xF0, 0x90, 0x9F, 0xC2, \r
+0xE0, 0xFF, 0xC3, 0x22, 0xF1, 0x0B, 0x40, 0x1E, 0x90, 0x9F, 0xC1, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, \r
+0x94, 0x04, 0x50, 0x12, 0x90, 0x9F, 0xB9, 0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0x9F, 0xC0, \r
+0xF0, 0xFB, 0x91, 0xF9, 0x71, 0x0D, 0x22, 0x90, 0x9F, 0xA4, 0xE0, 0x12, 0x5E, 0xCD, 0x30, 0xE0, \r
+0x0B, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xF1, 0xBB, 0xB1, 0x02, 0x30, 0xE0, \r
+0x08, 0xF1, 0x7E, 0x54, 0x07, 0x70, 0x39, 0x80, 0x34, 0xD1, 0xFE, 0x40, 0x30, 0x12, 0x5F, 0x8C, \r
+0x64, 0x01, 0x70, 0x2C, 0x12, 0x69, 0x3A, 0x70, 0x04, 0x91, 0x74, 0x80, 0x24, 0x91, 0x74, 0x90, \r
+0x9F, 0xB1, 0xE0, 0x04, 0xF0, 0xE0, 0xD3, 0x94, 0x02, 0x40, 0x09, 0x91, 0xF1, 0xE4, 0x90, 0x9F, \r
+0xB1, 0xF0, 0x80, 0x03, 0x12, 0x5F, 0xB7, 0xE4, 0x90, 0x9F, 0xB0, 0xF0, 0x22, 0x12, 0x68, 0x44, \r
+0x22, 0x90, 0x9F, 0xA4, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x90, 0x9F, 0xB9, 0xE0, 0xFF, 0xA3, 0xE0, \r
+0xFD, 0x22, 0x90, 0x9F, 0xA3, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x22, 0x12, 0x4F, 0xD0, 0x20, \r
+0xE0, 0x02, 0xC1, 0xB9, 0x90, 0xA0, 0x67, 0xE0, 0x64, 0x01, 0x70, 0x2A, 0x90, 0x06, 0x92, 0xE0, \r
+0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x18, 0xD1, 0xC0, 0xD1, 0xC7, 0x90, 0xA0, 0x6B, \r
+0xE0, 0x75, 0xF0, 0x03, 0x84, 0xFF, 0x90, 0xA0, 0x74, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xC1, \r
+0xA3, 0xD1, 0xD6, 0x04, 0xF0, 0x22, 0x90, 0xA0, 0x67, 0xE0, 0x64, 0x04, 0x70, 0x27, 0x90, 0x06, \r
+0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x14, 0xD1, 0xC0, 0xD1, 0xC7, 0x90, \r
+0xA0, 0x6A, 0xE0, 0xFF, 0x90, 0xA0, 0x74, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xC1, 0xA3, 0xD1, \r
+0xD6, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA0, 0x67, 0xE0, 0x64, 0x06, 0x60, 0x02, 0xC1, 0x22, 0xF1, \r
+0x17, 0x50, 0x08, 0x90, 0xA0, 0x75, 0xE0, 0x94, 0x03, 0x40, 0x1B, 0x12, 0x85, 0xA8, 0x90, 0xA0, \r
+0x72, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA0, 0x67, \r
+0xF0, 0x90, 0xA0, 0x75, 0xF0, 0x22, 0x90, 0xA0, 0x66, 0xB1, 0x05, 0x30, 0xE0, 0x40, 0xEF, 0x54, \r
+0xFB, 0xF0, 0xE4, 0xA3, 0x12, 0x85, 0xA7, 0x30, 0xE0, 0x0B, 0x90, 0xA0, 0x84, 0xE0, 0x20, 0xE0, \r
+0x02, 0xC1, 0x59, 0xC1, 0x4C, 0xF1, 0x17, 0x40, 0x0B, 0x90, 0xA0, 0x84, 0xE0, 0x30, 0xE0, 0x02, \r
+0x80, 0x7A, 0xC1, 0x59, 0x90, 0xA0, 0x84, 0xE0, 0x30, 0xE0, 0x0C, 0xD1, 0xBA, 0xE4, 0x90, 0xA0, \r
+0x74, 0xF0, 0x90, 0xA2, 0x15, 0x80, 0x7D, 0x90, 0xA0, 0x72, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x4C, \r
+0x80, 0x90, 0xA0, 0x75, 0xE0, 0x04, 0xF0, 0x7F, 0x03, 0x12, 0x66, 0xEC, 0xF1, 0x17, 0x50, 0x0A, \r
+0x90, 0xA0, 0x75, 0xE0, 0x94, 0x03, 0x50, 0x02, 0xC1, 0xB9, 0x7F, 0x03, 0x12, 0x62, 0xC3, 0x90, \r
+0x05, 0x22, 0xE0, 0x44, 0x10, 0xFF, 0x7D, 0x03, 0x12, 0x49, 0x22, 0x90, 0x04, 0x9C, 0xE0, 0x04, \r
+0xF0, 0x22, 0x90, 0xA0, 0x67, 0xE0, 0x64, 0x07, 0x70, 0x3D, 0x90, 0xA0, 0x75, 0xE0, 0xB4, 0x04, \r
+0x05, 0x12, 0x6F, 0xD1, 0x80, 0x67, 0x90, 0xA0, 0x66, 0xB1, 0x05, 0x30, 0xE0, 0x1E, 0xEF, 0x54, \r
+0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA0, 0x84, 0xE0, 0x30, 0xE0, 0x0D, 0xD1, 0xBA, 0xE4, 0x90, \r
+0xA0, 0x74, 0xF0, 0x90, 0xA2, 0x15, 0x04, 0x80, 0x0B, 0x02, 0x6F, 0xD1, 0x12, 0x4C, 0x80, 0x90, \r
+0xA0, 0x75, 0xE0, 0x04, 0xF0, 0x80, 0x3C, 0x90, 0xA0, 0x67, 0xE0, 0x64, 0x09, 0x70, 0x4A, 0x90, \r
+0xA0, 0x66, 0xE0, 0x30, 0xE0, 0x0B, 0x12, 0x6F, 0xD1, 0x90, 0xA0, 0x66, 0xE0, 0x54, 0xFE, 0xF0, \r
+0x22, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE2, 0x20, 0x74, 0x04, 0xF0, 0xD1, 0xC7, 0xE0, 0xB4, 0x02, \r
+0x12, 0xD1, 0xCE, 0x60, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA0, \r
+0x67, 0xF0, 0x22, 0x7F, 0x03, 0x02, 0x66, 0xEC, 0xD1, 0xCE, 0x60, 0x05, 0x74, 0x05, 0xF0, 0x80, \r
+0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA0, 0x67, 0xF0, 0x22, 0x90, 0xA0, 0x67, 0x74, 0x09, 0xF0, \r
+0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA0, 0x74, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA2, \r
+0x15, 0xE0, 0x90, 0xA0, 0x72, 0x22, 0xE4, 0x90, 0xA0, 0x67, 0xF0, 0x90, 0xA0, 0x72, 0x22, 0x90, \r
+0x01, 0x57, 0xE0, 0x60, 0x18, 0x12, 0x82, 0xC7, 0xB1, 0x02, 0x30, 0xE0, 0x02, 0xE1, 0x7E, 0xD1, \r
+0xFE, 0x40, 0x0A, 0xE4, 0xFF, 0x12, 0x5F, 0x2F, 0xBF, 0x01, 0x02, 0x91, 0xF1, 0x22, 0x90, 0x9F, \r
+0xB0, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0xAB, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA0, 0x4B, 0xE0, 0xFF, \r
+0x90, 0x9F, 0xB0, 0xE0, 0xD3, 0x9F, 0x22, 0x90, 0xA0, 0x75, 0xE0, 0xFF, 0x90, 0xA0, 0x74, 0xE0, \r
+0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, 0xA0, 0x6B, 0xE0, \r
+0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x22, 0x90, \r
+0xA0, 0x5F, 0xE0, 0x30, 0xE0, 0x37, 0xB1, 0x0C, 0x90, 0xA0, 0x72, 0xE0, 0xFF, 0xB4, 0x01, 0x02, \r
+0x80, 0x1D, 0x90, 0xA0, 0x72, 0xE0, 0xFF, 0xB4, 0x02, 0x02, 0x80, 0x1E, 0x90, 0xA0, 0x72, 0xE0, \r
+0xFF, 0xB4, 0x03, 0x03, 0x02, 0x65, 0x1D, 0x90, 0xA0, 0x72, 0xE0, 0xFF, 0xB4, 0x04, 0x03, 0x02, \r
+0x85, 0xB0, 0x90, 0xA0, 0x72, 0xE0, 0xFF, 0xB4, 0x05, 0x03, 0x12, 0x9A, 0x62, 0x22, 0xEF, 0x54, \r
+0xFB, 0xF0, 0x90, 0x9F, 0xAB, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0xE4, 0xFE, 0x74, 0xC4, 0x2E, 0x91, \r
+0x64, 0xE4, 0xF0, 0x0E, 0xEE, 0xB4, 0x19, 0xF4, 0xE4, 0x90, 0x9F, 0xBD, 0xF0, 0x90, 0x9F, 0xC1, \r
+0xF0, 0x90, 0x9F, 0xB9, 0xF0, 0xEF, 0xB4, 0x01, 0x09, 0x90, 0x9F, 0xC2, 0x74, 0x19, 0xF0, 0xE4, \r
+0xA3, 0xF0, 0x22, 0x22, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x02, \r
+0x5F, 0xAB, 0x7D, 0x01, 0x7F, 0x02, 0x02, 0x5C, 0xD1, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, \r
+0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, \r
+0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, \r
+0xC4, 0x74, 0xD1, 0xF0, 0x74, 0x8F, 0xA3, 0xF0, 0x12, 0x90, 0x24, 0x53, 0x91, 0xBF, 0x74, 0xD1, \r
+0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x8F, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, \r
 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, \r
-0xF0, 0xD0, 0xE0, 0x32, 0x90, 0xA0, 0x2C, 0xE0, 0x30, 0xE0, 0x0B, 0x12, 0x6F, 0x6B, 0xE4, 0x90, \r
-0xA0, 0x2E, 0xF0, 0x12, 0x48, 0x00, 0x22, 0x12, 0x90, 0x13, 0x12, 0x97, 0x5A, 0xF1, 0xC1, 0x11, \r
-0xC4, 0x02, 0x5F, 0x29, 0x90, 0x9F, 0xCA, 0xE0, 0x30, 0xE0, 0x04, 0xE4, 0xFF, 0x11, 0xD0, 0x22, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xC8, 0xEF, 0xF0, 0xA3, 0x74, 0x02, 0xF0, \r
-0xE4, 0xFF, 0x12, 0x97, 0xD0, 0x90, 0x9F, 0xCE, 0x12, 0x6E, 0xBB, 0x30, 0xE0, 0x03, 0x12, 0x5F, \r
-0x71, 0x90, 0x9F, 0xCE, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x01, 0x80, 0x37, 0x90, 0x9F, 0xCA, 0x12, \r
-0x4F, 0xD2, 0x30, 0xE0, 0x04, 0x7F, 0x0D, 0x80, 0x2A, 0x90, 0x9F, 0xCD, 0xE0, 0xFF, 0xC4, 0x54, \r
-0x0F, 0x30, 0xE0, 0x10, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x04, 0x7F, 0x09, 0x80, 0x13, \r
-0x7F, 0x03, 0x80, 0x0F, 0x90, 0x9F, 0xCD, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, \r
-0x02, 0x7F, 0x09, 0x12, 0x62, 0x14, 0x90, 0xA1, 0xC8, 0xE0, 0x64, 0x03, 0x70, 0x6A, 0x12, 0x4F, \r
-0xCF, 0x30, 0xE0, 0x5F, 0x90, 0x9F, 0xD5, 0xE0, 0xFF, 0x90, 0x9F, 0xE0, 0xE0, 0xFE, 0xD3, 0x9F, \r
-0x40, 0x37, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0x9F, 0xD7, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, \r
-0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x9F, 0xCC, 0xE0, 0xFE, 0xD3, 0x9D, 0xEC, 0x12, \r
-0x77, 0x9E, 0x40, 0x08, 0xEE, 0x9F, 0x90, 0xA1, 0xCB, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xCB, 0x74, \r
-0x03, 0xF0, 0x90, 0xA1, 0xCB, 0x51, 0xAE, 0x80, 0x13, 0x90, 0x9F, 0xD8, 0xE0, 0xFF, 0x51, 0x9C, \r
-0x90, 0x9F, 0xD3, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x9F, 0xDE, 0x91, 0x6A, 0xE4, 0x90, 0x9F, 0xE0, \r
-0xF0, 0x80, 0x05, 0x90, 0x9F, 0xCC, 0x51, 0xAE, 0x90, 0x9F, 0xCA, 0xE0, 0x12, 0x56, 0xCD, 0x30, \r
-0xE0, 0x07, 0xE4, 0x90, 0xA1, 0xCA, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xCA, 0x74, 0x01, 0xF0, 0x12, \r
-0xAA, 0x38, 0x20, 0xE0, 0x13, 0x90, 0xA0, 0x0C, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA1, 0xC9, 0xF0, \r
-0x80, 0x06, 0x90, 0xA1, 0xC9, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xC9, 0x12, 0x62, 0xC8, 0x90, 0x9F, \r
-0xDD, 0x74, 0x01, 0xF0, 0xD1, 0x1B, 0x30, 0xE0, 0x0D, 0x90, 0xA1, 0xC8, 0xE0, 0x70, 0x3A, 0xFD, \r
-0xFF, 0x12, 0x49, 0x1D, 0x80, 0x33, 0xD1, 0x13, 0x30, 0xE0, 0x1A, 0x90, 0x9F, 0xD1, 0xE0, 0x44, \r
-0x20, 0xF0, 0x90, 0x9F, 0xBC, 0xE0, 0x60, 0x04, 0x7D, 0x01, 0x80, 0x18, 0x12, 0x5C, 0x9B, 0x7D, \r
-0x01, 0x7F, 0x0C, 0x80, 0x11, 0x90, 0xA1, 0xC8, 0xE0, 0xB4, 0x03, 0x0D, 0x90, 0x9F, 0x17, 0xE0, \r
-0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x5A, 0xA8, 0x90, 0x9F, 0xBC, 0xE0, 0x60, 0x18, 0x90, \r
-0xA1, 0xC8, 0xE0, 0x70, 0x04, 0x7D, 0x04, 0x80, 0x0A, 0x90, 0xA1, 0xC8, 0xE0, 0x64, 0x03, 0x70, \r
-0x2C, 0x7D, 0x0B, 0x7F, 0x6F, 0x80, 0x23, 0x90, 0xA1, 0xC8, 0xE0, 0x70, 0x04, 0xFD, 0xFF, 0x80, \r
-0x19, 0x90, 0xA1, 0xC8, 0xE0, 0xB4, 0x03, 0x15, 0xD1, 0x24, 0x20, 0xE0, 0x0A, 0xEF, 0x13, 0x13, \r
-0x54, 0x3F, 0x30, 0xE0, 0x02, 0xF1, 0xD8, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x1D, 0x90, 0x9F, 0xCD, \r
-0xE0, 0x12, 0x56, 0xCD, 0x30, 0xE0, 0x05, 0x7F, 0x01, 0x12, 0x8F, 0xCD, 0x90, 0x9F, 0xCE, 0xE0, \r
-0xC3, 0x13, 0x30, 0xE0, 0x0E, 0x90, 0x06, 0xCD, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x06, 0xCF, 0xE0, \r
-0x44, 0x10, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0xC3, 0x9F, 0xFF, 0xE4, 0x90, 0xA1, 0xB1, \r
-0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x02, 0x48, 0x2F, 0xE0, 0xFF, \r
-0x51, 0x9C, 0x90, 0x9F, 0xDE, 0xE0, 0x04, 0xF0, 0x22, 0x12, 0x4F, 0xCF, 0x20, 0xE0, 0x02, 0x81, \r
-0x64, 0x90, 0x9F, 0xD3, 0xE0, 0x64, 0x01, 0x70, 0x2A, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, \r
-0x90, 0x04, 0xE3, 0xE0, 0x60, 0x18, 0x91, 0x6B, 0x91, 0x72, 0x90, 0x9F, 0xD7, 0xE0, 0x75, 0xF0, \r
-0x03, 0x84, 0xFF, 0x90, 0x9F, 0xE0, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0x81, 0x4F, 0xB1, 0xCD, \r
-0x04, 0xF0, 0x22, 0x90, 0x9F, 0xD3, 0xE0, 0x64, 0x04, 0x70, 0x27, 0x90, 0x06, 0x92, 0xE0, 0x20, \r
-0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x14, 0x91, 0x6B, 0x91, 0x72, 0x90, 0x9F, 0xD6, 0xE0, \r
-0xFF, 0x90, 0x9F, 0xE0, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0x81, 0x4F, 0xB1, 0xCD, 0x74, 0x04, \r
-0xF0, 0x22, 0x90, 0x9F, 0xD3, 0xE0, 0x64, 0x06, 0x60, 0x02, 0x61, 0xCD, 0x91, 0x79, 0x50, 0x08, \r
-0x90, 0x9F, 0xE1, 0xE0, 0x94, 0x03, 0x40, 0x1A, 0x91, 0xAA, 0x90, 0x9F, 0xDE, 0x30, 0xE0, 0x05, \r
-0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0x9F, 0xD3, 0xF0, 0x90, 0x9F, 0xE1, \r
-0xF0, 0x22, 0x90, 0x9F, 0xD2, 0x12, 0x6E, 0xBB, 0x30, 0xE0, 0x3F, 0xEF, 0x54, 0xFB, 0xF0, 0xE4, \r
-0xA3, 0x91, 0xA9, 0x30, 0xE0, 0x0B, 0x90, 0x9F, 0xF0, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0x05, 0x61, \r
-0xF8, 0x91, 0x79, 0x40, 0x0B, 0x90, 0x9F, 0xF0, 0xE0, 0x30, 0xE0, 0x02, 0x80, 0x7A, 0x81, 0x05, \r
-0x90, 0x9F, 0xF0, 0xE0, 0x30, 0xE0, 0x0C, 0x91, 0x65, 0xE4, 0x90, 0x9F, 0xE0, 0xF0, 0x90, 0xA1, \r
-0xED, 0x80, 0x7D, 0x90, 0x9F, 0xDE, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x4C, 0x7D, 0x90, 0x9F, 0xE1, \r
-0xE0, 0x04, 0xF0, 0x7F, 0x03, 0x51, 0x9C, 0x91, 0x79, 0x50, 0x0A, 0x90, 0x9F, 0xE1, 0xE0, 0x94, \r
-0x03, 0x50, 0x02, 0x81, 0x64, 0x7F, 0x03, 0x12, 0x62, 0x14, 0x90, 0x05, 0x22, 0xE0, 0x44, 0x10, \r
-0xFF, 0x7D, 0x03, 0x12, 0x49, 0x1D, 0x90, 0x04, 0x9C, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x9F, 0xD3, \r
-0xE0, 0x64, 0x07, 0x70, 0x3E, 0x90, 0x9F, 0xE1, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0x6F, 0xD8, 0x80, \r
-0x68, 0x90, 0x9F, 0xD2, 0x12, 0x6E, 0xBB, 0x30, 0xE0, 0x1E, 0xEF, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, \r
-0xF0, 0x90, 0x9F, 0xF0, 0xE0, 0x30, 0xE0, 0x0D, 0x91, 0x65, 0xE4, 0x90, 0x9F, 0xE0, 0xF0, 0x90, \r
-0xA1, 0xED, 0x04, 0x80, 0x0B, 0x02, 0x6F, 0xD8, 0x12, 0x4C, 0x7D, 0x90, 0x9F, 0xE1, 0xE0, 0x04, \r
-0xF0, 0x80, 0x3C, 0x90, 0x9F, 0xD3, 0xE0, 0x64, 0x09, 0x70, 0x49, 0x90, 0x9F, 0xD2, 0xE0, 0x30, \r
-0xE0, 0x0B, 0x12, 0x6F, 0xD8, 0x90, 0x9F, 0xD2, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0x06, 0x92, \r
-0xE0, 0x30, 0xE2, 0x1F, 0x74, 0x04, 0xF0, 0x91, 0x72, 0xE0, 0xB4, 0x02, 0x12, 0x91, 0xA1, 0x60, \r
-0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0x9F, 0xD3, 0xF0, 0x22, 0x7F, \r
-0x03, 0x41, 0x9C, 0x91, 0xA1, 0x60, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, \r
-0x90, 0x9F, 0xD3, 0xF0, 0x22, 0x90, 0x9F, 0xD3, 0x74, 0x09, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, \r
-0xF0, 0x22, 0x90, 0x9F, 0xE0, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x9F, 0xE1, 0xE0, 0xFF, 0x90, 0x9F, \r
-0xE0, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, 0x9F, \r
-0xD7, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80, 0x94, 0x80, \r
-0x22, 0x90, 0xA1, 0xED, 0xE0, 0x90, 0x9F, 0xDE, 0x22, 0xF0, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x54, \r
-0x0F, 0x22, 0x90, 0xA1, 0x18, 0xEF, 0xF0, 0x7F, 0x03, 0x51, 0x9C, 0x91, 0xAA, 0x90, 0x9F, 0xDE, \r
-0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0xCE, 0xD1, 0x27, \r
-0x20, 0xE0, 0x05, 0xF1, 0xBA, 0x30, 0xE0, 0x37, 0x91, 0xAA, 0x30, 0xE0, 0x0A, 0x90, 0x9F, 0xCB, \r
-0xE0, 0xFF, 0x90, 0x9F, 0xDC, 0x80, 0x21, 0x90, 0xA1, 0x18, 0xE0, 0xFC, 0xB4, 0x01, 0x0D, 0x90, \r
-0x9F, 0xCB, 0xE0, 0xFE, 0x90, 0x9F, 0xDB, 0xE0, 0xC3, 0x9E, 0x80, 0x0F, 0xEC, 0xB4, 0x04, 0x0F, \r
-0x90, 0x9F, 0xCC, 0xE0, 0xFF, 0x90, 0x9F, 0xDB, 0xE0, 0xC3, 0x9F, 0x90, 0x9F, 0xE2, 0xF0, 0xD1, \r
-0x1B, 0x30, 0xE0, 0x20, 0xF1, 0xCF, 0x20, 0xE0, 0x02, 0xA1, 0x9B, 0xB1, 0xC4, 0x50, 0x0A, 0xEF, \r
-0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x12, \r
-0x4E, 0xDE, 0x80, 0x67, 0xD1, 0x13, 0x30, 0xE0, 0x49, 0x12, 0xAA, 0x26, 0xFD, 0x7F, 0x04, 0x12, \r
-0x5A, 0xA8, 0x12, 0x4F, 0xCF, 0x30, 0xE0, 0x3A, 0x90, 0x9F, 0xD2, 0xE0, 0x44, 0x02, 0xF0, 0x54, \r
-0xFB, 0xF0, 0xE4, 0x90, 0x9F, 0xE1, 0xF0, 0x90, 0x9F, 0xDE, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0xFF, \r
-0xB4, 0x01, 0x08, 0x90, 0x9F, 0xD3, 0x74, 0x06, 0xF0, 0x80, 0x0A, 0xEF, 0xB4, 0x04, 0x06, 0x90, \r
-0x9F, 0xD3, 0x74, 0x07, 0xF0, 0x90, 0x9F, 0xBC, 0xE0, 0x60, 0x07, 0x90, 0x9F, 0xD2, 0xE0, 0x44, \r
-0x04, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x06, 0x80, 0x09, 0x90, 0xA1, 0x18, \r
-0xE0, 0xB4, 0x04, 0x07, 0x7D, 0x0C, 0x7F, 0x6F, 0x12, 0x49, 0x1D, 0x90, 0x9F, 0xCE, 0x12, 0x66, \r
-0xE8, 0x30, 0xE0, 0x15, 0xB1, 0xC4, 0x50, 0x0A, 0xEF, 0x7F, 0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFE, \r
-0x80, 0x04, 0x7F, 0xFF, 0x7E, 0x7F, 0x12, 0x4E, 0x11, 0x90, 0x9F, 0xCD, 0xE0, 0x30, 0xE0, 0x03, \r
-0x12, 0x5C, 0x9B, 0x22, 0x90, 0x9F, 0xE2, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x22, 0xE4, 0x90, 0x9F, \r
-0xD3, 0xF0, 0x90, 0x9F, 0xDE, 0x22, 0x90, 0x9F, 0xCA, 0xE0, 0x30, 0xE0, 0x35, 0x51, 0xB9, 0x90, \r
-0x9F, 0xDE, 0xE0, 0xFF, 0xB4, 0x01, 0x02, 0x80, 0x1C, 0x90, 0x9F, 0xDE, 0xE0, 0xFF, 0xB4, 0x02, \r
-0x02, 0x80, 0x1C, 0x90, 0x9F, 0xDE, 0xE0, 0xFF, 0xB4, 0x03, 0x02, 0x01, 0xD0, 0x90, 0x9F, 0xDE, \r
-0xE0, 0xFF, 0xB4, 0x04, 0x02, 0x81, 0xB2, 0x90, 0x9F, 0xDE, 0xE0, 0xFF, 0xB4, 0x05, 0x03, 0x12, \r
-0x65, 0x60, 0x22, 0x90, 0x9F, 0xCA, 0xE0, 0xC4, 0x54, 0x0F, 0x22, 0x90, 0x9F, 0xCA, 0xE0, 0xC4, \r
-0x13, 0x54, 0x07, 0x22, 0x90, 0x9F, 0xCA, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x22, 0xE4, 0xFF, \r
-0x90, 0x9F, 0xCA, 0xE0, 0x30, 0xE0, 0x2C, 0xA3, 0x51, 0x98, 0x90, 0x9F, 0xDE, 0x74, 0x01, 0xF0, \r
-0x90, 0x9F, 0xDD, 0xF0, 0x90, 0x9F, 0xBC, 0xE0, 0x60, 0x07, 0x7D, 0x05, 0x7F, 0x6F, 0x02, 0x49, \r
-0x1D, 0x12, 0x5C, 0x9B, 0xD1, 0x24, 0x20, 0xE0, 0x0A, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, \r
-0x02, 0xF1, 0xD8, 0x22, 0xD1, 0xBB, 0x7F, 0x04, 0x8F, 0x71, 0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, \r
-0x9D, 0x93, 0xE0, 0x45, 0x71, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, \r
-0xB9, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x45, 0xBE, 0x12, 0xA8, 0xFA, 0x70, 0x21, 0x90, \r
-0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x12, 0x90, 0xA1, 0xB9, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0x12, \r
-0x45, 0xB5, 0xD1, 0xE1, 0x7F, 0x01, 0x80, 0x0E, 0x7F, 0x01, 0xD1, 0x64, 0x7F, 0x02, 0x80, 0x06, \r
-0x7F, 0x02, 0xD1, 0x64, 0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
-0xC0, 0xD0, 0x90, 0xA1, 0x8E, 0x74, 0x15, 0xF0, 0x90, 0xA1, 0x9C, 0x74, 0x01, 0xF0, 0x90, 0xA1, \r
-0x90, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x8E, 0x12, 0x8A, 0xE4, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0x90, 0xA1, 0xEF, 0x12, 0x45, 0xBE, 0xE4, 0xFE, 0x90, 0xFD, 0x50, 0xEF, 0xF0, 0x64, 0x30, \r
-0x60, 0x1E, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, 0x9D, 0x50, 0x09, 0xF1, 0x33, 0xF1, 0x28, 0xEF, 0xF0, \r
-0x0E, 0x80, 0xF2, 0xEE, 0xC3, 0x94, 0x06, 0x50, 0x18, 0xF1, 0x28, 0xE4, 0xF0, 0x0E, 0x80, 0xF3, \r
-0xEE, 0xC3, 0x94, 0x07, 0x50, 0x0B, 0xF1, 0x33, 0x74, 0x51, 0xF1, 0x2A, 0xEF, 0xF0, 0x0E, 0x80, \r
-0xEF, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0x22, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, \r
-0xF5, 0x83, 0x22, 0x90, 0xA1, 0xEF, 0x12, 0x45, 0xB5, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, \r
-0xA2, 0xFF, 0x22, 0x90, 0x9F, 0x0E, 0xE0, 0x30, 0xE0, 0x10, 0xA3, 0x74, 0x01, 0xF0, 0x90, 0x9F, \r
-0x0E, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0xF1, 0x5F, 0x12, 0x90, 0x6F, 0x01, 0xC4, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0x0D, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x04, 0x80, \r
-0x0C, 0x12, 0x6E, 0x19, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0x99, 0x15, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0x16, 0xF1, 0xAB, 0xB4, 0x02, \r
-0x19, 0x90, 0xA1, 0xEC, 0xE0, 0x64, 0x04, 0x60, 0x0C, 0x7F, 0x40, 0x12, 0x8B, 0xCF, 0x90, 0xA1, \r
-0xEC, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA1, 0xEC, 0xF0, 0x22, 0x7D, 0x03, 0x7F, 0x11, 0xD1, \r
-0x77, 0xEF, 0x22, 0x22, 0x7D, 0x01, 0x7F, 0x17, 0xC1, 0x77, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
-0x22, 0x7D, 0x02, 0x7F, 0x02, 0x02, 0x5E, 0xB8, 0x12, 0x8A, 0x5E, 0x7F, 0x04, 0xC1, 0x68, 0x90, \r
-0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x22, 0x90, 0x9F, 0xBB, 0xE0, 0xC4, 0x54, 0x0F, 0x20, \r
-0xE0, 0x1D, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x17, 0x90, 0x9D, 0x9A, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, \r
-0xFD, 0x12, 0x4D, 0x56, 0x90, 0xA2, 0x0A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x4F, 0x0A, 0x22, \r
-0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, \r
-0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, \r
-0x74, 0x00, 0xF0, 0x74, 0x88, 0xA3, 0xF0, 0x11, 0x52, 0x53, 0x91, 0xBF, 0x74, 0x00, 0x04, 0x90, \r
-0x01, 0xC4, 0xF0, 0x74, 0x88, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, \r
-0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, \r
-0xE0, 0x32, 0x90, 0xFD, 0x68, 0xE0, 0xFF, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0xA1, 0x27, 0xF0, 0xEF, \r
-0x20, 0xE0, 0x02, 0x41, 0x2D, 0x90, 0xA1, 0xEE, 0xE0, 0x70, 0x1A, 0x7F, 0x2E, 0x12, 0x47, 0xBF, \r
-0x90, 0xA0, 0x08, 0xEF, 0xF0, 0x7F, 0x2D, 0x12, 0x47, 0xBF, 0x90, 0xA0, 0x09, 0xEF, 0xF0, 0x90, \r
-0xA1, 0xEE, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x27, 0xE0, 0x64, 0x15, 0x70, 0x58, 0x90, 0xFD, 0x62, \r
-0xE0, 0xFF, 0x30, 0xE6, 0x11, 0xF4, 0x54, 0x3F, 0x04, 0xFE, 0x51, 0x3D, 0xC3, 0x9E, 0x51, 0x35, \r
-0x40, 0x12, 0xE4, 0xF0, 0x80, 0x0E, 0x51, 0x3D, 0xFE, 0xEF, 0x54, 0x3F, 0x2E, 0x51, 0x35, 0x40, \r
-0x03, 0x74, 0x3F, 0xF0, 0x90, 0xA1, 0x26, 0xE0, 0xFF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xFE, 0xEF, \r
-0x25, 0xE0, 0x25, 0xE0, 0x4E, 0x90, 0xA1, 0x24, 0xF0, 0xE0, 0xFD, 0x7F, 0x2E, 0x12, 0x46, 0xA0, \r
-0x90, 0xA1, 0x26, 0xE0, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA0, 0x09, 0xE0, 0x54, 0x0F, 0x4F, 0xFD, \r
-0x7F, 0x2D, 0x12, 0x46, 0xA0, 0x90, 0xA1, 0x27, 0xE0, 0xB4, 0x21, 0x0C, 0x90, 0xFD, 0x62, 0xE0, \r
-0xFF, 0x71, 0x98, 0x7F, 0x04, 0x12, 0x86, 0x68, 0x90, 0xA1, 0x27, 0xE0, 0xB4, 0x23, 0x05, 0x7F, \r
-0x01, 0x12, 0x87, 0xC8, 0x90, 0xA1, 0x27, 0xE0, 0xB4, 0x27, 0x05, 0x7F, 0x02, 0x12, 0x87, 0xC8, \r
-0x90, 0xA1, 0x27, 0xE0, 0xB4, 0x30, 0x0C, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0xB1, 0x83, 0x7F, 0x04, \r
-0x12, 0x86, 0x68, 0x90, 0xA1, 0x27, 0xE0, 0x64, 0x34, 0x60, 0x02, 0x21, 0xCB, 0x90, 0xFD, 0x62, \r
-0xE0, 0x30, 0xE0, 0x5B, 0x90, 0x9F, 0xF0, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x21, 0xCB, \r
-0x90, 0x9F, 0xCD, 0x12, 0x4F, 0xD2, 0x30, 0xE0, 0x1A, 0x51, 0x2E, 0x90, 0x9F, 0xF1, 0xEE, 0xF0, \r
-0xA3, 0xEF, 0xF0, 0x51, 0x2E, 0xE4, 0xFF, 0xFE, 0xEC, 0x12, 0x47, 0xE1, 0x7F, 0x48, 0x7E, 0x09, \r
-0x12, 0x38, 0x45, 0x51, 0x46, 0x7D, 0x01, 0x12, 0x46, 0xB5, 0x90, 0xA1, 0x24, 0x74, 0x01, 0xF0, \r
-0xFB, 0x7A, 0xA1, 0x79, 0x24, 0xFD, 0x7F, 0x34, 0x12, 0x86, 0x77, 0x90, 0xA0, 0x13, 0xE0, 0x44, \r
-0x01, 0xF0, 0x90, 0x04, 0x9D, 0xE4, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x71, 0x41, 0x80, 0x3C, 0x51, \r
-0x46, 0xE4, 0xFD, 0x12, 0x46, 0xB5, 0x90, 0x9F, 0xCD, 0x12, 0x69, 0xCD, 0x30, 0xE0, 0x21, 0x51, \r
-0x2E, 0xE4, 0xFB, 0xFA, 0xED, 0xF9, 0xEC, 0xF8, 0x90, 0x9F, 0xF1, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, \r
-0xE4, 0xFC, 0xFD, 0x12, 0x45, 0x53, 0x12, 0x47, 0xE1, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, \r
-0xF1, 0xA9, 0x90, 0x04, 0x9D, 0xE0, 0x54, 0xFE, 0xF0, 0x71, 0x90, 0x90, 0xA1, 0x27, 0xE0, 0xFD, \r
-0xB4, 0x35, 0x07, 0x90, 0x9F, 0xD2, 0xE0, 0x44, 0x01, 0xF0, 0xED, 0xB4, 0x36, 0x23, 0x90, 0xFD, \r
-0x61, 0xE0, 0x90, 0xA1, 0x24, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA1, 0x25, 0xF0, 0x90, 0xA1, \r
-0x27, 0xE0, 0xFF, 0x90, 0xA1, 0x24, 0xE0, 0xFD, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x25, 0x12, 0x86, \r
-0x77, 0x90, 0xA1, 0x27, 0xE0, 0xB4, 0x37, 0x03, 0x12, 0x98, 0x3A, 0x90, 0xA1, 0x27, 0xE0, 0xB4, \r
-0x40, 0x14, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0x9F, 0xEE, 0x74, 0x01, 0xF0, 0x80, \r
-0x05, 0xE4, 0x90, 0x9F, 0xEE, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x7F, 0x48, \r
-0x7E, 0x09, 0x02, 0x37, 0x4E, 0x90, 0xA1, 0x26, 0xF0, 0xD3, 0x94, 0x3F, 0x22, 0x90, 0xA0, 0x08, \r
-0xE0, 0x13, 0x13, 0x54, 0x3F, 0x22, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFF, \r
-0x90, 0xA0, 0x0D, 0xE0, 0xFB, 0x90, 0xA0, 0x0C, 0xE0, 0x90, 0xA1, 0xCF, 0xF0, 0x22, 0x90, 0xA1, \r
-0x70, 0x74, 0x09, 0xF0, 0x90, 0xA1, 0x7E, 0x74, 0x07, 0xF0, 0x90, 0xA1, 0x72, 0xEF, 0xF0, 0x70, \r
-0x31, 0x90, 0x9F, 0xE4, 0xE0, 0x60, 0x1A, 0xA3, 0xE0, 0x60, 0x02, 0x80, 0x0C, 0x90, 0x07, 0x70, \r
-0xE0, 0x70, 0x06, 0x90, 0x07, 0x74, 0xE0, 0x60, 0x08, 0x90, 0xA1, 0x73, 0x74, 0x01, 0xF0, 0x80, \r
-0x05, 0xE4, 0x90, 0xA1, 0x73, 0xF0, 0xE4, 0x90, 0xA1, 0x74, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0x80, 0x39, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA1, 0x73, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0xA1, \r
-0x74, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA1, 0x75, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0xA1, \r
-0x76, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA1, 0x77, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0xA1, \r
-0x78, 0xF0, 0x90, 0xA1, 0x73, 0xE0, 0x54, 0x01, 0x90, 0x9F, 0xE4, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, \r
-0x7A, 0xA1, 0x79, 0x70, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9E, 0x88, 0xE0, 0xFF, \r
-0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9E, 0x89, 0xE0, 0xB5, \r
-0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, \r
-0x02, 0xF0, 0x80, 0x28, 0xC0, 0x01, 0x90, 0x9E, 0x89, 0xE0, 0xF1, 0xB4, 0xA8, 0x01, 0xFC, 0x7D, \r
-0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0x9E, 0x89, 0xF1, 0x7B, 0xB4, \r
-0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9E, 0x89, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0x90, 0x01, 0xE7, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xF1, 0x98, \r
-0x54, 0xFD, 0x4F, 0xF0, 0xE0, 0xC3, 0x13, 0xFF, 0x54, 0x01, 0x90, 0x01, 0xE6, 0xF0, 0xA3, 0xE0, \r
-0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE0, 0x27, 0x12, 0xA8, 0xFA, 0x70, 0x20, 0x90, 0xA0, 0x13, 0xE0, \r
-0x30, 0xE0, 0x02, 0x80, 0x19, 0x90, 0xFD, 0x62, 0xE0, 0xB4, 0xAD, 0x0E, 0xA3, 0xE0, 0xB4, 0x35, \r
-0x09, 0x71, 0x41, 0x90, 0x01, 0xE5, 0x74, 0xDF, 0xF0, 0x22, 0x80, 0x00, 0x80, 0x02, 0x80, 0xB1, \r
-0x90, 0x01, 0xE7, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA1, 0x28, 0x74, 0x08, 0xF0, 0x90, 0xA1, \r
-0x36, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x2A, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x28, 0x41, \r
-0xE4, 0x90, 0x9F, 0xF3, 0xE0, 0x44, 0x04, 0xF0, 0x7D, 0x01, 0x7F, 0x23, 0x12, 0x86, 0x77, 0x8F, \r
-0x51, 0xE5, 0x51, 0xB4, 0x03, 0x08, 0xE4, 0xFF, 0x51, 0x5E, 0x7F, 0x04, 0x71, 0xCF, 0x22, 0x90, \r
-0xA2, 0x0D, 0xF1, 0x89, 0x90, 0x9D, 0x93, 0xE0, 0xFF, 0x90, 0xA2, 0x0D, 0xE0, 0xFE, 0xEF, 0x4E, \r
-0x90, 0x9D, 0x93, 0xF0, 0x22, 0x90, 0xA1, 0x39, 0xEB, 0xF0, 0x70, 0x5C, 0x90, 0xA1, 0x39, 0xE0, \r
-0xFE, 0x91, 0x49, 0xE0, 0xFC, 0x90, 0xA1, 0x3A, 0xE0, 0xFB, 0xEC, 0x6B, 0x60, 0x4A, 0x90, 0xA1, \r
-0x3E, 0xEB, 0xF0, 0xA3, 0xEE, 0xF0, 0xAE, 0x05, 0xEE, 0x25, 0xE0, 0x4F, 0xFF, 0x90, 0x9D, 0x92, \r
-0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, 0x90, 0xA1, 0x40, 0xF0, 0x90, 0xA1, 0x3B, 0xE0, 0x90, \r
-0xA1, 0x42, 0xF0, 0x90, 0xA1, 0x3C, 0x74, 0x0C, 0xF0, 0x90, 0xA1, 0x4A, 0x74, 0x04, 0xF0, 0x7B, \r
-0x01, 0x7A, 0xA1, 0x79, 0x3C, 0x51, 0xE4, 0x7F, 0x04, 0x71, 0xCF, 0x90, 0xA1, 0x3A, 0xE0, 0xFF, \r
-0x90, 0xA1, 0x39, 0xE0, 0x91, 0x49, 0xEF, 0xF0, 0x22, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x98, \r
-0xF5, 0x83, 0x22, 0x90, 0xA0, 0xF9, 0x74, 0x12, 0xF0, 0x90, 0xA1, 0x07, 0x74, 0x05, 0xF0, 0x90, \r
-0xA0, 0xFB, 0xEF, 0x12, 0x4F, 0xBE, 0x90, 0xA0, 0xF7, 0xE0, 0x90, 0xA0, 0xFE, 0xF0, 0x90, 0xA0, \r
-0xF8, 0xE0, 0x90, 0xA0, 0xFF, 0xF0, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xF9, 0x51, 0xE4, 0x7F, 0x04, \r
-0x61, 0xCF, 0x91, 0xFF, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x06, 0x90, 0xA0, \r
-0xEE, 0xE0, 0xA3, 0xF0, 0x91, 0xFF, 0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, \r
-0x90, 0xA0, 0xEE, 0xE0, 0x90, 0xA0, 0xF0, 0xF0, 0x91, 0xFF, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, \r
-0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA0, 0xEE, 0xE0, 0x90, 0xA0, 0xF1, 0xF0, 0x91, 0xFF, 0x7F, 0xF3, \r
-0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA0, 0xEE, 0xE0, 0x90, 0xA0, 0xF2, 0xF0, \r
-0x91, 0xFF, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA0, 0xEE, 0xE0, \r
-0x90, 0xA0, 0xF3, 0xF0, 0x90, 0xA0, 0xEF, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, \r
-0xE0, 0x90, 0xA0, 0xF7, 0xF0, 0x90, 0xA0, 0xF3, 0xE0, 0x90, 0xA0, 0xF8, 0xF0, 0x81, 0x53, 0x7B, \r
-0x01, 0x7A, 0xA0, 0x79, 0xEE, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06, 0x89, \r
-0x90, 0xA0, 0xEE, 0x12, 0x57, 0xC4, 0x90, 0xA0, 0xEF, 0x12, 0x56, 0xBB, 0x90, 0xA0, 0xF0, 0xF0, \r
-0x12, 0x56, 0xE7, 0x90, 0xA0, 0xF1, 0x12, 0x6C, 0xDD, 0x90, 0xA0, 0xF2, 0xD1, 0xC3, 0x90, 0x9F, \r
-0xF3, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA0, 0xEF, 0xE0, 0xB4, 0x0C, 0x06, 0xE5, 0x70, 0x70, 0x0D, \r
-0x80, 0x00, 0x91, 0xFF, 0x7D, 0x07, 0x7F, 0x30, 0x12, 0x86, 0x77, 0x8F, 0x51, 0x90, 0xA0, 0xEF, \r
-0xE0, 0xB4, 0x0D, 0x0E, 0xE5, 0x51, 0x64, 0x01, 0x60, 0x05, 0x75, 0x70, 0x01, 0x80, 0x03, 0xE4, \r
-0xF5, 0x70, 0xE5, 0x51, 0xB4, 0x01, 0x05, 0x75, 0x52, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x52, 0x90, \r
-0xA0, 0xEE, 0xE0, 0xFB, 0xAD, 0x52, 0xE4, 0xFF, 0xB1, 0x83, 0x7F, 0x04, 0x71, 0xCF, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x90, 0xA1, 0x7F, 0x74, 0x0B, 0xF0, 0x90, 0xA1, 0x8D, 0x74, 0x07, 0xF0, 0x90, \r
-0xA1, 0x81, 0xEF, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0xA1, 0x82, 0xF0, 0x90, 0xFD, \r
-0x61, 0xE0, 0x90, 0xA1, 0x83, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA1, 0x84, 0xF0, 0x90, 0xFD, \r
-0x65, 0xE0, 0x90, 0xA1, 0x85, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA1, 0x86, 0xF0, 0x90, 0xFD, \r
-0x67, 0xE0, 0x90, 0xA1, 0x87, 0xF0, 0x80, 0x0D, 0x90, 0xA1, 0x82, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, \r
-0xE4, 0xA3, 0x12, 0x58, 0xB2, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x7F, 0x41, 0xE4, 0x12, 0xA2, 0x59, \r
-0x7F, 0x08, 0x12, 0x47, 0xBF, 0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x46, 0xA0, 0xE4, 0xFF, \r
-0xD1, 0x76, 0x51, 0x46, 0xE4, 0xFD, 0x12, 0x46, 0xB5, 0x90, 0x9F, 0x13, 0xE0, 0xFF, 0xC4, 0x54, \r
-0x0F, 0x30, 0xE0, 0x03, 0x12, 0xA7, 0x8C, 0x90, 0x9F, 0x14, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xD1, 0x1F, 0xB1, 0xDD, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, \r
-0x9F, 0x14, 0xE0, 0x44, 0x10, 0xF0, 0x51, 0x46, 0x7D, 0x01, 0x12, 0x46, 0xB5, 0x90, 0x9F, 0x21, \r
-0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x46, 0xA0, 0x90, 0x9F, 0x18, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, \r
-0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, \r
-0x08, 0x12, 0x47, 0xBF, 0xEF, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, 0x46, 0xA0, 0x7F, 0x01, 0xD1, \r
-0x76, 0x7F, 0x90, 0x12, 0x47, 0xBF, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x46, 0xA0, 0x7F, \r
-0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90, 0xA1, 0xFB, 0xD1, 0xC2, 0x90, 0x01, 0x09, 0xE0, 0x7F, \r
-0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0xA1, 0xFB, 0xE0, 0x6F, 0x60, 0x34, 0xC3, 0x90, 0xA1, \r
-0xFD, 0xE0, 0x94, 0x88, 0x90, 0xA1, 0xFC, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, \r
-0x44, 0x10, 0xF0, 0x22, 0x90, 0xA1, 0xFC, 0xF1, 0x74, 0xF1, 0x82, 0xD3, 0x90, 0xA1, 0xFD, 0xE0, \r
-0x94, 0x32, 0x90, 0xA1, 0xFC, 0xE0, 0x94, 0x00, 0x40, 0xC1, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, \r
-0xBA, 0x22, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x9F, 0x1A, 0xE0, 0xFF, 0x60, \r
-0x03, 0xB4, 0x08, 0x08, 0x12, 0xA7, 0x63, 0xBF, 0x01, 0x02, 0xD1, 0x0F, 0x22, 0x90, 0x9F, 0x13, \r
-0xE0, 0x30, 0xE0, 0x18, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0x30, 0xE0, 0x0E, 0xC3, 0x13, 0x30, 0xE0, \r
-0x07, 0xF1, 0xC0, 0xBF, 0x01, 0x06, 0x80, 0x02, 0x80, 0x00, 0xD1, 0xCA, 0x22, 0x90, 0xA0, 0xEE, \r
-0x74, 0x0A, 0xF0, 0x90, 0xA0, 0xFC, 0x74, 0x06, 0xF0, 0x12, 0x06, 0x89, 0x90, 0xA0, 0xF0, 0x12, \r
-0x57, 0xC4, 0x90, 0xA0, 0xF1, 0x12, 0x56, 0xBB, 0x90, 0xA0, 0xF2, 0xF0, 0x12, 0x56, 0xE7, 0x90, \r
-0xA0, 0xF3, 0x12, 0x6C, 0xDD, 0x90, 0xA0, 0xF4, 0x12, 0x5E, 0x3A, 0x90, 0xA0, 0xF5, 0xF0, 0x91, \r
-0xFF, 0x41, 0xE4, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xD0, 0xEE, 0xF0, 0xA3, \r
-0xD1, 0xC2, 0x90, 0xA1, 0xD0, 0xF1, 0xA0, 0xE0, 0x60, 0x23, 0xC3, 0x90, 0xA1, 0xD3, 0xE0, 0x94, \r
-0xE8, 0x90, 0xA1, 0xD2, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, \r
-0x7F, 0x00, 0x80, 0x0B, 0x90, 0xA1, 0xD2, 0xF1, 0x74, 0xF1, 0x91, 0x80, 0xD5, 0x7F, 0x01, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x08, 0xD6, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, \r
-0x00, 0x22, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0xEF, 0xF0, 0x7F, 0x02, 0x02, 0x44, 0xB7, \r
-0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x25, 0xE0, 0xFF, 0x90, 0x9F, 0xF0, 0xE0, 0x22, \r
-0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0x22, 0x90, 0xA0, 0x13, 0xE0, 0x54, 0xFE, 0xF0, \r
-0xE4, 0xA3, 0xF0, 0x22, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF2, 0xF9, 0x74, 0x9D, 0x35, 0xF0, 0x22, \r
-0x90, 0x9F, 0x11, 0xE0, 0x64, 0x02, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0x9F, 0xFD, \r
-0xE0, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x16, 0xEF, 0xB4, 0x01, 0x05, 0x90, 0xA0, 0x04, 0x80, 0x03, \r
-0x90, 0xA0, 0x00, 0x12, 0x47, 0xDF, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x22, 0x12, 0x97, \r
-0x07, 0x30, 0xE0, 0x1E, 0x12, 0x87, 0xBA, 0x20, 0xE0, 0x18, 0x12, 0x84, 0xAA, 0x30, 0xE0, 0x04, \r
-0x7F, 0x03, 0x80, 0x0B, 0xF1, 0x40, 0x30, 0xE0, 0x04, 0x7F, 0x0D, 0x80, 0x02, 0x7F, 0x09, 0x12, \r
-0x62, 0x14, 0x22, 0xE4, 0x90, 0xA1, 0x18, 0xF0, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x50, 0x31, 0x23, \r
-0x70, 0x4C, 0x90, 0xA1, 0x18, 0x04, 0xF0, 0xE4, 0x90, 0x9F, 0x1E, 0xF0, 0x90, 0x9F, 0x0E, 0xE0, \r
-0x30, 0xE0, 0x16, 0x90, 0x9F, 0x12, 0xE0, 0xB4, 0x02, 0x05, 0xE4, 0x90, 0xA1, 0x18, 0xF0, 0x12, \r
-0x6E, 0x19, 0xEF, 0x70, 0x04, 0x90, 0xA1, 0x18, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0x60, 0x1F, 0x90, \r
-0x9F, 0x1B, 0xE0, 0x44, 0x10, 0x71, 0xC3, 0x90, 0x9F, 0x1F, 0xE0, 0x90, 0xA1, 0xB2, 0x12, 0x48, \r
-0x27, 0x90, 0x9F, 0x1A, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x5A, 0xA4, 0x12, 0x8F, 0xEE, 0x22, 0xE4, \r
-0xF5, 0x63, 0x90, 0x9F, 0x17, 0xE0, 0x70, 0x02, 0x21, 0x18, 0x31, 0x23, 0x60, 0x02, 0x21, 0x18, \r
-0x90, 0x9F, 0x13, 0xE0, 0x30, 0xE0, 0x16, 0x91, 0x93, 0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, \r
-0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x9F, 0x4C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x31, 0x2A, 0x60, \r
-0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0x9F, 0x1E, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, \r
-0x60, 0x06, 0x90, 0x9F, 0x20, 0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0x9F, 0x1D, 0xE0, 0xA3, \r
-0xF0, 0x80, 0x00, 0x75, 0x63, 0x01, 0x90, 0x9F, 0x0E, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0x9F, 0x12, \r
-0xE0, 0xB4, 0x02, 0x03, 0xE4, 0xF5, 0x63, 0x12, 0x6E, 0x19, 0xEF, 0x70, 0x02, 0xF5, 0x63, 0xE5, \r
-0x63, 0x60, 0x35, 0x90, 0x9F, 0x1B, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x9F, 0x20, 0xE0, 0x60, 0x03, \r
-0xB4, 0x01, 0x04, 0x31, 0x19, 0x80, 0x08, 0x31, 0x19, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, \r
-0x90, 0x9F, 0x1F, 0xE0, 0x2F, 0x90, 0xA1, 0xB2, 0x12, 0x48, 0x27, 0x90, 0x9F, 0x1A, 0xE0, 0x20, \r
-0xE2, 0x03, 0x12, 0x5A, 0xA4, 0x12, 0x8F, 0xEE, 0x22, 0xE4, 0x90, 0xA1, 0xB1, 0xF0, 0x90, 0x9F, \r
-0x20, 0xE0, 0x22, 0x90, 0x9E, 0x8D, 0xE0, 0x64, 0x01, 0x22, 0x90, 0x9F, 0x15, 0xE0, 0xFF, 0xC4, \r
-0x54, 0x0F, 0x22, 0x31, 0x23, 0x70, 0x73, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x6D, 0x31, 0x2A, 0x64, \r
-0x01, 0x70, 0x26, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x9F, 0x1E, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x04, \r
-0x90, 0x9F, 0x1D, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x9F, 0x1D, 0xE0, 0xFE, 0xFF, 0x80, \r
-0x03, 0xEF, 0x04, 0xFF, 0x90, 0x9F, 0x1E, 0xEF, 0xF0, 0x90, 0x9F, 0x13, 0xE0, 0x30, 0xE0, 0x02, \r
-0x71, 0xCA, 0x31, 0xB6, 0xE4, 0x90, 0x9F, 0x20, 0xB1, 0x37, 0x31, 0xD0, 0x31, 0xFA, 0x54, 0xEF, \r
-0xF0, 0x31, 0x2A, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x0D, 0x90, 0x9F, 0x0E, 0xE0, 0x30, 0xE0, 0x04, \r
-0x51, 0xEE, 0x80, 0x02, 0x51, 0x98, 0x90, 0x9F, 0x14, 0x12, 0x66, 0xE8, 0x30, 0xE0, 0x0B, 0x51, \r
-0x90, 0xB5, 0x07, 0x06, 0x12, 0x6F, 0x47, 0x12, 0x5F, 0x61, 0x90, 0x9F, 0x0E, 0xE0, 0xC3, 0x13, \r
-0x20, 0xE0, 0x02, 0x31, 0xB6, 0x22, 0x90, 0x9F, 0x14, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x31, 0x23, \r
-0x70, 0x0D, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x07, 0x31, 0xD0, 0x71, 0x66, 0x12, 0x48, 0x27, 0x22, \r
-0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x22, 0x31, 0x23, 0x70, 0x15, \r
-0x90, 0x9F, 0x17, 0xE0, 0x60, 0x0F, 0x31, 0xD0, 0x90, 0x9F, 0x13, 0xE0, 0x31, 0xF7, 0x54, 0x07, \r
-0x70, 0x03, 0x12, 0x68, 0x3E, 0x22, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xFD, \r
-0xF0, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x1A, 0x31, 0xD3, 0x90, 0x9F, 0x13, 0x12, 0x6E, 0xBB, \r
-0x30, 0xE0, 0x02, 0x80, 0xE1, 0xB1, 0x42, 0x40, 0x09, 0x90, 0x9E, 0x8D, 0xE0, 0xB4, 0x01, 0x02, \r
-0xF1, 0x49, 0x22, 0xEF, 0x60, 0x2D, 0x31, 0x23, 0x70, 0x29, 0x90, 0x9F, 0x14, 0xE0, 0x54, 0xFE, \r
-0xF0, 0x7D, 0x2B, 0x7F, 0x0F, 0x12, 0x49, 0x1D, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x71, \r
-0x83, 0xBF, 0x01, 0x0F, 0x90, 0x9F, 0x13, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0x12, 0x5F, 0x53, \r
-0x74, 0x06, 0xF0, 0x22, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0x30, 0xE0, 0x05, 0x12, 0x6E, 0xE5, 0x60, \r
-0x2E, 0x90, 0x9F, 0x17, 0xE0, 0x70, 0x04, 0xEF, 0x30, 0xE0, 0x0A, 0x90, 0x9F, 0x1A, 0xE0, 0x64, \r
-0x02, 0x60, 0x1C, 0x31, 0x33, 0x90, 0x9F, 0x14, 0x12, 0x66, 0xE8, 0x30, 0xE0, 0x11, 0x51, 0x90, \r
-0x6F, 0x70, 0x0C, 0x12, 0x6F, 0x47, 0x12, 0x5F, 0x5B, 0x90, 0x9F, 0x1E, 0xE0, 0x14, 0xF0, 0x22, \r
-0x90, 0x9F, 0x1D, 0xE0, 0xFF, 0xA3, 0xE0, 0x22, 0xE4, 0xF5, 0x63, 0x90, 0x06, 0xA9, 0xE0, 0xF5, \r
-0x63, 0x54, 0xC0, 0x70, 0x08, 0x51, 0xE6, 0x54, 0xFD, 0xF0, 0x02, 0x68, 0x3E, 0xE5, 0x63, 0x30, \r
-0xE6, 0x18, 0x90, 0x9F, 0x17, 0xE0, 0x64, 0x01, 0x70, 0x12, 0x12, 0x6F, 0x8E, 0x64, 0x02, 0x60, \r
-0x05, 0x12, 0x87, 0xD8, 0x80, 0x06, 0x71, 0x73, 0x80, 0x02, 0x51, 0xE6, 0xE5, 0x63, 0x90, 0x9F, \r
-0x1B, 0x30, 0xE7, 0x0D, 0x71, 0x62, 0x12, 0x48, 0x27, 0x90, 0x9F, 0x13, 0xE0, 0x44, 0x04, 0xF0, \r
-0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0x06, \r
-0xA9, 0xE0, 0x90, 0xA1, 0x08, 0xF0, 0xE0, 0xFD, 0x54, 0xC0, 0x70, 0x04, 0x51, 0xE6, 0x80, 0x5E, \r
-0xED, 0x30, 0xE6, 0x40, 0x90, 0x9F, 0x17, 0xE0, 0x64, 0x02, 0x70, 0x28, 0x90, 0x9F, 0x13, 0xE0, \r
-0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x09, 0x90, 0x9F, 0x1B, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x1C, 0x12, \r
-0x6F, 0x95, 0x64, 0x01, 0x70, 0x20, 0x90, 0x9F, 0x1B, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x01, 0x12, \r
-0x4D, 0xD2, 0x80, 0x12, 0x12, 0x6F, 0x8E, 0x64, 0x02, 0x60, 0x05, 0x12, 0x87, 0xD8, 0x80, 0x06, \r
-0x71, 0x73, 0x80, 0x02, 0x51, 0xE6, 0x90, 0xA1, 0x08, 0xE0, 0x90, 0x9F, 0x1B, 0x30, 0xE7, 0x0D, \r
-0x71, 0x62, 0x12, 0x48, 0x27, 0x90, 0x9F, 0x13, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, \r
-0xF0, 0x22, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0xB1, 0xF0, 0x90, 0x9F, 0xB7, 0xE0, 0x90, \r
-0xA1, 0xB2, 0x22, 0x71, 0x8A, 0x90, 0x9F, 0x1A, 0xE0, 0x64, 0x0C, 0x60, 0x05, 0x12, 0x5C, 0x95, \r
-0x71, 0x83, 0x22, 0x7D, 0x08, 0xE4, 0xFF, 0x02, 0x4C, 0x88, 0x90, 0x9F, 0x13, 0x12, 0x66, 0xE8, \r
-0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x01, \r
-0x3C, 0x74, 0x04, 0x71, 0xC3, 0x90, 0x9F, 0xB8, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0xA1, 0xB2, \r
-0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x48, 0x2F, 0x90, 0x9F, 0x13, 0xE0, 0x44, \r
-0x08, 0xF0, 0x22, 0xF0, 0xE4, 0x90, 0xA1, 0xB1, 0xF0, 0x22, 0xE4, 0x90, 0xA1, 0x08, 0xF0, 0xFD, \r
-0xA3, 0x91, 0x92, 0xFB, 0xEB, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, \r
-0x9F, 0x4A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x9F, 0x4A, \r
-0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3, 0x9F, 0xEA, 0x9E, 0x40, 0x23, 0xEB, 0x9F, 0xFF, 0x90, 0x9F, \r
-0x2C, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F, 0xFD, 0xC3, 0x94, 0x19, 0x50, 0x0E, 0x74, 0x2F, \r
-0x2D, 0x91, 0x8A, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0x2A, 0xE0, 0x04, 0xF0, 0x91, 0xB6, 0x90, 0x9F, \r
-0x2A, 0xE0, 0xC3, 0x94, 0x64, 0x40, 0x5F, 0xE4, 0x90, 0xA1, 0x09, 0xF0, 0x90, 0xA1, 0x08, 0xF0, \r
-0x90, 0xA1, 0x08, 0xE0, 0xFF, 0xC3, 0x94, 0x19, 0x50, 0x3F, 0x91, 0x87, 0xE0, 0xFF, 0x90, 0xA1, \r
-0x09, 0xE0, 0x2F, 0xF0, 0xE0, 0xD3, 0x94, 0x05, 0x40, 0x27, 0x90, 0xA1, 0x08, 0xE0, 0xFF, 0x94, \r
-0x0A, 0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0x9F, 0x29, 0xF0, 0xE4, 0x80, 0x0E, 0xE4, 0x90, 0x9F, \r
-0x29, 0xF0, 0x90, 0xA1, 0x08, 0xE0, 0xFF, 0xC3, 0x74, 0x0A, 0x9F, 0x90, 0x9F, 0x28, 0xF0, 0x80, \r
-0x08, 0x90, 0xA1, 0x08, 0xE0, 0x04, 0xF0, 0x80, 0xB7, 0x90, 0x9F, 0x29, 0xE0, 0xFD, 0x7B, 0x08, \r
-0xE4, 0xFF, 0x91, 0xD9, 0x91, 0x9D, 0x22, 0x74, 0x2F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, \r
-0x83, 0x22, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0x22, 0xE4, 0xFF, 0x91, \r
-0x87, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x19, 0xF7, 0xE4, 0x90, 0x9F, 0x2A, 0xF0, 0x90, 0x9F, 0x2E, \r
-0xF0, 0x90, 0x9F, 0x28, 0xF0, 0x22, 0xB1, 0x4F, 0x40, 0x1E, 0x90, 0x9F, 0x2E, 0xE0, 0x04, 0xF0, \r
-0xE0, 0xFF, 0x94, 0x04, 0x50, 0x12, 0x90, 0x9F, 0x28, 0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, \r
-0x9F, 0x2D, 0xF0, 0xFB, 0xB1, 0x92, 0x91, 0xD9, 0x22, 0xA9, 0x07, 0x90, 0x9F, 0x13, 0xE0, 0x30, \r
-0xE0, 0x41, 0x90, 0x9F, 0x4E, 0xE0, 0x24, 0x03, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x9F, 0x29, 0x12, \r
-0x77, 0x9A, 0x50, 0x07, 0x90, 0x9F, 0x1F, 0xEB, 0xF0, 0x80, 0x15, 0xED, 0x24, 0xFD, 0xFF, 0x90, \r
-0x9F, 0x4E, 0xE0, 0x2F, 0x2B, 0x90, 0x9F, 0x1F, 0xF0, 0x90, 0x9F, 0x4E, 0xE0, 0x24, 0x03, 0xFD, \r
-0x90, 0x9F, 0x4E, 0xE0, 0x24, 0x04, 0xC3, 0x9D, 0x29, 0xFF, 0x90, 0x9F, 0x2C, 0xB1, 0x2F, 0xEF, \r
-0xF0, 0x80, 0x0A, 0xB1, 0x30, 0x74, 0x02, 0xF0, 0x90, 0x9F, 0x1F, 0xEB, 0xF0, 0x80, 0x09, 0xF0, \r
-0x90, 0x9F, 0x22, 0xE4, 0xF0, 0xA3, 0x22, 0xF0, 0x90, 0x9F, 0x22, 0xA3, 0xE0, 0x90, 0x05, 0x58, \r
-0xF0, 0x22, 0x90, 0x9F, 0x20, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xEF, 0xF0, 0x90, \r
-0x9F, 0xB6, 0xE0, 0xFF, 0x90, 0x9F, 0x20, 0xE0, 0xD3, 0x9F, 0x22, 0x12, 0xA2, 0x12, 0x90, 0xA1, \r
-0x18, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x5A, \r
-0x26, 0x90, 0xA1, 0x18, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, \r
-0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0xB1, 0x92, 0x90, 0x9F, 0x2D, 0xE0, 0xFB, \r
-0x81, 0xD9, 0x90, 0x9F, 0x28, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x22, 0x12, 0x6F, 0xDF, 0x12, 0x57, \r
-0xC5, 0xFF, 0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x56, 0xBC, \r
-0xF5, 0x56, 0x80, 0x02, 0x8F, 0x56, 0x85, 0x55, 0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, 0x1E, \r
-0x12, 0x57, 0xBD, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0xB1, 0xF4, 0xEF, 0xF0, 0xB1, 0xF4, 0xE0, \r
-0xAF, 0x54, 0x70, 0x04, 0xF1, 0x71, 0x80, 0x02, 0xF1, 0x64, 0x05, 0x54, 0x80, 0xDB, 0x91, 0x9D, \r
-0xE5, 0x55, 0x70, 0x0F, 0x90, 0x9E, 0x8D, 0xE0, 0x70, 0x09, 0x12, 0x5E, 0xC5, 0x54, 0xBF, 0xF0, \r
-0x54, 0x7F, 0xF0, 0x22, 0x74, 0x8D, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0x22, \r
-0x90, 0x9F, 0xE6, 0xE0, 0x30, 0xE0, 0x04, 0xD1, 0xDB, 0x80, 0x03, 0x12, 0x86, 0x2E, 0x90, 0xA0, \r
-0x13, 0xE0, 0x30, 0xE0, 0x04, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA0, 0x14, 0xE0, 0x64, 0x08, 0x70, \r
-0x19, 0x90, 0xA0, 0x13, 0xE0, 0x30, 0xE0, 0x0D, 0x12, 0x8A, 0x46, 0xE4, 0xFD, 0x12, 0x46, 0xB5, \r
-0x12, 0x8F, 0xA9, 0x80, 0x05, 0xE4, 0x90, 0xA0, 0x14, 0xF0, 0x90, 0x9F, 0xCE, 0x12, 0x69, 0xCD, \r
-0x30, 0xE0, 0x13, 0x90, 0xA0, 0x15, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x14, 0x09, 0x90, 0x04, 0x9C, \r
-0xE4, 0xF0, 0x90, 0xA0, 0x15, 0xF0, 0x90, 0x9F, 0x0E, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x9F, 0x10, \r
-0x74, 0x01, 0xF0, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x59, 0x90, 0x9F, 0x13, 0xE0, 0x30, 0xE0, 0x1B, \r
-0x90, 0x9F, 0x2B, 0xE0, 0x04, 0x91, 0x92, 0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, \r
-0xD8, 0xF9, 0xFF, 0x90, 0x9F, 0x48, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x9F, 0x14, 0x12, 0x66, \r
-0xE8, 0x30, 0xE0, 0x0C, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x05, 0x12, 0x5F, 0x5B, 0xF1, 0x5A, \r
-0x90, 0xA2, 0x00, 0x12, 0x8F, 0x74, 0xC3, 0x90, 0xA2, 0x01, 0xE0, 0x94, 0x80, 0x90, 0xA2, 0x00, \r
-0xE0, 0x64, 0x80, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, \r
-0x01, 0xF0, 0x7F, 0x01, 0x12, 0x86, 0x68, 0x90, 0x9F, 0xBD, 0xE0, 0x30, 0xE0, 0x0C, 0x90, 0x01, \r
-0x3B, 0xE0, 0x30, 0xE4, 0x05, 0x12, 0x5F, 0x5B, 0xF1, 0x51, 0x22, 0x12, 0x66, 0xEF, 0x90, 0x9F, \r
-0xE6, 0x12, 0x86, 0x27, 0xFE, 0xEF, 0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9E, 0x40, 0x02, 0xE1, 0xAF, \r
-0x90, 0x9F, 0xE6, 0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, \r
-0x54, 0x0F, 0x25, 0xE0, 0x4F, 0xF0, 0x22, 0x90, 0x9F, 0xBB, 0xE0, 0xFF, 0xC3, 0x13, 0x22, 0x12, \r
-0x06, 0x89, 0x90, 0x9F, 0xBC, 0xF0, 0x60, 0x27, 0x90, 0x9F, 0xCA, 0xE0, 0x20, 0xE0, 0x20, 0xE4, \r
-0xFD, 0x7F, 0x04, 0x12, 0x5A, 0xA8, 0xF1, 0x07, 0x30, 0xE0, 0x14, 0x12, 0x87, 0xBA, 0x20, 0xE0, \r
-0x0E, 0xF1, 0x40, 0x30, 0xE0, 0x04, 0x7F, 0x0D, 0x80, 0x02, 0x7F, 0x09, 0x12, 0x62, 0x14, 0x22, \r
-0x90, 0x9F, 0xBB, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x22, 0x90, 0x9F, 0x14, 0xE0, 0x54, 0xFB, 0xF0, \r
-0x22, 0x90, 0x9F, 0xBF, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x90, 0x9F, 0x1D, 0xE0, 0x14, 0x90, \r
-0x05, 0x73, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x12, 0x7A, 0x7D, 0x54, 0xFB, 0xF0, \r
-0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x12, 0x7A, 0x7D, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x9E, \r
-0x8D, 0xE0, 0xB4, 0x01, 0x0F, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x09, 0x51, 0xE6, 0x54, 0x07, 0x70, \r
-0x03, 0x12, 0x68, 0x3E, 0x22, 0x90, 0x9E, 0x8D, 0xE0, 0xB4, 0x01, 0x12, 0x90, 0x9F, 0x17, 0xE0, \r
-0x60, 0x0C, 0x12, 0x6F, 0x95, 0x64, 0x02, 0x60, 0x03, 0x02, 0x87, 0xD8, 0x71, 0x73, 0x22, 0x90, \r
-0x9F, 0xE6, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xE1, 0xF0, 0x90, 0x9F, 0xEB, 0xE0, 0xFF, 0x12, 0x62, \r
-0x14, 0x90, 0x9F, 0xEC, 0x12, 0x62, 0xC8, 0x12, 0x5F, 0x71, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x1D, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xB4, 0x03, 0x10, 0x90, 0x9F, 0xCD, 0x12, 0x4F, \r
-0xD2, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x35, 0xE4, 0xF0, 0x80, 0x34, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, \r
-0x54, 0x0F, 0x30, 0xE0, 0x0C, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x03, \r
-0xF0, 0x90, 0xA0, 0x19, 0xE0, 0x30, 0xE0, 0x17, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0B, 0xEF, 0x90, \r
-0x06, 0xCC, 0x70, 0x03, 0xF0, 0x80, 0x08, 0x80, 0x03, 0x90, 0x06, 0xCC, 0x74, 0x03, 0xF0, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0x7E, 0x00, 0x7F, 0x0A, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0xF3, \r
-0x12, 0x08, 0xAA, 0x90, 0x9F, 0xDF, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x9F, 0xCD, 0x12, 0x4F, 0xD2, \r
-0x20, 0xE0, 0x1E, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x17, 0xE0, 0x90, 0xA1, 0x28, 0x30, 0xE1, \r
-0x05, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x28, 0xE0, 0xFF, 0x12, 0x64, \r
-0x7E, 0x22, 0x90, 0xA2, 0x0E, 0x12, 0x8F, 0x89, 0x90, 0x9D, 0x94, 0xE0, 0xFF, 0x90, 0xA2, 0x0E, \r
-0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x9D, 0x94, 0xF0, 0x22, 0x90, 0x02, 0x09, 0x11, 0xB5, 0x90, 0x9D, \r
-0x99, 0x12, 0x57, 0xC4, 0x25, 0x51, 0x90, 0x9D, 0x9A, 0x12, 0x56, 0xBB, 0x25, 0x51, 0x90, 0x9D, \r
-0x9B, 0xF0, 0x12, 0x56, 0xE7, 0x25, 0x51, 0x90, 0x9D, 0x9C, 0x12, 0x6C, 0xDD, 0x25, 0x51, 0x90, \r
-0x9D, 0x9D, 0x12, 0x5E, 0x3A, 0x25, 0x51, 0x90, 0x9D, 0x9E, 0xF0, 0x12, 0x5F, 0xE4, 0x25, 0x51, \r
-0x90, 0x9D, 0x9F, 0xF0, 0x22, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25, 0x51, 0x22, 0x90, 0x04, \r
-0x24, 0x11, 0xB5, 0x90, 0xA0, 0x3B, 0x12, 0x57, 0xC4, 0x25, 0x51, 0x90, 0xA0, 0x49, 0x12, 0x56, \r
-0xBB, 0x25, 0x51, 0x90, 0xA0, 0x57, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, \r
-0x6F, 0xDF, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x9F, 0x0D, 0xF0, 0xBF, 0x01, 0x09, 0x12, 0x57, 0xC5, \r
-0x64, 0x01, 0x60, 0x1C, 0x80, 0x17, 0x12, 0x57, 0xBD, 0x12, 0x57, 0xC5, 0x64, 0x01, 0x60, 0x10, \r
-0x90, 0x9F, 0x0E, 0xE0, 0x20, 0xE0, 0x06, 0xE4, 0xFF, 0x31, 0x15, 0x80, 0x03, 0x12, 0x87, 0x5F, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0x11, 0xE0, \r
-0x90, 0xA2, 0x10, 0xF0, 0x6F, 0x70, 0x02, 0x41, 0x1E, 0xEF, 0x14, 0x60, 0x42, 0x14, 0x60, 0x6C, \r
-0x14, 0x70, 0x02, 0x21, 0xCA, 0x14, 0x70, 0x02, 0x21, 0xF5, 0x24, 0x04, 0x60, 0x02, 0x41, 0x1E, \r
-0x90, 0xA2, 0x10, 0xE0, 0xB4, 0x04, 0x04, 0x51, 0x49, 0x41, 0x1E, 0x90, 0xA2, 0x10, 0xE0, 0xB4, \r
-0x02, 0x04, 0x51, 0x53, 0x41, 0x1E, 0x90, 0xA2, 0x10, 0xE0, 0xB4, 0x03, 0x04, 0x51, 0x57, 0x41, \r
-0x1E, 0x90, 0xA2, 0x10, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x41, 0x1E, 0x51, 0x4B, 0x41, 0x1E, 0x90, \r
-0xA2, 0x10, 0xE0, 0xB4, 0x04, 0x04, 0x51, 0x42, 0x41, 0x1E, 0x90, 0xA2, 0x10, 0xE0, 0xB4, 0x02, \r
-0x04, 0x51, 0x60, 0x41, 0x1E, 0x90, 0xA2, 0x10, 0xE0, 0xB4, 0x03, 0x04, 0x51, 0x5B, 0x41, 0x1E, \r
-0x90, 0xA2, 0x10, 0xE0, 0x60, 0x02, 0x41, 0x1E, 0x51, 0x23, 0x41, 0x1E, 0x90, 0xA2, 0x10, 0xE0, \r
-0xB4, 0x04, 0x05, 0x12, 0x67, 0xC7, 0x80, 0x76, 0x90, 0xA2, 0x10, 0xE0, 0xB4, 0x01, 0x05, 0x12, \r
-0x67, 0xB0, 0x80, 0x6A, 0x90, 0xA2, 0x10, 0xE0, 0xB4, 0x03, 0x05, 0x12, 0x67, 0xBB, 0x80, 0x5E, \r
-0x90, 0xA2, 0x10, 0xE0, 0x70, 0x58, 0x51, 0x73, 0x80, 0x54, 0x90, 0xA2, 0x10, 0xE0, 0xB4, 0x04, \r
-0x04, 0x51, 0x68, 0x80, 0x49, 0x90, 0xA2, 0x10, 0xE0, 0xB4, 0x01, 0x04, 0x51, 0x34, 0x80, 0x3E, \r
-0x90, 0xA2, 0x10, 0xE0, 0xB4, 0x02, 0x04, 0x51, 0x78, 0x80, 0x33, 0x90, 0xA2, 0x10, 0xE0, 0x70, \r
-0x2D, 0x51, 0x32, 0x80, 0x29, 0x90, 0xA2, 0x10, 0xE0, 0xB4, 0x03, 0x04, 0x51, 0x7D, 0x80, 0x1E, \r
-0x90, 0xA2, 0x10, 0xE0, 0xB4, 0x01, 0x04, 0x51, 0x2C, 0x80, 0x13, 0x90, 0xA2, 0x10, 0xE0, 0xB4, \r
-0x02, 0x04, 0x51, 0x8B, 0x80, 0x08, 0x90, 0xA2, 0x10, 0xE0, 0x70, 0x02, 0x51, 0x2A, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x90, 0x9F, 0x11, 0x74, 0x01, 0xF0, 0x22, 0x51, 0x23, 0x7D, 0x1F, 0x51, 0x94, \r
-0xF0, 0x22, 0x51, 0x23, 0x7D, 0x21, 0x7F, 0xFF, 0x12, 0x49, 0x1D, 0x90, 0x9F, 0x11, 0x74, 0x03, \r
-0xF0, 0x22, 0x12, 0x5C, 0x9B, 0x51, 0x83, 0x80, 0xDA, 0x51, 0x42, 0x51, 0xA6, 0xE4, 0x90, 0x9F, \r
-0x11, 0xF0, 0x22, 0x51, 0x60, 0x80, 0xF4, 0x51, 0x5B, 0x80, 0xF0, 0x12, 0x5C, 0x9B, 0x80, 0xC3, \r
-0x12, 0x5F, 0x71, 0x12, 0x5C, 0x9B, 0x80, 0xBB, 0x7D, 0x22, 0x7F, 0xFF, 0x12, 0x49, 0x1D, 0x51, \r
-0x83, 0x80, 0xC8, 0x51, 0x23, 0x02, 0x67, 0xB0, 0x12, 0x5F, 0x71, 0x80, 0xBE, 0x7D, 0x25, 0x51, \r
-0x94, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x12, 0x5F, 0x71, 0x7D, 0x24, \r
-0x51, 0x94, 0xF0, 0x22, 0x7F, 0x6F, 0x12, 0x49, 0x1D, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, \r
-0x90, 0x9F, 0x11, 0x74, 0x04, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x22, 0x12, 0x5C, \r
-0x9B, 0x12, 0x5F, 0xEB, 0x51, 0x83, 0x90, 0x9F, 0x12, 0x74, 0x04, 0xF0, 0x22, 0x7D, 0x2E, 0x7F, \r
-0x6F, 0x12, 0x49, 0x1D, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x5A, 0x26, 0x51, 0xA6, 0x90, 0x9F, 0x12, \r
-0x74, 0x02, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x9E, 0x8C, 0xF0, 0xBF, 0x01, 0x08, 0x12, \r
-0x8C, 0x82, 0xE4, 0x90, 0x9E, 0x8C, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0xA0, \r
-0x5A, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x9F, 0x21, 0xF0, 0x22, 0x12, \r
-0x6D, 0xF7, 0x90, 0x9F, 0xBD, 0x12, 0x6D, 0x01, 0x12, 0x57, 0xC4, 0x90, 0x9F, 0xBE, 0x12, 0x56, \r
-0xBB, 0x90, 0x9F, 0xBF, 0xF0, 0x90, 0x9F, 0xBE, 0xE0, 0x90, 0x9F, 0xC0, 0xF0, 0x90, 0x9F, 0xBD, \r
-0xE0, 0x54, 0x01, 0xFF, 0x02, 0x5E, 0xD1, 0x12, 0x6D, 0xF7, 0x90, 0x9F, 0xC1, 0xE0, 0x54, 0xFE, \r
-0x4E, 0xF0, 0xEF, 0x54, 0x02, 0x71, 0x49, 0x90, 0x9F, 0x13, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x90, \r
-0x9F, 0xC1, 0xE0, 0x54, 0x01, 0xFF, 0x02, 0x58, 0xE1, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x22, \r
-0x12, 0x06, 0x89, 0x54, 0x01, 0x71, 0x49, 0x90, 0x9F, 0xF0, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0x12, \r
-0x66, 0xE8, 0x90, 0x07, 0x65, 0x30, 0xE0, 0x04, 0x74, 0x18, 0xF0, 0x22, 0xE4, 0xF0, 0x22, 0x90, \r
-0x9F, 0xF3, 0xE0, 0x44, 0x10, 0xF0, 0x7D, 0x01, 0x7F, 0x1B, 0x12, 0x86, 0x77, 0x90, 0xA0, 0xEE, \r
-0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0xF4, 0xE0, 0x44, 0x01, \r
-0xF0, 0x7D, 0x01, 0x7F, 0x28, 0x71, 0x7A, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x6F, 0xD2, 0x90, \r
-0xA1, 0xF2, 0xE0, 0x70, 0x08, 0x71, 0xED, 0x90, 0xA1, 0xF2, 0x74, 0x01, 0xF0, 0x12, 0x5E, 0x32, \r
-0x12, 0x06, 0x89, 0xFF, 0xE4, 0x8F, 0x54, 0xF5, 0x53, 0xF5, 0x52, 0xF5, 0x51, 0x90, 0xA0, 0x04, \r
-0x12, 0x45, 0x71, 0xEC, 0x54, 0xC1, 0xFC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xAF, \r
-0x54, 0xAE, 0x53, 0xAD, 0x52, 0xAC, 0x51, 0x78, 0x19, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, \r
-0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53, 0x90, 0xA0, 0x00, 0x02, 0x08, 0x6D, 0x7F, 0x80, 0x7E, \r
-0x08, 0x12, 0x37, 0x4E, 0x90, 0xA0, 0x04, 0x02, 0x08, 0x6D, 0x12, 0x06, 0x89, 0x90, 0xA0, 0x0C, \r
-0x12, 0x57, 0xC4, 0x90, 0xA0, 0x0D, 0xF0, 0x22, 0x12, 0x5E, 0x2C, 0x12, 0x06, 0x89, 0x90, 0xA0, \r
-0x16, 0x12, 0x57, 0xC4, 0x90, 0xA0, 0x17, 0x12, 0x56, 0xBB, 0x90, 0xA0, 0x18, 0xF0, 0x90, 0x9F, \r
-0xF3, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0x5E, 0x32, 0x12, 0x87, 0xAB, 0xB4, 0x02, 0x05, 0x7F, 0x40, \r
-0x12, 0x8B, 0xCF, 0x22, 0x12, 0x06, 0x89, 0xF5, 0x51, 0x12, 0x57, 0xC5, 0xF5, 0x54, 0x12, 0x56, \r
-0xBC, 0xF5, 0x55, 0x12, 0x56, 0xE7, 0xF5, 0x56, 0x12, 0x6C, 0xDE, 0xF5, 0x57, 0x12, 0x5E, 0x3B, \r
-0xF5, 0x58, 0x12, 0x5F, 0xE4, 0xF5, 0x59, 0xE5, 0x51, 0x12, 0x45, 0xC7, 0x9C, 0x75, 0x00, 0x9C, \r
-0x7D, 0x01, 0x9C, 0x85, 0x02, 0x9C, 0x8D, 0x03, 0x9C, 0x95, 0x04, 0x9C, 0x9D, 0x05, 0x9C, 0xA6, \r
-0x06, 0x00, 0x00, 0x9C, 0xB8, 0x75, 0x52, 0x02, 0x75, 0x53, 0x29, 0x80, 0x41, 0x75, 0x52, 0x06, \r
-0x75, 0x53, 0x2A, 0x80, 0x39, 0x75, 0x52, 0x01, 0x75, 0x53, 0x31, 0x80, 0x31, 0x75, 0x52, 0x01, \r
-0x75, 0x53, 0x32, 0x80, 0x29, 0x75, 0x52, 0x06, 0x75, 0x53, 0x33, 0x80, 0x21, 0x7B, 0x00, 0x7A, \r
-0x00, 0x79, 0x54, 0x02, 0x8E, 0xFD, 0x90, 0xA0, 0x0E, 0x91, 0xCB, 0xA3, 0xE5, 0x56, 0xF0, 0xA3, \r
-0xE5, 0x57, 0xF0, 0xA3, 0xE5, 0x58, 0xF0, 0x22, 0x75, 0x52, 0x01, 0x75, 0x53, 0xFF, 0x7B, 0x00, \r
-0x7A, 0x00, 0x79, 0x54, 0xAD, 0x52, 0xAF, 0x53, 0x02, 0x86, 0x77, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, \r
-0x55, 0xF0, 0x22, 0x12, 0x5E, 0x2C, 0x12, 0x06, 0x89, 0x90, 0xA0, 0x29, 0x12, 0x57, 0xC4, 0x90, \r
-0xA0, 0x2A, 0xF0, 0x12, 0x5E, 0x32, 0x7D, 0x02, 0x7F, 0x38, 0x02, 0x86, 0x77, 0x12, 0x06, 0x89, \r
-0x54, 0x01, 0x25, 0xE0, 0x12, 0x8F, 0x98, 0x54, 0xFB, 0x4F, 0xF0, 0xE0, 0x13, 0x13, 0x54, 0x3F, \r
-0x30, 0xE0, 0x02, 0x80, 0x12, 0x90, 0xA0, 0x13, 0xE0, 0x20, 0xE0, 0x02, 0xB1, 0x0F, 0x22, 0x90, \r
-0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x22, 0x90, 0x07, 0x65, 0xE0, 0x44, 0x18, 0xF0, 0x22, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9D, 0xF1, 0xE0, 0xFF, 0x90, 0x9D, 0xF0, 0xE0, 0xB5, \r
-0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x3A, 0x90, 0x9D, 0xF0, 0xE0, 0xFE, \r
-0xB1, 0x7A, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0xA1, 0xF9, 0x74, 0x9D, 0x35, 0xF0, \r
-0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x52, 0xE4, 0x90, 0x9D, 0xF0, 0x12, 0x8F, 0x7B, 0xB4, 0x0A, \r
-0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9D, 0xF0, 0xF0, 0x12, 0x7D, 0x2B, 0x90, 0x9D, \r
-0x93, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0xF0, 0x08, 0x90, 0x9D, 0xA0, \r
-0x02, 0x45, 0xA9, 0xE4, 0x90, 0x9E, 0x88, 0xF0, 0xA3, 0xF0, 0x90, 0x9D, 0xF0, 0xF0, 0xA3, 0xF0, \r
-0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xB1, 0xE2, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xF3, \r
-0x74, 0x00, 0x2D, 0xB1, 0xE2, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, \r
-0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, \r
-0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, \r
-0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, \r
-0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x90, 0xA1, 0xD8, 0x12, 0x45, 0xBE, 0x7F, 0x96, 0x7E, 0x02, 0x12, 0x8F, 0x33, 0xEF, 0x60, \r
-0x51, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, \r
-0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0xA1, 0xDB, 0xEF, 0xF0, 0xEE, 0xFF, \r
-0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA1, 0xDB, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, \r
-0x90, 0xA1, 0xD8, 0xD1, 0xC9, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0xB1, 0x91, 0x90, 0xA1, 0xDB, \r
-0xE0, 0x24, 0x18, 0xFF, 0x90, 0xA1, 0xD8, 0x12, 0x45, 0xB5, 0xD1, 0x57, 0x90, 0x02, 0x96, 0x74, \r
-0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xD4, 0xEF, 0xF0, 0xA3, 0x12, 0x45, 0xBE, \r
-0x90, 0xA1, 0xF4, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x06, 0xE1, 0x74, 0x00, \r
-0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0xA1, \r
-0xD5, 0x12, 0x45, 0xB5, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, \r
-0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0xA1, 0xD4, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, \r
-0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x45, 0xB5, 0xE9, 0x24, 0x02, \r
-0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0xA1, 0xD5, 0xD1, 0xC9, 0xF5, 0x43, \r
-0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x35, 0x26, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x0E, 0x02, \r
-0x06, 0xA2, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x9E, 0x89, 0xE0, 0xFE, \r
-0x90, 0x9E, 0x88, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, \r
-0x01, 0x60, 0x24, 0xED, 0x12, 0x8F, 0xB4, 0xFA, 0x7B, 0x01, 0xB1, 0xEA, 0x7F, 0x01, 0xEF, 0x60, \r
-0x16, 0x90, 0x9E, 0x88, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, \r
-0x60, 0x05, 0xE4, 0x90, 0x9E, 0x88, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xF5, 0x12, \r
-0x45, 0xBE, 0xE4, 0xFF, 0x90, 0xA1, 0xF5, 0x12, 0x45, 0xB5, 0x8F, 0x82, 0x75, 0x83, 0x00, 0x12, \r
-0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0xF1, 0x40, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x10, 0xE5, 0x22, \r
-0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0x22, 0x90, 0x00, 0xF1, 0xE0, 0x54, 0xF0, 0xC4, 0x54, \r
-0x0F, 0xFF, 0x22, 0x75, 0x15, 0x12, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, 0x75, 0x18, 0x32, 0x90, \r
-0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5, 0x18, \r
-0xF0, 0x22, 0x75, 0x1D, 0x06, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x43, 0x20, \r
-0x80, 0x43, 0x1F, 0x04, 0x90, 0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, \r
-0x1F, 0xF0, 0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, \r
-0xC7, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0x12, 0x8F, 0x90, 0x90, \r
-0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0xA0, \r
-0xDE, 0xF0, 0xA3, 0xF0, 0xF1, 0xA4, 0xEF, 0x64, 0x01, 0x60, 0x3D, 0xC3, 0x90, 0xA0, 0xDF, 0xE0, \r
-0x94, 0x88, 0x90, 0xA0, 0xDE, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, \r
-0xF0, 0x90, 0x01, 0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x1F, 0x90, 0xA0, 0xDE, 0x12, 0x8F, 0x74, 0x12, \r
-0x8F, 0x82, 0xD3, 0x90, 0xA0, 0xDF, 0xE0, 0x94, 0x32, 0x90, 0xA0, 0xDE, 0xE0, 0x94, 0x00, 0x40, \r
-0xC3, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xBC, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x7D, \r
-0x02, 0x90, 0x01, 0xC4, 0x74, 0x0F, 0xF0, 0x74, 0xA0, 0xA3, 0xF0, 0x90, 0xA0, 0x2B, 0xE0, 0xFF, \r
-0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x03, 0x7F, \r
-0x00, 0x22, 0x0D, 0x80, 0xE6, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x9D, 0x93, 0x12, 0x58, 0xB2, 0xA3, \r
-0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x1D, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, \r
-0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, \r
-0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, \r
-0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, \r
-0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, \r
-0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, \r
-0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0xA1, 0x08, \r
-0xF0, 0xE0, 0xFF, 0x30, 0xE0, 0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, \r
-0x23, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, \r
-0xA8, 0xF5, 0xE8, 0x12, 0x58, 0x8C, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, \r
-0x46, 0xA0, 0x80, 0xFE, 0x22, 0x90, 0x9F, 0x0E, 0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0x22, 0x90, 0x9F, 0x17, 0xE0, 0x70, 0x07, 0x90, 0x9F, 0x0E, 0xE0, 0x30, 0xE0, 0x13, 0x90, \r
-0x9F, 0x0E, 0xE0, 0x30, 0xE0, 0x09, 0x12, 0x6E, 0x19, 0xBF, 0x01, 0x06, 0x02, 0x6F, 0x76, 0x12, \r
-0x5C, 0xD8, 0x22, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x03, 0x12, 0x6E, 0xC2, 0x02, 0x48, 0x5C, 0x90, \r
-0x9F, 0x0E, 0xE0, 0xFF, 0x30, 0xE0, 0x3F, 0x90, 0x9F, 0x12, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, \r
-0x7E, 0x01, 0x90, 0x9F, 0x11, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, \r
-0x25, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x03, 0x02, 0x87, 0x5F, 0x12, 0x6E, 0xEC, 0x90, 0x9F, 0x12, \r
-0xE0, 0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F, 0x0C, 0x80, 0x09, 0x90, 0x9F, 0x12, 0xE0, 0x70, 0x06, \r
-0xFD, 0x7F, 0x04, 0x12, 0x5A, 0xA8, 0x22, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0x30, 0xE0, 0x40, 0x90, \r
-0x9F, 0x12, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0x9F, 0x11, 0xE0, 0x7D, 0x00, \r
-0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x26, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x03, 0x02, \r
-0x87, 0x5F, 0x12, 0x92, 0x02, 0x90, 0x9F, 0x12, 0xE0, 0xB4, 0x0C, 0x06, 0xE4, 0xFD, 0x7F, 0x08, \r
-0x80, 0x0A, 0x90, 0x9F, 0x12, 0xE0, 0xB4, 0x04, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x5A, 0xA8, 0x22, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x19, 0xE0, 0x30, 0xE0, 0x21, 0x90, 0xA0, \r
-0x1E, 0xE0, 0xB4, 0x01, 0x0D, 0xA3, 0xE0, 0xB4, 0x01, 0x15, 0x74, 0x02, 0xF0, 0x12, 0x67, 0x89, \r
-0x80, 0x0D, 0x90, 0xA0, 0x1E, 0xE0, 0xB4, 0x02, 0x06, 0x74, 0x03, 0xF0, 0x12, 0x67, 0x14, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, \r
-0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, \r
-0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, \r
-0xAF, 0x22, 0xE4, 0x90, 0xA1, 0x19, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x47, 0xBF, \r
-0x90, 0xA1, 0x19, 0xEF, 0xF0, 0x7F, 0x83, 0x12, 0x47, 0xBF, 0xAE, 0x07, 0x90, 0xA1, 0x19, 0xE0, \r
-0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0xA1, 0x1B, 0xE0, 0x94, 0x64, 0x90, 0xA1, 0x1A, 0xE0, \r
-0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x19, 0xE0, 0xFF, \r
-0x22, 0x90, 0xA1, 0x1A, 0x12, 0x8F, 0x74, 0x80, 0xC2, 0x90, 0x01, 0xC4, 0x74, 0x59, 0xF0, 0x74, \r
-0xA2, 0xA3, 0xF0, 0x7F, 0x90, 0x12, 0x47, 0xBF, 0xEF, 0x20, 0xE0, 0xF7, 0x74, 0x59, 0x04, 0x90, \r
-0x01, 0xC4, 0xF0, 0x74, 0xA2, 0xA3, 0xF0, 0x22, 0xE4, 0xF5, 0x5E, 0x12, 0x56, 0xD4, 0xE0, 0xFE, \r
-0xB4, 0x02, 0x08, 0xED, 0xC3, 0x94, 0x11, 0x40, 0x22, 0x80, 0x18, 0xEE, 0xB4, 0x01, 0x08, 0xED, \r
-0xC3, 0x94, 0x0A, 0x40, 0x16, 0x80, 0x0C, 0x12, 0x56, 0xD4, 0xE0, 0x70, 0x0B, 0xED, 0xC3, 0x94, \r
-0x03, 0x40, 0x08, 0x75, 0x5E, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x5E, 0xAF, 0x5E, 0x22, 0x8F, 0x52, \r
-0x8D, 0x53, 0x8B, 0x54, 0x12, 0x56, 0xC2, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x52, 0x12, 0x77, \r
-0x94, 0xE0, 0xFD, 0x2F, 0x51, 0xF3, 0x90, 0xA0, 0xF1, 0xF0, 0xE5, 0x53, 0xD3, 0x94, 0x2D, 0x40, \r
-0x02, 0x80, 0x16, 0xE5, 0x53, 0xD3, 0x94, 0x19, 0x40, 0x05, 0x90, 0xA0, 0xF1, 0x80, 0x08, 0x75, \r
-0xF0, 0x04, 0xE5, 0x52, 0x12, 0x56, 0xC6, 0xE0, 0xFD, 0x85, 0x54, 0x6A, 0xE4, 0xFB, 0xAF, 0x52, \r
-0x02, 0x75, 0xDD, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x22, 0xD3, 0x10, 0xAF, 0x01, \r
-0xC3, 0xC0, 0xD0, 0xED, 0x60, 0x2C, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x71, 0x4A, 0xEF, \r
-0x90, 0x8D, 0x03, 0x71, 0x4A, 0xEF, 0x90, 0x8D, 0x05, 0x71, 0x4A, 0xEF, 0x90, 0x8D, 0x07, 0x71, \r
-0x4A, 0xEF, 0x90, 0x8D, 0x09, 0x71, 0x55, 0x12, 0x77, 0xD5, 0xE4, 0xF0, 0xA3, 0xF0, 0x71, 0x5C, \r
-0xE4, 0xF0, 0x71, 0x67, 0x54, 0xBF, 0x44, 0x80, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, \r
-0x12, 0x45, 0xA9, 0xEE, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, \r
-0xF0, 0x75, 0xF0, 0x0A, 0x22, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0x22, 0x74, 0x12, 0x2F, 0xF5, \r
-0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0x22, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, \r
-0xA9, 0xE0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x08, 0xEF, 0xF0, 0x71, \r
-0xC9, 0x30, 0xE6, 0x40, 0x7F, 0x8D, 0x12, 0x47, 0xBF, 0xEF, 0x64, 0x01, 0x70, 0x36, 0x90, 0xA2, \r
-0x09, 0xF0, 0x90, 0xA2, 0x09, 0xE0, 0xFD, 0x90, 0xA2, 0x08, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, \r
-0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2D, 0x12, 0x56, 0x0E, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x50, \r
-0xBA, 0x90, 0xA2, 0x09, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD5, 0x71, 0xC9, 0x30, \r
-0xE0, 0x02, 0x71, 0xD0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x8F, 0x12, 0x47, 0xBF, 0xEF, 0x22, \r
-0xE4, 0xFD, 0x7F, 0x8D, 0x02, 0x46, 0xA0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, \r
-0x4C, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0xA1, 0x4B, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, \r
-0x3E, 0x02, 0x90, 0xA1, 0x56, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x4E, 0x12, 0x45, 0x71, 0x12, 0x08, \r
-0x3A, 0x90, 0xA1, 0x56, 0x12, 0x4F, 0xEF, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, \r
-0xA1, 0x4E, 0x12, 0x45, 0x71, 0x90, 0xA1, 0x52, 0x12, 0x4F, 0xEF, 0xD0, 0x03, 0xD0, 0x02, 0xD0, \r
-0x01, 0xD0, 0x00, 0x12, 0x45, 0x53, 0x90, 0xA1, 0x5A, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x4C, 0xA3, \r
-0xE0, 0xFD, 0xC0, 0x05, 0x90, 0xA1, 0x5A, 0x12, 0x45, 0x71, 0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D, \r
-0x90, 0xA1, 0x4B, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, 0x09, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xE0, 0xEF, 0xF0, 0xED, 0x64, 0x01, 0x70, 0x2E, \r
-0xEB, 0xB4, 0x01, 0x07, 0xE0, 0x24, 0x02, 0xF5, 0x72, 0x80, 0x08, 0x90, 0xA1, 0xE0, 0xE0, 0x24, \r
-0xFE, 0xF5, 0x72, 0x90, 0xA1, 0x4E, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x72, 0x91, \r
-0xC0, 0x91, 0xB8, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x72, 0x80, 0x1F, 0x90, 0xA1, \r
-0x4E, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA1, 0xE0, 0xE0, 0xFF, 0x91, 0xC0, 0x91, \r
-0xB8, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA1, 0xE0, 0xE0, 0xFF, 0x91, 0xC0, 0x7F, \r
-0x01, 0x71, 0xD7, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0x71, 0xD7, 0x90, 0xA1, 0x4E, 0x22, \r
-0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA1, 0x52, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0x22, 0x7E, \r
-0x00, 0x7F, 0x2D, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0x2C, 0x02, 0x08, 0xAA, 0xC3, 0xEF, \r
-0x9D, 0xF5, 0x56, 0xC3, 0x94, 0x08, 0x50, 0x1C, 0xE4, 0xF5, 0x57, 0xB1, 0xB8, 0xC0, 0x83, 0xC0, \r
-0x82, 0x90, 0xA0, 0xF2, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0xA9, 0xE5, \r
-0x56, 0xF0, 0x80, 0x3E, 0xE5, 0x56, 0xC3, 0x94, 0x10, 0x50, 0x09, 0x75, 0x57, 0x01, 0xE5, 0x56, \r
-0x24, 0xF8, 0x80, 0x17, 0xE5, 0x56, 0xC3, 0x94, 0x18, 0x50, 0x09, 0x75, 0x57, 0x02, 0xE5, 0x56, \r
-0x24, 0xF0, 0x80, 0x07, 0x75, 0x57, 0x03, 0xE5, 0x56, 0x24, 0xE8, 0xFF, 0xB1, 0xB8, 0xC0, 0x83, \r
-0xC0, 0x82, 0x90, 0xA0, 0xF2, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0xA9, \r
-0xEF, 0xF0, 0xAF, 0x57, 0x22, 0x8F, 0x54, 0x8D, 0x55, 0xAE, 0x03, 0x74, 0x1F, 0xC3, 0x95, 0x54, \r
-0x40, 0x0A, 0xB1, 0xB0, 0xE4, 0xFD, 0xB1, 0xA8, 0x24, 0xD4, 0x80, 0x31, 0x74, 0x3F, 0xC3, 0x95, \r
-0x54, 0x40, 0x0A, 0xB1, 0xB0, 0x7D, 0x20, 0xB1, 0xA6, 0x24, 0x88, 0x80, 0x20, 0x74, 0x5F, 0xC3, \r
-0x95, 0x54, 0x40, 0x0A, 0xB1, 0xB0, 0x7D, 0x40, 0xB1, 0xA6, 0x24, 0xD0, 0x80, 0x0F, 0x74, 0x7F, \r
-0xC3, 0x95, 0x54, 0x40, 0x20, 0xB1, 0xB0, 0x7D, 0x60, 0xB1, 0xA6, 0x24, 0x84, 0xFD, 0xE4, 0x34, \r
-0x04, 0xFC, 0x75, 0xF0, 0x0E, 0xE5, 0x55, 0xB1, 0xC5, 0x75, 0xF0, 0x03, 0xEE, 0x12, 0x45, 0xA9, \r
-0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x22, 0xAF, 0x54, 0x91, 0xDE, 0x90, 0xA0, 0xEE, 0xEF, 0xF0, 0x22, \r
-0x90, 0xA0, 0xF2, 0xEE, 0xF0, 0xAB, 0x55, 0x22, 0x75, 0xF0, 0x0E, 0xEB, 0x90, 0xA0, 0x33, 0x02, \r
-0x45, 0xA9, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x31, 0x02, 0x45, 0xA9, 0x90, 0xA0, 0x2C, 0xE0, 0x30, \r
-0xE0, 0x22, 0xB1, 0xF5, 0xE0, 0xFE, 0x30, 0xE0, 0x1B, 0x75, 0xF0, 0x0E, 0xEF, 0xB1, 0xFD, 0xEE, \r
-0x54, 0xFE, 0xF0, 0x90, 0xA0, 0x2E, 0x74, 0x05, 0xF0, 0x12, 0x4A, 0x47, 0x54, 0x07, 0xFD, 0x7F, \r
-0x01, 0x12, 0x49, 0xA0, 0x22, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x37, \r
-0x02, 0x45, 0xA9, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x37, \r
-0x4E, 0x90, 0xA0, 0xE1, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0x90, 0xA0, \r
-0xE5, 0x12, 0x08, 0x6D, 0x90, 0xA0, 0xE1, 0xD1, 0x70, 0x60, 0x18, 0x90, 0xA0, 0xE1, 0xD1, 0x67, \r
-0x90, 0xA0, 0xE1, 0x12, 0x08, 0x6D, 0x90, 0xA0, 0xE1, 0x12, 0x47, 0xDF, 0x7F, 0x00, 0x7E, 0x08, \r
-0x12, 0x38, 0x45, 0x90, 0xA0, 0xE5, 0xD1, 0x70, 0x60, 0x18, 0x90, 0xA0, 0xE5, 0xD1, 0x67, 0x90, \r
-0xA0, 0xE5, 0x12, 0x08, 0x6D, 0x90, 0xA0, 0xE5, 0x12, 0x47, 0xDF, 0x7F, 0x00, 0x7E, 0x09, 0x12, \r
-0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x45, 0x71, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x22, \r
-0x12, 0x45, 0x71, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x22, 0xE4, 0x90, 0x9E, \r
-0x8D, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x01, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0x0E, 0x12, \r
-0x08, 0xAA, 0x90, 0x9F, 0x0E, 0xE0, 0x54, 0xFD, 0xF0, 0xE4, 0x12, 0x58, 0xB3, 0xA3, 0x74, 0x0C, \r
-0xF0, 0x22, 0x90, 0x9F, 0x13, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x9F, 0x20, 0xF0, 0x90, 0x9F, \r
-0x1B, 0xF0, 0x90, 0x9F, 0x14, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x5E, 0xB4, 0x7D, 0x02, 0x7F, 0x02, \r
-0x02, 0x5E, 0xB8, 0xEF, 0x24, 0xFE, 0x60, 0x0B, 0x04, 0x70, 0x27, 0x90, 0x9F, 0x1D, 0x74, 0x02, \r
-0xF0, 0x80, 0x16, 0xED, 0x70, 0x0A, 0x90, 0x9F, 0xB9, 0xE0, 0x90, 0x9F, 0x1D, 0xF0, 0x80, 0x05, \r
-0x90, 0x9F, 0x1D, 0xED, 0xF0, 0x90, 0x9F, 0x1D, 0xE0, 0xA3, 0xF0, 0x90, 0x9F, 0x14, 0xE0, 0x44, \r
-0x08, 0xF0, 0x22, 0x90, 0x9F, 0xCA, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0x9F, 0xDD, 0xE0, 0x70, 0x60, \r
-0x90, 0x9F, 0x19, 0xE0, 0xD3, 0x94, 0x00, 0x50, 0x57, 0x90, 0x9F, 0xBC, 0xE0, 0x60, 0x4E, 0x80, \r
-0x4F, 0x12, 0x6F, 0x9C, 0xEF, 0x64, 0x01, 0x70, 0x47, 0x90, 0x9F, 0x1B, 0xE0, 0xFF, 0x54, 0x03, \r
-0x70, 0x3E, 0x90, 0x9F, 0x19, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x40, 0x34, 0xEF, 0x20, 0xE2, 0x30, \r
-0x90, 0x9F, 0x1B, 0xE0, 0x20, 0xE4, 0x29, 0x90, 0x9F, 0x14, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, \r
-0xE0, 0x1E, 0x90, 0x9F, 0xBC, 0xE0, 0x70, 0x18, 0x90, 0x06, 0x62, 0xE0, 0x20, 0xE1, 0x11, 0x90, \r
-0x06, 0x62, 0xE0, 0x30, 0xE0, 0x07, 0xE0, 0x54, 0xFC, 0x64, 0x80, 0x60, 0x03, 0x7F, 0x01, 0x22, \r
-0x7F, 0x00, 0x22, 0x90, 0x9F, 0xBD, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x13, 0x90, 0x02, 0x87, 0xE0, \r
-0x70, 0x17, 0x90, 0x02, 0x96, 0xE0, 0x70, 0x11, 0x90, 0x02, 0x86, 0xE0, 0x30, 0xE1, 0x0A, 0x90, \r
-0xA0, 0x13, 0xE0, 0x20, 0xE0, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x9F, 0xC6, 0xE0, \r
-0x90, 0x01, 0x30, 0xF0, 0x90, 0x9F, 0xC3, 0xE0, 0x90, 0x01, 0x39, 0xF0, 0x90, 0x9F, 0xC4, 0xE0, \r
-0x90, 0x01, 0x3A, 0xF0, 0x22, 0x90, 0xA1, 0xC0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x00, \r
-0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x12, 0xA9, 0x32, 0x44, 0x01, 0xF0, 0x12, 0xA9, 0x32, 0x54, \r
-0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0x12, 0x4F, 0x92, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, \r
-0x2C, 0x12, 0xAA, 0x61, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, \r
-0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, \r
-0x11, 0x0F, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0x11, 0x0F, 0xED, 0xF0, 0x22, 0xF5, \r
-0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0xD3, 0x10, 0xAF, 0x01, \r
-0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x14, 0xEF, 0xF0, 0x90, 0x9D, 0x9B, 0xE0, 0xFF, 0x90, 0x04, 0x1C, \r
-0xE0, 0x6F, 0x70, 0x3E, 0x90, 0x9F, 0x1A, 0xE0, 0x64, 0x0E, 0x70, 0x15, 0x90, 0xA2, 0x14, 0xE0, \r
-0x70, 0x30, 0x90, 0x9F, 0x13, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0x12, 0x5A, 0x1E, 0x80, \r
-0x1E, 0x90, 0x9F, 0x1A, 0xE0, 0x64, 0x06, 0x70, 0x19, 0x90, 0xA2, 0x14, 0xE0, 0x60, 0x13, 0x90, \r
-0x9F, 0x13, 0xE0, 0x54, 0xBF, 0xF0, 0x11, 0x77, 0xF0, 0x90, 0x9F, 0x1A, 0x74, 0x04, 0xF0, 0x12, \r
-0x5C, 0x9B, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, \r
-0x80, 0x22, 0x90, 0x9D, 0x9E, 0xE0, 0xFF, 0xE4, 0xFB, 0x7D, 0x01, 0x12, 0x4D, 0x56, 0x90, 0xA1, \r
-0xC5, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xC3, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xAB, 0x07, 0x90, 0xA2, 0x15, 0xED, 0xF0, 0xEC, 0xF9, 0xE0, 0xFF, \r
-0xAE, 0x03, 0x74, 0x2A, 0x2E, 0x11, 0xC1, 0x12, 0x4F, 0x9A, 0xE9, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, \r
-0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0x90, \r
-0x9D, 0x9C, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0x12, 0x4D, 0x56, 0x90, 0xA1, 0xE9, 0xEE, 0xF0, \r
-0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA1, 0xE8, 0xE0, 0x22, 0x7F, 0xA3, 0x12, 0x47, 0xBF, 0xEF, \r
-0x54, 0xF8, 0x44, 0x05, 0xFD, 0x7F, 0xA3, 0x12, 0x46, 0xA0, 0x7F, 0xA0, 0x12, 0x47, 0xBF, 0xEF, \r
-0x54, 0x0F, 0x64, 0x04, 0x22, 0x75, 0xF0, 0x03, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x74, 0x01, 0xA8, \r
-0x06, 0x08, 0x22, 0x90, 0xA2, 0x0F, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, \r
-0xE4, 0x22, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xFD, 0x7C, \r
-0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x55, 0xF5, 0x55, 0xEE, 0x35, 0x54, 0xF5, 0x54, 0x22, 0x90, \r
-0x9F, 0x4E, 0xE0, 0x24, 0x04, 0x90, 0x9F, 0x2C, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x22, 0xA4, 0xF5, \r
-0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xAE, 0xF0, 0xA8, 0x59, 0x08, 0x22, 0xFD, 0x75, 0xF0, \r
-0x0E, 0x90, 0xA0, 0x2F, 0x02, 0x45, 0xA9, 0x7E, 0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, \r
-0x9F, 0x79, 0xBD, 0x22, 0x12, 0x45, 0xA9, 0xE0, 0xFC, 0xA3, 0xE0, 0xF5, 0x82, 0x8C, 0x83, 0x22, \r
-0x12, 0x45, 0xA9, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA0, 0x5C, 0xE0, 0x22, 0x74, 0x21, 0x2F, 0xF5, \r
-0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x93, \r
-0xF5, 0x83, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE5, 0x5F, 0xF0, 0x22, 0xFE, 0x54, \r
-0x03, 0xFF, 0xEE, 0x13, 0x13, 0x54, 0x07, 0x22, 0x90, 0x01, 0x53, 0x74, 0x03, 0xF0, 0x7D, 0x10, \r
-0xFF, 0x22, 0x90, 0xA0, 0x2C, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x07, 0x22, 0x90, 0xA1, 0xE7, 0xE0, \r
-0xFF, 0x90, 0xA1, 0xE5, 0xE0, 0x22, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, 0x22, \r
-0x7F, 0x16, 0x12, 0x47, 0xBF, 0xEF, 0x54, 0x0F, 0x22, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x37, 0x4E, \r
-0xE4, 0x22, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0x22, 0x90, 0xA0, 0x5C, 0xE0, 0xFF, \r
-0xC3, 0x94, 0x80, 0x22, 0xE5, 0x6C, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x6B, 0x22, 0xFF, 0x90, 0xA1, \r
-0xDE, 0xE0, 0xFB, 0xEF, 0x5B, 0x22, 0x90, 0x9F, 0xD1, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x22, 0x90, \r
-0xA1, 0xCF, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x22, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x13, 0x54, 0x07, \r
-0x22, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, \r
-0x22, 0xFF, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFD, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, \r
-0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xC4, 0x54, 0x0F, 0x90, 0xA1, 0xE3, 0xF0, \r
-0x22, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0x22, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x6B, 0x08, \r
-0x22, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0x22, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, \r
-0x22, 0x12, 0x47, 0xBF, 0xEF, 0x44, 0x40, 0xFD, 0x22, 0x00, 0xDE, 0xF2, \r
+0xF0, 0xD0, 0xE0, 0x32, 0x90, 0xFD, 0x68, 0xE0, 0xFF, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0xA1, 0x3A, \r
+0xF0, 0xEF, 0x20, 0xE0, 0x02, 0x21, 0xF9, 0x90, 0xA2, 0x16, 0xE0, 0x70, 0x1A, 0x7F, 0x2E, 0x12, \r
+0x47, 0xAF, 0x90, 0xA0, 0x9C, 0xEF, 0xF0, 0x7F, 0x2D, 0x12, 0x47, 0xAF, 0x90, 0xA0, 0x9D, 0xEF, \r
+0xF0, 0x90, 0xA2, 0x16, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x3A, 0xE0, 0x64, 0x15, 0x70, 0x58, 0x90, \r
+0xFD, 0x62, 0xE0, 0xFF, 0x30, 0xE6, 0x11, 0xF4, 0x54, 0x3F, 0x04, 0xFE, 0x51, 0x92, 0xC3, 0x9E, \r
+0x51, 0x8A, 0x40, 0x12, 0xE4, 0xF0, 0x80, 0x0E, 0x51, 0x92, 0xFE, 0xEF, 0x54, 0x3F, 0x2E, 0x51, \r
+0x8A, 0x40, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0xA1, 0x39, 0xE0, 0xFF, 0x54, 0x30, 0xC4, 0x54, 0x0F, \r
+0xFE, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x4E, 0x90, 0xA1, 0x37, 0xF0, 0xE0, 0xFD, 0x7F, 0x2E, 0x12, \r
+0x46, 0xA0, 0x90, 0xA1, 0x39, 0xE0, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA0, 0x9D, 0xE0, 0x54, 0x0F, \r
+0x4F, 0xFD, 0x7F, 0x2D, 0x12, 0x46, 0xA0, 0x90, 0xA1, 0x3A, 0xE0, 0xB4, 0x21, 0x0D, 0x90, 0xFD, \r
+0x62, 0xE0, 0xFF, 0x12, 0x9A, 0x48, 0x7F, 0x04, 0x12, 0x6F, 0x57, 0x90, 0xA1, 0x3A, 0xE0, 0xB4, \r
+0x23, 0x04, 0x7F, 0x01, 0x31, 0xFA, 0x90, 0xA1, 0x3A, 0xE0, 0xB4, 0x27, 0x04, 0x7F, 0x02, 0x31, \r
+0xFA, 0x90, 0xA1, 0x3A, 0xE0, 0xB4, 0x30, 0x0D, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0x12, 0x99, 0x49, \r
+0x7F, 0x04, 0x12, 0x6F, 0x57, 0x90, 0xA1, 0x3A, 0xE0, 0x64, 0x34, 0x60, 0x02, 0x21, 0x98, 0x90, \r
+0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x59, 0x90, 0xA0, 0x84, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x02, \r
+0x21, 0x98, 0x90, 0xA0, 0x62, 0x12, 0x4F, 0xD3, 0x30, 0xE0, 0x18, 0x12, 0x47, 0xF0, 0x90, 0xA0, \r
+0x85, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x47, 0xF0, 0xE4, 0xFF, 0xFE, 0xEC, 0x12, 0x47, 0xD0, \r
+0x12, 0x47, 0xD6, 0x51, 0x9B, 0x7D, 0x01, 0x12, 0x46, 0xB4, 0x90, 0xA1, 0x37, 0x74, 0x01, 0xF0, \r
+0xFB, 0x7A, 0xA1, 0x79, 0x37, 0xFD, 0x7F, 0x34, 0x12, 0x6E, 0x00, 0x90, 0xA0, 0xA7, 0xE0, 0x44, \r
+0x01, 0xF0, 0x90, 0x04, 0x9D, 0xE4, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x51, 0xB3, 0x80, 0x39, 0x51, \r
+0x9B, 0xE4, 0xFD, 0x12, 0x46, 0xB4, 0x90, 0xA0, 0x62, 0x12, 0x6F, 0xA4, 0x30, 0xE0, 0x1E, 0x12, \r
+0x47, 0xF0, 0xE4, 0xFB, 0xFA, 0xED, 0xF9, 0xEC, 0xF8, 0x90, 0xA0, 0x85, 0xE0, 0xFE, 0xA3, 0xE0, \r
+0xFF, 0xE4, 0xFC, 0xFD, 0x12, 0x45, 0x53, 0x12, 0x47, 0xD0, 0x12, 0x47, 0xD6, 0xD1, 0x2E, 0x90, \r
+0x04, 0x9D, 0xE0, 0x54, 0xFE, 0xF0, 0x71, 0x02, 0x90, 0xA1, 0x3A, 0xE0, 0xFD, 0xB4, 0x35, 0x07, \r
+0x90, 0xA0, 0x66, 0xE0, 0x44, 0x01, 0xF0, 0xED, 0xB4, 0x36, 0x23, 0x90, 0xFD, 0x61, 0xE0, 0x90, \r
+0xA1, 0x37, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA1, 0x38, 0xF0, 0x90, 0xA1, 0x3A, 0xE0, 0xFF, \r
+0x90, 0xA1, 0x37, 0xE0, 0xFD, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x38, 0x12, 0x6E, 0x00, 0x90, 0xA1, \r
+0x3A, 0xE0, 0xB4, 0x37, 0x02, 0x71, 0x29, 0x90, 0xA1, 0x3A, 0xE0, 0xB4, 0x40, 0x14, 0x90, 0xFD, \r
+0x62, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0xA0, 0x82, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA0, \r
+0x82, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x51, 0x01, 0x7F, 0x04, 0x02, 0x6F, \r
+0x57, 0x90, 0xA1, 0x98, 0x74, 0x09, 0xF0, 0x90, 0xA1, 0xA6, 0x74, 0x07, 0xF0, 0x90, 0xA1, 0x9A, \r
+0xEF, 0xF0, 0x70, 0x31, 0x90, 0xA0, 0x78, 0xE0, 0x60, 0x1A, 0xA3, 0xE0, 0x60, 0x02, 0x80, 0x0C, \r
+0x90, 0x07, 0x70, 0xE0, 0x70, 0x06, 0x90, 0x07, 0x74, 0xE0, 0x60, 0x08, 0x90, 0xA1, 0x9B, 0x74, \r
+0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0x9B, 0xF0, 0xE4, 0x90, 0xA1, 0x9C, 0xF0, 0xA3, 0xF0, \r
+0xA3, 0xF0, 0xA3, 0x80, 0x39, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA1, 0x9B, 0xF0, 0x90, 0xFD, 0x63, \r
+0xE0, 0x90, 0xA1, 0x9C, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA1, 0x9D, 0xF0, 0x90, 0xFD, 0x65, \r
+0xE0, 0x90, 0xA1, 0x9E, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA1, 0x9F, 0xF0, 0x90, 0xFD, 0x67, \r
+0xE0, 0x90, 0xA1, 0xA0, 0xF0, 0x90, 0xA1, 0x9B, 0xE0, 0x54, 0x01, 0x90, 0xA0, 0x78, 0xF0, 0xA3, \r
+0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x98, 0x02, 0x6E, 0xA2, 0x90, 0xA1, 0x39, 0xF0, 0xD3, 0x94, \r
+0x3F, 0x22, 0x90, 0xA0, 0x9C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x22, 0x90, 0xA0, 0x62, 0xE0, 0xC4, \r
+0x13, 0x13, 0x54, 0x01, 0xFF, 0x90, 0xA0, 0xA1, 0xE0, 0xFB, 0x90, 0xA0, 0xA0, 0xE0, 0x90, 0xA1, \r
+0xF7, 0xF0, 0x22, 0x90, 0x01, 0xE7, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, \r
+0xF1, 0x75, 0x54, 0xFD, 0x4F, 0xF0, 0xE0, 0xC3, 0x13, 0xFF, 0x54, 0x01, 0x90, 0x01, 0xE6, 0xF0, \r
+0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE0, 0x27, 0x12, 0xAB, 0x37, 0x70, 0x20, 0x90, 0xA0, \r
+0xA7, 0xE0, 0x30, 0xE0, 0x02, 0x80, 0x19, 0x90, 0xFD, 0x62, 0xE0, 0xB4, 0xAD, 0x0E, 0xA3, 0xE0, \r
+0xB4, 0x35, 0x09, 0x51, 0xB3, 0x90, 0x01, 0xE5, 0x74, 0xDF, 0xF0, 0x22, 0x80, 0x00, 0x80, 0x02, \r
+0x80, 0xB1, 0x90, 0x01, 0xE7, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA0, 0x87, 0xE0, 0x44, 0x04, \r
+0xF0, 0x7D, 0x01, 0x7F, 0x23, 0x12, 0x6E, 0x00, 0x8F, 0x51, 0xE5, 0x51, 0xB4, 0x03, 0x09, 0xE4, \r
+0xFF, 0x51, 0x01, 0x7F, 0x04, 0x12, 0x98, 0x0D, 0x22, 0x90, 0xA0, 0x62, 0x12, 0x4F, 0xD3, 0x20, \r
+0xE0, 0x1D, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x16, 0xE0, 0x90, 0xA1, 0x3B, 0x30, 0xE1, 0x05, \r
+0x74, 0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x3B, 0xE0, 0xFF, 0x71, 0x50, 0x22, \r
+0x90, 0xA1, 0x3C, 0xEF, 0xF0, 0x90, 0xA0, 0xA1, 0xE0, 0x70, 0x4D, 0x12, 0x47, 0xF0, 0xEE, 0x54, \r
+0x0F, 0xFE, 0xE4, 0xFD, 0xFC, 0x90, 0xA1, 0x3D, 0x12, 0x08, 0x6D, 0xE4, 0x7F, 0x80, 0x91, 0x1F, \r
+0x70, 0x05, 0x90, 0xA0, 0x80, 0x80, 0x1B, 0xE4, 0xFF, 0xFE, 0x91, 0x21, 0x70, 0x0A, 0x90, 0xA0, \r
+0x80, 0x04, 0xF0, 0xE4, 0xA3, 0xF0, 0x80, 0x55, 0xE4, 0xFF, 0x91, 0x1F, 0x70, 0x09, 0x90, 0xA0, \r
+0x80, 0x04, 0xF0, 0xA3, 0xF0, 0x80, 0x46, 0xE4, 0x7F, 0x80, 0xFE, 0x91, 0x21, 0x70, 0x3E, 0x90, \r
+0xA0, 0x80, 0xF0, 0xA3, 0x04, 0xF0, 0x80, 0x35, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, \r
+0x54, 0x02, 0x91, 0x34, 0x4E, 0x4F, 0x60, 0x08, 0x90, 0xA0, 0x80, 0x74, 0x01, 0xF0, 0x80, 0x05, \r
+0xE4, 0x90, 0xA0, 0x80, 0xF0, 0xF1, 0x6E, 0xEF, 0x54, 0x01, 0x91, 0x34, 0x4E, 0x4F, 0x60, 0x07, \r
+0xE4, 0x90, 0xA0, 0x81, 0xF0, 0x80, 0x06, 0x90, 0xA0, 0x81, 0x74, 0x01, 0xF0, 0x90, 0xA0, 0x7A, \r
+0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x11, 0x12, 0x63, 0x00, 0x90, 0x07, 0x78, 0xE0, 0x90, 0xA0, 0x7F, \r
+0xF0, 0xF1, 0x7D, 0x12, 0x63, 0x84, 0x90, 0xA1, 0x3C, 0xE0, 0xFD, 0x70, 0x02, 0x80, 0x1C, 0xED, \r
+0xB4, 0x01, 0x06, 0x91, 0x2D, 0x44, 0x20, 0xF0, 0x22, 0x90, 0xA1, 0x3C, 0xE0, 0xFD, 0xB4, 0x02, \r
+0x06, 0x91, 0x2D, 0x44, 0x60, 0xF0, 0x22, 0xED, 0xB4, 0x03, 0x03, 0x91, 0x2D, 0xF0, 0x22, 0x7E, \r
+0x02, 0xFD, 0xFC, 0x90, 0xA1, 0x3D, 0x12, 0x45, 0x8D, 0xC3, 0x02, 0x45, 0x60, 0x90, 0xA0, 0x7A, \r
+0xE0, 0x54, 0x1F, 0x22, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA1, 0x3D, 0x12, 0x08, 0x6D, 0x90, \r
+0xA1, 0x3D, 0x12, 0x45, 0x71, 0xEC, 0x4D, 0x22, 0x12, 0xA5, 0x55, 0x7F, 0x08, 0x12, 0x47, 0xAF, \r
+0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x46, 0xA0, 0xE4, 0xFF, 0x91, 0xE0, 0x51, 0x9B, 0xE4, \r
+0xFD, 0x12, 0x46, 0xB4, 0x90, 0x9F, 0xA3, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0xF1, \r
+0xAD, 0x90, 0x9F, 0xA4, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0x91, 0x89, 0x91, 0x48, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F, 0xA4, 0xE0, 0x44, 0x10, 0xF0, \r
+0x51, 0x9B, 0x7D, 0x01, 0x12, 0x46, 0xB4, 0x90, 0x9F, 0xB2, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x46, \r
+0xA0, 0x90, 0x9F, 0xA8, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, \r
+0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x12, 0x47, 0xAF, 0xEF, 0x44, \r
+0x10, 0xFD, 0x7F, 0x08, 0x12, 0x46, 0xA0, 0x7F, 0x01, 0x91, 0xE0, 0x7F, 0x90, 0x12, 0x47, 0xAF, \r
+0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x46, 0xA0, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, \r
+0x90, 0xA2, 0x23, 0xD1, 0x81, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, \r
+0x90, 0xA2, 0x23, 0xE0, 0x6F, 0x60, 0x34, 0xC3, 0x90, 0xA2, 0x25, 0xE0, 0x94, 0x88, 0x90, 0xA2, \r
+0x24, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA2, \r
+0x24, 0xD1, 0x39, 0xD1, 0xD9, 0xD3, 0x90, 0xA2, 0x25, 0xE0, 0x94, 0x32, 0x90, 0xA2, 0x24, 0xE0, \r
+0x94, 0x00, 0x40, 0xC1, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xBA, 0x22, 0x90, 0x9F, 0xAA, 0xE0, \r
+0xFF, 0x60, 0x03, 0xB4, 0x08, 0x08, 0x12, 0xA9, 0x79, 0xBF, 0x01, 0x02, 0x91, 0x79, 0x22, 0x90, \r
+0x9F, 0xA3, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0x9F, 0x9E, 0xE0, 0xFF, 0x30, 0xE0, 0x0E, 0xC3, 0x13, \r
+0x30, 0xE0, 0x07, 0xF1, 0xA0, 0xBF, 0x01, 0x06, 0x80, 0x02, 0x80, 0x00, 0xB1, 0x2C, 0x22, 0x90, \r
+0xA0, 0x7A, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0x9C, 0x28, 0x80, 0x03, 0x12, 0x9B, 0xEC, 0x90, 0xA0, \r
+0xA7, 0xE0, 0x30, 0xE0, 0x04, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA0, 0xA8, 0xE0, 0x64, 0x08, 0x70, \r
+0x17, 0x90, 0xA0, 0xA7, 0xE0, 0x30, 0xE0, 0x0B, 0x51, 0x9B, 0xE4, 0xFD, 0x12, 0x46, 0xB4, 0xD1, \r
+0x2E, 0x80, 0x05, 0xE4, 0x90, 0xA0, 0xA8, 0xF0, 0x90, 0xA0, 0x63, 0x12, 0x6F, 0xA4, 0x30, 0xE0, \r
+0x13, 0x90, 0xA0, 0xA9, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x14, 0x09, 0x90, 0x04, 0x9C, 0xE4, 0xF0, \r
+0x90, 0xA0, 0xA9, 0xF0, 0x90, 0x9F, 0x9E, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x9F, 0xA0, 0x74, 0x01, \r
+0xF0, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x4E, 0x90, 0x9F, 0xA3, 0xE0, 0x30, 0xE0, 0x1A, 0x90, 0x9F, \r
+0xBE, 0xE0, 0x04, 0x12, 0x87, 0xC3, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, \r
+0x90, 0x9F, 0xDE, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x9F, 0xA4, 0xE0, 0x13, 0x13, 0x13, 0x54, \r
+0x1F, 0x30, 0xE0, 0x0A, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x03, 0x12, 0x5F, 0xA1, 0x90, 0xA2, \r
+0x35, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, \r
+0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x01, 0x12, 0x6F, 0x57, 0x90, 0xA0, 0x52, 0xE0, 0x30, 0xE0, \r
+0x0C, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x05, 0x12, 0x5F, 0xA1, 0xF1, 0x85, 0x22, 0x90, 0xA0, \r
+0xA7, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x08, 0xD6, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xF8, 0xEE, 0xF0, 0xA3, 0xD1, 0x81, 0x90, \r
+0xA1, 0xF8, 0xF1, 0x97, 0xE0, 0x60, 0x23, 0xC3, 0x90, 0xA1, 0xFB, 0xE0, 0x94, 0xE8, 0x90, 0xA1, \r
+0xFA, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, \r
+0x0B, 0x90, 0xA1, 0xFA, 0xD1, 0x39, 0xD1, 0xF9, 0x80, 0xD5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0xF1, 0xF0, 0xA3, 0xF0, \r
+0xD1, 0xE0, 0xEF, 0x64, 0x01, 0x60, 0x3B, 0xC3, 0x90, 0xA0, 0xF2, 0xE0, 0x94, 0x88, 0x90, 0xA0, \r
+0xF1, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, \r
+0x74, 0xFD, 0xF0, 0x80, 0x1D, 0x90, 0xA0, 0xF1, 0xD1, 0x39, 0xD1, 0xD9, 0xD3, 0x90, 0xA0, 0xF2, \r
+0xE0, 0x94, 0x32, 0x90, 0xA0, 0xF1, 0xE0, 0x94, 0x00, 0x40, 0xC5, 0x90, 0x01, 0xC6, 0xE0, 0x30, \r
+0xE3, 0xBE, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, \r
+0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xD1, 0xF8, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, \r
+0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x02, 0x3E, 0x50, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x00, 0x12, 0x45, 0xBE, 0x7F, 0x96, 0x7E, \r
+0x02, 0xD1, 0x40, 0xEF, 0x60, 0x53, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, \r
+0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0xA2, \r
+0x03, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA2, 0x03, 0xE0, 0xFD, 0x90, 0x02, \r
+0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0x00, 0xF1, 0x8E, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, \r
+0x12, 0xA0, 0x27, 0x90, 0xA2, 0x03, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0xA2, 0x00, 0x12, 0x45, 0xB5, \r
+0x12, 0xA0, 0x80, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x30, \r
+0x7E, 0x09, 0x02, 0x37, 0x4E, 0x25, 0xE0, 0xFF, 0x90, 0xA0, 0x84, 0xE0, 0x22, 0x90, 0xA0, 0xA0, \r
+0xE0, 0xFF, 0xE4, 0xFD, 0x22, 0x90, 0xA0, 0x54, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x12, 0x45, \r
+0xB5, 0x90, 0x00, 0x0E, 0x02, 0x06, 0xA2, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0x22, \r
+0x90, 0x9F, 0xA1, 0xE0, 0x64, 0x02, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0xA0, 0x5B, \r
+0xE0, 0x90, 0x01, 0x30, 0xF0, 0x90, 0xA0, 0x58, 0xE0, 0x90, 0x01, 0x39, 0xF0, 0x90, 0xA0, 0x59, \r
+0xE0, 0x90, 0x01, 0x3A, 0xF0, 0x22, 0x90, 0xA0, 0x91, 0xE0, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x16, \r
+0xEF, 0xB4, 0x01, 0x05, 0x90, 0xA0, 0x98, 0x80, 0x03, 0x90, 0xA0, 0x94, 0x12, 0x47, 0xCE, 0x7F, \r
+0x80, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x22, 0xE4, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xAA, 0x12, 0x6F, \r
+0x85, 0xB4, 0x02, 0x18, 0x90, 0xA2, 0x14, 0xE0, 0x64, 0x04, 0x60, 0x0B, 0x7F, 0x40, 0x11, 0x0D, \r
+0x90, 0xA2, 0x14, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x14, 0xF0, 0x22, 0x90, 0xA2, 0x33, \r
+0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, 0x9E, 0x92, 0xE0, 0xFF, 0x90, 0xA2, 0x33, 0xE0, \r
+0xFE, 0xEF, 0x4E, 0x90, 0x9E, 0x92, 0xF0, 0x22, 0x90, 0xA1, 0x61, 0xEB, 0xF0, 0x70, 0x5D, 0x90, \r
+0xA1, 0x61, 0xE0, 0xFE, 0x11, 0x8D, 0xE0, 0xFC, 0x90, 0xA1, 0x62, 0xE0, 0xFB, 0xEC, 0x6B, 0x60, \r
+0x4B, 0x90, 0xA1, 0x66, 0xEB, 0xF0, 0xA3, 0xEE, 0xF0, 0xAE, 0x05, 0xEE, 0x25, 0xE0, 0x4F, 0xFF, \r
+0x90, 0x9E, 0x91, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, 0x90, 0xA1, 0x68, 0xF0, 0x90, 0xA1, \r
+0x63, 0xE0, 0x90, 0xA1, 0x6A, 0xF0, 0x90, 0xA1, 0x64, 0x74, 0x0C, 0xF0, 0x90, 0xA1, 0x72, 0x74, \r
+0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x64, 0x12, 0x6E, 0xA2, 0x7F, 0x04, 0x11, 0x0D, 0x90, \r
+0xA1, 0x62, 0xE0, 0xFF, 0x90, 0xA1, 0x61, 0xE0, 0x11, 0x8D, 0xEF, 0xF0, 0x22, 0x24, 0x11, 0xF5, \r
+0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06, \r
+0x89, 0x90, 0xA1, 0x01, 0x12, 0x6A, 0x86, 0x90, 0xA1, 0x02, 0x12, 0x56, 0xDD, 0x90, 0xA1, 0x03, \r
+0xF0, 0x12, 0x57, 0x09, 0x90, 0xA1, 0x04, 0x12, 0x6D, 0x27, 0x90, 0xA1, 0x05, 0x12, 0x96, 0x82, \r
+0x90, 0xA0, 0x87, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x02, 0xE0, 0xB4, 0x0C, 0x06, 0xE5, 0x70, \r
+0x70, 0x11, 0x80, 0x00, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x01, 0x7D, 0x07, 0x7F, 0x30, 0x12, 0x6E, \r
+0x00, 0x8F, 0x51, 0x90, 0xA1, 0x02, 0xE0, 0xB4, 0x0D, 0x0E, 0xE5, 0x51, 0x64, 0x01, 0x60, 0x05, \r
+0x75, 0x70, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x70, 0xE5, 0x51, 0xB4, 0x01, 0x05, 0x75, 0x52, 0x01, \r
+0x80, 0x03, 0xE4, 0xF5, 0x52, 0x90, 0xA1, 0x01, 0xE0, 0xFB, 0xAD, 0x52, 0xE4, 0xFF, 0x31, 0x49, \r
+0x7F, 0x04, 0x11, 0x0D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x0C, 0x74, 0x12, 0xF0, 0x90, \r
+0xA1, 0x1A, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0x0E, 0xEF, 0x12, 0x4F, 0xBF, 0x90, 0xA1, 0x0A, 0xE0, \r
+0x90, 0xA1, 0x11, 0xF0, 0x90, 0xA1, 0x0B, 0xE0, 0x90, 0xA1, 0x12, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, \r
+0x79, 0x0C, 0x12, 0x6E, 0xA2, 0x7F, 0x04, 0x01, 0x0D, 0x90, 0xA1, 0xA7, 0x74, 0x0B, 0xF0, 0x90, \r
+0xA1, 0xB5, 0x74, 0x07, 0xF0, 0x90, 0xA1, 0xA9, 0xEF, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, 0xE0, \r
+0x90, 0xA1, 0xAA, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0xA1, 0xAB, 0xF0, 0x90, 0xFD, 0x64, 0xE0, \r
+0x90, 0xA1, 0xAC, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0xA1, 0xAD, 0xF0, 0x90, 0xFD, 0x66, 0xE0, \r
+0x90, 0xA1, 0xAE, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0xA1, 0xAF, 0xF0, 0x80, 0x0D, 0x90, 0xA1, \r
+0xAA, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0x12, 0x58, 0xA4, 0x7B, 0x01, 0x7A, 0xA1, 0x79, \r
+0xA7, 0x02, 0x6E, 0xA2, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x01, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x34, \r
+0xC1, 0xBF, 0x01, 0x06, 0x90, 0xA1, 0x01, 0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x01, \r
+0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA1, 0x01, 0xE0, 0x90, 0xA1, \r
+0x03, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x01, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, \r
+0x01, 0x08, 0x90, 0xA1, 0x01, 0xE0, 0x90, 0xA1, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x01, \r
+0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA1, 0x01, 0xE0, 0x90, 0xA1, \r
+0x05, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x01, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, \r
+0x01, 0x08, 0x90, 0xA1, 0x01, 0xE0, 0x90, 0xA1, 0x06, 0xF0, 0x90, 0xA1, 0x02, 0xE0, 0xFF, 0xA3, \r
+0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA1, 0x0A, 0xF0, 0x90, 0xA1, 0x06, 0xE0, 0x90, \r
+0xA1, 0x0B, 0xF0, 0x21, 0x19, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x9F, 0x8B, 0xF0, 0xBF, 0x01, 0x07, \r
+0x31, 0xA4, 0xE4, 0x90, 0x9F, 0x8B, 0xF0, 0x22, 0x90, 0xA1, 0x3B, 0x74, 0x08, 0xF0, 0x90, 0xA1, \r
+0x49, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x3D, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x3B, 0x02, \r
+0x6E, 0xA2, 0x90, 0xA1, 0x2B, 0xEF, 0xF0, 0x90, 0xA1, 0x2D, 0x74, 0x02, 0xF0, 0x7F, 0x01, 0x12, \r
+0x8A, 0x84, 0x90, 0xA0, 0x63, 0x12, 0x8D, 0x05, 0x30, 0xE0, 0x22, 0x90, 0xA1, 0x2B, 0xE0, 0xB4, \r
+0x02, 0x04, 0x7D, 0x07, 0x80, 0x09, 0x90, 0xA1, 0x2B, 0xE0, 0xB4, 0x05, 0x07, 0x7D, 0x0D, 0x7F, \r
+0xFF, 0x12, 0x49, 0x22, 0x12, 0x4C, 0x22, 0xBF, 0x01, 0x03, 0x12, 0x63, 0x05, 0x90, 0xA0, 0x63, \r
+0x12, 0x56, 0xE4, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x02, 0x7F, 0x01, 0x12, 0x62, 0xC3, 0x90, \r
+0xA1, 0x2B, 0xE0, 0xB4, 0x02, 0x0D, 0x90, 0xA0, 0x60, 0xE0, 0x24, 0x03, 0xFF, 0x90, 0xA0, 0x6F, \r
+0x12, 0x66, 0xE8, 0x90, 0xA0, 0x5F, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA1, 0x2C, \r
+0xF0, 0x80, 0x06, 0x90, 0xA1, 0x2C, 0x74, 0x01, 0xF0, 0x71, 0xCD, 0x20, 0xE0, 0x13, 0x90, 0xA0, \r
+0xA0, 0xE0, 0x60, 0x08, 0x90, 0xA1, 0x2D, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0x2D, \r
+0xF0, 0x90, 0xA1, 0x2D, 0xE0, 0xFF, 0x90, 0xA1, 0x2C, 0xE0, 0xFD, 0x12, 0x63, 0x84, 0xE4, 0x90, \r
+0xA0, 0x71, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xFF, 0xB4, 0x02, 0x05, 0x12, 0x67, 0x9C, 0x80, 0x09, \r
+0xEF, 0xB4, 0x05, 0x05, 0xE4, 0x90, 0xA0, 0x72, 0xF0, 0x71, 0xC4, 0x30, 0xE0, 0x17, 0x90, 0xA1, \r
+0x2B, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x08, 0x80, 0x4B, 0x90, 0xA1, 0x2B, 0xE0, 0x64, 0x05, 0x70, \r
+0x48, 0x7D, 0x0E, 0x80, 0x3F, 0x71, 0xB3, 0x30, 0xE0, 0x1E, 0x71, 0xBB, 0x20, 0xE0, 0x02, 0x71, \r
+0xA9, 0x90, 0xA1, 0x2B, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x09, 0x80, 0x28, 0x90, 0xA1, 0x2B, 0xE0, \r
+0x64, 0x05, 0x70, 0x25, 0x7D, 0x0F, 0x80, 0x1C, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x1B, 0x71, 0xA9, \r
+0x90, 0xA1, 0x2B, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x0A, 0x80, 0x09, 0x90, 0xA1, 0x2B, 0xE0, 0xB4, \r
+0x05, 0x07, 0x7D, 0x10, 0x7F, 0x6F, 0x12, 0x49, 0x22, 0x90, 0xA0, 0x62, 0xE0, 0x30, 0xE0, 0x03, \r
+0x12, 0x5C, 0x93, 0x90, 0xA0, 0x62, 0x12, 0x56, 0xE4, 0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0x97, \r
+0xC6, 0x90, 0xA0, 0x63, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x0E, 0x90, 0x06, 0xCD, 0xE0, 0x54, 0xEF, \r
+0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x90, 0x9F, 0xA9, 0xE0, 0xFF, 0xE4, 0xFD, \r
+0x02, 0x5A, 0xA1, 0x90, 0xA0, 0x5F, 0xE0, 0xC4, 0x54, 0x0F, 0x22, 0x90, 0xA0, 0x63, 0xE0, 0xC4, \r
+0x13, 0x54, 0x07, 0x22, 0x90, 0xA0, 0x5F, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x22, 0x90, 0xA0, 0x62, \r
+0xE0, 0xC4, 0x13, 0x54, 0x07, 0x22, 0x7E, 0x00, 0x7F, 0x0A, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA0, \r
+0x79, 0x87, 0x12, 0x08, 0xAA, 0x90, 0xA0, 0x73, 0x74, 0x02, 0xF0, 0x22, 0xE4, 0xFF, 0x90, 0xA0, \r
+0x5F, 0xE0, 0x30, 0xE0, 0x32, 0xA3, 0x12, 0x66, 0xE8, 0x90, 0xA0, 0x72, 0x74, 0x01, 0xF0, 0x90, \r
+0xA0, 0x71, 0xF0, 0x90, 0xA0, 0x51, 0xE0, 0x60, 0x07, 0x7D, 0x05, 0x7F, 0x6F, 0x02, 0x49, 0x22, \r
+0x12, 0x5C, 0x93, 0x90, 0xA0, 0x5F, 0x12, 0x8F, 0xB4, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x54, \r
+0x3F, 0x30, 0xE0, 0x03, 0x12, 0x6F, 0xDF, 0x22, 0x12, 0x67, 0xA3, 0x90, 0xA0, 0x7A, 0x12, 0x8F, \r
+0xB4, 0xFE, 0xEF, 0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9E, 0x40, 0x03, 0x02, 0x67, 0xB3, 0x90, 0xA0, \r
+0x7A, 0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, \r
+0x25, 0xE0, 0x4F, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x7F, 0xC2, 0x12, \r
+0x06, 0x89, 0xFF, 0x90, 0x9F, 0x9D, 0xF0, 0xBF, 0x01, 0x09, 0x12, 0x6A, 0x87, 0x64, 0x01, 0x60, \r
+0x1D, 0x80, 0x18, 0x12, 0x57, 0xE3, 0x12, 0x6A, 0x87, 0x64, 0x01, 0x60, 0x11, 0x90, 0x9F, 0x9E, \r
+0xE0, 0x20, 0xE0, 0x07, 0xE4, 0xFF, 0x12, 0x84, 0x59, 0x80, 0x03, 0x12, 0x82, 0xFC, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0x90, 0x04, 0x24, 0x91, 0xAD, 0x90, 0xA0, 0xD0, 0x12, 0x6A, 0x86, 0x25, 0x51, \r
+0x90, 0xA0, 0xDE, 0x12, 0x56, 0xDD, 0x25, 0x51, 0x90, 0xA0, 0xEC, 0xF0, 0x22, 0xE0, 0xF5, 0x51, \r
+0x12, 0x06, 0x89, 0x25, 0x51, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0xA0, 0xEF, 0xE0, \r
+0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x12, 0x56, 0xDE, 0xFF, 0x30, 0xE0, 0x1F, 0x12, 0x06, 0x89, 0x90, \r
+0xA0, 0x4B, 0x12, 0x6A, 0x86, 0x90, 0xA0, 0x4C, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, \r
+0x01, 0x4F, 0xF0, 0x12, 0x57, 0x09, 0x90, 0xA0, 0x4E, 0xF0, 0x22, 0x91, 0xF1, 0x74, 0x05, 0xF0, \r
+0x22, 0x90, 0xA0, 0x4B, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, \r
+0x1E, 0xF0, 0xA3, 0x22, 0x12, 0x06, 0x89, 0x90, 0x9F, 0xB2, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, \r
+0xA0, 0x51, 0xF0, 0x60, 0x29, 0x90, 0xA0, 0x5F, 0xE0, 0x20, 0xE0, 0x22, 0xE4, 0xFD, 0x7F, 0x04, \r
+0x12, 0x5A, 0xA1, 0xB1, 0x3F, 0x30, 0xE0, 0x16, 0x12, 0x86, 0xD3, 0x20, 0xE0, 0x10, 0xB1, 0x48, \r
+0x54, 0x3F, 0x30, 0xE0, 0x04, 0x7F, 0x0D, 0x80, 0x02, 0x7F, 0x09, 0x12, 0x62, 0xC3, 0x22, 0x90, \r
+0xA0, 0x50, 0xE0, 0xFF, 0xC3, 0x13, 0x22, 0xF0, 0x90, 0xA0, 0x50, 0xE0, 0x13, 0x13, 0x22, 0x12, \r
+0x8F, 0xC9, 0x90, 0xA0, 0x56, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0xB1, 0x71, 0x90, \r
+0x9F, 0xA3, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x90, 0xA0, 0x56, 0xE0, 0x54, 0x01, 0xFF, 0x02, 0x58, \r
+0xD3, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xB1, 0x71, 0x90, \r
+0xA0, 0x84, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x07, 0x65, \r
+0x30, 0xE0, 0x04, 0x74, 0x18, 0xF0, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0xA2, 0x17, 0x12, 0x45, 0xBE, \r
+0xE4, 0xFE, 0x90, 0xFD, 0x50, 0xEF, 0xF0, 0x64, 0x30, 0x60, 0x1E, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, \r
+0x9D, 0x50, 0x09, 0xB1, 0xEC, 0xB1, 0xE1, 0xEF, 0xF0, 0x0E, 0x80, 0xF2, 0xEE, 0xC3, 0x94, 0x06, \r
+0x50, 0x18, 0xB1, 0xE1, 0xE4, 0xF0, 0x0E, 0x80, 0xF3, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x0B, 0xB1, \r
+0xEC, 0x74, 0x51, 0xB1, 0xE3, 0xEF, 0xF0, 0x0E, 0x80, 0xEF, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, \r
+0x22, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0x22, 0x90, 0xA2, 0x17, 0x12, \r
+0x45, 0xB5, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x22, 0x90, 0xA0, 0x87, 0xE0, \r
+0x44, 0x10, 0xF0, 0x7D, 0x01, 0x7F, 0x1B, 0x12, 0x6E, 0x00, 0x90, 0xA1, 0x01, 0xEF, 0xF0, 0x22, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x88, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x01, \r
+0x7F, 0x28, 0xD1, 0x07, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x6F, 0x66, 0x90, 0xA2, 0x1A, 0xE0, \r
+0x70, 0x08, 0xD1, 0x7A, 0x90, 0xA2, 0x1A, 0x74, 0x01, 0xF0, 0x12, 0x6A, 0x73, 0x12, 0x06, 0x89, \r
+0xFF, 0xE4, 0x8F, 0x54, 0xF5, 0x53, 0xF5, 0x52, 0xF5, 0x51, 0x90, 0xA0, 0x98, 0x12, 0x45, 0x71, \r
+0xEC, 0x54, 0xC1, 0xFC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xAF, 0x54, 0xAE, 0x53, \r
+0xAD, 0x52, 0xAC, 0x51, 0x78, 0x19, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, \r
+0x00, 0x12, 0x45, 0x53, 0x90, 0xA0, 0x94, 0x02, 0x08, 0x6D, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x37, \r
+0x4E, 0x90, 0xA0, 0x98, 0x02, 0x08, 0x6D, 0x12, 0x06, 0x89, 0x90, 0xA0, 0xA0, 0x12, 0x6A, 0x86, \r
+0x90, 0xA0, 0xA1, 0xF0, 0x22, 0x12, 0x8F, 0xC9, 0x90, 0xA0, 0xAD, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, \r
+0xF0, 0xEF, 0x54, 0x06, 0xFF, 0xEE, 0x54, 0xF9, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, \r
+0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA0, 0xAD, 0x12, 0x6F, 0xAC, 0xF1, 0x79, 0x4E, \r
+0x90, 0xA0, 0xAD, 0x12, 0x6A, 0x86, 0xFF, 0x54, 0x03, 0xFE, 0x90, 0xA0, 0xAE, 0xE0, 0x54, 0xFC, \r
+0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xFF, 0x12, 0x6A, 0x86, 0xFE, \r
+0x54, 0x30, 0xFD, 0xEF, 0x54, 0xCF, 0x4D, 0xFF, 0x90, 0xA0, 0xAE, 0x12, 0x6F, 0x3B, 0x4E, 0x12, \r
+0x56, 0xDD, 0x90, 0xA0, 0xAF, 0xF0, 0x12, 0x57, 0x09, 0x90, 0xA0, 0xB0, 0x12, 0x6D, 0x27, 0x90, \r
+0xA0, 0xB1, 0xF0, 0x90, 0xA0, 0xAF, 0xF1, 0x6C, 0xEF, 0x78, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, \r
+0xD8, 0xF9, 0xFF, 0x90, 0xA0, 0xB7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA0, 0xB0, 0xF1, 0x6C, \r
+0xEF, 0x78, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA0, 0xB9, 0xEE, 0xF0, \r
+0xA3, 0xEF, 0xF0, 0x90, 0xA0, 0xB1, 0xF1, 0x6C, 0x90, 0xA0, 0xBB, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0x90, 0xA0, 0xAD, 0xE0, 0x30, 0xE0, 0x14, 0x90, 0xA0, 0xB2, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0xA3, \r
+0x12, 0x96, 0x82, 0x90, 0x07, 0x83, 0xE0, 0x44, 0x20, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0xB2, 0x12, \r
+0x58, 0xA4, 0xA3, 0xF0, 0x90, 0x07, 0x83, 0xE0, 0x54, 0xDF, 0xF0, 0x22, 0xE0, 0xFF, 0x7E, 0x00, \r
+0x7C, 0x01, 0x7D, 0x40, 0x02, 0x07, 0x03, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x22, \r
+0x12, 0x06, 0x89, 0x54, 0x01, 0x25, 0xE0, 0x12, 0x97, 0x75, 0x54, 0xFB, 0x4F, 0xF0, 0xE0, 0x13, \r
+0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0x80, 0x12, 0x90, 0xA0, 0xA7, 0xE0, 0x20, 0xE0, 0x02, 0xF1, \r
+0xA2, 0x22, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x22, 0x90, 0x07, 0x65, 0xE0, 0x44, 0x18, \r
+0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0xA0, 0xBF, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, \r
+0x30, 0xE0, 0x55, 0x90, 0x00, 0x40, 0xE0, 0x54, 0xBF, 0x44, 0xA0, 0xFD, 0x7F, 0x40, 0x12, 0x46, \r
+0xA0, 0x90, 0x00, 0x41, 0xE0, 0x44, 0x04, 0xFD, 0x7F, 0x41, 0x12, 0x46, 0xA0, 0x90, 0x00, 0x6A, \r
+0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x6A, 0x12, 0x46, 0xA0, 0x90, 0x07, 0x6E, 0x74, 0x55, 0xF0, 0xA3, \r
+0x74, 0x12, 0xF0, 0x90, 0x07, 0x78, 0xE0, 0x54, 0xF2, 0x44, 0x02, 0xF0, 0x90, 0x06, 0xCC, 0xE0, \r
+0x44, 0x03, 0xF0, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xF5, 0xF0, 0x90, 0x05, 0x23, 0xE0, 0x54, 0x7F, \r
+0xF0, 0xE4, 0xFD, 0x7F, 0x66, 0x12, 0x46, 0xA0, 0x22, 0xE4, 0x90, 0x9F, 0x87, 0xF0, 0xA3, 0xF0, \r
+0x90, 0x9E, 0xEF, 0xF0, 0xA3, 0xF0, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0x11, 0x78, 0xE4, \r
+0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xF3, 0x74, 0x00, 0x2D, 0x11, 0x78, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, \r
+0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0x22, \r
+0x90, 0xA1, 0xFC, 0xEF, 0xF0, 0xA3, 0x12, 0x45, 0xBE, 0x90, 0xA2, 0x1C, 0xE0, 0xFE, 0x04, 0xF0, \r
+0x90, 0x00, 0x01, 0xEE, 0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, \r
+0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0xA1, 0xFD, 0x12, 0x45, 0xB5, 0x8B, 0x40, 0x8A, \r
+0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, \r
+0xA1, 0xFC, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, \r
+0xC0, 0x01, 0xA3, 0x12, 0x45, 0xB5, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, \r
+0x89, 0x42, 0x90, 0xA1, 0xFD, 0x12, 0x97, 0x8E, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, \r
+0x02, 0x35, 0x26, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x9F, 0x88, 0xE0, \r
+0xFE, 0x90, 0x9F, 0x87, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, \r
+0x64, 0x01, 0x60, 0x40, 0xED, 0x31, 0x59, 0xFA, 0x7B, 0x01, 0x12, 0x97, 0x00, 0x7F, 0x01, 0xEF, \r
+0x60, 0x32, 0x90, 0x9F, 0x87, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, \r
+0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9F, 0x87, 0xF0, 0x90, 0x9F, 0x88, 0xE0, 0xFF, 0x90, 0x9F, 0x87, \r
+0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x07, 0x90, 0x9E, 0x92, \r
+0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF1, 0xF9, \r
+0x74, 0x9E, 0x35, 0xF0, 0x22, 0x90, 0xA2, 0x1D, 0x12, 0x45, 0xBE, 0xE4, 0xFF, 0x90, 0xA2, 0x1D, \r
+0x12, 0x45, 0xB5, 0x8F, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0x31, \r
+0x89, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x10, 0xE5, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, \r
+0x22, 0x90, 0x00, 0xF1, 0xE0, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFF, 0x22, 0x75, 0x15, 0x12, 0xE4, \r
+0xF5, 0x16, 0x75, 0x17, 0x07, 0x75, 0x18, 0x32, 0x90, 0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, \r
+0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5, 0x18, 0xF0, 0x22, 0x75, 0x1D, 0x06, 0x75, 0x1E, \r
+0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x43, 0x20, 0x80, 0x43, 0x1F, 0x04, 0x90, 0x01, 0x38, \r
+0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0, 0xA3, 0xE5, 0x20, 0xF0, 0x22, \r
+0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x7D, 0x02, 0x90, \r
+0x01, 0xC4, 0x74, 0xED, 0xF0, 0x74, 0xA1, 0xA3, 0xF0, 0x90, 0xA0, 0xC0, 0xE0, 0xFF, 0xED, 0xC3, \r
+0x9F, 0x50, 0x10, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, \r
+0x0D, 0x80, 0xE6, 0x74, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xA1, 0xA3, 0xF0, 0x7F, 0x01, \r
+0x22, 0xE4, 0x90, 0x9E, 0x92, 0x12, 0x58, 0xA4, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x1F, \r
+0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, \r
+0x16, 0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, \r
+0x01, 0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, \r
+0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, \r
+0xA3, 0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, \r
+0x21, 0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, \r
+0xDF, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0xA1, 0x1B, 0xF0, 0xE0, 0xFF, 0x30, 0xE0, 0x07, 0x90, \r
+0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x23, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xDF, \r
+0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x12, 0x58, 0x7E, 0x90, \r
+0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x46, 0xA0, 0x80, 0xFE, 0x22, 0x90, 0x9F, \r
+0x9E, 0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x9F, 0x9E, 0xE0, 0xFF, \r
+0x30, 0xE0, 0x04, 0x51, 0xFD, 0x60, 0x15, 0x90, 0x9F, 0xA7, 0xE0, 0x70, 0x04, 0xEF, 0x30, 0xE0, \r
+0x0B, 0x90, 0x9F, 0xAA, 0xE0, 0x64, 0x02, 0x60, 0x03, 0x12, 0x86, 0xFF, 0x22, 0x90, 0x9F, 0xA2, \r
+0xE0, 0x64, 0x02, 0x22, 0x12, 0x6F, 0xA1, 0x30, 0xE0, 0x0B, 0x51, 0xFD, 0x60, 0x07, 0x7D, 0x01, \r
+0x7F, 0x02, 0x12, 0x5A, 0xA1, 0x51, 0xFD, 0x60, 0x02, 0x71, 0x1C, 0x22, 0x90, 0x9F, 0xA7, 0xE0, \r
+0x64, 0x02, 0x60, 0x10, 0x12, 0x69, 0x3A, 0x60, 0x0B, 0x71, 0x35, 0xEF, 0x70, 0x06, 0xFD, 0x7F, \r
+0x0C, 0x12, 0x5A, 0xA1, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, \r
+0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x71, 0x35, \r
+0xEF, 0x70, 0x03, 0x12, 0x5E, 0x6F, 0x22, 0x90, 0x9F, 0x9E, 0xE0, 0xFF, 0x30, 0xE0, 0x3E, 0x90, \r
+0x9F, 0xA2, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0x9F, 0xA1, 0xE0, 0x7D, 0x00, \r
+0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x24, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x03, 0x02, \r
+0x82, 0xFC, 0x71, 0x04, 0x90, 0x9F, 0xA2, 0xE0, 0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F, 0x0C, 0x80, \r
+0x09, 0x90, 0x9F, 0xA2, 0xE0, 0x70, 0x06, 0xFD, 0x7F, 0x04, 0x12, 0x5A, 0xA1, 0x22, 0x90, 0xA0, \r
+0x5F, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0xA0, 0x71, 0xE0, 0x70, 0x5F, 0x90, 0x9F, 0xA9, 0xE0, 0xD3, \r
+0x94, 0x00, 0x50, 0x56, 0x90, 0xA0, 0x51, 0xE0, 0x60, 0x4D, 0x80, 0x4E, 0x71, 0x35, 0xEF, 0x64, \r
+0x01, 0x70, 0x47, 0x90, 0x9F, 0xAB, 0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3E, 0x90, 0x9F, 0xA9, 0xE0, \r
+0xFE, 0xE4, 0xC3, 0x9E, 0x40, 0x34, 0xEF, 0x20, 0xE2, 0x30, 0x90, 0x9F, 0xAB, 0xE0, 0x20, 0xE4, \r
+0x29, 0x90, 0x9F, 0xA4, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1E, 0x90, 0xA0, 0x51, 0xE0, \r
+0x70, 0x18, 0x90, 0x06, 0x62, 0xE0, 0x20, 0xE1, 0x11, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, 0x07, \r
+0xE0, 0x54, 0xFC, 0x64, 0x80, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xE4, 0xFF, 0x12, \r
+0x5F, 0x2F, 0xBF, 0x01, 0x13, 0x90, 0x9F, 0xA7, 0xE0, 0x60, 0x0D, 0x12, 0x69, 0x3A, 0x64, 0x02, \r
+0x60, 0x03, 0x02, 0x6F, 0xDF, 0x12, 0x5F, 0xB7, 0x22, 0x90, 0x9F, 0x9E, 0xE0, 0xFF, 0x30, 0xE0, \r
+0x40, 0x90, 0x9F, 0xA2, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0x9F, 0xA1, 0xE0, \r
+0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x26, 0xEF, 0xC3, 0x13, 0x30, 0xE0, \r
+0x03, 0x02, 0x82, 0xFC, 0x12, 0x8E, 0xDF, 0x90, 0x9F, 0xA2, 0xE0, 0xB4, 0x0C, 0x06, 0xE4, 0xFD, \r
+0x7F, 0x08, 0x80, 0x0A, 0x90, 0x9F, 0xA2, 0xE0, 0xB4, 0x04, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x5A, \r
+0xA1, 0x22, 0x90, 0x9F, 0xA3, 0xE0, 0xFF, 0x12, 0x56, 0xE5, 0x30, 0xE0, 0x1B, 0xEF, 0x54, 0x7F, \r
+0xB1, 0x05, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, \r
+0x9F, 0xA7, 0xE0, 0x60, 0x03, 0x12, 0x68, 0x44, 0x90, 0xA0, 0x63, 0x12, 0x6F, 0xA4, 0x30, 0xE0, \r
+0x22, 0x90, 0xA0, 0x66, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x18, 0xEF, 0x54, 0xFD, 0xF0, 0x90, \r
+0x04, 0xE0, 0xE0, 0x90, 0xA0, 0x66, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x04, 0xE0, \r
+0x54, 0xFB, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x30, 0xE1, 0x02, 0x91, 0xCD, 0x22, 0x90, 0xA0, 0xC1, \r
+0xE0, 0x30, 0xE0, 0x22, 0x91, 0xF7, 0xE0, 0xFE, 0x30, 0xE0, 0x1B, 0x75, 0xF0, 0x0E, 0xEF, 0x91, \r
+0xFF, 0xEE, 0x54, 0xFE, 0xF0, 0x90, 0xA0, 0xC3, 0x74, 0x05, 0xF0, 0x12, 0x4A, 0x4C, 0x54, 0x07, \r
+0xFD, 0x7F, 0x01, 0x12, 0x49, 0xA5, 0x22, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0E, 0x90, \r
+0xA0, 0xCC, 0x02, 0x45, 0xA9, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x9F, 0xA4, 0x22, 0xE4, 0x90, \r
+0xA1, 0x2C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x47, 0xAF, 0x90, 0xA1, 0x2C, 0xEF, \r
+0xF0, 0x7F, 0x83, 0x12, 0x47, 0xAF, 0xAE, 0x07, 0x90, 0xA1, 0x2C, 0xE0, 0xFF, 0xB5, 0x06, 0x01, \r
+0x22, 0xC3, 0x90, 0xA1, 0x2E, 0xE0, 0x94, 0x64, 0x90, 0xA1, 0x2D, 0xE0, 0x94, 0x00, 0x40, 0x0D, \r
+0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x2C, 0xE0, 0xFF, 0x22, 0x90, 0xA1, 0x2D, \r
+0x12, 0x96, 0x39, 0x80, 0xC2, 0x90, 0x01, 0xC4, 0x74, 0x55, 0xF0, 0x74, 0xA5, 0xA3, 0xF0, 0x7F, \r
+0x90, 0x12, 0x47, 0xAF, 0xEF, 0x20, 0xE0, 0xF7, 0x74, 0x55, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, \r
+0xA5, 0xA3, 0xF0, 0x22, 0xE4, 0xF5, 0x5E, 0xB1, 0xA8, 0xE0, 0xFE, 0xB4, 0x02, 0x08, 0xED, 0xC3, \r
+0x94, 0x11, 0x40, 0x21, 0x80, 0x17, 0xEE, 0xB4, 0x01, 0x08, 0xED, 0xC3, 0x94, 0x0A, 0x40, 0x15, \r
+0x80, 0x0B, 0xB1, 0xA8, 0xE0, 0x70, 0x0B, 0xED, 0xC3, 0x94, 0x03, 0x40, 0x08, 0x75, 0x5E, 0x01, \r
+0x80, 0x03, 0xE4, 0xF5, 0x5E, 0xAF, 0x5E, 0x22, 0x74, 0x91, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, \r
+0xF5, 0x83, 0x22, 0x8F, 0x52, 0x8D, 0x53, 0x8B, 0x54, 0x75, 0xF0, 0x04, 0xEF, 0x12, 0x51, 0x19, \r
+0xC4, 0x54, 0x03, 0x90, 0xA1, 0x06, 0xF0, 0x90, 0xA1, 0x04, 0x60, 0x09, 0x74, 0x32, 0xF0, 0xA3, \r
+0x74, 0x2F, 0xF0, 0x80, 0x07, 0x74, 0x11, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xE5, 0x53, 0xD3, 0x94, \r
+0x2D, 0x40, 0x0A, 0x75, 0xF0, 0x04, 0xE5, 0x52, 0x12, 0x57, 0xEF, 0x80, 0x20, 0xE5, 0x53, 0xD3, \r
+0x94, 0x1E, 0x40, 0x05, 0x90, 0xA1, 0x04, 0x80, 0x14, 0xE5, 0x53, 0xD3, 0x94, 0x14, 0x40, 0x05, \r
+0x90, 0xA1, 0x05, 0x80, 0x08, 0x75, 0xF0, 0x04, 0xE5, 0x52, 0x12, 0x56, 0xF1, 0xE0, 0xFD, 0x85, \r
+0x54, 0x6A, 0xE4, 0xFB, 0xAF, 0x52, 0x02, 0x77, 0x89, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0x90, 0xA1, 0x74, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0xA1, 0x73, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, \r
+0xFD, 0x12, 0x3E, 0x02, 0x90, 0xA1, 0x7E, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x76, 0x12, 0x45, 0x71, \r
+0x12, 0x08, 0x3A, 0x90, 0xA1, 0x7E, 0x12, 0x4F, 0xF0, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, \r
+0x07, 0x90, 0xA1, 0x76, 0x12, 0x45, 0x71, 0x90, 0xA1, 0x7A, 0x12, 0x4F, 0xF0, 0xD0, 0x03, 0xD0, \r
+0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53, 0x90, 0xA1, 0x82, 0x12, 0x08, 0x6D, 0x90, 0xA1, \r
+0x74, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0xA1, 0x82, 0x12, 0x45, 0x71, 0x90, 0xAA, 0x96, 0x12, \r
+0x08, 0x6D, 0x90, 0xA1, 0x73, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, 0x09, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x08, 0xEF, 0xF0, 0xED, 0x64, 0x01, \r
+0x70, 0x2E, 0xEB, 0xB4, 0x01, 0x07, 0xE0, 0x24, 0x02, 0xF5, 0x72, 0x80, 0x08, 0x90, 0xA2, 0x08, \r
+0xE0, 0x24, 0xFE, 0xF5, 0x72, 0x90, 0xA1, 0x76, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, \r
+0x72, 0xF1, 0x02, 0xD1, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x72, 0x80, 0x1F, \r
+0x90, 0xA1, 0x76, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA2, 0x08, 0xE0, 0xFF, 0xF1, \r
+0x02, 0xD1, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA2, 0x08, 0xE0, 0xFF, 0xF1, \r
+0x02, 0x7F, 0x01, 0xD1, 0x19, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0xD1, 0x19, 0x90, 0xA1, \r
+0x76, 0x22, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA1, 0x7A, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, \r
+0x22, 0x7E, 0x00, 0x7F, 0x2D, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xC1, 0x02, 0x08, 0xAA, \r
+0xC3, 0xEF, 0x9D, 0xF5, 0x56, 0xC3, 0x94, 0x08, 0x50, 0x1C, 0xE4, 0xF5, 0x57, 0xF1, 0x87, 0xC0, \r
+0x83, 0xC0, 0x82, 0x90, 0xA1, 0x05, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, \r
+0xA9, 0xE5, 0x56, 0xF0, 0x80, 0x3E, 0xE5, 0x56, 0xC3, 0x94, 0x10, 0x50, 0x09, 0x75, 0x57, 0x01, \r
+0xE5, 0x56, 0x24, 0xF8, 0x80, 0x17, 0xE5, 0x56, 0xC3, 0x94, 0x18, 0x50, 0x09, 0x75, 0x57, 0x02, \r
+0xE5, 0x56, 0x24, 0xF0, 0x80, 0x07, 0x75, 0x57, 0x03, 0xE5, 0x56, 0x24, 0xE8, 0xFF, 0xF1, 0x87, \r
+0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA1, 0x05, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, \r
+0x45, 0xA9, 0xEF, 0xF0, 0xAF, 0x57, 0x22, 0x75, 0xF0, 0x0E, 0xEB, 0x90, 0xA0, 0xC8, 0x02, 0x45, \r
+0xA9, 0xAF, 0x54, 0xF1, 0x20, 0x90, 0xA1, 0x01, 0xEF, 0xF0, 0x22, 0x8F, 0x54, 0x8D, 0x55, 0xAE, \r
+0x03, 0x74, 0x1F, 0xC3, 0x95, 0x54, 0x40, 0x0B, 0x12, 0xA8, 0x01, 0xE4, 0xFD, 0xF1, 0x93, 0x24, \r
+0xD4, 0x80, 0x34, 0x74, 0x3F, 0xC3, 0x95, 0x54, 0x40, 0x0B, 0x12, 0xA8, 0x01, 0x7D, 0x20, 0xF1, \r
+0x91, 0x24, 0x88, 0x80, 0x22, 0x74, 0x5F, 0xC3, 0x95, 0x54, 0x40, 0x0B, 0x12, 0xA8, 0x01, 0x7D, \r
+0x40, 0xF1, 0x91, 0x24, 0xD0, 0x80, 0x10, 0x74, 0x7F, 0xC3, 0x95, 0x54, 0x40, 0x22, 0x12, 0xA8, \r
+0x01, 0x7D, 0x60, 0xF1, 0x91, 0x24, 0x84, 0xFD, 0xE4, 0x34, 0x04, 0xFC, 0x75, 0xF0, 0x0E, 0xE5, \r
+0x55, 0x12, 0xA8, 0x0C, 0x75, 0xF0, 0x03, 0xEE, 0x12, 0x45, 0xA9, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, \r
+0x22, 0x90, 0xA1, 0x05, 0xEE, 0xF0, 0xAB, 0x55, 0x22, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0xC6, 0x02, \r
+0x45, 0xA9, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x37, 0x4E, \r
+0x90, 0xA0, 0xF4, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0x90, 0xA0, 0xF8, \r
+0x12, 0x08, 0x6D, 0x90, 0xA0, 0xF4, 0x11, 0x7F, 0x60, 0x18, 0x90, 0xA0, 0xF4, 0x11, 0x76, 0x90, \r
+0xA0, 0xF4, 0x12, 0x08, 0x6D, 0x90, 0xA0, 0xF4, 0x12, 0x47, 0xCE, 0x7F, 0x00, 0x7E, 0x08, 0x12, \r
+0x38, 0x45, 0x90, 0xA0, 0xF8, 0x11, 0x7F, 0x60, 0x18, 0x90, 0xA0, 0xF8, 0x11, 0x76, 0x90, 0xA0, \r
+0xF8, 0x12, 0x08, 0x6D, 0x90, 0xA0, 0xF8, 0x12, 0x47, 0xCE, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x38, \r
+0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x45, 0x71, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x22, 0x12, \r
+0x45, 0x71, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x22, 0x7E, 0x00, 0x7F, 0x01, \r
+0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0x9E, 0x12, 0x08, 0xAA, 0x90, 0x9F, 0x9E, 0xE0, 0x54, \r
+0xFD, 0xF0, 0xE4, 0x12, 0x58, 0xA5, 0xA3, 0x74, 0x0C, 0xF0, 0x22, 0x7D, 0x22, 0x7F, 0xFF, 0x12, \r
+0x49, 0x22, 0x12, 0x5F, 0xD6, 0x02, 0x85, 0x7F, 0x12, 0x5F, 0xD6, 0x7D, 0x23, 0x12, 0x63, 0x00, \r
+0x02, 0x67, 0xE3, 0xAE, 0x07, 0x12, 0x82, 0xF0, 0xBF, 0x01, 0x13, 0x90, 0x9F, 0x9E, 0x12, 0x4F, \r
+0xD3, 0x20, 0xE0, 0x0A, 0xAF, 0x06, 0x7D, 0x01, 0x12, 0x5A, 0xA1, 0x7F, 0x01, 0x22, 0x7F, 0x00, \r
+0x22, 0x31, 0x1F, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, \r
+0x74, 0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0x31, 0x18, 0x90, 0xA0, 0x4D, 0xE0, 0xC3, 0x13, \r
+0x54, 0x7F, 0x90, 0xA1, 0xDA, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x48, 0x34, \r
+0x90, 0x9F, 0xA3, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xF0, 0xE4, 0x90, 0xA1, 0xD9, 0xF0, 0x22, 0x90, \r
+0x9F, 0xA3, 0xE0, 0x13, 0x13, 0x13, 0x22, 0x90, 0x9F, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, \r
+0x9F, 0xB0, 0xF0, 0xA3, 0xF0, 0x90, 0x9F, 0xAB, 0xF0, 0x90, 0x9F, 0xA4, 0xE0, 0x54, 0xF7, 0xF0, \r
+0x54, 0xBF, 0x12, 0x5C, 0xC6, 0x7D, 0x10, 0x7F, 0x03, 0x02, 0x88, 0xAD, 0xEF, 0x24, 0xFE, 0x60, \r
+0x0B, 0x04, 0x70, 0x24, 0x90, 0x9F, 0xAD, 0x74, 0x02, 0xF0, 0x80, 0x13, 0xED, 0x70, 0x06, 0x90, \r
+0xA0, 0x4E, 0xE0, 0x80, 0x02, 0xED, 0x14, 0x90, 0x9F, 0xAD, 0xF0, 0x90, 0x9F, 0xAD, 0xE0, 0xA3, \r
+0xF0, 0x90, 0x9F, 0xA4, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0xA0, 0x52, 0xE0, 0xC3, 0x13, 0x20, \r
+0xE0, 0x13, 0x90, 0x02, 0x87, 0xE0, 0x70, 0x17, 0x90, 0x02, 0x96, 0xE0, 0x70, 0x11, 0x90, 0x02, \r
+0x86, 0xE0, 0x30, 0xE1, 0x0A, 0x90, 0xA0, 0xA7, 0xE0, 0x20, 0xE0, 0x03, 0x7F, 0x01, 0x22, 0x7F, \r
+0x00, 0x22, 0x7D, 0x2E, 0x7F, 0x6F, 0x12, 0x49, 0x22, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x5A, 0x1E, \r
+0x31, 0xB9, 0x90, 0x9F, 0xA2, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, \r
+0x22, 0x90, 0xA1, 0xE8, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, \r
+0xAC, 0x07, 0x51, 0x32, 0xE0, 0x44, 0x01, 0xF0, 0x51, 0x32, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, \r
+0x74, 0x12, 0x2C, 0x12, 0x4F, 0x9E, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0x51, 0x3D, 0xE0, \r
+0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
+0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, \r
+0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0x51, 0x2A, 0xE0, 0x54, 0xC0, \r
+0x4D, 0xFD, 0x74, 0x14, 0x2F, 0x51, 0x2A, 0xED, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
+0x83, 0x22, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFC, 0xF5, 0x83, 0x22, 0x90, 0xA1, 0xE6, 0xE0, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x90, 0xA2, 0x3B, 0xEF, 0xF0, 0x90, 0x9E, 0x9A, 0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, \r
+0x70, 0x3E, 0x90, 0x9F, 0xAA, 0xE0, 0x64, 0x0E, 0x70, 0x15, 0x90, 0xA2, 0x3B, 0xE0, 0x70, 0x30, \r
+0x90, 0x9F, 0xA3, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0x12, 0x5A, 0x16, 0x80, 0x1E, 0x90, \r
+0x9F, 0xAA, 0xE0, 0x64, 0x06, 0x70, 0x19, 0x90, 0xA2, 0x3B, 0xE0, 0x60, 0x13, 0x90, 0x9F, 0xA3, \r
+0xE0, 0x54, 0xBF, 0xF0, 0x51, 0xA5, 0xF0, 0x90, 0x9F, 0xAA, 0x74, 0x04, 0xF0, 0x12, 0x5C, 0x93, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0x22, \r
+0x90, 0x9E, 0x9D, 0xE0, 0xFF, 0xE4, 0xFB, 0x7D, 0x01, 0x12, 0x4D, 0x59, 0x90, 0xA1, 0xED, 0xEE, \r
+0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xEB, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0xAB, 0x07, 0x90, 0xA2, 0x3C, 0xED, 0xF0, 0xEC, 0xF9, 0xE0, 0xFF, 0xAE, 0x03, \r
+0x74, 0x2A, 0x2E, 0x51, 0xEF, 0x12, 0x4F, 0x8F, 0xE9, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, \r
+0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0xE5, 0x53, 0x25, \r
+0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x22, 0x90, 0x9E, 0x9B, 0xE0, 0xFF, \r
+0x7B, 0x08, 0x7D, 0x01, 0x12, 0x4D, 0x59, 0x90, 0xA2, 0x11, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, \r
+0xFD, 0x90, 0xA2, 0x10, 0xE0, 0xFF, 0x22, 0x7F, 0xA3, 0x12, 0x47, 0xAF, 0xEF, 0x54, 0xF8, 0x44, \r
+0x05, 0xFD, 0x7F, 0xA3, 0x12, 0x46, 0xA0, 0x7F, 0xA0, 0x12, 0x47, 0xAF, 0xEF, 0x54, 0x0F, 0x64, \r
+0x04, 0x22, 0x90, 0xA2, 0x36, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, \r
+0x22, 0x74, 0x11, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0x22, 0x12, 0x64, 0xAA, \r
+0x12, 0x5F, 0x92, 0x90, 0x9F, 0xA3, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, \r
+0x22, 0x74, 0x91, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x22, 0x7F, 0x2C, 0x7E, \r
+0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0x22, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, \r
+0x25, 0x55, 0xF5, 0x55, 0xEE, 0x35, 0x54, 0xF5, 0x54, 0x22, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x91, \r
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE4, 0x22, 0xF0, 0x90, 0x9F, 0xDD, 0xE0, 0x24, \r
+0x04, 0x90, 0x9F, 0xBF, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x22, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, \r
+0x12, 0x07, 0xAB, 0xAE, 0xF0, 0xA8, 0x59, 0x08, 0x22, 0xFD, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0xC4, \r
+0x02, 0x45, 0xA9, 0x7E, 0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0x52, 0x22, \r
+0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x22, 0x90, 0x9F, 0xA4, 0xE0, 0x44, 0x04, \r
+0xF0, 0x22, 0x12, 0x45, 0xA9, 0xE0, 0xFC, 0xA3, 0xE0, 0xF5, 0x82, 0x8C, 0x83, 0x22, 0x90, 0xA2, \r
+0x04, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0x22, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, \r
+0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0x74, 0x91, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, \r
+0x83, 0x22, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF0, 0x90, \r
+0x9F, 0xB3, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0xFF, 0xEE, 0x54, 0x3F, 0x90, 0x9F, 0xE2, \r
+0xF0, 0xA3, 0xEF, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE5, 0x5F, 0xF0, 0x22, 0x90, \r
+0x00, 0x08, 0x02, 0x07, 0xAB, 0xFE, 0x54, 0x03, 0xFF, 0xEE, 0x13, 0x13, 0x54, 0x07, 0x22, 0x90, \r
+0xA0, 0xC1, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x07, 0x22, 0x90, 0xA2, 0x0F, 0xE0, 0xFF, 0x90, 0xA2, \r
+0x0D, 0xE0, 0x22, 0xD3, 0xE5, 0x57, 0x94, 0xE8, 0xE5, 0x56, 0x94, 0x03, 0x22, 0xFF, 0xEE, 0x55, \r
+0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x22, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, \r
+0x22, 0x7F, 0x16, 0x12, 0x47, 0xAF, 0xEF, 0x54, 0x0F, 0x22, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, \r
+0xF8, 0xF0, 0x22, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0x22, 0xE5, 0x6C, 0x75, 0xF0, \r
+0x08, 0xA4, 0x25, 0x6B, 0x22, 0xFF, 0x90, 0xA2, 0x06, 0xE0, 0xFB, 0xEF, 0x5B, 0x22, 0x90, 0xA0, \r
+0x65, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x22, 0x90, 0x9F, 0x9E, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x22, \r
+0x90, 0xA1, 0xF7, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x22, 0xFF, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFD, \r
+0x22, 0xC4, 0x54, 0x0F, 0x90, 0xA2, 0x0B, 0xF0, 0x22, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x6B, 0x08, \r
+0x22, 0xE5, 0x57, 0xAE, 0x56, 0xA8, 0x59, 0x08, 0x22, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, \r
+0x22, 0x54, 0x03, 0x4F, 0xFF, 0x75, 0xF0, 0x10, 0x22, 0x90, 0xA0, 0xAD, 0xE0, 0x13, 0x13, 0x13, \r
+0x22, 0x90, 0xA1, 0xC5, 0x12, 0x45, 0x71, 0xEF, 0x22, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x80, 0xFF, \r
+0x22, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0x22, 0x12, 0x47, 0xAF, 0xEF, 0x44, 0x40, 0xFD, \r
+0x22, 0x00, 0x36, 0x6E \r
 };\r
-u4Byte ArrayLength_MP_8723B_FW_NIC = 27324;\r
+u4Byte ArrayLength_MP_8723B_FW_NIC = 28004;\r
 \r
 \r
 \r
@@ -3334,16 +3377,16 @@ ODM_ReadFirmware_MP_8723B_FW_NIC(
        *pFirmwareSize = ArrayLength_MP_8723B_FW_NIC;\r
 }\r
 \r
-// v29 20140605 by Isaachsu <isaachsu@realtek.com>\r
+// v31.00 20140813 by Isaachsu <isaachsu@realtek.com>\r
 u1Byte Array_MP_8723B_FW_WoWLAN[] = {\r
-0x01, 0x53, 0x30, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x06, 0x05, 0x10, 0x59, 0x5A, 0x60, 0x00, 0x00, \r
-0xF8, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x02, 0x48, 0x94, 0x02, 0x67, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x68, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x68, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x01, 0x53, 0x30, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x08, 0x13, 0x23, 0x38, 0xAA, 0x61, 0x00, 0x00, \r
+0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x02, 0x48, 0x94, 0x02, 0x70, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x02, 0x70, 0xB7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x02, 0x70, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x68, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x77, 0xEF, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x02, 0x70, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x77, 0xFC, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x02, 0x7F, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
@@ -3483,1405 +3526,1426 @@ u1Byte Array_MP_8723B_FW_WoWLAN[] = {
 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, \r
 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, \r
 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, \r
-0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x41, 0x95, 0x7B, 0x00, 0x41, 0x95, 0x7C, 0x00, 0x41, \r
-0x95, 0x8E, 0x00, 0x41, 0x94, 0xD0, 0x00, 0x41, 0x94, 0xB2, 0x00, 0x44, 0x95, 0x6E, 0x00, 0x50, \r
-0xF2, 0x01, 0x00, 0x4B, 0xF0, 0x58, 0x47, 0x60, 0x24, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x56, 0xEF, 0xF0, 0x90, \r
-0x95, 0x58, 0xEB, 0xF0, 0xED, 0x60, 0x02, 0x41, 0x14, 0x90, 0x07, 0x6E, 0xE0, 0x44, 0x08, 0xF0, \r
-0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x90, 0x95, 0x58, 0xE0, 0x70, 0x4B, 0xF1, 0x49, 0x70, \r
-0x41, 0x90, 0x95, 0x59, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x70, 0x19, 0x12, 0x37, 0x4E, 0xE4, 0xFF, \r
-0x74, 0x02, 0x71, 0x8F, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x64, 0x51, 0x84, 0xEF, \r
-0x54, 0xFE, 0x80, 0x19, 0x12, 0x37, 0x4E, 0xE4, 0xFE, 0x74, 0x80, 0xFF, 0xE4, 0x71, 0x90, 0x7F, \r
-0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x64, 0x51, 0x84, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x64, \r
-0x31, 0x39, 0x7F, 0x4E, 0xF1, 0xD9, 0x41, 0x76, 0xF1, 0x49, 0x70, 0x0D, 0x12, 0x9F, 0x36, 0xFF, \r
-0x71, 0x8F, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x4E, 0x51, 0x84, 0xEF, 0x54, 0x7F, \r
-0xF1, 0x3E, 0x44, 0x01, 0xFD, 0x7F, 0x4F, 0x31, 0x39, 0x7F, 0x30, 0x12, 0x9F, 0x38, 0x74, 0x66, \r
-0xFF, 0x71, 0x90, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x37, \r
-0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0xEF, 0x44, 0x01, 0xFF, 0x71, 0x90, 0x7F, 0x2C, 0x7E, 0x09, 0x12, \r
-0x38, 0x45, 0x80, 0x6B, 0x90, 0x07, 0x6E, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x07, 0x65, 0xE0, 0x44, \r
-0x18, 0xF0, 0x90, 0x95, 0x56, 0xE0, 0x70, 0x47, 0x90, 0x95, 0x58, 0xE0, 0x60, 0x12, 0x7F, 0x67, \r
-0x51, 0x84, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x31, 0x39, 0x12, 0x9F, 0x36, 0xFF, 0x80, 0x26, \r
-0x7F, 0x67, 0x51, 0x84, 0xEF, 0x54, 0xDF, 0xFD, 0x7F, 0x67, 0x31, 0x39, 0x90, 0x95, 0x59, 0xE0, \r
-0x7F, 0x48, 0x7E, 0x09, 0x70, 0x0B, 0x12, 0x37, 0x4E, 0xE4, 0x74, 0x80, 0xFF, 0x74, 0x02, 0x80, \r
-0x05, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0x71, 0x8F, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, \r
-0x4E, 0x51, 0x84, 0xEF, 0x54, 0x7F, 0xF1, 0x3E, 0x54, 0xFE, 0xFD, 0x7F, 0x4F, 0x31, 0x39, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, \r
-0xE0, 0x90, 0x95, 0x89, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x95, 0x89, 0xE0, \r
-0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x84, \r
-0xED, 0xF0, 0x90, 0x95, 0x83, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x42, 0x7F, 0x47, 0x71, 0x4D, \r
-0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x47, 0x31, 0x39, 0x7F, 0x46, 0x71, \r
-0x4D, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x46, 0x12, 0xA0, 0x47, 0x60, 0x0D, \r
-0x7F, 0x45, 0x71, 0x4D, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x0C, 0x7F, 0x45, 0x71, \r
-0x4D, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x45, 0x80, 0x46, 0x90, 0x95, \r
-0x83, 0xE0, 0x24, 0xF8, 0xF0, 0x7F, 0x63, 0x71, 0x4D, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, \r
-0x5F, 0xFD, 0x7F, 0x63, 0x31, 0x39, 0x7F, 0x62, 0x71, 0x4D, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, \r
-0x4F, 0xFD, 0x7F, 0x62, 0x12, 0xA0, 0x47, 0x60, 0x0E, 0x71, 0x4B, 0x80, 0x02, 0xC3, 0x33, 0xD8, \r
-0xFC, 0x4F, 0xFD, 0x7F, 0x61, 0x80, 0x0D, 0x71, 0x4B, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, \r
-0x5F, 0xFD, 0x7F, 0x61, 0x31, 0x39, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x61, 0x51, 0x84, 0x90, \r
-0x95, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x12, 0x9E, 0xC4, 0x7D, 0x01, 0x31, 0x53, 0x12, 0x57, 0xFC, 0x71, 0xAA, 0x71, 0x97, 0x71, \r
-0x97, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x31, 0x39, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, \r
-0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xFE, \r
-0xEC, 0x90, 0xAA, 0xB9, 0x02, 0x08, 0x6D, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x31, 0x39, 0x7F, 0x02, \r
-0x51, 0x84, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x31, 0x39, 0x7F, 0x02, 0x51, 0x84, 0xEF, 0x22, \r
-0x7F, 0x54, 0x51, 0x84, 0xE5, 0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, 0x51, 0x84, 0xE5, 0x0E, 0x5F, \r
-0xF5, 0x12, 0x7F, 0x56, 0x51, 0x84, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0x51, 0x84, 0xE5, \r
-0x10, 0x5F, 0xF5, 0x14, 0xAD, 0x11, 0x7F, 0x54, 0x31, 0x39, 0xAD, 0x12, 0x7F, 0x55, 0x31, 0x39, \r
-0xAD, 0x13, 0x7F, 0x56, 0x31, 0x39, 0xAD, 0x14, 0x7F, 0x57, 0x31, 0x39, 0x53, 0x91, 0xEF, 0x22, \r
-0x7F, 0x81, 0x51, 0x84, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81, 0x31, 0x39, 0x7F, 0x80, 0xF1, 0xD9, \r
-0xFD, 0x7F, 0x80, 0x31, 0x39, 0x12, 0x91, 0xB5, 0x12, 0x3E, 0x11, 0xF1, 0xFA, 0x12, 0x91, 0xF2, \r
-0x7F, 0x01, 0x12, 0x47, 0x00, 0x90, 0x93, 0x88, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x47, 0x00, 0x90, \r
-0x93, 0x88, 0xE0, 0x04, 0xF0, 0x91, 0x55, 0x12, 0x8A, 0x53, 0x7F, 0x80, 0xF1, 0xFB, 0x7F, 0x80, \r
-0x31, 0x39, 0x75, 0x28, 0xFF, 0x12, 0x60, 0x1D, 0x12, 0x91, 0xC2, 0x12, 0x93, 0x18, 0x7F, 0x81, \r
-0x51, 0x84, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x31, 0x39, 0x12, 0x91, 0xFC, 0x12, 0x93, 0x43, \r
-0xE4, 0xFF, 0x02, 0x47, 0x89, 0x12, 0x60, 0x03, 0x90, 0x8D, 0x06, 0xEF, 0xF0, 0x12, 0x91, 0x6B, \r
-0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x17, 0x51, \r
-0x84, 0xEF, 0x54, 0xFC, 0x44, 0x04, 0xFD, 0x7F, 0x17, 0x31, 0x39, 0x7F, 0x16, 0x51, 0x84, 0xEF, \r
-0x54, 0x0F, 0x44, 0x40, 0xFD, 0x7F, 0x16, 0x31, 0x39, 0x7F, 0x38, 0xF1, 0xFB, 0x7F, 0x38, 0x31, \r
-0x39, 0x02, 0x37, 0x99, 0xAD, 0x07, 0x90, 0x8F, 0x33, 0xE0, 0x75, 0xF0, 0x40, 0xA4, 0xFF, 0x90, \r
-0x95, 0x6A, 0xE5, 0xF0, 0x12, 0x67, 0xF4, 0x90, 0x8F, 0x34, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, \r
-0x95, 0x6D, 0xF0, 0xED, 0x64, 0x01, 0x70, 0x70, 0x90, 0x95, 0x6A, 0xE0, 0x70, 0x02, 0xA3, 0xE0, \r
-0x60, 0x0B, 0x90, 0x95, 0x6A, 0x74, 0xFF, 0x75, 0xF0, 0xD0, 0x12, 0x08, 0xD6, 0xB1, 0x34, 0x13, \r
-0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x51, 0xA6, 0xB1, 0x34, 0x13, 0x54, 0x01, \r
-0xFD, 0x51, 0xA6, 0x90, 0x8F, 0x34, 0xE0, 0x30, 0xE0, 0x3E, 0xB1, 0x29, 0x13, 0x54, 0x07, 0x7D, \r
-0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x51, 0xA6, 0xE4, 0x90, 0x95, 0x6C, 0xF0, 0x90, 0x95, 0x6D, \r
-0xE0, 0xFF, 0x90, 0x95, 0x6C, 0xE0, 0xC3, 0x9F, 0x50, 0x1E, 0xB1, 0x29, 0x13, 0x54, 0x01, 0xFD, \r
-0x51, 0xA6, 0xB1, 0x29, 0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x51, 0xA6, \r
-0x90, 0x95, 0x6C, 0xE0, 0x04, 0xF0, 0x80, 0xD5, 0x22, 0x90, 0x95, 0x6A, 0xE0, 0xFE, 0xA3, 0xE0, \r
-0xFF, 0x12, 0x3E, 0x50, 0x90, 0x8F, 0x32, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x31, 0xE0, 0xFE, \r
-0xC4, 0x22, 0x90, 0x8E, 0x81, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x8E, 0x8E, 0xE0, 0xFD, 0x7F, 0x93, \r
-0x31, 0x39, 0x90, 0x8E, 0x85, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, \r
-0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x51, 0x84, 0xEF, 0x44, \r
-0x10, 0xFD, 0x7F, 0x08, 0x31, 0x39, 0x7F, 0x01, 0x12, 0x58, 0xE6, 0x7F, 0x90, 0x51, 0x84, 0xEF, \r
-0x44, 0x01, 0xFD, 0x7F, 0x90, 0x31, 0x39, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x7F, 0x58, \r
-0x7E, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xF8, 0xEE, 0xF0, 0xA3, 0xEF, \r
-0xF0, 0x12, 0x37, 0x4E, 0x90, 0x95, 0x02, 0x12, 0x08, 0x6D, 0x90, 0x94, 0xFA, 0x12, 0x43, 0xE5, \r
-0x12, 0x08, 0x3A, 0x90, 0x95, 0x02, 0xF1, 0xF4, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, \r
-0x90, 0x94, 0xFA, 0x12, 0x43, 0xE5, 0x90, 0x94, 0xFE, 0xF1, 0xF4, 0xD0, 0x03, 0xD0, 0x02, 0xD0, \r
-0x01, 0xD0, 0x00, 0x12, 0x43, 0xC7, 0x90, 0x95, 0x06, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x06, 0x12, \r
-0x43, 0xE5, 0x71, 0x91, 0x90, 0x94, 0xF8, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, 0x45, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x8C, 0xED, 0xF0, \r
-0xEF, 0x14, 0x60, 0x02, 0xC1, 0xCD, 0x90, 0x06, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x95, 0x8C, \r
-0xE0, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x90, 0x04, 0x42, 0xE0, 0x54, 0x9F, 0x4F, 0xFF, 0xF0, 0x90, \r
-0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x79, 0x00, \r
-0x00, 0x00, 0x01, 0xF1, 0x34, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0xFE, 0x12, \r
-0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0xF1, 0x38, 0x12, 0x08, 0x79, 0x00, \r
-0x00, 0x00, 0x10, 0x90, 0x95, 0x8C, 0x12, 0x65, 0x62, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x01, \r
-0x12, 0x08, 0x47, 0x78, 0x04, 0x12, 0x83, 0x4D, 0x7F, 0x00, 0x7E, 0x0A, 0xF1, 0x38, 0x12, 0x08, \r
-0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x95, 0x8C, 0x12, 0x65, 0x62, 0xEF, 0x54, 0x03, 0xFF, 0xE4, \r
-0x78, 0x0A, 0x12, 0x83, 0x4D, 0x7F, 0x00, 0x7E, 0x0D, 0xF1, 0x38, 0x12, 0x08, 0x79, 0x0C, 0x00, \r
-0x00, 0x00, 0x90, 0x95, 0x8C, 0x12, 0x65, 0x62, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x1A, 0x12, \r
-0x83, 0x4D, 0x7F, 0x18, 0xF1, 0x36, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0xFE, \r
-0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x12, 0x9F, 0x8B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, \r
-0x00, 0x90, 0x94, 0xEC, 0x12, 0x08, 0x79, 0x00, 0x00, 0x04, 0x00, 0x80, 0x59, 0x90, 0x06, 0x03, \r
-0xE0, 0x44, 0x04, 0xF0, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, \r
-0xFE, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xF1, 0x34, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, \r
-0x01, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x09, 0xF1, \r
-0x38, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x79, 0x00, 0x00, \r
-0x0C, 0x00, 0x12, 0x9F, 0x8B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0xEC, 0x12, \r
-0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0x12, 0x82, 0x66, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x00, 0x7E, 0x08, 0xB1, 0x92, 0x90, 0x94, 0xFA, 0x22, 0xFD, 0x7F, \r
-0x4E, 0x31, 0x39, 0x7F, 0x4F, 0x51, 0x84, 0xEF, 0x22, 0x7F, 0x67, 0x51, 0x84, 0xEF, 0x44, 0x20, \r
-0xFD, 0x7F, 0x67, 0x31, 0x39, 0x90, 0x95, 0x56, 0xE0, 0x22, 0x90, 0x01, 0x34, 0xF1, 0x9D, 0x90, \r
-0x01, 0x3C, 0xF1, 0x9F, 0xFD, 0x7F, 0x54, 0x31, 0x39, 0x7D, 0xFF, 0x7F, 0x55, 0x31, 0x39, 0x7D, \r
-0xFF, 0x7F, 0x56, 0x31, 0x39, 0x7D, 0xFF, 0x7F, 0x57, 0x21, 0x39, 0x90, 0x01, 0x30, 0xE4, 0xF1, \r
-0x9F, 0x90, 0x01, 0x38, 0xF1, 0x9F, 0xFD, 0x7F, 0x50, 0x31, 0x39, 0xE4, 0xFD, 0x7F, 0x51, 0x31, \r
-0x39, 0xE4, 0xFD, 0x7F, 0x52, 0x31, 0x39, 0xE4, 0xFD, 0x7F, 0x53, 0x21, 0x39, 0x74, 0xFF, 0xF0, \r
-0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0xD3, \r
-0x30, 0xE6, 0x1B, 0x90, 0x00, 0x8C, 0xE0, 0xF5, 0x26, 0x7F, 0x8D, 0x51, 0x84, 0x90, 0x00, 0x8E, \r
-0xE0, 0xF5, 0x27, 0xF1, 0xD3, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0x7F, 0x8D, 0x31, 0x39, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x7F, 0x8F, 0x51, 0x84, 0xEF, 0x22, 0x51, 0x84, 0xEF, 0x44, 0x80, 0x22, 0x12, \r
-0x9F, 0xE0, 0x7F, 0xF2, 0x51, 0x84, 0xEF, 0x20, 0xE6, 0x09, 0x7F, 0x05, 0xF1, 0xD9, 0xFD, 0x7F, \r
-0x05, 0x31, 0x39, 0x22, 0x12, 0x43, 0xF1, 0x02, 0x43, 0xBA, 0x22, 0x51, 0x84, 0xEF, 0x44, 0x40, \r
-0xFD, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x3F, 0xEE, 0xF0, 0xA3, 0xEF, \r
-0xF0, 0x90, 0x95, 0x43, 0xE0, 0xF5, 0x3B, 0xA3, 0xE0, 0xF5, 0x3C, 0x12, 0x36, 0x3E, 0x90, 0x95, \r
-0x3F, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0x74, 0x05, 0xF0, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x95, 0x4A, 0xF0, 0x7F, 0x03, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
-0xC0, 0xD0, 0x90, 0x95, 0x45, 0xEF, 0xF0, 0x12, 0x93, 0x31, 0x90, 0x95, 0x45, 0xE0, 0xFF, 0x31, \r
-0x4A, 0x74, 0x01, 0xF0, 0x90, 0x95, 0x4A, 0xE0, 0xFE, 0xEF, 0x31, 0x58, 0xEE, 0xF0, 0x90, 0x95, \r
-0x45, 0xE0, 0x11, 0x9F, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x11, 0x94, 0x78, 0x10, 0x12, \r
-0x08, 0x47, 0xAB, 0x07, 0x11, 0x94, 0x78, 0x08, 0x12, 0x08, 0x47, 0x90, 0x95, 0x43, 0xEF, 0xF0, \r
-0x11, 0x94, 0x90, 0x95, 0x44, 0xEF, 0xF0, 0x7D, 0x01, 0x7F, 0x50, 0x7E, 0x01, 0x11, 0x02, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0x90, 0x95, 0x46, 0x02, 0x43, 0xE5, 0x90, 0x93, 0xA7, 0xE0, 0xFB, 0x75, \r
-0xF0, 0x0A, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0xE4, 0x90, 0x93, \r
-0xA7, 0xF0, 0x90, 0x93, 0xA7, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x40, 0x02, 0x21, 0x42, 0xEF, 0x31, \r
-0x4A, 0xE0, 0x64, 0x01, 0x70, 0x74, 0x90, 0x93, 0xA7, 0xE0, 0x11, 0x9F, 0x12, 0x43, 0xE5, 0xE4, \r
-0x7B, 0x01, 0x31, 0x43, 0x70, 0x3A, 0x90, 0x93, 0xA7, 0xE0, 0xFB, 0x31, 0x58, 0xE0, 0x60, 0x21, \r
-0x14, 0x70, 0x57, 0xEB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, \r
-0x83, 0x12, 0x43, 0xE5, 0xEB, 0x11, 0x9F, 0x12, 0x08, 0x6D, 0x90, 0x93, 0xA7, 0xE0, 0xFF, 0x80, \r
-0x0B, 0x11, 0x9A, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x03, 0x31, 0x66, 0x80, 0x2A, \r
-0x90, 0x93, 0xA7, 0xE0, 0x11, 0x9F, 0x12, 0x43, 0xE5, 0xE4, 0xFB, 0x31, 0x43, 0x50, 0x1B, 0x11, \r
-0x9A, 0x12, 0x43, 0xE5, 0xEF, 0x24, 0xFF, 0xFF, 0xEE, 0x34, 0xFF, 0xFE, 0xED, 0x34, 0xFF, 0xFD, \r
-0xEC, 0x34, 0xFF, 0xFC, 0xEB, 0x11, 0x9F, 0x12, 0x08, 0x6D, 0x90, 0x93, 0xA7, 0xE0, 0x04, 0xF0, \r
-0x01, 0xB2, 0x22, 0xFA, 0xF9, 0xF8, 0xC3, 0x02, 0x43, 0xD4, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x6B, \r
-0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x6A, 0xF5, 0x82, \r
-0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0xEF, 0x24, 0xFC, 0x60, 0x05, 0x04, 0x70, 0x05, 0x80, 0x04, \r
-0x12, 0x81, 0x2C, 0x22, 0xE4, 0x90, 0x93, 0xA8, 0xF0, 0x90, 0x94, 0xD0, 0x04, 0xF0, 0x90, 0x06, \r
-0x32, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x93, 0x73, 0x12, 0x43, 0xE5, 0x12, 0x9F, 0xE7, 0xE4, 0x3D, \r
-0xFD, 0xE4, 0x3C, 0xFC, 0x90, 0x93, 0x73, 0x12, 0x08, 0x6D, 0x12, 0x9C, 0xAC, 0xE4, 0x90, 0x94, \r
-0xB4, 0xF0, 0xFF, 0x12, 0x83, 0x92, 0x12, 0x6B, 0x46, 0x70, 0x27, 0x31, 0xE1, 0x7F, 0x05, 0x7E, \r
-0x00, 0x12, 0x3D, 0xC2, 0x71, 0xD0, 0x90, 0x8E, 0x87, 0xE0, 0x64, 0x02, 0x60, 0x14, 0x90, 0x93, \r
-0xA8, 0xE0, 0x04, 0xF0, 0x12, 0x9F, 0xE0, 0x31, 0xE1, 0x90, 0x93, 0xA8, 0xE0, 0xD3, 0x94, 0x0A, \r
-0x40, 0xE4, 0x90, 0x95, 0x46, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x0A, 0x12, 0x9F, 0xD8, 0x01, \r
-0x3B, 0x7D, 0x01, 0x7F, 0x02, 0x80, 0x04, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
-0xC0, 0xD0, 0x90, 0x95, 0x91, 0xED, 0xF0, 0x90, 0x8E, 0x80, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, \r
-0x03, 0x30, 0xE0, 0x02, 0x61, 0x32, 0xEE, 0x12, 0x74, 0x1B, 0x30, 0xE0, 0x02, 0x61, 0x32, 0x90, \r
-0x8E, 0x87, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x61, 0x32, 0xEF, 0x70, 0x02, 0x41, 0xAA, 0x24, 0xFE, \r
-0x70, 0x02, 0x41, 0xE4, 0x24, 0xFE, 0x60, 0x4A, 0x24, 0xFC, 0x70, 0x02, 0x61, 0x1F, 0x24, 0xFC, \r
-0x60, 0x02, 0x61, 0x32, 0xEE, 0xB4, 0x0E, 0x02, 0x71, 0x55, 0x90, 0x8E, 0x87, 0xE0, 0x70, 0x04, \r
-0x7F, 0x01, 0x71, 0x91, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0x70, 0x90, 0x8E, 0x87, \r
-0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x95, 0x91, 0xE0, 0xFF, 0x60, 0x05, 0x12, 0x9B, 0x11, 0x80, 0x03, \r
-0x12, 0x6D, 0x8A, 0x90, 0x8E, 0x87, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x61, 0x32, 0x12, 0x9B, 0x87, \r
-0x61, 0x32, 0x90, 0x8E, 0x87, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x71, 0x91, 0x90, 0x8E, 0x87, 0xE0, \r
-0xB4, 0x06, 0x02, 0x71, 0x70, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0x37, 0xBF, 0x01, \r
-0x02, 0x71, 0x55, 0x90, 0x8E, 0x87, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x61, 0x32, 0x71, 0x37, 0xEF, \r
-0x64, 0x01, 0x60, 0x02, 0x61, 0x32, 0x71, 0xA7, 0x61, 0x32, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x0E, \r
-0x07, 0x71, 0x37, 0xBF, 0x01, 0x02, 0x71, 0x55, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x06, 0x02, 0x71, \r
-0x70, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x0C, 0x07, 0x71, 0x37, 0xBF, 0x01, 0x02, 0x71, 0xA7, 0x90, \r
-0x8E, 0x87, 0xE0, 0x64, 0x04, 0x70, 0x5B, 0x12, 0x9A, 0x5A, 0xEF, 0x64, 0x01, 0x70, 0x53, 0x12, \r
-0x9B, 0x43, 0x80, 0x4E, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0x37, 0xBF, 0x01, 0x02, \r
-0x71, 0x55, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0x70, 0x90, 0x8E, 0x87, 0xE0, 0xB4, \r
-0x0C, 0x07, 0x71, 0x37, 0xBF, 0x01, 0x02, 0x71, 0xA7, 0x90, 0x8E, 0x87, 0xE0, 0x70, 0x04, 0x7F, \r
-0x01, 0x71, 0x91, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x04, 0x18, 0x12, 0x9B, 0x5E, 0x80, 0x13, 0x90, \r
-0x8E, 0x87, 0xE0, 0xB4, 0x0C, 0x0C, 0x90, 0x8E, 0x81, 0x12, 0x84, 0x0B, 0x30, 0xE0, 0x03, 0x12, \r
-0x9B, 0x76, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x9A, 0x41, 0xBF, 0x01, 0x15, 0x90, 0x8E, 0x80, \r
-0x12, 0x9E, 0xBD, 0x20, 0xE0, 0x0C, 0x90, 0x8E, 0x86, 0xE0, 0xD3, 0x94, 0x04, 0x50, 0x03, 0x7F, \r
-0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x8E, 0x81, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, 0x7D, 0x0C, \r
-0x80, 0x05, 0x12, 0x8D, 0x28, 0x7D, 0x04, 0x7F, 0x01, 0x71, 0xDC, 0xE4, 0xFD, 0xFF, 0x81, 0x51, \r
-0x90, 0x8E, 0x81, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x08, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x04, \r
-0x80, 0x06, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0x71, 0xDC, 0xE4, 0xFD, 0xFF, 0x81, \r
-0x51, 0x90, 0x95, 0x90, 0xEF, 0xF0, 0x12, 0x6F, 0x13, 0x90, 0x95, 0x90, 0xE0, 0x60, 0x02, 0xF1, \r
-0xF3, 0x7D, 0x04, 0x7F, 0x01, 0x80, 0x35, 0x12, 0x6B, 0x46, 0x70, 0x23, 0x90, 0x8E, 0x81, 0xE0, \r
-0x54, 0xFD, 0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x91, 0x51, 0x7D, 0x08, 0x7F, 0x01, 0xF1, 0x87, 0xBF, \r
-0x01, 0x0D, 0x90, 0x8E, 0x80, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0x71, 0xDC, 0x22, \r
-0x90, 0x8E, 0x86, 0xE0, 0x90, 0x94, 0xCC, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0xD3, 0x10, 0xAF, 0x01, \r
-0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x8F, 0xEF, 0xF0, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, \r
-0x70, 0x1A, 0xED, 0x54, 0x01, 0xFF, 0x90, 0x8E, 0x80, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x80, 0x0C, \r
-0x90, 0x8E, 0x87, 0xED, 0xF0, 0x80, 0x05, 0x90, 0x8E, 0x86, 0xED, 0xF0, 0x12, 0x4F, 0xD3, 0x30, \r
-0xE4, 0x31, 0x90, 0x95, 0x8F, 0xE0, 0x14, 0x60, 0x07, 0x14, 0x60, 0x1D, 0x24, 0x02, 0x70, 0x23, \r
-0x90, 0x8E, 0x80, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x90, 0x8E, 0x87, \r
-0xE0, 0x54, 0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, 0x8E, 0x86, 0xE0, 0xFD, 0x7F, 0x89, \r
-0x12, 0x49, 0x39, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFD, 0x7F, 0x0C, 0x31, 0xEB, 0xE4, 0xFD, \r
-0xFF, 0x90, 0x05, 0x22, 0xEF, 0xF0, 0x90, 0x8D, 0x05, 0xED, 0xF0, 0x22, 0x90, 0x93, 0xD4, 0x12, \r
-0x44, 0x12, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, 0xE5, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x09, \r
-0x7D, 0x39, 0xF1, 0xF8, 0xBF, 0x01, 0x10, 0x80, 0x00, 0x90, 0x93, 0x7B, 0x12, 0x7A, 0x5E, 0x90, \r
-0x93, 0xE2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xE2, 0x12, 0x8B, 0x87, 0x90, 0x93, 0xE4, \r
-0xEF, 0xF0, 0x90, 0x93, 0xE2, 0x12, 0x8D, 0x1C, 0x90, 0x93, 0xE0, 0xE0, 0xFD, 0x12, 0x8B, 0xCD, \r
-0x90, 0x93, 0xE1, 0xE0, 0x60, 0x02, 0xA1, 0x29, 0xD1, 0xF6, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, \r
-0x90, 0x93, 0xD7, 0xD1, 0xE5, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0xB1, 0xC8, \r
-0xF1, 0xDD, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0xD4, 0xD1, 0xE5, 0x75, 0x43, 0x10, \r
-0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0xB1, 0xC8, 0xD1, 0xF9, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, \r
-0xD1, 0xE2, 0x75, 0x43, 0x10, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0xB1, 0xC8, 0x24, 0x60, 0xF9, \r
-0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xD1, 0xE2, 0x75, 0x43, \r
-0x10, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0xB1, 0xC8, 0x24, 0x72, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, \r
-0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0xDD, 0xD1, 0xE5, 0x75, 0x43, 0x06, \r
-0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x93, 0xDA, 0x12, 0x44, 0x09, 0x90, \r
-0x94, 0x12, 0x12, 0x44, 0x12, 0x90, 0x94, 0x15, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x20, 0x90, \r
-0x94, 0x19, 0x74, 0x3A, 0xF0, 0x90, 0x93, 0xD4, 0x12, 0x44, 0x09, 0x12, 0x98, 0x24, 0xB1, 0xCB, \r
-0x24, 0x30, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x28, \r
-0x7B, 0x01, 0x7A, 0x93, 0x79, 0xE7, 0xB1, 0xC8, 0x12, 0x9F, 0x96, 0xC0, 0x03, 0x8B, 0x40, 0x75, \r
-0x41, 0x8F, 0x75, 0x42, 0xD1, 0x75, 0x43, 0x28, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x93, 0xE4, \r
-0xE0, 0xFF, 0x90, 0x93, 0xE3, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xE2, 0xE0, 0x34, 0x00, 0xCF, 0x24, \r
-0x30, 0xFD, 0xE4, 0x3F, 0xFC, 0x90, 0x93, 0x7B, 0xE0, 0xFB, 0x7F, 0x3A, 0x12, 0x61, 0x65, 0xB1, \r
-0xCB, 0x12, 0x9F, 0x96, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x93, 0x75, 0x42, 0xE7, 0x75, 0x43, \r
-0x28, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x93, 0xE5, \r
-0xE0, 0xFF, 0x7D, 0x3A, 0x91, 0x51, 0xE1, 0xEC, 0x12, 0x35, 0x26, 0x90, 0x93, 0xE2, 0xA3, 0xE0, \r
-0xFF, 0xA3, 0xE0, 0x2F, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x0A, 0x12, \r
-0x44, 0x12, 0x78, 0x16, 0x7C, 0x95, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x64, 0x12, 0x97, \r
-0xBD, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x95, 0x15, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x09, 0x7D, \r
-0x33, 0xF1, 0xF8, 0xBF, 0x01, 0x10, 0x80, 0x00, 0x90, 0x93, 0x7A, 0x12, 0x7A, 0x5E, 0x90, 0x95, \r
-0x12, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x95, 0x12, 0x12, 0x8B, 0x87, 0x90, 0x95, 0x14, 0xEF, \r
-0xF0, 0x90, 0x95, 0x12, 0x12, 0x8D, 0x1C, 0x90, 0x95, 0x10, 0xE0, 0xFD, 0x12, 0x8B, 0xCD, 0x90, \r
-0x95, 0x11, 0xE0, 0x70, 0x4D, 0xD1, 0xF6, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x95, 0x0D, \r
-0xD1, 0xE5, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0xD1, 0xEF, 0xB1, 0xCE, 0xF1, \r
-0x61, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x95, 0x0D, 0xD1, 0xE5, 0x75, \r
-0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0xD1, 0xEF, 0xB1, 0xCE, 0xF1, 0xDD, 0xC0, 0x03, \r
-0xC0, 0x02, 0xC0, 0x01, 0x90, 0x95, 0x0A, 0xD1, 0xE5, 0x75, 0x43, 0x04, 0xD0, 0x01, 0xD0, 0x02, \r
-0x80, 0x44, 0x90, 0x95, 0x11, 0xE0, 0x64, 0x01, 0x70, 0x41, 0xD1, 0xF6, 0xC0, 0x03, 0x8B, 0x40, \r
-0x75, 0x41, 0x8F, 0x75, 0x42, 0x4D, 0x75, 0x43, 0x06, 0xD0, 0x03, 0xD1, 0xEF, 0xB1, 0xCE, 0xF1, \r
-0x61, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8F, 0x75, 0x42, 0x57, 0x75, 0x43, \r
-0x06, 0xD0, 0x03, 0xD1, 0xEF, 0xB1, 0xCE, 0xF1, 0xDD, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8F, \r
-0x75, 0x42, 0x5D, 0x75, 0x43, 0x04, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x06, 0x30, 0xE0, 0x44, \r
-0x10, 0xF0, 0x90, 0x95, 0x15, 0xE0, 0xFF, 0x7D, 0x34, 0x91, 0x51, 0xF1, 0xEC, 0xD0, 0xD0, 0x92, \r
-0xAF, 0x22, 0x90, 0x93, 0xDA, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x22, 0x12, \r
-0x35, 0x26, 0x90, 0x95, 0x12, 0x22, 0xA3, 0xA3, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, \r
-0x7B, 0x01, 0x22, 0x12, 0x66, 0x44, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xAB, 0x12, 0x8B, \r
-0x87, 0x90, 0x93, 0xAD, 0xEF, 0xF0, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, \r
-0xFC, 0x12, 0x9F, 0x1D, 0x7A, 0x8F, 0x79, 0x4D, 0xF1, 0x5A, 0xB1, 0xCE, 0x24, 0x3E, 0xF9, 0xE4, \r
-0x34, 0xFC, 0x12, 0x83, 0xD0, 0x7A, 0x8F, 0x79, 0x53, 0xF1, 0x5A, 0xB1, 0xCE, 0xF1, 0x61, 0x12, \r
-0x9F, 0x1D, 0x7A, 0x8F, 0x79, 0x57, 0xF1, 0x5A, 0xB1, 0xCE, 0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, \r
-0x12, 0x83, 0xD0, 0x7A, 0x8F, 0x79, 0x5D, 0x02, 0x35, 0x26, 0x12, 0x35, 0x26, 0x90, 0x93, 0xAB, \r
-0x22, 0x24, 0x42, 0xF9, 0xE4, 0x34, 0xFC, 0x22, 0x90, 0x8E, 0x84, 0xE0, 0x64, 0x01, 0x70, 0x12, \r
-0x12, 0x7F, 0x0A, 0x60, 0x05, 0x91, 0x48, 0x02, 0x79, 0xEE, 0x90, 0x8E, 0x87, 0xE0, 0x70, 0x02, \r
-0x31, 0xE7, 0x22, 0x7D, 0x08, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, \r
-0x51, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x8D, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0, \r
-0x60, 0x27, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x95, 0x55, 0xF0, 0x7D, 0x26, 0xF1, 0xF8, 0xEF, 0x64, \r
-0x01, 0x70, 0x03, 0x12, 0x7E, 0x35, 0x90, 0x95, 0x55, 0xE0, 0xFF, 0x7D, 0x27, 0x91, 0x51, 0x90, \r
-0x95, 0x51, 0xE0, 0xFF, 0x12, 0x8A, 0x97, 0x80, 0x0B, 0x90, 0x95, 0x51, 0xE0, 0xFF, 0x12, 0x8A, \r
-0x97, 0x12, 0x7E, 0x35, 0xF1, 0xEC, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x24, 0x48, 0xF9, \r
-0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, \r
-0x20, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x81, 0x51, 0x7F, 0xFF, 0x91, 0x51, 0xE4, 0x90, 0x95, 0x81, \r
-0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, \r
-0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x95, 0x82, 0xE0, 0x94, 0xE8, 0x90, \r
-0x95, 0x81, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, \r
-0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x95, 0x81, 0xE4, 0x75, 0xF0, 0x01, 0x12, \r
-0x08, 0xD6, 0x80, 0xBF, 0x02, 0x4F, 0xA7, 0xE4, 0x90, 0x93, 0x9D, 0xF0, 0x90, 0x93, 0x9D, 0xE0, \r
-0x64, 0x01, 0xF0, 0x24, 0x47, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0x12, 0x3E, 0x44, \r
-0xBF, 0x01, 0x03, 0x12, 0x31, 0xFC, 0xC2, 0xAF, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x0F, 0x90, 0x8E, \r
-0x87, 0xE0, 0xFF, 0x90, 0x8E, 0x86, 0xE0, 0x6F, 0x60, 0x03, 0x12, 0x79, 0x32, 0xC2, 0xAF, 0x12, \r
-0x91, 0xC9, 0xBF, 0x01, 0x02, 0x11, 0x9B, 0xD2, 0xAF, 0xD2, 0xAF, 0x90, 0x93, 0x95, 0xE0, 0xB4, \r
-0x01, 0x02, 0x31, 0x3D, 0x11, 0x44, 0x12, 0x46, 0x38, 0x80, 0xB1, 0x90, 0x8E, 0x80, 0xE0, 0x30, \r
-0xE0, 0x02, 0x11, 0xA5, 0x22, 0x90, 0x8E, 0x87, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x08, 0x12, \r
-0x9A, 0xDB, 0xBF, 0x01, 0x02, 0x11, 0xB8, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, \r
-0x4D, 0x42, 0x11, 0xC9, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x92, 0xF9, 0x7F, 0x08, 0x12, 0x4A, \r
-0x84, 0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x49, 0x39, 0xE4, 0xFF, 0x11, 0xE6, 0x90, 0x8E, \r
-0x81, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x90, 0x95, 0x78, 0xEF, 0x31, 0xBE, 0x90, 0x01, 0x09, 0xE0, \r
-0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0x95, 0x78, 0xE0, 0x6F, 0x60, 0x3E, 0xC3, 0x90, \r
-0x95, 0x7A, 0xE0, 0x94, 0x88, 0x90, 0x95, 0x79, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, \r
-0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x95, 0x79, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, \r
-0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90, 0x95, 0x7A, 0xE0, 0x94, 0x32, 0x90, 0x95, 0x79, \r
-0xE0, 0x94, 0x00, 0x40, 0xB7, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB0, 0x22, 0xD3, 0x10, 0xAF, \r
-0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0x93, 0x9E, 0x12, 0x08, \r
-0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0x90, 0x93, 0xA2, 0x12, 0x08, 0x6D, 0x90, 0x93, \r
-0x9E, 0x31, 0xB1, 0x60, 0x1C, 0x90, 0x93, 0x9E, 0x31, 0xA9, 0xEC, 0x90, 0x93, 0x9E, 0x12, 0x08, \r
-0x6D, 0x90, 0x93, 0x9E, 0x12, 0x43, 0xE5, 0x12, 0x4B, 0x91, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x38, \r
-0x45, 0x90, 0x93, 0xA2, 0x31, 0xB1, 0x60, 0x1C, 0x90, 0x93, 0xA2, 0x31, 0xA9, 0xEC, 0x90, 0x93, \r
-0xA2, 0x12, 0x08, 0x6D, 0x90, 0x93, 0xA2, 0x12, 0x43, 0xE5, 0x12, 0x4B, 0x91, 0x7F, 0x00, 0x7E, \r
-0x09, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x43, 0xE5, 0xEF, 0x54, 0xFE, 0xFF, \r
-0x22, 0x12, 0x43, 0xE5, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x22, 0xF0, 0xE4, \r
-0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x94, 0xDA, \r
-0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0x31, 0xBE, 0x90, 0x94, 0xE2, 0xF0, 0xA3, 0xF0, \r
-0xA3, 0xF0, 0x90, 0x01, 0xC4, 0x74, 0xC5, 0xF0, 0x74, 0x59, 0xA3, 0xF0, 0x90, 0x01, 0x1F, 0xE0, \r
-0xFE, 0x90, 0x01, 0x1E, 0x12, 0x61, 0x5C, 0x90, 0x94, 0xD1, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, \r
-0x82, 0xE0, 0x90, 0x94, 0xD9, 0xF0, 0x90, 0x8F, 0x2E, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0xC3, 0xE4, \r
-0x90, 0x94, 0xD8, 0xF0, 0x90, 0x94, 0xD9, 0xE0, 0xFF, 0x90, 0x94, 0xD8, 0xE0, 0xC3, 0x9F, 0x40, \r
-0x02, 0x81, 0xC3, 0x90, 0x94, 0xD1, 0x12, 0xA0, 0x2F, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x94, 0xE2, \r
-0xEF, 0xF0, 0x12, 0x8E, 0xFA, 0x12, 0x9E, 0xFC, 0x54, 0x3F, 0xFE, 0x90, 0x94, 0xD3, 0xF0, 0xA3, \r
-0xEF, 0xF0, 0x90, 0x94, 0xDE, 0xEE, 0x12, 0x8F, 0xAC, 0xE0, 0x54, 0x03, 0xFE, 0xEF, 0x24, 0x18, \r
-0x2E, 0xFF, 0x90, 0x94, 0xE3, 0xF0, 0x90, 0x94, 0xD2, 0xE0, 0x2F, 0xFF, 0x90, 0x94, 0xD1, 0xE0, \r
-0x34, 0x00, 0xFE, 0x90, 0x94, 0xD5, 0xF1, 0xE0, 0xC0, 0x07, 0x91, 0xD3, 0x7D, 0x01, 0x91, 0xFE, \r
-0xC0, 0x07, 0x91, 0xD3, 0x7D, 0x04, 0x91, 0xFE, 0xAB, 0x07, 0xD0, 0x05, 0xD0, 0x07, 0x12, 0x8B, \r
-0xAD, 0x90, 0x94, 0xDA, 0xEF, 0xF0, 0x91, 0xD3, 0xE4, 0xFD, 0x91, 0xFE, 0xEF, 0x54, 0xFC, 0x90, \r
-0x94, 0xD7, 0xF0, 0x90, 0x94, 0xE3, 0xE0, 0xFF, 0x90, 0x94, 0xD3, 0xE4, 0x8F, 0xF0, 0x12, 0x08, \r
-0xD6, 0x90, 0x94, 0xD3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x93, 0x78, 0x90, 0x94, 0xD3, 0xEE, \r
-0xF0, 0xA3, 0xEF, 0xF0, 0xF1, 0xF1, 0xFF, 0x7D, 0x0F, 0x91, 0xFE, 0x90, 0x94, 0xD3, 0xE0, 0xFC, \r
-0xA3, 0xE0, 0xFD, 0x90, 0x94, 0xD1, 0xEC, 0x8D, 0xF0, 0x12, 0x8F, 0xDE, 0xFC, 0xA3, 0xE0, 0xFD, \r
-0xD3, 0x90, 0x94, 0xD2, 0xE0, 0x9D, 0x90, 0x94, 0xD1, 0xE0, 0x9C, 0x40, 0x18, 0x90, 0x8D, 0xF9, \r
-0xE0, 0x24, 0x01, 0xFD, 0x12, 0x9F, 0x09, 0xFC, 0xC3, 0x90, 0x94, 0xD2, 0xE0, 0x9D, 0xF0, 0x90, \r
-0x94, 0xD1, 0xE0, 0x9C, 0xF0, 0xEF, 0x30, 0xE6, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF0, 0xEF, \r
-0x30, 0xE7, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x21, 0xF0, 0xEF, 0x30, 0xE5, 0x06, 0x90, 0x01, 0xC7, \r
-0x74, 0x23, 0xF0, 0x90, 0x94, 0xD0, 0xE0, 0x60, 0x41, 0x90, 0x94, 0xD7, 0xE0, 0x24, 0xB0, 0x60, \r
-0x19, 0x24, 0xD0, 0x60, 0x02, 0x81, 0x5F, 0x12, 0xA0, 0x27, 0x20, 0xE0, 0x1E, 0xEF, 0x13, 0x13, \r
-0x13, 0x54, 0x1F, 0x20, 0xE0, 0x02, 0x81, 0x5F, 0x80, 0x11, 0x12, 0xA0, 0x27, 0x20, 0xE0, 0x0B, \r
-0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x02, 0x81, 0x5F, 0x91, 0xD3, 0x90, 0x94, 0xDE, \r
-0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x73, 0xB6, 0x81, 0x5F, 0x90, 0x94, 0xD7, 0xE0, 0x24, 0x40, \r
-0x60, 0x04, 0x24, 0x20, 0x70, 0x2B, 0x90, 0x8F, 0x31, 0x12, 0x74, 0x19, 0x20, 0xE0, 0x02, 0x81, \r
-0x5F, 0x90, 0x8F, 0x43, 0xE0, 0x04, 0xF0, 0x91, 0xD3, 0x12, 0x94, 0x35, 0xEF, 0x70, 0x02, 0x81, \r
-0x5F, 0x90, 0x94, 0xD7, 0xE0, 0xFF, 0x12, 0x94, 0x23, 0x90, 0x8F, 0x44, 0xE0, 0x04, 0xF0, 0x81, \r
-0x5F, 0xF1, 0xF9, 0x30, 0xE0, 0x5C, 0x90, 0x94, 0xDA, 0xE0, 0xFF, 0x90, 0x94, 0xD6, 0xE0, 0x2F, \r
-0xFF, 0x90, 0x94, 0xD5, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x08, 0xCF, 0x34, 0x00, 0xFE, 0x90, 0x94, \r
-0xE0, 0xF1, 0xE0, 0xEF, 0x64, 0x45, 0x70, 0x3A, 0xB1, 0xB3, 0x12, 0x9E, 0x33, 0xEF, 0x64, 0x01, \r
-0x70, 0x30, 0xB1, 0xB3, 0x12, 0x9E, 0x77, 0xEF, 0x64, 0x01, 0x70, 0x26, 0x90, 0x94, 0xE4, 0x04, \r
-0xF0, 0xB1, 0xB3, 0xA3, 0xE0, 0xFD, 0x12, 0x9D, 0x97, 0xEF, 0x70, 0x0E, 0x90, 0x94, 0xE2, 0xE0, \r
-0xFD, 0x90, 0xFD, 0x11, 0xF0, 0xB1, 0xB3, 0x12, 0x9D, 0xF0, 0x90, 0x94, 0xE2, 0xE0, 0x90, 0xFD, \r
-0x11, 0xF0, 0x91, 0xD3, 0x12, 0x94, 0x35, 0xEF, 0x60, 0x1F, 0x91, 0xD3, 0x90, 0x94, 0xDA, 0xE0, \r
-0xFD, 0x90, 0x94, 0xDD, 0xE0, 0xFB, 0x90, 0x94, 0xE2, 0xE0, 0x90, 0x93, 0xAB, 0xF0, 0xB1, 0x2D, \r
-0xEF, 0x60, 0x06, 0x90, 0x94, 0xE4, 0x74, 0x01, 0xF0, 0x90, 0x8F, 0x2E, 0xE0, 0xC3, 0x13, 0x30, \r
-0xE0, 0x13, 0x91, 0xD3, 0x90, 0x94, 0xDA, 0xE0, 0xFD, 0x12, 0x94, 0x8D, 0xEF, 0x60, 0x06, 0x90, \r
-0x94, 0xE4, 0x74, 0x01, 0xF0, 0x12, 0x87, 0xDE, 0x54, 0x3F, 0x30, 0xE0, 0x0A, 0x91, 0xD3, 0x90, \r
-0x94, 0xDA, 0xE0, 0xFD, 0x12, 0x95, 0xEC, 0x90, 0x8F, 0x2E, 0x12, 0x74, 0x19, 0x30, 0xE0, 0x0F, \r
-0x90, 0x94, 0xE4, 0xE0, 0x70, 0x09, 0x91, 0xD3, 0x90, 0x94, 0xDA, 0xE0, 0xFD, 0xF1, 0x29, 0x12, \r
-0x98, 0x63, 0xEF, 0x64, 0x01, 0x60, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x05, 0x7F, 0x01, \r
-0x12, 0x73, 0xCF, 0x12, 0x93, 0xFD, 0xEF, 0x64, 0x01, 0x70, 0x37, 0x90, 0x8F, 0x45, 0xE0, 0x04, \r
-0xF0, 0x12, 0x93, 0x9A, 0xAD, 0x07, 0xEF, 0x64, 0x01, 0x60, 0x1F, 0xF1, 0xD8, 0xED, 0xB4, 0x02, \r
-0x08, 0x90, 0x01, 0xC7, 0x74, 0x42, 0xF0, 0x80, 0x0A, 0xED, 0xB4, 0x04, 0x06, 0x90, 0x01, 0xC7, \r
-0x74, 0x43, 0xF0, 0x7F, 0x01, 0x12, 0x73, 0xCF, 0x80, 0x19, 0xF1, 0xF1, 0xFF, 0x12, 0x93, 0x6A, \r
-0x80, 0x09, 0x90, 0x8F, 0x2E, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x08, 0x90, 0x94, 0xD8, 0xE0, 0x04, \r
-0xF0, 0x41, 0x14, 0x74, 0xC5, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x59, 0xA3, 0xF0, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x90, 0x94, 0xD5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x90, 0x93, 0xA9, 0xE0, \r
-0xFD, 0x90, 0x93, 0xA8, 0xE0, 0x2D, 0xFD, 0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x10, \r
-0xCD, 0x34, 0x00, 0xFC, 0x7E, 0x00, 0xED, 0x2F, 0xFF, 0xEE, 0x3C, 0xFE, 0xE4, 0xFD, 0xAB, 0x07, \r
-0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0x90, 0x8D, 0xF9, 0xE0, 0x9B, 0x90, 0x8D, \r
-0xF8, 0xE0, 0x9A, 0x50, 0x0C, 0xA3, 0x12, 0x9F, 0x05, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, \r
-0xFA, 0x12, 0x8F, 0xD6, 0x74, 0x00, 0x2F, 0x12, 0x8F, 0x09, 0xE0, 0xFF, 0x22, 0x90, 0x93, 0xA9, \r
-0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x12, 0x9E, 0x6E, 0xE4, 0x90, 0x93, 0xAC, 0xF0, 0xFD, 0x91, 0xFE, \r
-0xEF, 0x54, 0x0C, 0x64, 0x08, 0x70, 0x5C, 0xB1, 0xAA, 0xA3, 0xE0, 0xF1, 0xD0, 0x64, 0x88, 0x70, \r
-0x52, 0xB1, 0xAA, 0xA3, 0xE0, 0x24, 0x07, 0xFD, 0x91, 0xFE, 0xEF, 0x64, 0x8E, 0x70, 0x44, 0x90, \r
-0x93, 0xAC, 0x04, 0xB1, 0xA9, 0x12, 0x9F, 0x3F, 0x04, 0xFD, 0x91, 0xFE, 0xEF, 0x64, 0x03, 0x70, \r
-0x32, 0xB1, 0xAA, 0x12, 0x9F, 0x3F, 0xF1, 0xD0, 0x30, 0xE3, 0x07, 0x90, 0x01, 0xC7, 0x74, 0x01, \r
-0x80, 0x1F, 0x90, 0x8F, 0x2E, 0x12, 0x9E, 0xBD, 0x30, 0xE0, 0x09, 0xB1, 0xAA, 0xA3, 0xE0, 0xFD, \r
-0xB1, 0xF0, 0x80, 0x0F, 0x90, 0x8F, 0x31, 0xF1, 0xFC, 0x30, 0xE0, 0x07, 0x90, 0x01, 0xC7, 0x74, \r
-0x02, 0xF1, 0xD7, 0x90, 0x93, 0xAC, 0xE0, 0xFF, 0x22, 0xF0, 0x90, 0x93, 0xA7, 0xE0, 0xFE, 0xA3, \r
-0xE0, 0xFF, 0x22, 0x90, 0x94, 0xE0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x12, 0xA0, 0x3F, 0xF0, \r
-0x7D, 0x09, 0x91, 0xFE, 0xEF, 0x64, 0x06, 0x70, 0x24, 0xF1, 0xE8, 0x7D, 0x14, 0x91, 0xFE, 0xEF, \r
-0x70, 0x1B, 0xF1, 0xE8, 0x7D, 0x15, 0x91, 0xFE, 0xEF, 0x64, 0x50, 0x70, 0x10, 0xF1, 0xE8, 0x7D, \r
-0x21, 0x91, 0xFE, 0xEF, 0x20, 0xE0, 0x03, 0x30, 0xE2, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x06, 0x31, 0xE0, 0x54, 0xEF, 0x44, 0x08, 0xF0, \r
-0xED, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x7C, 0x00, 0xEF, 0x24, 0x08, 0xFF, 0xEC, 0x3E, 0x90, 0x93, \r
-0xB0, 0xF0, 0xA3, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, 0x83, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x90, 0x79, \r
-0x43, 0x12, 0x08, 0xAA, 0x90, 0x93, 0xB1, 0xE0, 0x24, 0x01, 0xF1, 0x16, 0x90, 0x90, 0x44, 0xF1, \r
-0x22, 0x24, 0x04, 0xF1, 0x16, 0x90, 0x90, 0x47, 0xF1, 0x22, 0x24, 0x05, 0xF1, 0x16, 0x90, 0x90, \r
-0x48, 0xF1, 0x22, 0x24, 0x06, 0xF1, 0x16, 0x90, 0x90, 0x49, 0xF1, 0x22, 0x24, 0x07, 0xF1, 0x16, \r
-0x90, 0x90, 0x4A, 0xF1, 0x22, 0x24, 0x08, 0xF1, 0x16, 0x90, 0x90, 0x4B, 0xEF, 0xF0, 0xE4, 0x90, \r
-0x93, 0xAF, 0xF0, 0x90, 0x93, 0xAF, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x1D, 0x90, 0x93, 0xB1, \r
-0xE0, 0x24, 0x09, 0xFD, 0x90, 0x93, 0xB0, 0xE0, 0x91, 0xF1, 0x90, 0x93, 0xAF, 0xE0, 0x24, 0x4C, \r
-0xF5, 0x82, 0xE4, 0x34, 0x90, 0x12, 0x9F, 0x6A, 0x80, 0xD9, 0xE4, 0x90, 0x93, 0xAF, 0xF0, 0x90, \r
-0x93, 0xAF, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x1D, 0x90, 0x93, 0xB1, 0xE0, 0x24, 0x63, 0xFD, \r
-0x90, 0x93, 0xB0, 0xE0, 0x91, 0xF1, 0x90, 0x93, 0xAF, 0xE0, 0x24, 0xA6, 0xF5, 0x82, 0xE4, 0x34, \r
-0x90, 0x12, 0x9F, 0x6A, 0x80, 0xD9, 0x90, 0x90, 0x48, 0x12, 0x9C, 0xA4, 0x12, 0x8F, 0xCE, 0xF0, \r
-0x30, 0xE3, 0x0D, 0x7F, 0x01, 0x12, 0x73, 0xCF, 0x90, 0x01, 0xC7, 0x74, 0x03, 0xF0, 0x80, 0x3F, \r
-0x90, 0x93, 0xAD, 0xA3, 0xE0, 0xFF, 0x7C, 0x00, 0x54, 0x07, 0xFD, 0x64, 0x01, 0x60, 0x05, 0xED, \r
-0x64, 0x02, 0x70, 0x2B, 0xED, 0x64, 0x02, 0x4C, 0x70, 0x25, 0xEF, 0x54, 0x30, 0xFF, 0xE4, 0xC4, \r
-0xF8, 0x54, 0xF0, 0xC8, 0xEF, 0xC4, 0x54, 0x0F, 0x48, 0x90, 0x90, 0xDC, 0xF0, 0xAE, 0x04, 0xAF, \r
-0x05, 0xE4, 0xFD, 0x12, 0x9B, 0x94, 0x90, 0x06, 0x31, 0xE0, 0x54, 0xF7, 0x44, 0x10, 0xF0, 0x7F, \r
-0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xFF, 0x90, 0x93, 0xB0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, \r
-0x81, 0xFE, 0xEF, 0xF0, 0x90, 0x93, 0xB1, 0xE0, 0x22, 0x12, 0x97, 0xE1, 0x12, 0x97, 0xCB, 0x7B, \r
-0xFF, 0x7A, 0x40, 0x79, 0x90, 0x12, 0x97, 0xBD, 0x78, 0xB1, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, \r
-0x7A, 0x40, 0x79, 0x96, 0x12, 0x97, 0xC4, 0xB1, 0xAA, 0x12, 0x94, 0x35, 0xEF, 0x70, 0x02, 0xE1, \r
-0xCF, 0x12, 0x95, 0xDA, 0xFE, 0x90, 0x93, 0xB5, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x06, 0xFF, 0xE4, \r
-0x3E, 0xF1, 0x1D, 0xEF, 0x64, 0x08, 0x70, 0x67, 0x90, 0x93, 0xB6, 0xE0, 0x24, 0x07, 0xFF, 0x90, \r
-0x93, 0xB5, 0xF1, 0x1A, 0xEF, 0x70, 0x58, 0x90, 0x93, 0xB0, 0xF0, 0x90, 0x93, 0xB0, 0xE0, 0xFF, \r
-0xC3, 0x94, 0x04, 0x50, 0x24, 0x90, 0x93, 0xB6, 0xE0, 0x24, 0x18, 0xFD, 0x90, 0x93, 0xB5, 0xE0, \r
-0x91, 0xF1, 0x90, 0x93, 0xB0, 0xE0, 0x24, 0xB1, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, \r
-0xF0, 0x90, 0x93, 0xB0, 0xE0, 0x04, 0xF0, 0x80, 0xD2, 0x78, 0xB1, 0x7C, 0x93, 0x12, 0x9E, 0xE2, \r
-0xEF, 0x70, 0x1C, 0x90, 0x93, 0xB6, 0xE0, 0x24, 0x08, 0xFF, 0x90, 0x93, 0xB5, 0xE0, 0x34, 0x00, \r
-0xFE, 0xB1, 0xBC, 0xEF, 0x64, 0x01, 0x60, 0x07, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF1, 0xD7, 0x22, \r
-0x24, 0x06, 0xFD, 0x91, 0xFE, 0xEF, 0x22, 0xF0, 0x90, 0x8F, 0x36, 0xE0, 0x44, 0x01, 0xF0, 0x22, \r
-0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0x81, 0xFE, 0x90, 0x93, 0xB7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, \r
-0x22, 0x90, 0x94, 0xD1, 0xE0, 0xFE, 0xA3, 0xE0, 0x22, 0x90, 0x8F, 0x2E, 0xE0, 0xC4, 0x13, 0x13, \r
-0x54, 0x03, 0x22, 0x7F, 0xF4, 0x12, 0x4A, 0x84, 0xEF, 0x20, 0xE5, 0x0E, 0x7F, 0xF4, 0x12, 0x4A, \r
-0x84, 0xEF, 0x7F, 0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, 0x75, 0xE8, 0x03, \r
-0x75, 0xA8, 0x85, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x48, 0x39, 0x90, 0x93, 0xA6, \r
-0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x60, 0xE9, 0xC2, 0xAF, 0x30, 0xE1, 0x06, \r
-0x54, 0xFD, 0xF0, 0x12, 0x84, 0x32, 0x11, 0x6F, 0x30, 0xE2, 0x05, 0x54, 0xFB, 0xF0, 0x11, 0xAB, \r
-0x11, 0x6F, 0x30, 0xE4, 0x0B, 0x54, 0xEF, 0xF0, 0x11, 0x79, 0xBF, 0x01, 0x03, 0x12, 0x59, 0xC5, \r
-0x11, 0x6F, 0x30, 0xE7, 0x06, 0x54, 0x7F, 0xF0, 0x12, 0x50, 0xAD, 0xD2, 0xAF, 0x80, 0xC5, 0xD2, \r
-0xAF, 0xC2, 0xAF, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x22, 0xE4, 0x90, 0x95, 0x85, 0xF0, 0xA3, 0xF0, \r
-0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x21, 0xC3, 0x90, 0x95, 0x86, 0xE0, 0x94, 0xD0, 0x90, 0x95, \r
-0x85, 0xE0, 0x94, 0x07, 0x40, 0x0A, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, \r
-0x90, 0x95, 0x85, 0x12, 0x8E, 0x8D, 0x80, 0xD8, 0x7F, 0x01, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
-0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x8D, 0xF7, 0xE0, 0xFE, 0x90, 0x8D, 0xF6, 0xE0, 0xFD, 0xB5, 0x06, \r
-0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x24, 0xED, 0x12, 0x9F, 0x2A, \r
-0xFA, 0x7B, 0x01, 0x11, 0xF5, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, 0x8D, 0xF6, 0xE0, 0x04, 0xF0, \r
-0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0xF6, 0xF0, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x62, 0x12, \r
-0x44, 0x12, 0x7F, 0x96, 0x7E, 0x02, 0x12, 0x8E, 0x46, 0xEF, 0x60, 0x42, 0x31, 0x54, 0xFE, 0x12, \r
-0x9F, 0xE7, 0x90, 0x95, 0x65, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x95, 0x65, \r
-0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x95, 0x62, 0x12, 0x90, 0x52, 0x24, \r
-0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x12, 0x8E, 0xB4, 0x90, 0x95, 0x65, 0xE0, 0x24, 0x18, 0xFF, 0x90, \r
-0x95, 0x62, 0x12, 0x44, 0x09, 0x12, 0x8F, 0xE6, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, \r
-0x00, 0xFF, 0xEC, 0x3E, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x2A, 0xEC, \r
-0x12, 0xA0, 0x37, 0xAA, 0x07, 0x90, 0x95, 0x31, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x12, \r
-0x9F, 0x75, 0xEA, 0x24, 0xEF, 0x60, 0x3B, 0x24, 0xD7, 0x70, 0x02, 0x41, 0xC8, 0x24, 0x3A, 0x60, \r
-0x02, 0x61, 0x00, 0xD1, 0x5E, 0x24, 0x0A, 0xD1, 0x6D, 0xED, 0xF0, 0xFE, 0x71, 0x3F, 0xB1, 0x7A, \r
-0xE4, 0xF0, 0xFE, 0x74, 0x00, 0x2F, 0xF1, 0xC8, 0x7D, 0x14, 0x71, 0x18, 0x7B, 0x00, 0x7A, 0x00, \r
-0x79, 0x00, 0x71, 0x23, 0x90, 0xAC, 0x6A, 0x12, 0x08, 0x6D, 0x7D, 0x14, 0x7C, 0x00, 0xE4, 0xFF, \r
-0x41, 0xC3, 0x90, 0x95, 0x2A, 0xE4, 0x75, 0xF0, 0x14, 0x12, 0x08, 0xD6, 0x90, 0x95, 0x2A, 0xA3, \r
-0xE0, 0xFB, 0xFF, 0x24, 0x06, 0xFC, 0xD1, 0x6E, 0xCC, 0xF0, 0x90, 0x95, 0x35, 0xA3, 0xE0, 0xFE, \r
-0x71, 0x3F, 0xB1, 0x7A, 0xE4, 0xF1, 0xA3, 0xE0, 0xFE, 0xA9, 0x03, 0x74, 0x05, 0x29, 0xF5, 0x82, \r
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x31, 0x5C, 0xFE, 0x90, 0x95, 0x2F, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, \r
-0x95, 0x2A, 0xE0, 0xFC, 0xA3, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xD3, 0xEF, 0x94, 0x00, 0xEE, \r
-0x94, 0x01, 0x90, 0x95, 0x2A, 0x40, 0x6A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE9, 0x7C, 0x00, 0x24, \r
-0x00, 0xF9, 0xEC, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC3, 0xE4, 0x9F, 0xFD, 0x74, 0x01, 0x9E, 0xFC, \r
-0x71, 0x1A, 0x90, 0x95, 0x2C, 0xE0, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, \r
-0x90, 0xFD, 0x10, 0xF0, 0xD1, 0x90, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0x7B, 0x01, \r
-0x7A, 0xFC, 0x79, 0x00, 0x90, 0x95, 0x2A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0xE4, 0x9F, 0xFF, \r
-0x74, 0x01, 0x9E, 0xFE, 0xD1, 0x65, 0xC3, 0x9F, 0xFD, 0xEC, 0x9E, 0xFC, 0x12, 0x26, 0x4E, 0xD0, \r
-0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0x71, 0x1D, 0x12, 0x9F, 0x75, 0x80, \r
-0x0D, 0xA3, 0xE0, 0x7E, 0x00, 0x24, 0x00, 0xF1, 0xC8, 0xD1, 0x65, 0xFD, 0x71, 0x1A, 0x90, 0x95, \r
-0x2A, 0x74, 0xFF, 0x75, 0xF0, 0xEC, 0x12, 0x08, 0xD6, 0xD1, 0x5E, 0x7E, 0x00, 0x24, 0x0C, 0xF9, \r
-0xEE, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x02, 0xC0, 0x01, 0x74, 0x10, 0x2F, 0xF9, 0xEE, 0x34, \r
-0xFC, 0xFA, 0x71, 0x23, 0x90, 0xAC, 0x6A, 0x12, 0x08, 0x6D, 0xD1, 0x65, 0xFD, 0xD0, 0x01, 0xD0, \r
-0x02, 0x7F, 0x11, 0x12, 0x1B, 0xAC, 0x80, 0x30, 0xD1, 0x5E, 0x24, 0x2A, 0xD1, 0x6D, 0xED, 0xF0, \r
-0xFE, 0x71, 0x3F, 0xB1, 0x7A, 0xE4, 0xF0, 0x12, 0x99, 0x5C, 0x7D, 0x48, 0x71, 0x18, 0x71, 0x29, \r
-0xD1, 0x8B, 0x12, 0x42, 0x90, 0xE4, 0xFD, 0xFC, 0x71, 0x1D, 0x71, 0x29, 0xD1, 0x8B, 0x12, 0x42, \r
-0x90, 0x71, 0x1D, 0x71, 0x29, 0x12, 0x08, 0x3A, 0x90, 0x95, 0x2D, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
-0x90, 0x95, 0x2D, 0x12, 0xA0, 0x2F, 0x90, 0x95, 0x35, 0xA3, 0xE0, 0xFE, 0x71, 0x3F, 0xEF, 0xB1, \r
-0x7B, 0xED, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7C, 0x00, 0x12, 0x26, 0x4E, 0x90, 0x95, 0x31, \r
-0x02, 0x08, 0x6D, 0x90, 0xAC, 0x67, 0x12, 0x44, 0x12, 0x90, 0x95, 0x31, 0x02, 0x43, 0xE5, 0x12, \r
-0x42, 0x90, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, \r
-0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0xE4, 0x90, 0x93, 0xAB, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x87, 0xE0, 0xFF, 0xD1, 0x4A, 0x7E, 0x00, \r
-0x90, 0x93, 0xAB, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x71, 0x3F, 0xE0, 0x90, 0x91, 0x33, 0xF0, 0xF1, \r
-0xE1, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x02, 0xF1, 0xAF, 0xFF, 0xE4, 0xFC, 0xFD, 0x78, 0x10, \r
-0x12, 0x08, 0x5A, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xD1, 0xA3, 0xB1, 0x60, 0x78, \r
-0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0xC0, \r
-0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xD1, 0x96, 0xB1, 0x60, 0x78, 0x08, 0x12, 0x08, 0x5A, \r
-0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x71, 0x2F, 0xB1, 0x62, 0x12, 0x42, 0x90, 0x90, \r
-0x91, 0x37, 0xB1, 0x47, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, \r
-0x07, 0xD1, 0xA3, 0xB1, 0x60, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, \r
-0xD0, 0x00, 0x12, 0x42, 0x90, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xD1, 0x96, 0xB1, \r
-0x60, 0x78, 0x08, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x71, 0x2F, \r
-0xB1, 0x62, 0x12, 0x42, 0x90, 0x90, 0x91, 0x3B, 0xB1, 0x47, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xC0, \r
-0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xD1, 0xA3, 0xB1, 0x60, 0x78, 0x18, 0x12, 0x08, 0x5A, \r
-0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0xC0, 0x04, 0xC0, 0x05, 0xC0, \r
-0x06, 0xC0, 0x07, 0xD1, 0x96, 0xB1, 0x60, 0x78, 0x08, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, \r
-0xD0, 0x01, 0xD0, 0x00, 0x71, 0x2F, 0xB1, 0x62, 0x12, 0x42, 0x90, 0x90, 0x91, 0x3F, 0x12, 0x08, \r
-0x6D, 0xF1, 0xE1, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0xD1, 0x80, 0x71, 0x3F, 0xE0, 0xFF, 0x12, 0x9F, \r
-0x4A, 0xEF, 0xF0, 0xB1, 0x73, 0xE0, 0xB4, 0x10, 0xEF, 0xD1, 0x76, 0xE4, 0x90, 0x93, 0xAD, 0xF0, \r
-0xD1, 0x80, 0x71, 0x3F, 0xE0, 0xFF, 0x74, 0x53, 0x2E, 0x12, 0x9F, 0xC8, 0xEF, 0xF0, 0xB1, 0x73, \r
-0xE0, 0xB4, 0x10, 0xEC, 0xD1, 0x76, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0xD1, 0x80, 0x71, 0x3F, 0xE0, \r
-0xFF, 0x74, 0x63, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, 0xB1, 0x73, 0xE0, \r
-0xB4, 0x10, 0xE8, 0xD1, 0x76, 0x90, 0x93, 0x87, 0xE0, 0x04, 0x90, 0x93, 0xAF, 0xF0, 0xE4, 0x90, \r
-0x93, 0xAE, 0xF0, 0x90, 0x91, 0x33, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x24, 0x01, 0xFF, 0xE4, 0x33, \r
-0xFE, 0x90, 0x93, 0xAE, 0xE0, 0xFD, 0xC3, 0x12, 0x9F, 0xC0, 0x98, 0x50, 0x63, 0xA3, 0xE0, 0x2D, \r
-0xF0, 0xD1, 0x42, 0xE4, 0xF1, 0xF4, 0x90, 0x93, 0xAD, 0xE0, 0xFD, 0xC3, 0x94, 0x04, 0x50, 0x48, \r
-0xA3, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x7C, 0x00, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0xEF, 0x78, \r
-0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x24, 0x73, 0xF9, 0x74, 0x91, 0x3E, 0xFA, 0x7B, \r
-0x01, 0xC0, 0x03, 0xC0, 0x01, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, \r
-0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x20, 0xD0, 0x01, 0xD0, 0x03, 0x12, 0x57, 0x5A, \r
-0xE4, 0x75, 0xF0, 0x20, 0xB1, 0x70, 0x80, 0xAE, 0x90, 0x93, 0xAE, 0xE0, 0x04, 0xF0, 0x80, 0x83, \r
-0xE4, 0x90, 0x93, 0xAD, 0xF0, 0xE4, 0xFF, 0x0F, 0xEF, 0xB4, 0x20, 0xFB, 0xB1, 0x73, 0xE0, 0xB4, \r
-0x10, 0xF3, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x08, 0x6D, 0x90, 0x93, 0xAB, 0xE4, 0x75, 0xF0, \r
-0x04, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
-0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x22, 0x90, 0x93, 0xD0, 0xE4, 0x75, 0xF0, 0x04, \r
-0x12, 0x08, 0xD6, 0x90, 0x93, 0xAD, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0xF0, 0x74, 0x01, 0x2E, 0xF5, \r
-0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x90, 0x93, 0x84, 0xD1, 0x42, 0xEF, 0xF0, 0xE0, 0xFE, \r
-0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x29, 0x2E, 0x12, 0x7E, \r
-0xF4, 0xFD, 0x90, 0x93, 0xAB, 0xE0, 0x24, 0x2C, 0x12, 0x8B, 0xA4, 0x90, 0x93, 0xAB, 0xE0, 0x2F, \r
-0x24, 0x30, 0xA3, 0xF0, 0xE0, 0xFD, 0x24, 0x04, 0xF1, 0xA7, 0xE0, 0xFE, 0x74, 0x05, 0x2D, 0xF5, \r
-0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x31, 0x5C, 0x90, 0x90, 0xE7, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, \r
-0x93, 0xAC, 0xE0, 0x24, 0x0C, 0xF9, 0xE4, 0x34, 0xFC, 0x12, 0x83, 0xD0, 0x7A, 0x90, 0x79, 0xE9, \r
-0x12, 0x35, 0x26, 0x90, 0x93, 0xAC, 0xE0, 0x24, 0x14, 0xF0, 0xE0, 0xFD, 0x24, 0x01, 0xB1, 0x7F, \r
-0xE0, 0xFE, 0x74, 0x00, 0x2D, 0x71, 0x41, 0x31, 0x5C, 0x90, 0x90, 0xED, 0xF0, 0xA3, 0xEF, 0xF0, \r
-0x90, 0x93, 0x85, 0xD1, 0x42, 0xEF, 0xF0, 0x90, 0x90, 0xE3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x4E, \r
-0x60, 0x14, 0x90, 0x93, 0xAB, 0xE0, 0x12, 0x83, 0xC4, 0x89, 0x42, 0x8F, 0x43, 0x7B, 0x01, 0x7A, \r
-0x90, 0x79, 0xF1, 0x12, 0x35, 0x26, 0x90, 0x93, 0x86, 0xD1, 0x42, 0xEF, 0xF0, 0x12, 0x83, 0xC4, \r
-0x89, 0x42, 0x90, 0x90, 0xE5, 0xA3, 0xE0, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x91, 0x79, 0x11, 0x02, \r
-0x35, 0x26, 0xE0, 0xFF, 0xD1, 0x4A, 0x90, 0x93, 0xAB, 0x22, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, \r
-0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0x90, 0x95, \r
-0x2A, 0xA3, 0xE0, 0xFF, 0x22, 0x90, 0x95, 0x2F, 0xE0, 0xFC, 0xA3, 0xE0, 0x22, 0xFD, 0xE4, 0x33, \r
-0x90, 0x95, 0x35, 0xF0, 0xA3, 0x22, 0x90, 0x93, 0xAB, 0xE4, 0x75, 0xF0, 0x10, 0x02, 0x08, 0xD6, \r
-0x90, 0x93, 0xAB, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFE, 0x2F, 0x22, 0x78, 0x10, 0x12, 0x08, 0x47, \r
-0x90, 0x95, 0x31, 0x02, 0x43, 0xF1, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0x22, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0x22, \r
-0x90, 0x8D, 0xFD, 0xE0, 0xFF, 0xD1, 0x4A, 0x74, 0x00, 0x2F, 0x71, 0x41, 0xE0, 0x90, 0x94, 0xB7, \r
-0xF0, 0x74, 0x01, 0x2F, 0xB1, 0x7F, 0xE0, 0x90, 0x94, 0xB8, 0xF0, 0x74, 0x02, 0x2F, 0xF1, 0xAF, \r
-0x90, 0x94, 0xB9, 0xF0, 0x74, 0x03, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, \r
-0x94, 0xBA, 0xF1, 0xA3, 0xE0, 0x90, 0x94, 0xBB, 0xF0, 0x74, 0x05, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
-0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x94, 0xBC, 0xF0, 0x74, 0x06, 0x2F, 0xF1, 0xD0, 0x90, 0x94, 0xBD, \r
-0xF0, 0x74, 0x07, 0x2F, 0xF1, 0xC0, 0xE0, 0x90, 0x94, 0xBE, 0xF0, 0x74, 0x08, 0x2F, 0xF1, 0xB8, \r
-0xE0, 0x90, 0x94, 0xBF, 0xF0, 0x22, 0xE4, 0xFD, 0xFC, 0x90, 0x93, 0x83, 0xF1, 0xEB, 0xAB, 0x05, \r
-0x74, 0x01, 0x2B, 0xB1, 0x7F, 0xE0, 0xFE, 0x74, 0x00, 0x2B, 0x71, 0x41, 0x12, 0x9E, 0xFC, 0x90, \r
-0x90, 0xDD, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x03, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
-0xE0, 0xFE, 0x74, 0x02, 0x2B, 0xF1, 0xAF, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90, 0xDF, 0xF0, \r
-0xA3, 0xEF, 0xF0, 0x74, 0x05, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, \r
-0x04, 0x2B, 0xF1, 0xA7, 0xE0, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90, 0xE1, 0xF0, 0xA3, 0xEF, \r
-0xF0, 0x74, 0x07, 0x2B, 0xF1, 0xC0, 0xE0, 0xFE, 0x74, 0x06, 0x2B, 0xF1, 0xD0, 0x24, 0x00, 0xFF, \r
-0xEA, 0x3E, 0x90, 0x90, 0xE3, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x09, 0x2B, 0x12, 0x7F, 0x01, 0xFE, \r
-0x74, 0x08, 0x2B, 0xF1, 0xB8, 0xE0, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x90, 0xE5, 0xF0, 0xA3, \r
-0xEF, 0xF0, 0x22, 0xF0, 0x74, 0x04, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, \r
-0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF9, 0xEE, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xEF, 0x60, 0x04, 0xF1, 0x16, 0xB1, 0x87, \r
-0x22, 0x90, 0x93, 0xAB, 0xE4, 0x75, 0xF0, 0x04, 0x02, 0x08, 0xD6, 0xE0, 0xFF, 0xD1, 0x4A, 0x7C, \r
-0x00, 0xAD, 0x07, 0x22, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, \r
-0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0xFC, 0x90, 0x01, 0xC4, \r
-0xED, 0xF0, 0x74, 0x67, 0x11, 0x23, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, \r
-0xD0, 0xE0, 0x32, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, \r
-0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, \r
-0x30, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x68, 0x11, 0x23, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, \r
-0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, \r
-0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, \r
-0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x57, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x12, 0x4B, \r
-0xB0, 0xE5, 0x14, 0x30, 0xE7, 0x03, 0x12, 0x4F, 0xDF, 0x74, 0x57, 0x04, 0x90, 0x01, 0xC4, 0xF0, \r
-0x74, 0x68, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, \r
-0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xC0, \r
-0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, \r
-0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, \r
-0xAF, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x12, 0x92, 0x06, 0xE5, 0x19, 0x30, 0xE3, 0x02, 0x71, 0x26, \r
-0xE5, 0x19, 0x30, 0xE4, 0x02, 0x31, 0xEB, 0xE5, 0x19, 0x30, 0xE5, 0x03, 0x12, 0x92, 0x63, 0xE5, \r
-0x1B, 0x30, 0xE0, 0x02, 0x31, 0x50, 0xE5, 0x1B, 0x30, 0xE1, 0x02, 0x91, 0xA1, 0xE5, 0x1B, 0x30, \r
-0xE2, 0x02, 0x71, 0xEF, 0xE5, 0x1B, 0x30, 0xE3, 0x02, 0x71, 0x32, 0xE5, 0x1B, 0x30, 0xE4, 0x02, \r
-0x71, 0x4D, 0xE5, 0x1B, 0x30, 0xE5, 0x03, 0x12, 0x7A, 0x46, 0xE5, 0x1B, 0x30, 0xE6, 0x03, 0x12, \r
-0x79, 0x6E, 0xE5, 0x1C, 0x30, 0xE1, 0x03, 0x12, 0x92, 0x9F, 0x74, 0xAF, 0x04, 0x90, 0x01, 0xC4, \r
-0xF0, 0x74, 0x68, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, \r
-0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, \r
-0xE4, 0xF5, 0x58, 0x90, 0x8E, 0x84, 0xE0, 0x70, 0x02, 0x21, 0xE0, 0x71, 0x46, 0x60, 0x02, 0x21, \r
-0xE0, 0x90, 0x8E, 0x80, 0xE0, 0x30, 0xE0, 0x17, 0x12, 0x8D, 0x12, 0xFD, 0xED, 0x78, 0x02, 0xCE, \r
-0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x8E, 0xB9, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, \r
-0x8E, 0x82, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, \r
-0x8E, 0x8B, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x8E, 0x8D, 0xE0, 0x60, 0x0E, 0xEF, \r
-0x70, 0x08, 0x90, 0x8E, 0x8A, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x58, 0x01, 0xE5, 0x58, 0x60, \r
-0x2F, 0x12, 0xA0, 0x17, 0x90, 0x8E, 0x8D, 0xE0, 0x60, 0x03, 0xB4, 0x01, 0x04, 0x31, 0xE1, 0x80, \r
-0x08, 0x31, 0xE1, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x8E, 0x8C, 0xE0, 0x2F, 0xF1, \r
-0x09, 0x7E, 0x01, 0x12, 0x50, 0x02, 0x90, 0x8E, 0x87, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x51, 0xE7, \r
-0x22, 0xE4, 0x90, 0x95, 0x43, 0xF0, 0x90, 0x8E, 0x8D, 0xE0, 0x22, 0x31, 0xFE, 0x7F, 0x02, 0x8F, \r
-0x59, 0x7F, 0x02, 0x12, 0x48, 0x12, 0x90, 0x8D, 0x01, 0xE0, 0x45, 0x59, 0xF0, 0x22, 0x90, 0x01, \r
-0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x95, 0x7D, 0xF0, 0x90, 0x95, 0x7D, 0xE0, 0xFD, 0x70, 0x02, 0x41, \r
-0xFB, 0x90, 0x8D, 0x5E, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, \r
-0xFF, 0x90, 0x8D, 0x5F, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, \r
-0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x95, 0x7B, 0xE0, 0xFF, 0x12, 0xA0, \r
-0x1F, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x41, \r
-0xDD, 0xE4, 0x90, 0x95, 0x7E, 0xF0, 0x90, 0x95, 0x7E, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x31, \r
-0x51, 0xFC, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, \r
-0x71, 0x14, 0x90, 0x8D, 0x0E, 0x71, 0x04, 0x51, 0xFC, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, \r
-0x74, 0xF0, 0x71, 0x14, 0x90, 0x8D, 0x12, 0x71, 0x04, 0x90, 0x95, 0x7E, 0xE0, 0x04, 0xF0, 0x80, \r
-0xC5, 0x90, 0x95, 0x7D, 0xE0, 0xFF, 0x90, 0x95, 0x7B, 0x12, 0x4B, 0x52, 0x80, 0x02, 0xC3, 0x33, \r
-0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x95, 0x7D, 0xF0, 0x90, 0x95, 0x7B, 0xE0, 0xFF, 0x74, 0x01, 0xA8, \r
-0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x95, 0x7B, 0xE0, \r
-0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x8D, 0x5F, 0x12, 0x84, 0x2B, 0xB4, 0x0A, 0x02, 0x7F, \r
-0x01, 0xEF, 0x70, 0x02, 0x41, 0x08, 0xE4, 0x90, 0x8D, 0x5F, 0xF0, 0x41, 0x08, 0x90, 0x01, 0xC0, \r
-0xE0, 0x44, 0x02, 0xF0, 0x90, 0x95, 0x7B, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0xF0, 0x51, 0xFC, \r
-0x90, 0x01, 0xD0, 0x12, 0x43, 0xFD, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0x90, 0x95, 0x7B, 0xE0, \r
-0x75, 0xF0, 0x04, 0x22, 0x12, 0x43, 0xFD, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, \r
-0x83, 0xEF, 0xF0, 0x22, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x8D, \r
-0x5F, 0xE0, 0x75, 0xF0, 0x08, 0x22, 0x90, 0x8F, 0x2E, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x10, 0x31, \r
-0xEF, 0x22, 0x71, 0x46, 0x70, 0x0F, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x09, 0x71, 0x69, 0xD1, 0xFF, \r
-0x7E, 0x01, 0x12, 0x50, 0x02, 0x22, 0x90, 0x8D, 0xFF, 0xE0, 0x64, 0x01, 0x22, 0x71, 0x46, 0x70, \r
-0x17, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x11, 0x71, 0x69, 0xF0, 0x90, 0x8E, 0x80, 0xE0, 0x12, 0x9E, \r
-0xD7, 0x54, 0x07, 0x70, 0x03, 0x12, 0x79, 0x32, 0x22, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, \r
-0x3C, 0x74, 0x02, 0x22, 0x71, 0x46, 0x70, 0x76, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x70, 0x90, 0x8E, \r
-0x82, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x26, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x8E, \r
-0x8B, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x04, 0x90, 0x8E, 0x8A, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, \r
-0x90, 0x8E, 0x8A, 0xE0, 0xFE, 0xFF, 0x80, 0x03, 0xEF, 0x04, 0xFF, 0x90, 0x8E, 0x8B, 0xEF, 0xF0, \r
-0x90, 0x8E, 0x80, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x88, 0xC2, 0x12, 0xA0, 0x0F, 0xE4, 0x90, 0x8E, \r
-0x8D, 0xF0, 0x12, 0x7F, 0xF9, 0x71, 0x69, 0x12, 0x9E, 0xD9, 0x54, 0xEF, 0xF0, 0x90, 0x8E, 0x82, \r
-0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x79, 0x8C, 0x12, 0x9E, \r
-0xBA, 0x30, 0xE0, 0x0A, 0x12, 0xA0, 0x07, 0xB5, 0x07, 0x04, 0xD1, 0x3A, 0x91, 0x1C, 0x22, 0x90, \r
-0x93, 0x93, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x87, 0xE0, 0x64, 0x02, 0x60, 0x18, 0x71, 0x74, 0x12, \r
-0x9E, 0xBA, 0x30, 0xE0, 0x10, 0x12, 0xA0, 0x07, 0x6F, 0x70, 0x0A, 0xD1, 0x3A, 0x91, 0x16, 0x90, \r
-0x8E, 0x8B, 0xE0, 0x14, 0xF0, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x91, 0x20, 0x7D, 0x01, 0x7F, 0x02, \r
-0x74, 0x15, 0x12, 0xA0, 0x4F, 0xFE, 0xF6, 0x74, 0x30, 0xD1, 0xB0, 0xF0, 0x22, 0xEF, 0x70, 0x36, \r
-0x7D, 0x78, 0x7F, 0x02, 0x91, 0x20, 0x7D, 0x02, 0x7F, 0x03, 0x91, 0x20, 0x7D, 0xC8, 0x7F, 0x02, \r
-0xD1, 0xA3, 0x71, 0x69, 0xF0, 0x90, 0x8D, 0xFF, 0xE0, 0x70, 0x0A, 0xB1, 0x7E, 0x54, 0xBF, 0xF0, \r
-0x54, 0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x51, 0xEB, 0xB1, 0x82, 0x90, 0x06, \r
-0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, \r
-0x7D, 0x78, 0xFF, 0xB1, 0xA1, 0x7D, 0x02, 0x7F, 0x03, 0xB1, 0xA1, 0x90, 0x06, 0x0A, 0xE0, 0x44, \r
-0x07, 0xF0, 0x12, 0x7F, 0xF9, 0x90, 0x8D, 0xFF, 0xE0, 0xB4, 0x01, 0x11, 0x12, 0x9F, 0xFF, 0x90, \r
-0x8E, 0x87, 0xE0, 0x20, 0xE2, 0x0A, 0x7D, 0x01, 0x7F, 0x04, 0x02, 0x51, 0xEB, 0x12, 0xA0, 0x0F, \r
-0x22, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x5F, 0x90, 0x8E, 0x80, 0xE0, 0x30, 0xE0, 0x1D, 0x90, 0x8E, \r
-0x98, 0xE0, 0x04, 0xF0, 0x12, 0x8D, 0x12, 0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, \r
-0xD8, 0xF9, 0xFF, 0x90, 0x8E, 0xB5, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8E, 0x81, 0x12, 0x9E, \r
-0xF4, 0x30, 0xE0, 0x0C, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x05, 0x91, 0x16, 0x12, 0x9F, 0xA6, \r
-0x90, 0x95, 0x7F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0xC3, 0x90, 0x95, 0x80, 0xE0, 0x94, \r
-0x80, 0x90, 0x95, 0x7F, 0xE0, 0x64, 0x80, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, \r
-0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0x99, 0x9B, 0xF1, 0x4B, 0xE4, 0x90, 0x93, 0x8C, 0xF0, \r
-0xB1, 0x6B, 0x12, 0x5F, 0xF9, 0x30, 0xE0, 0x52, 0x90, 0x90, 0xDD, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, \r
-0x7C, 0x00, 0x7D, 0x64, 0x12, 0x07, 0x15, 0x90, 0x91, 0x31, 0xE0, 0x6E, 0x70, 0x03, 0xA3, 0xE0, \r
-0x6F, 0x60, 0x0A, 0x90, 0x91, 0x31, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x08, 0xD6, 0x90, 0x90, 0xE1, \r
-0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, 0xEF, 0xE0, 0xB5, 0x06, 0x14, 0xA3, 0xE0, 0xB5, 0x07, \r
-0x0F, 0xEF, 0x4E, 0x60, 0x0B, 0x90, 0x01, 0xC7, 0x74, 0x31, 0xF0, 0x7F, 0x01, 0x02, 0x73, 0xCF, \r
-0x12, 0x8A, 0xFF, 0xE4, 0x90, 0x91, 0x31, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x8F, 0x2A, 0xE0, 0x30, \r
-0xE0, 0x0B, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x04, 0x91, 0x16, 0xD1, 0x9A, 0x22, 0xF1, 0x13, \r
-0xB1, 0x8A, 0x90, 0x8E, 0x80, 0xE0, 0x54, 0xF7, 0xF0, 0x22, 0x12, 0x8A, 0xEF, 0x12, 0x57, 0xF3, \r
-0x7D, 0x0C, 0x7F, 0x01, 0x02, 0x53, 0xDC, 0x7D, 0x02, 0x7F, 0x02, 0xB1, 0xA1, 0x7D, 0x01, 0x7F, \r
-0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0xD1, 0xB0, 0xF0, 0x22, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x92, 0xEF, 0xF0, 0x54, 0x01, 0xFF, 0x90, 0x8F, \r
-0x2A, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x12, 0x9E, 0xF1, 0x30, 0xE0, 0x39, 0x12, 0x9F, 0x5F, 0x60, \r
-0x10, 0x12, 0x9F, 0x55, 0x40, 0x0B, 0xE4, 0x7F, 0x0A, 0xFE, 0xFD, 0xFC, 0x90, 0x91, 0x3F, 0x80, \r
-0x09, 0xE4, 0x7F, 0x0A, 0xFE, 0xFD, 0xFC, 0x90, 0x91, 0x37, 0x12, 0x43, 0xF1, 0x12, 0x42, 0x9D, \r
-0xC0, 0x07, 0x90, 0x8F, 0x2C, 0xE0, 0xFB, 0xE4, 0xFA, 0xF9, 0xF8, 0xD0, 0x07, 0x12, 0x43, 0x28, \r
-0x90, 0x8F, 0x2D, 0xEF, 0xF0, 0x90, 0x95, 0x92, 0xE0, 0x64, 0x01, 0x70, 0x1F, 0x90, 0x01, 0x53, \r
-0xF0, 0x90, 0x8F, 0x2C, 0xE0, 0x60, 0x0A, 0x7D, 0x10, 0x7F, 0x03, 0xD1, 0x49, 0xD1, 0x9A, 0x80, \r
-0x14, 0xD1, 0xBA, 0xD1, 0xA3, 0x91, 0x16, 0x12, 0x9B, 0x76, 0x80, 0x09, 0xD1, 0xBA, 0xD1, 0x49, \r
-0xB1, 0x97, 0x12, 0x9B, 0x87, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x14, 0x90, 0x05, 0x73, 0xF0, \r
-0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0xD1, \r
-0xAC, 0xF0, 0x22, 0x90, 0x8F, 0x2A, 0xE0, 0x30, 0xE0, 0x3F, 0xD1, 0x9A, 0x90, 0x8F, 0x2D, 0xE0, \r
-0x60, 0x05, 0x14, 0xF0, 0x02, 0x9B, 0x76, 0x90, 0x8F, 0x2B, 0xE0, 0x14, 0x90, 0x8F, 0x2D, 0xF0, \r
-0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0xB1, 0xAF, 0xB1, 0x97, 0x90, 0x8D, 0xFB, 0xE0, \r
-0xFF, 0x20, 0xE0, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0D, 0x90, 0x95, 0x46, 0x12, \r
-0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x12, 0x50, 0x34, 0x22, 0x90, 0x8F, 0x2C, 0xE0, 0x90, 0x05, \r
-0x73, 0xF0, 0x22, 0x74, 0x1D, 0x12, 0xA0, 0x4F, 0xD1, 0xAC, 0xF0, 0x22, 0xFE, 0xF6, 0x74, 0x38, \r
-0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0x22, 0x90, 0x01, 0x53, 0x74, 0x03, 0xF0, \r
-0x7D, 0x10, 0xFF, 0x22, 0xD1, 0xD1, 0x12, 0x9F, 0xA6, 0x7D, 0x02, 0x7F, 0x02, 0xB1, 0xA1, 0x80, \r
-0x82, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x27, 0x71, 0x46, 0x70, 0x23, 0x90, 0x8E, 0x8B, 0xF0, 0x04, \r
-0x60, 0x1C, 0x12, 0xA0, 0x17, 0xE4, 0x90, 0x95, 0x43, 0xF0, 0x90, 0x8E, 0x8C, 0xF1, 0x08, 0x7E, \r
-0x01, 0x12, 0x50, 0x02, 0x90, 0x8E, 0x87, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x51, 0xE7, 0x22, 0xF0, \r
-0xE4, 0x90, 0x95, 0x43, 0xF0, 0x90, 0x8F, 0x24, 0xE0, 0x90, 0x95, 0x44, 0xF0, 0xE4, 0xFB, 0xFD, \r
-0x7F, 0x54, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, \r
-0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, \r
-0x74, 0x86, 0xF0, 0x12, 0x9E, 0xC4, 0xE4, 0xFD, 0x12, 0x49, 0x53, 0x12, 0x4B, 0xAA, 0x44, 0x01, \r
-0xFD, 0x7F, 0x02, 0x12, 0x49, 0x39, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x89, 0xE0, 0x30, \r
-0xE0, 0x34, 0x71, 0x46, 0x70, 0x30, 0x90, 0x95, 0x8E, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, \r
-0x90, 0x93, 0x8B, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x95, 0x8E, 0xF0, 0x90, 0x93, 0x8B, 0xE0, 0xFF, \r
-0x90, 0x93, 0x8A, 0xE0, 0xD3, 0x9F, 0x50, 0x0E, 0x90, 0x93, 0x8C, 0xE0, 0x70, 0x08, 0xE4, 0x90, \r
-0x93, 0x8B, 0xF0, 0x12, 0x84, 0x12, 0x22, 0xEF, 0x60, 0x41, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0x60, \r
-0x03, 0x12, 0x83, 0xDD, 0x90, 0x01, 0xC7, 0xE4, 0x12, 0x61, 0x53, 0x12, 0x9F, 0xB8, 0x90, 0x06, \r
-0x09, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x35, 0x7F, 0xFF, 0x12, 0x54, 0x51, 0x12, 0x4B, 0x5A, 0x12, \r
-0x9F, 0xF7, 0x12, 0x93, 0xB0, 0x12, 0x99, 0x75, 0xF1, 0x13, 0x12, 0x57, 0xF3, 0x12, 0x90, 0xAF, \r
-0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0xFD, 0xE4, 0xFF, 0xA1, 0xA1, 0x7D, 0x08, 0xE4, 0xFF, 0x91, \r
-0x20, 0x90, 0x06, 0x90, 0xE0, 0x54, 0xF0, 0xF0, 0x12, 0x9F, 0xEF, 0x12, 0x91, 0x02, 0x12, 0x73, \r
-0x82, 0x7E, 0x00, 0x7F, 0x1F, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x2E, 0x12, 0x08, 0xAA, \r
-0x90, 0x06, 0x90, 0xE0, 0x44, 0x20, 0xF0, 0x12, 0x91, 0x27, 0x12, 0x73, 0x92, 0x90, 0x8D, 0x06, \r
-0xE0, 0xFF, 0x64, 0x02, 0x70, 0x2A, 0x11, 0xC3, 0x30, 0xE0, 0x02, 0x7E, 0x01, 0x90, 0x8F, 0x4C, \r
-0x11, 0xC1, 0x30, 0xE1, 0x02, 0x7E, 0x01, 0x90, 0x8F, 0x4A, 0x11, 0xC1, 0x30, 0xE2, 0x02, 0x7E, \r
-0x01, 0x90, 0x8F, 0x4B, 0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x90, 0x02, 0xFB, 0xF0, 0x80, 0x4A, \r
-0xEF, 0x64, 0x01, 0x70, 0x1D, 0x11, 0xBA, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0x8F, 0x4C, 0x11, \r
-0xB8, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0x8F, 0x4A, 0x11, 0xB8, 0x30, 0xE2, 0x02, 0x7F, 0x01, \r
-0x80, 0x23, 0x90, 0x8D, 0x06, 0xE0, 0x64, 0x03, 0x70, 0x20, 0x11, 0xB1, 0x30, 0xE0, 0x02, 0x7F, \r
-0x01, 0x90, 0x8F, 0x4C, 0x11, 0xAF, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0x8F, 0x4A, 0x11, 0xAF, \r
-0x30, 0xE2, 0x02, 0x7F, 0x01, 0x90, 0x8F, 0x4B, 0xEF, 0xF0, 0x90, 0x8F, 0x2E, 0xE0, 0x54, 0xEF, \r
-0xF0, 0xE4, 0x90, 0x91, 0x33, 0xF0, 0x90, 0x91, 0x3B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, \r
-0x90, 0x91, 0x3F, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x91, 0x37, 0x12, 0x08, 0x79, \r
-0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0x73, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x22, 0xEF, \r
-0xF0, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x22, 0xEF, 0xF0, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, \r
-0x22, 0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x22, 0x90, 0x8F, 0x2E, 0xE0, 0xFF, 0xC4, \r
-0x54, 0x0F, 0x30, 0xE0, 0x05, 0x12, 0x93, 0x31, 0x11, 0x7A, 0x22, 0x90, 0x93, 0xAB, 0xEC, 0xF0, \r
-0xA3, 0xED, 0xF0, 0x90, 0x93, 0xA9, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xCF, 0xF0, \r
-0xEF, 0x24, 0x24, 0xFF, 0xE4, 0x3E, 0xFE, 0xC0, 0x06, 0x71, 0x65, 0xD0, 0x06, 0xE4, 0xFB, 0xFA, \r
-0x71, 0x39, 0x4E, 0x60, 0x42, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x93, 0xD0, 0x12, 0x5F, 0x1A, 0x90, \r
-0x93, 0xAE, 0x71, 0x45, 0x90, 0x93, 0xAE, 0x71, 0x50, 0xFE, 0xC3, 0x9F, 0x50, 0x29, 0x90, 0x93, \r
-0xD1, 0xE0, 0x24, 0x02, 0xFD, 0x90, 0x93, 0xD0, 0xE0, 0x34, 0x00, 0xFC, 0xEE, 0x7E, 0x00, 0x2D, \r
-0x12, 0x5C, 0xF8, 0x90, 0x93, 0xAD, 0xE0, 0x24, 0xAF, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, \r
-0xEF, 0xF0, 0x12, 0x65, 0x73, 0x80, 0xCD, 0x71, 0x57, 0xFE, 0xC0, 0x06, 0x71, 0x65, 0xD0, 0x06, \r
-0x7B, 0x03, 0x71, 0x36, 0x90, 0x93, 0xAA, 0xE0, 0x24, 0x22, 0x71, 0x5D, 0xFE, 0x90, 0x93, 0xD0, \r
-0x12, 0x5F, 0xE0, 0xEF, 0x20, 0xE4, 0x02, 0x41, 0x1F, 0x90, 0x93, 0xCF, 0xE0, 0x04, 0xF0, 0x71, \r
-0x57, 0xFE, 0xC0, 0x06, 0x71, 0x65, 0xD0, 0x06, 0x7B, 0x30, 0x71, 0x36, 0x4E, 0x60, 0x46, 0xE0, \r
-0x24, 0x08, 0xFF, 0x90, 0x93, 0xD0, 0x12, 0x5F, 0x1A, 0x90, 0x93, 0xD3, 0x71, 0x45, 0x71, 0x4D, \r
-0xC3, 0x9F, 0x50, 0x31, 0x90, 0x93, 0xD1, 0xE0, 0x24, 0x0D, 0xFF, 0x90, 0x93, 0xD0, 0x12, 0x5F, \r
-0x1A, 0x90, 0x93, 0xD2, 0xEF, 0xF0, 0xBF, 0x02, 0x09, 0x90, 0x93, 0xCF, 0xE0, 0x24, 0x20, 0xF0, \r
-0x80, 0x0E, 0x90, 0x93, 0xD2, 0xE0, 0xB4, 0x04, 0x07, 0x90, 0x93, 0xCF, 0xE0, 0x24, 0x40, 0xF0, \r
-0x12, 0x65, 0x69, 0x80, 0xC9, 0x71, 0x57, 0xFE, 0xC0, 0x06, 0x71, 0x65, 0xD0, 0x06, 0x7B, 0xDD, \r
-0x7A, 0x00, 0x7D, 0x01, 0x71, 0x3A, 0x4E, 0x60, 0x4B, 0xE0, 0x24, 0x0C, 0xFF, 0x90, 0x93, 0xD0, \r
-0x12, 0x5F, 0x1A, 0x90, 0x93, 0xD3, 0x71, 0x45, 0x71, 0x4D, 0xC3, 0x9F, 0x50, 0x36, 0x90, 0x93, \r
-0xD1, 0xE0, 0x24, 0x11, 0xFF, 0x90, 0x93, 0xD0, 0x12, 0x5F, 0x1A, 0x90, 0x93, 0xD2, 0xEF, 0xF0, \r
-0xBF, 0x02, 0x09, 0x90, 0x93, 0xCF, 0xE0, 0x24, 0x02, 0xF0, 0x80, 0x0E, 0x90, 0x93, 0xD2, 0xE0, \r
-0xB4, 0x04, 0x07, 0x90, 0x93, 0xCF, 0xE0, 0x24, 0x04, 0xF0, 0x12, 0x65, 0x69, 0x80, 0xC9, 0xE4, \r
-0x90, 0x93, 0xCF, 0xF0, 0x90, 0x91, 0x33, 0xE0, 0x90, 0x04, 0xFD, 0x71, 0x46, 0x90, 0x91, 0x33, \r
-0x71, 0x50, 0xFE, 0xC3, 0x9F, 0x50, 0x65, 0x12, 0x9F, 0x4A, 0xE0, 0xFF, 0x90, 0x93, 0xAE, 0xE0, \r
-0xFE, 0x6F, 0x70, 0x53, 0x90, 0x04, 0xFC, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0xAD, 0xE0, 0x24, 0x53, \r
-0x12, 0x9F, 0xC8, 0xE0, 0xFF, 0x90, 0x93, 0xCF, 0xE0, 0xFD, 0x4F, 0x60, 0x04, 0xED, 0x5F, 0x60, \r
-0x36, 0xEE, 0xFF, 0x7E, 0x00, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAD, 0xE0, 0x75, 0xF0, 0x20, \r
-0xA4, 0x24, 0x73, 0xF9, 0x74, 0x91, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x78, 0xAF, 0x7C, 0x93, 0x7D, \r
-0x01, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x45, 0xC7, 0xEF, 0x70, 0x0C, 0x90, 0x01, 0xC7, 0x74, 0x55, \r
-0xF0, 0x7F, 0x01, 0x71, 0xCF, 0x11, 0xCA, 0x12, 0x65, 0x73, 0x80, 0x91, 0x22, 0x90, 0x93, 0xD4, \r
-0x12, 0x97, 0xE4, 0xA3, 0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0xC3, 0x90, 0x93, 0xDA, 0xE0, 0x94, 0x01, \r
-0x90, 0x93, 0xD9, 0xE0, 0x94, 0x00, 0x50, 0x02, 0x80, 0x78, 0xE4, 0x90, 0x93, 0xDD, 0xF0, 0xA3, \r
-0xF0, 0x71, 0x7A, 0xFF, 0xE4, 0xFD, 0x12, 0x5C, 0xFE, 0x90, 0x93, 0xD7, 0xE0, 0x70, 0x03, 0xA3, \r
-0xE0, 0x6F, 0x70, 0x1B, 0x90, 0x93, 0xD5, 0xE0, 0x24, 0x02, 0x12, 0x98, 0x1C, 0xFE, 0x90, 0x93, \r
-0xD6, 0xE0, 0xFD, 0x12, 0x9D, 0x8A, 0xBF, 0x01, 0x04, 0x71, 0x7A, 0xFF, 0x22, 0x80, 0x00, 0x90, \r
-0x93, 0xD5, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x93, 0xD4, 0x12, 0x5F, 0x1A, 0x7E, 0x00, 0x90, 0x93, \r
-0xDB, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x02, 0xFF, 0xEE, 0x33, 0xFE, 0x90, 0x93, 0xD4, 0x8F, \r
-0xF0, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xDD, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xD9, \r
-0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x90, 0x93, 0xDE, 0xE0, 0x9F, 0x90, 0x93, 0xDD, 0xE0, 0x9E, \r
-0x40, 0x8F, 0xE4, 0xFE, 0xFF, 0x22, 0x7A, 0x00, 0xE4, 0xFD, 0x51, 0x9D, 0x90, 0x93, 0xD0, 0xEE, \r
-0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x22, 0x90, 0x93, 0xD3, \r
-0xE0, 0xFF, 0x90, 0x93, 0xAD, 0xE0, 0x22, 0x90, 0x93, 0xAA, 0xE0, 0x24, 0x24, 0xFF, 0x90, 0x93, \r
-0xA9, 0xE0, 0x34, 0x00, 0x22, 0x90, 0x93, 0xAC, 0xE0, 0x24, 0xDC, 0xFE, 0x90, 0x93, 0xAB, 0xE0, \r
-0x34, 0xFF, 0x90, 0x93, 0xD9, 0xF0, 0xA3, 0xCE, 0xF0, 0x22, 0x90, 0x93, 0xD4, 0xE0, 0xFE, 0xA3, \r
-0xE0, 0x22, 0x71, 0x86, 0x01, 0xCA, 0x90, 0x8F, 0x2E, 0x12, 0x9F, 0xD0, 0x30, 0xE0, 0x02, 0x71, \r
-0x92, 0x22, 0x91, 0x11, 0xE4, 0x90, 0x93, 0x83, 0x12, 0x4F, 0x9F, 0x90, 0x90, 0xDD, 0x12, 0x4F, \r
-0x9F, 0xA3, 0x12, 0x4F, 0x9F, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x90, 0xEF, 0xF0, 0xA3, 0xF0, 0x90, \r
-0x91, 0x31, 0xF0, 0xA3, 0xF0, 0x22, 0x12, 0x9E, 0x6E, 0x90, 0x94, 0xB2, 0xE0, 0x64, 0x01, 0xF0, \r
-0xE0, 0x24, 0xB6, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x73, 0xA3, 0x12, 0x5D, 0xA9, 0x01, 0xDB, 0x90, \r
-0x95, 0x8D, 0xEF, 0xF0, 0x90, 0x8D, 0x06, 0xE0, 0x64, 0x02, 0x70, 0x22, 0x90, 0x95, 0x8D, 0xE0, \r
-0xFD, 0x64, 0x01, 0x70, 0x28, 0x12, 0x5F, 0xD8, 0x90, 0x8F, 0x32, 0xE0, 0x91, 0x1B, 0x30, 0xE0, \r
-0x09, 0x90, 0x01, 0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x80, 0x13, 0xAF, 0x05, 0x80, 0x0C, 0x90, 0x06, \r
-0x90, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x95, 0x8D, 0xE0, 0xFF, 0x12, 0x4C, 0x94, 0x12, 0x9A, 0x19, \r
-0xF0, 0x90, 0x8F, 0x2E, 0xE0, 0x54, 0xBF, 0xF0, 0x22, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, \r
-0x01, 0x22, 0xF1, 0xCB, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x7F, 0x90, 0x8E, 0x84, 0xF0, 0xEF, 0x91, \r
-0x1B, 0xA3, 0xB1, 0xC9, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x8E, 0x82, 0xE0, 0x54, \r
-0xF0, 0x4E, 0xF1, 0x82, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0x8E, 0x80, 0xE0, 0x54, 0xFD, 0x4E, \r
-0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x12, 0x7F, 0x0A, 0x4F, 0xF1, 0x7A, 0x90, 0x8E, \r
-0x83, 0xF0, 0x91, 0xF8, 0x30, 0xE0, 0x4D, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, 0x90, \r
-0x8E, 0x96, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x25, 0x74, 0x03, 0xF0, 0x91, 0xF2, 0xE9, 0x24, 0x06, \r
-0xF1, 0xD8, 0xFF, 0x74, 0x03, 0x24, 0xFD, 0xFE, 0xEF, 0xC4, 0x54, 0x0F, 0xFD, 0xEF, 0x54, 0x0F, \r
-0xFF, 0xED, 0x2E, 0x54, 0x0F, 0xFE, 0xC4, 0x54, 0xF0, 0x4F, 0x12, 0x06, 0xCF, 0x91, 0xF2, 0x91, \r
-0xF8, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x8E, 0x8C, 0x50, 0x05, 0x74, 0x04, 0xF0, \r
-0x80, 0x02, 0xEF, 0xF0, 0x91, 0xF2, 0xF1, 0xC5, 0xFD, 0x7F, 0x02, 0x12, 0x53, 0xDC, 0x90, 0x94, \r
-0xD0, 0xE0, 0x60, 0x03, 0x12, 0x53, 0xD0, 0x91, 0xF2, 0x90, 0x93, 0xAE, 0x12, 0x44, 0x12, 0x12, \r
-0x9A, 0x20, 0x90, 0x8E, 0x84, 0xE0, 0xFF, 0x12, 0x6C, 0x2D, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x11, \r
-0x90, 0x93, 0xAE, 0x12, 0x44, 0x09, 0xB1, 0xCA, 0x54, 0x0F, 0xFF, 0xF1, 0x7B, 0xFD, 0x12, 0x9A, \r
-0xAB, 0x22, 0x90, 0x93, 0xAB, 0x02, 0x44, 0x09, 0x90, 0x00, 0x06, 0x02, 0x06, 0xA2, 0x90, 0x95, \r
-0x1C, 0x12, 0x44, 0x12, 0x12, 0x06, 0x89, 0x90, 0x95, 0x21, 0xB1, 0xC9, 0x90, 0x95, 0x22, 0xF1, \r
-0xC4, 0x90, 0x95, 0x23, 0xF1, 0xD1, 0x90, 0x95, 0x24, 0xF0, 0x91, 0xF8, 0x90, 0x95, 0x25, 0xF0, \r
-0x90, 0x00, 0x07, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x26, 0xF1, 0x82, 0x90, 0x95, 0x29, 0xF0, 0xED, \r
-0x70, 0x19, 0xFF, 0xD1, 0xA8, 0xE0, 0xB4, 0xFF, 0x06, 0xD1, 0xA8, 0xE4, 0xF0, 0x80, 0x07, 0xD1, \r
-0xA8, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x06, 0xE8, 0x90, 0x95, 0x20, 0xE0, 0xFF, \r
-0xB4, 0x04, 0x14, 0xA3, 0xE0, 0xFE, 0xB1, 0xC2, 0xEE, 0xF1, 0xE7, 0xFE, 0xB1, 0xC2, 0x12, 0x90, \r
-0x4B, 0x90, 0x00, 0x02, 0xE4, 0x80, 0x20, 0xEF, 0xB4, 0x02, 0x1F, 0x90, 0x95, 0x22, 0xB1, 0xC0, \r
-0xEF, 0xF1, 0xE7, 0x44, 0x20, 0x54, 0x7F, 0xB1, 0xC1, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x06, 0xE1, \r
-0x90, 0x95, 0x21, 0xE0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xE1, 0xB1, 0xC2, 0xE9, 0x24, 0x03, 0xF1, \r
-0xD8, 0x44, 0x20, 0x12, 0x06, 0xCF, 0x90, 0x95, 0x23, 0xB1, 0xC0, 0x90, 0x00, 0x04, 0xEF, 0x12, \r
-0x06, 0xE1, 0x90, 0x95, 0x24, 0xE0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xE1, 0x90, 0x95, 0x25, 0xE0, \r
-0x90, 0x00, 0x06, 0x12, 0x06, 0xE1, 0x90, 0x95, 0x26, 0xE0, 0x90, 0x00, 0x07, 0x02, 0x06, 0xE1, \r
-0xE0, 0xFF, 0x90, 0x95, 0x1C, 0x02, 0x44, 0x09, 0x4E, 0xF0, 0x90, 0x00, 0x01, 0x02, 0x06, 0xA2, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0xCB, 0x12, 0x06, 0x89, 0x20, 0xE0, 0x05, 0x12, \r
-0x91, 0x02, 0xC1, 0xA3, 0x90, 0x90, 0x01, 0x74, 0x05, 0xF0, 0x12, 0x86, 0x25, 0x90, 0x8F, 0x31, \r
-0x12, 0x87, 0xE5, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x8F, 0x31, 0x12, 0x9E, 0xAA, 0x54, \r
-0x10, 0xFD, 0xEF, 0x54, 0xEF, 0xF1, 0xDF, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x12, 0x9E, 0xB2, \r
-0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0xF1, 0xDF, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0xB1, 0xC8, \r
-0x54, 0x80, 0xFF, 0x90, 0x8F, 0x32, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x12, 0x06, 0x89, 0x13, 0x13, \r
-0x54, 0x3F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x04, 0xF0, 0x91, 0xF2, 0x12, 0x06, \r
-0x89, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x08, 0xF0, \r
-0x90, 0x8D, 0x06, 0xE0, 0xB4, 0x02, 0x09, 0x90, 0x8F, 0x32, 0xE0, 0x91, 0x1B, 0x20, 0xE0, 0x35, \r
-0xB1, 0xCA, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x32, 0xE0, 0x54, 0x80, 0x4F, 0xF1, 0x7A, 0x90, 0x8F, \r
-0x33, 0xF1, 0x82, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0x34, 0x12, 0x86, 0x1D, 0x54, 0xFE, 0xFF, \r
-0xEE, 0x54, 0x01, 0x4F, 0xF0, 0x12, 0x4D, 0x34, 0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, \r
-0x7D, 0x01, 0x12, 0x4A, 0xA6, 0x90, 0x8D, 0x06, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, \r
-0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, \r
-0xF5, 0x83, 0x22, 0x12, 0x06, 0x89, 0x90, 0x06, 0x74, 0xB1, 0xC9, 0x90, 0x06, 0x75, 0xF1, 0x7A, \r
-0x90, 0x06, 0x76, 0xF1, 0x82, 0x90, 0x06, 0x77, 0xF0, 0x90, 0x06, 0x70, 0xEF, 0xF0, 0xA3, 0xE4, \r
-0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90, \r
-0x94, 0x09, 0x12, 0x9F, 0xA0, 0x90, 0x94, 0x0A, 0x12, 0x56, 0xE5, 0xF1, 0x54, 0x24, 0x02, 0xF1, \r
-0x69, 0x24, 0x04, 0xF1, 0x4B, 0x24, 0x03, 0xF1, 0x69, 0x24, 0x08, 0xF1, 0x4B, 0x24, 0x04, 0xF1, \r
-0x69, 0x24, 0x0C, 0xF1, 0x4B, 0x24, 0x05, 0xFF, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x0D, 0xD1, 0xB3, \r
-0x90, 0x94, 0x09, 0xE0, 0xFE, 0x44, 0x10, 0x90, 0x94, 0x0D, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0xA3, \r
-0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x7B, 0x01, 0x7A, 0x94, 0x79, \r
-0x0D, 0xD1, 0xB3, 0x90, 0x94, 0x0D, 0x12, 0x4F, 0x9D, 0xF1, 0x60, 0x04, 0xFF, 0x7B, 0x01, 0x7A, \r
-0x94, 0x79, 0x0D, 0xD1, 0xB3, 0x90, 0x06, 0x72, 0xE4, 0xF0, 0x22, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, \r
-0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x0D, 0x12, 0x35, 0x26, \r
-0x90, 0x94, 0x09, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x22, 0xFF, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x0D, \r
-0xD1, 0xB3, 0x90, 0x94, 0x0A, 0x12, 0x44, 0x09, 0xE9, 0x22, 0xF0, 0x90, 0x00, 0x02, 0x02, 0x06, \r
-0xA2, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x02, 0x06, 0xA2, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, 0x12, \r
-0x06, 0x89, 0x25, 0x51, 0x90, 0x8D, 0x07, 0xB1, 0xC9, 0x25, 0x51, 0x90, 0x8D, 0x08, 0xF1, 0x7A, \r
-0x25, 0x51, 0x90, 0x8D, 0x09, 0xF1, 0x82, 0x25, 0x51, 0x90, 0x8D, 0x0A, 0xF1, 0xC4, 0x25, 0x51, \r
-0x90, 0x8D, 0x0B, 0xF1, 0xD1, 0x25, 0x51, 0x90, 0x8D, 0x0C, 0xF0, 0x91, 0xF8, 0x25, 0x51, 0x90, \r
-0x8D, 0x0D, 0xF0, 0x22, 0xF0, 0x90, 0x00, 0x04, 0x02, 0x06, 0xA2, 0x90, 0x93, 0xAB, 0x02, 0x44, \r
-0x12, 0xF0, 0x90, 0x00, 0x05, 0x02, 0x06, 0xA2, 0xF9, 0xE4, 0x3A, 0xFA, 0x02, 0x06, 0x89, 0x4D, \r
-0xFF, 0x90, 0x8F, 0x31, 0xF0, 0xEE, 0x22, 0x12, 0x06, 0xCF, 0x90, 0x95, 0x22, 0xE0, 0x22, 0xC0, \r
+0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x41, 0x95, 0x1A, 0x00, 0x41, 0x95, 0x1B, 0x00, 0x41, \r
+0x95, 0x2C, 0x00, 0x41, 0x94, 0x6F, 0x00, 0x41, 0x94, 0x51, 0x00, 0x44, 0x95, 0x0D, 0x00, 0x50, \r
+0xF2, 0x01, 0x00, 0x4B, 0xAE, 0x60, 0x04, 0x67, 0xFC, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF1, 0xDF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xF5, 0xEF, 0xF0, 0x90, 0x94, 0xF7, 0xEB, 0xF0, 0xED, 0x60, \r
+0x02, 0x21, 0xF7, 0x90, 0x07, 0x6E, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, \r
+0xF0, 0x90, 0x94, 0xF7, 0xE0, 0x70, 0x3B, 0xB1, 0x58, 0xD1, 0x21, 0x70, 0x2F, 0x12, 0xA1, 0x20, \r
+0x70, 0x13, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0x74, 0x02, 0xFE, 0x91, 0xFE, 0x7F, 0x64, 0x51, 0x4E, \r
+0xEF, 0x54, 0xFE, 0x80, 0x12, 0x12, 0x37, 0x4E, 0xE4, 0xFE, 0x74, 0x80, 0xFF, 0xE4, 0x91, 0xFE, \r
+0x7F, 0x64, 0x51, 0x4E, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x64, 0x31, 0x39, 0x7F, 0x4E, 0xD1, 0x81, \r
+0x41, 0x40, 0xB1, 0x58, 0xD1, 0x21, 0x70, 0x06, 0xD1, 0x2F, 0xFF, 0xFE, 0x91, 0xFE, 0xD1, 0x38, \r
+0xB1, 0x63, 0x44, 0x01, 0xFD, 0x7F, 0x4F, 0x31, 0x39, 0x7F, 0x30, 0xD1, 0x31, 0x74, 0x66, 0xFF, \r
+0xEC, 0x12, 0x61, 0x5B, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x2C, 0x7E, 0x09, 0x12, \r
+0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0xEF, 0x44, 0x01, 0xFF, 0xEC, 0x12, 0x61, 0x5B, 0x7F, 0x2C, \r
+0x7E, 0x09, 0x12, 0x38, 0x45, 0x80, 0x52, 0x90, 0x07, 0x6E, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x07, \r
+0x65, 0xE0, 0x44, 0x18, 0xF0, 0x90, 0x94, 0xF5, 0xE0, 0x70, 0x33, 0x90, 0x94, 0xF7, 0xE0, 0x60, \r
+0x09, 0xB1, 0x58, 0x31, 0x39, 0xD1, 0x2F, 0xFF, 0x80, 0x21, 0x7F, 0x67, 0x51, 0x4E, 0xEF, 0x54, \r
+0xDF, 0xFD, 0x7F, 0x67, 0x31, 0x39, 0x12, 0xA1, 0x20, 0x70, 0x0B, 0x12, 0x37, 0x4E, 0xE4, 0x74, \r
+0x80, 0xFF, 0x74, 0x02, 0x80, 0x05, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0x91, 0xFE, 0xD1, 0x38, \r
+0xB1, 0x63, 0x54, 0xFE, 0xFD, 0x7F, 0x4F, 0x31, 0x39, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xE0, 0x90, 0x95, 0x26, 0xF1, 0xDF, \r
+0x90, 0x95, 0x26, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x90, 0x95, 0x21, 0xED, 0xF0, 0x90, 0x95, 0x20, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x41, \r
+0x7F, 0x47, 0x71, 0x0F, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x47, 0x31, \r
+0x39, 0x7F, 0x46, 0x71, 0x0F, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x46, 0xD1, \r
+0x28, 0x60, 0x0D, 0x7F, 0x45, 0x71, 0x0F, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x0C, \r
+0x7F, 0x45, 0x71, 0x0F, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x45, 0x80, \r
+0x45, 0x90, 0x95, 0x20, 0xE0, 0x24, 0xF8, 0xF0, 0x7F, 0x63, 0x71, 0x0F, 0x80, 0x02, 0xC3, 0x33, \r
+0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x63, 0x31, 0x39, 0x7F, 0x62, 0x71, 0x0F, 0x80, 0x02, 0xC3, \r
+0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x62, 0xD1, 0x28, 0x60, 0x0E, 0x71, 0x0D, 0x80, 0x02, 0xC3, \r
+0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x61, 0x80, 0x0D, 0x71, 0x0D, 0x80, 0x02, 0xC3, 0x33, 0xD8, \r
+0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x61, 0x31, 0x39, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x61, 0x51, \r
+0x4E, 0x90, 0x95, 0x20, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x22, 0x7F, 0xFF, 0x12, 0x53, \r
+0xD9, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0xFA, 0x7D, 0x01, 0x31, 0x4D, 0x12, 0x8F, \r
+0xD0, 0x71, 0x68, 0x71, 0x55, 0x71, 0x55, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x31, 0x39, 0x90, 0x01, \r
+0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x31, 0x39, 0x7F, 0x02, 0x51, 0x4E, \r
+0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x31, 0x39, 0x7F, 0x02, 0x51, 0x4E, 0xEF, 0x22, 0x7F, 0x54, \r
+0x51, 0x4E, 0xE5, 0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, 0x51, 0x4E, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, \r
+0x7F, 0x56, 0x51, 0x4E, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0x51, 0x4E, 0xE5, 0x10, 0x5F, \r
+0xF5, 0x14, 0xAD, 0x11, 0x7F, 0x54, 0x31, 0x39, 0xAD, 0x12, 0x7F, 0x55, 0x31, 0x39, 0xAD, 0x13, \r
+0x7F, 0x56, 0x31, 0x39, 0xAD, 0x14, 0x7F, 0x57, 0x31, 0x39, 0x53, 0x91, 0xEF, 0x22, 0x7F, 0x81, \r
+0x51, 0x4E, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81, 0x31, 0x39, 0x7F, 0x80, 0xD1, 0x81, 0xFD, 0x7F, \r
+0x80, 0x31, 0x39, 0x12, 0x8B, 0xA5, 0x12, 0x3E, 0x11, 0xF1, 0xF7, 0x12, 0x8C, 0x07, 0x7F, 0x01, \r
+0x12, 0x47, 0x00, 0x90, 0x93, 0x27, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x47, 0x00, 0x90, 0x93, 0x27, \r
+0xE0, 0x04, 0xF0, 0x91, 0x13, 0x12, 0x88, 0xCC, 0x7F, 0x80, 0xF1, 0xBA, 0x7F, 0x80, 0x31, 0x39, \r
+0x75, 0x28, 0xFF, 0x12, 0x5F, 0xFD, 0x12, 0x8B, 0xCC, 0x12, 0x90, 0x33, 0x7F, 0x81, 0x51, 0x4E, \r
+0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x31, 0x39, 0x12, 0x8C, 0x11, 0x12, 0x90, 0x5E, 0xE4, 0xFF, \r
+0x02, 0x47, 0x89, 0xF1, 0xC1, 0x90, 0x8D, 0x06, 0xEF, 0xF0, 0xD1, 0x40, 0x90, 0x01, 0x64, 0x74, \r
+0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x17, 0x51, 0x4E, 0xEF, 0x54, 0xFC, \r
+0x44, 0x04, 0xFD, 0x7F, 0x17, 0x31, 0x39, 0x7F, 0x16, 0x51, 0x4E, 0xEF, 0x54, 0x0F, 0x44, 0x40, \r
+0xFD, 0x7F, 0x16, 0x31, 0x39, 0x7F, 0x38, 0xF1, 0xBA, 0x7F, 0x38, 0x31, 0x39, 0x02, 0x37, 0x99, \r
+0xAD, 0x07, 0x90, 0x8E, 0xC9, 0xE0, 0x75, 0xF0, 0x40, 0xA4, 0xFF, 0x90, 0x95, 0x09, 0xE5, 0xF0, \r
+0x12, 0xA1, 0x31, 0x90, 0x8E, 0xCA, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x95, 0x0C, 0xF0, 0xED, \r
+0x64, 0x01, 0x70, 0x70, 0x90, 0x95, 0x09, 0xE0, 0x70, 0x02, 0xA3, 0xE0, 0x60, 0x0B, 0x90, 0x95, \r
+0x09, 0x74, 0xFF, 0x75, 0xF0, 0xD0, 0x12, 0x08, 0xD6, 0x91, 0xF0, 0x13, 0x54, 0x07, 0x7D, 0x00, \r
+0x20, 0xE0, 0x02, 0x7D, 0x01, 0x51, 0x6A, 0x91, 0xF0, 0x13, 0x54, 0x01, 0xFD, 0x51, 0x6A, 0x90, \r
+0x8E, 0xCA, 0xE0, 0x30, 0xE0, 0x3E, 0x91, 0xE5, 0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, \r
+0x7D, 0x01, 0x51, 0x6A, 0xE4, 0x90, 0x95, 0x0B, 0xF0, 0x90, 0x95, 0x0C, 0xE0, 0xFF, 0x90, 0x95, \r
+0x0B, 0xE0, 0xC3, 0x9F, 0x50, 0x1E, 0x91, 0xE5, 0x13, 0x54, 0x01, 0xFD, 0x51, 0x6A, 0x91, 0xE5, \r
+0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x51, 0x6A, 0x90, 0x95, 0x0B, 0xE0, \r
+0x04, 0xF0, 0x80, 0xD5, 0x22, 0x90, 0x95, 0x09, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x3E, 0x50, \r
+0x90, 0x8E, 0xC8, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8E, 0xC7, 0xE0, 0xFE, 0xC4, 0x22, 0xEC, 0x90, \r
+0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x02, 0x38, 0x45, 0x90, 0x8E, 0x12, 0xE0, \r
+0x44, 0x10, 0xF0, 0x90, 0x8E, 0x20, 0xE0, 0xFD, 0x7F, 0x93, 0x31, 0x39, 0x90, 0x8E, 0x16, 0xE0, \r
+0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, \r
+0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x51, 0x4E, 0xEF, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x31, 0x39, \r
+0x7F, 0x01, 0x12, 0x60, 0xA4, 0x7F, 0x90, 0x51, 0x4E, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x31, \r
+0x39, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x7F, 0x67, 0x51, 0x4E, 0xEF, 0x44, 0x20, 0xFD, \r
+0x7F, 0x67, 0x22, 0xFD, 0x7F, 0x4E, 0x31, 0x39, 0x7F, 0x4F, 0x51, 0x4E, 0xEF, 0x22, 0x90, 0x01, \r
+0x30, 0xE4, 0xB1, 0xB3, 0x90, 0x01, 0x38, 0xB1, 0xB3, 0xFD, 0x7F, 0x50, 0x31, 0x39, 0xE4, 0xFD, \r
+0x7F, 0x51, 0x31, 0x39, 0xE4, 0xFD, 0x7F, 0x52, 0x31, 0x39, 0xE4, 0xFD, 0x7F, 0x53, 0x21, 0x39, \r
+0x90, 0x01, 0x34, 0x74, 0xFF, 0xB1, 0xB3, 0x90, 0x01, 0x3C, 0xB1, 0xB3, 0xFD, 0x7F, 0x54, 0x31, \r
+0x39, 0x7D, 0xFF, 0x7F, 0x55, 0x31, 0x39, 0x7D, 0xFF, 0x7F, 0x56, 0x31, 0x39, 0x7D, 0xFF, 0x7F, \r
+0x57, 0x21, 0x39, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
+0xC0, 0xD0, 0xD1, 0x1B, 0x30, 0xE6, 0x1B, 0x90, 0x00, 0x8C, 0xE0, 0xF5, 0x26, 0x7F, 0x8D, 0x51, \r
+0x4E, 0x90, 0x00, 0x8E, 0xE0, 0xF5, 0x27, 0xD1, 0x1B, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0x7F, 0x8D, \r
+0x31, 0x39, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, \r
+0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, \r
+0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0xF1, 0xFA, 0xE4, 0xFD, 0x31, 0x4D, 0x71, 0x68, 0x44, \r
+0x01, 0xFD, 0x7F, 0x02, 0x31, 0x39, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x8F, 0x51, 0x4E, 0xEF, \r
+0x22, 0x31, 0x39, 0x90, 0x94, 0xF5, 0xE0, 0x22, 0x31, 0x39, 0x90, 0x95, 0x21, 0xE0, 0x22, 0x7F, \r
+0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0x22, 0x7F, 0x4E, 0x51, 0x4E, 0xEF, 0x54, 0x7F, 0x22, \r
+0xB1, 0x6E, 0xB1, 0x90, 0x12, 0x8B, 0x67, 0x12, 0x8B, 0x86, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, \r
+0x0F, 0x75, 0x10, 0x80, 0xAD, 0x0D, 0x7F, 0x50, 0x31, 0x39, 0xAD, 0x0E, 0x7F, 0x51, 0x31, 0x39, \r
+0xAD, 0x0F, 0x7F, 0x52, 0x31, 0x39, 0xAD, 0x10, 0x7F, 0x53, 0x21, 0x39, 0x12, 0xA1, 0x39, 0x7F, \r
+0xF2, 0x51, 0x4E, 0xEF, 0x20, 0xE6, 0x09, 0x7F, 0x05, 0xD1, 0x81, 0xFD, 0x7F, 0x05, 0x31, 0x39, \r
+0x22, 0x51, 0x4E, 0xEF, 0x44, 0x80, 0x22, 0x12, 0x79, 0x62, 0xE4, 0x90, 0x93, 0x22, 0xB1, 0xB3, \r
+0x90, 0x90, 0x74, 0xB1, 0xB3, 0xA3, 0xB1, 0xB3, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x90, 0x86, 0xF0, \r
+0xA3, 0xF0, 0x90, 0x90, 0xC8, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x8E, 0x17, 0xE0, 0x90, 0x94, 0x6B, \r
+0xF0, 0x7D, 0x02, 0x7F, 0x02, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x2D, 0xEF, \r
+0xF0, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, 0x01, 0xFF, 0x90, \r
+0x8E, 0x11, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x80, 0x0C, 0x90, 0x8E, 0x18, 0xED, 0xF0, 0x80, 0x05, \r
+0x90, 0x8E, 0x17, 0xED, 0xF0, 0xD1, 0x1B, 0x30, 0xE4, 0x30, 0x90, 0x95, 0x2D, 0xE0, 0x14, 0x60, \r
+0x07, 0x14, 0x60, 0x1D, 0x24, 0x02, 0x70, 0x22, 0x90, 0x8E, 0x11, 0xE0, 0x54, 0x01, 0xC4, 0x33, \r
+0x33, 0x33, 0x54, 0x80, 0xFF, 0x90, 0x8E, 0x18, 0xE0, 0x54, 0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80, \r
+0x07, 0x90, 0x8E, 0x17, 0xE0, 0xFD, 0x7F, 0x89, 0x31, 0x39, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7E, \r
+0x00, 0x7F, 0xA8, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0x11, 0x12, 0x08, 0xAA, 0x12, 0x89, \r
+0xB2, 0x12, 0x08, 0xAA, 0x90, 0x8E, 0x14, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x1B, 0x14, 0x12, 0xA1, \r
+0x80, 0x90, 0x8E, 0x21, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x12, 0xA0, 0x26, 0xE4, 0xFD, 0xFF, \r
+0xD1, 0xB5, 0x7D, 0x0C, 0x7F, 0x02, 0xD1, 0xB5, 0xF1, 0xD9, 0x90, 0x8D, 0x06, 0xE0, 0xFF, 0xB4, \r
+0x01, 0x08, 0x90, 0x8E, 0x20, 0x74, 0xDD, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x8E, 0x20, 0xB4, 0x03, \r
+0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x79, 0x51, 0x4E, 0xEF, 0x54, 0x03, \r
+0xFF, 0xBF, 0x02, 0x0E, 0x7F, 0x28, 0x51, 0x4E, 0xEF, 0x30, 0xE2, 0x06, 0x90, 0x8E, 0x4B, 0x74, \r
+0x02, 0xF0, 0x12, 0x7F, 0x83, 0x12, 0xA0, 0x26, 0x7F, 0x01, 0x12, 0x9D, 0x05, 0x7E, 0x00, 0x7F, \r
+0x02, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xBD, 0x12, 0x08, 0xAA, 0x12, 0x67, 0xF4, 0x12, \r
+0xA1, 0x29, 0xF1, 0xE9, 0xE4, 0x90, 0x8E, 0xBF, 0xF0, 0x22, 0x51, 0x4E, 0xEF, 0x44, 0x40, 0xFD, \r
+0x22, 0x7F, 0xF4, 0x51, 0x4E, 0xEF, 0x20, 0xE5, 0x0D, 0x7F, 0xF4, 0x51, 0x4E, 0xEF, 0x7F, 0x01, \r
+0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, 0x7D, 0x0C, 0x7F, 0x01, 0xC1, 0xB5, 0xF0, \r
+0x7F, 0x10, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0xB1, 0xE7, 0xE4, 0xFD, 0xFF, 0x02, 0x53, 0xD9, 0xF1, \r
+0xE7, 0x7D, 0x0C, 0x7F, 0x01, 0xC1, 0xB5, 0x22, 0xA1, 0xBB, 0x90, 0x8E, 0xE2, 0xE0, 0xFF, 0x90, \r
+0x8E, 0xE1, 0xE0, 0xFB, 0x90, 0x8E, 0xE3, 0xE0, 0x90, 0x94, 0xF8, 0xF0, 0x22, 0x90, 0x94, 0xE3, \r
+0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
+0x94, 0xDE, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x94, 0xE2, 0xE0, 0xF5, 0x3B, 0xA3, 0xE0, 0xF5, \r
+0x3C, 0x12, 0x36, 0x3E, 0x90, 0x94, 0xDE, 0x12, 0xA1, 0x17, 0xA3, 0xA3, 0xA3, 0x74, 0x05, 0xF0, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x94, 0xE9, 0xF0, 0x7F, 0x03, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xE4, 0xEF, 0xF0, 0x12, 0x90, 0x4C, 0x90, 0x94, 0xE4, 0xE0, 0xFF, \r
+0x31, 0x5B, 0x74, 0x01, 0xF0, 0x90, 0x94, 0xE9, 0xE0, 0xFE, 0xEF, 0x31, 0x69, 0xEE, 0xF0, 0x90, \r
+0x94, 0xE4, 0xE0, 0x11, 0xB0, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x11, 0xA5, 0x78, 0x10, \r
+0x12, 0x08, 0x47, 0xAB, 0x07, 0x11, 0xA5, 0x78, 0x08, 0x12, 0x08, 0x47, 0x90, 0x94, 0xE2, 0xEF, \r
+0xF0, 0x11, 0xA5, 0x90, 0x94, 0xE3, 0xEF, 0xF0, 0x7D, 0x01, 0x7F, 0x50, 0x7E, 0x01, 0x11, 0x18, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x94, 0xE5, 0x02, 0x43, 0xE5, 0x90, 0x93, 0x46, 0xE0, 0xFB, \r
+0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0xE4, 0x90, \r
+0x93, 0x46, 0xF0, 0x90, 0x93, 0x46, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x40, 0x02, 0x21, 0x53, 0xEF, \r
+0x31, 0x5B, 0xE0, 0x64, 0x01, 0x70, 0x74, 0x90, 0x93, 0x46, 0xE0, 0x11, 0xB0, 0x12, 0x43, 0xE5, \r
+0xE4, 0x7B, 0x01, 0x31, 0x54, 0x70, 0x3A, 0x90, 0x93, 0x46, 0xE0, 0xFB, 0x31, 0x69, 0xE0, 0x60, \r
+0x21, 0x14, 0x70, 0x57, 0xEB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x94, \r
+0xF5, 0x83, 0x12, 0x43, 0xE5, 0xEB, 0x11, 0xB0, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x46, 0xE0, 0xFF, \r
+0x80, 0x0B, 0x11, 0xAB, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x03, 0x31, 0x77, 0x80, \r
+0x2A, 0x90, 0x93, 0x46, 0xE0, 0x11, 0xB0, 0x12, 0x43, 0xE5, 0xE4, 0xFB, 0x31, 0x54, 0x50, 0x1B, \r
+0x11, 0xAB, 0x12, 0x43, 0xE5, 0xEF, 0x24, 0xFF, 0xFF, 0xEE, 0x34, 0xFF, 0xFE, 0xED, 0x34, 0xFF, \r
+0xFD, 0xEC, 0x34, 0xFF, 0xFC, 0xEB, 0x11, 0xB0, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x46, 0xE0, 0x04, \r
+0xF0, 0x01, 0xC3, 0x22, 0xFA, 0xF9, 0xF8, 0xC3, 0x02, 0x43, 0xD4, 0x75, 0xF0, 0x0A, 0xA4, 0x24, \r
+0x0A, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x09, 0xF5, \r
+0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0xEF, 0x24, 0xFC, 0x60, 0x05, 0x04, 0x70, 0x05, 0x80, \r
+0x04, 0x12, 0x81, 0x22, 0x22, 0xE4, 0x90, 0x93, 0x47, 0xF0, 0x90, 0x94, 0x6F, 0x04, 0xF0, 0x90, \r
+0x06, 0x32, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x93, 0x12, 0x12, 0x43, 0xE5, 0x12, 0xA1, 0x40, 0xE4, \r
+0x3D, 0xFD, 0xE4, 0x3C, 0xFC, 0x90, 0x93, 0x12, 0x12, 0x08, 0x6D, 0x12, 0x9E, 0xFB, 0xE4, 0x90, \r
+0x94, 0x53, 0xF0, 0xFF, 0x12, 0x9F, 0x6D, 0x12, 0x73, 0x13, 0x70, 0x28, 0x31, 0xF3, 0x7F, 0x05, \r
+0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x12, 0x4E, 0xA9, 0x90, 0x8E, 0x18, 0xE0, 0x64, 0x02, 0x60, 0x14, \r
+0x90, 0x93, 0x47, 0xE0, 0x04, 0xF0, 0x12, 0xA1, 0x39, 0x31, 0xF3, 0x90, 0x93, 0x47, 0xE0, 0xD3, \r
+0x94, 0x0A, 0x40, 0xE4, 0x90, 0x94, 0xE5, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x0A, 0x12, 0x83, \r
+0x95, 0x01, 0x4C, 0x7D, 0x01, 0x7F, 0x02, 0x80, 0x04, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x2F, 0xED, 0xF0, 0x90, 0x8E, 0x11, 0xE0, 0xFE, 0xC4, 0x13, \r
+0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x61, 0x47, 0xEE, 0x12, 0x79, 0x1A, 0x30, 0xE0, 0x02, 0x61, \r
+0x47, 0x90, 0x8E, 0x18, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x61, 0x47, 0xEF, 0x70, 0x02, 0x41, 0xBE, \r
+0x24, 0xFE, 0x70, 0x02, 0x41, 0xF8, 0x24, 0xFE, 0x60, 0x4B, 0x24, 0xFC, 0x70, 0x02, 0x61, 0x34, \r
+0x24, 0xFC, 0x60, 0x02, 0x61, 0x47, 0xEE, 0xB4, 0x0E, 0x02, 0x71, 0x67, 0x90, 0x8E, 0x18, 0xE0, \r
+0x70, 0x05, 0x7F, 0x01, 0x12, 0x9B, 0x6C, 0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0x83, \r
+0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x95, 0x2F, 0xE0, 0xFF, 0x60, 0x05, 0x12, 0x9B, \r
+0x11, 0x80, 0x03, 0x12, 0x77, 0x5E, 0x90, 0x8E, 0x18, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x61, 0x47, \r
+0x12, 0x4F, 0xEF, 0x61, 0x47, 0x90, 0x8E, 0x18, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x9B, 0x6C, \r
+0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0x83, 0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x0E, 0x07, \r
+0x71, 0x4C, 0xBF, 0x01, 0x02, 0x71, 0x67, 0x90, 0x8E, 0x18, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x61, \r
+0x47, 0x71, 0x4C, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x61, 0x47, 0x71, 0xA5, 0x61, 0x47, 0x90, 0x8E, \r
+0x18, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0x4C, 0xBF, 0x01, 0x02, 0x71, 0x67, 0x90, 0x8E, 0x18, 0xE0, \r
+0xB4, 0x06, 0x02, 0x71, 0x83, 0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x0C, 0x07, 0x71, 0x4C, 0xBF, 0x01, \r
+0x02, 0x71, 0xA5, 0x90, 0x8E, 0x18, 0xE0, 0x64, 0x04, 0x70, 0x5C, 0x12, 0x9A, 0x5D, 0xEF, 0x64, \r
+0x01, 0x70, 0x54, 0x12, 0x9B, 0x43, 0x80, 0x4F, 0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x0E, 0x07, 0x71, \r
+0x4C, 0xBF, 0x01, 0x02, 0x71, 0x67, 0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0x83, 0x90, \r
+0x8E, 0x18, 0xE0, 0xB4, 0x0C, 0x07, 0x71, 0x4C, 0xBF, 0x01, 0x02, 0x71, 0xA5, 0x90, 0x8E, 0x18, \r
+0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x9B, 0x6C, 0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x04, 0x18, 0x12, \r
+0x9B, 0x5E, 0x80, 0x13, 0x90, 0x8E, 0x18, 0xE0, 0xB4, 0x0C, 0x0C, 0x90, 0x8E, 0x12, 0x12, 0x67, \r
+0xED, 0x30, 0xE0, 0x03, 0x12, 0x9D, 0x2E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x9A, 0x44, 0xBF, \r
+0x01, 0x12, 0x12, 0xA0, 0x70, 0x20, 0xE0, 0x0C, 0x90, 0x8E, 0x17, 0xE0, 0xD3, 0x94, 0x04, 0x50, \r
+0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x8E, 0x12, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, \r
+0x7D, 0x0C, 0x80, 0x05, 0x12, 0xA0, 0x87, 0x7D, 0x04, 0x7F, 0x01, 0x12, 0x4E, 0xB5, 0xE4, 0xFD, \r
+0xFF, 0x80, 0x56, 0x90, 0x8E, 0x12, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x08, 0xE0, 0x44, 0x40, \r
+0xF0, 0x7D, 0x04, 0x80, 0x06, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0x12, 0x4E, 0xB5, \r
+0xE4, 0xFD, 0xFF, 0x80, 0x34, 0x12, 0x73, 0x13, 0x70, 0x25, 0x90, 0x8E, 0x12, 0xE0, 0x54, 0xFD, \r
+0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x71, 0xD9, 0x7D, 0x08, 0x7F, 0x01, 0x12, 0x65, 0x59, 0xBF, 0x01, \r
+0x0E, 0x90, 0x8E, 0x11, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0x12, 0x4E, 0xB5, 0x22, \r
+0xE4, 0xFD, 0x7F, 0x0C, 0x31, 0xFD, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, 0xF0, 0x90, 0x8D, \r
+0x05, 0xED, 0xF0, 0x22, 0x90, 0x93, 0x73, 0x12, 0x44, 0x12, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, \r
+0x84, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x0A, 0x7D, 0x39, 0x12, 0x8F, 0xCB, 0xBF, 0x01, 0x10, \r
+0x80, 0x00, 0x90, 0x93, 0x1A, 0x12, 0x64, 0x32, 0x90, 0x93, 0x81, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0x90, 0x93, 0x81, 0x12, 0x97, 0xC4, 0x90, 0x93, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x81, 0x12, 0x9F, \r
+0xF1, 0x90, 0x93, 0x7F, 0xE0, 0xFD, 0x12, 0x98, 0x0A, 0x90, 0x93, 0x80, 0xE0, 0x60, 0x02, 0x81, \r
+0xBF, 0xD1, 0x8B, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0x76, 0xD1, 0x7A, 0x75, 0x43, \r
+0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0xB1, 0x5D, 0x12, 0x9F, 0xFD, 0xC0, \r
+0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0x73, 0xD1, 0x7A, 0x75, 0x43, 0x10, 0xD0, 0x01, 0xD0, \r
+0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0xB1, 0x5D, 0xD1, 0x8E, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, \r
+0xD1, 0x77, 0x75, 0x43, 0x10, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0xB1, 0x5D, \r
+0x24, 0x60, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xD1, \r
+0x77, 0x75, 0x43, 0x10, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0xB1, 0x5D, 0x24, \r
+0x72, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, \r
+0x7C, 0xD1, 0x7A, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, \r
+0x93, 0x79, 0x12, 0x44, 0x09, 0x90, 0x93, 0xB0, 0x12, 0x44, 0x12, 0x90, 0x93, 0xB3, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x00, 0x20, 0x90, 0x93, 0xB7, 0x74, 0x3A, 0xF0, 0x90, 0x93, 0x73, 0x12, 0x44, \r
+0x09, 0x12, 0x99, 0x40, 0xB1, 0x5D, 0x24, 0x30, 0xF9, 0xE4, 0x34, 0xFC, 0xF1, 0x04, 0x75, 0x43, \r
+0x28, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x85, 0x12, 0x35, 0x26, 0xB1, 0x5D, 0x12, 0xA0, 0xCB, 0xC0, \r
+0x03, 0x8B, 0x40, 0x75, 0x41, 0x8F, 0x75, 0x42, 0x68, 0x75, 0x43, 0x28, 0xD0, 0x03, 0x12, 0x35, \r
+0x26, 0x90, 0x93, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x82, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0x81, 0xE0, \r
+0x34, 0x00, 0xCF, 0x24, 0x30, 0xFD, 0xE4, 0x3F, 0xFC, 0x90, 0x93, 0x1A, 0xE0, 0xFB, 0x7F, 0x3A, \r
+0x12, 0x62, 0x1B, 0xB1, 0x5D, 0x12, 0xA0, 0xCB, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x93, 0x75, \r
+0x42, 0x85, 0x75, 0x43, 0x28, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x02, \r
+0xF0, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0x7D, 0x3A, 0x71, 0xD9, 0x02, 0x58, 0x01, 0x90, 0x93, 0x81, \r
+0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, \r
+0xA9, 0x12, 0x44, 0x12, 0x78, 0xB5, 0x7C, 0x94, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x64, \r
+0xF1, 0xF5, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x94, 0xB4, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x0A, \r
+0x7D, 0x33, 0x12, 0x8F, 0xCB, 0xBF, 0x01, 0x10, 0x80, 0x00, 0x90, 0x93, 0x19, 0x12, 0x64, 0x32, \r
+0x90, 0x94, 0xB1, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x94, 0xB1, 0x12, 0x97, 0xC4, 0x90, 0x94, \r
+0xB3, 0xEF, 0xF0, 0x90, 0x94, 0xB1, 0x12, 0x9F, 0xF1, 0x90, 0x94, 0xAF, 0xE0, 0xFD, 0x12, 0x98, \r
+0x0A, 0x90, 0x94, 0xB0, 0xE0, 0x70, 0x4E, 0xD1, 0x8B, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, \r
+0x94, 0xAC, 0xD1, 0x7A, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0xD1, 0x84, 0xB1, \r
+0x60, 0xF1, 0xEE, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x94, 0xAC, 0xD1, \r
+0x7A, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0xD1, 0x84, 0xB1, 0x60, 0x12, 0x9F, \r
+0xFD, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x94, 0xA9, 0xD1, 0x7A, 0x75, 0x43, 0x04, 0xD0, \r
+0x01, 0xD0, 0x02, 0x80, 0x45, 0x90, 0x94, 0xB0, 0xE0, 0x64, 0x01, 0x70, 0x42, 0xD1, 0x8B, 0xC0, \r
+0x03, 0x8B, 0x40, 0x75, 0x41, 0x8E, 0x75, 0x42, 0xE4, 0x75, 0x43, 0x06, 0xD0, 0x03, 0xD1, 0x84, \r
+0xB1, 0x60, 0xF1, 0xEE, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8E, 0x75, 0x42, \r
+0xEE, 0x75, 0x43, 0x06, 0xD0, 0x03, 0xD1, 0x84, 0xB1, 0x60, 0x12, 0x9F, 0xFD, 0xC0, 0x03, 0x8B, \r
+0x40, 0x75, 0x41, 0x8E, 0x75, 0x42, 0xF4, 0x75, 0x43, 0x04, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, \r
+0x06, 0x30, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x94, 0xB4, 0xE0, 0xFF, 0x7D, 0x34, 0x71, 0xD9, 0x12, \r
+0x58, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x79, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, \r
+0x41, 0x89, 0x42, 0x22, 0x12, 0x35, 0x26, 0x90, 0x94, 0xB1, 0x22, 0xA3, 0xA3, 0xE0, 0x24, 0x38, \r
+0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, 0xF1, 0xC8, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, \r
+0x93, 0x4A, 0x12, 0x97, 0xC4, 0x90, 0x93, 0x4C, 0xEF, 0xF0, 0x90, 0x93, 0x4A, 0xA3, 0xE0, 0x24, \r
+0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xF1, 0x04, 0x75, 0x43, 0x06, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xE4, \r
+0xF1, 0xE7, 0xB1, 0x60, 0x24, 0x3E, 0xF9, 0xE4, 0x34, 0xFC, 0xF1, 0x04, 0x75, 0x43, 0x04, 0x7B, \r
+0x01, 0x7A, 0x8E, 0x79, 0xEA, 0xF1, 0xE7, 0xB1, 0x60, 0xF1, 0xEE, 0xF1, 0x04, 0x75, 0x43, 0x06, \r
+0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xEE, 0xF1, 0xE7, 0xB1, 0x60, 0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, \r
+0xF1, 0x04, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xF4, 0x02, 0x35, 0x26, 0x24, 0x00, \r
+0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x22, 0x90, 0x93, 0x23, 0xF1, \r
+0xC6, 0xEF, 0xF0, 0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, \r
+0x74, 0x29, 0x2E, 0x12, 0x65, 0xC6, 0xFD, 0x90, 0x93, 0x4A, 0xE0, 0x24, 0x2C, 0x12, 0x97, 0xE1, \r
+0x90, 0x93, 0x4A, 0xE0, 0x2F, 0x24, 0x30, 0xA3, 0xF0, 0xE0, 0xFD, 0x24, 0x04, 0x12, 0x66, 0xE7, \r
+0xE0, 0xFE, 0x74, 0x05, 0x2D, 0x12, 0x66, 0xDB, 0x12, 0x84, 0xA3, 0x90, 0x90, 0x7E, 0xF0, 0xA3, \r
+0xEF, 0xF0, 0x90, 0x93, 0x4B, 0xE0, 0x24, 0x0C, 0xF9, 0xE4, 0x34, 0xFC, 0xF1, 0x04, 0x75, 0x43, \r
+0x04, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x80, 0x12, 0x35, 0x26, 0x90, 0x93, 0x4B, 0xE0, 0x24, 0x14, \r
+0xF0, 0xE0, 0xFD, 0x24, 0x01, 0x12, 0x63, 0xE8, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0x12, 0x5A, 0xFC, \r
+0x12, 0x84, 0xA3, 0x90, 0x90, 0x84, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x24, 0xF1, 0xC6, 0xEF, \r
+0xF0, 0x90, 0x90, 0x7A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x4E, 0x60, 0x11, 0x90, 0x93, 0x4A, 0xE0, \r
+0xD1, 0xFE, 0x8F, 0x43, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x88, 0x12, 0x35, 0x26, 0x90, 0x93, 0x25, \r
+0xF1, 0xC6, 0xEF, 0xF0, 0xD1, 0xFE, 0x90, 0x90, 0x7C, 0xA3, 0xE0, 0xF5, 0x43, 0x7B, 0x01, 0x7A, \r
+0x90, 0x79, 0xA8, 0x02, 0x35, 0x26, 0xE0, 0xFF, 0xF1, 0xD3, 0x90, 0x93, 0x4A, 0x22, 0x90, 0x8D, \r
+0xFD, 0xE0, 0xFF, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, \r
+0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0x12, 0x35, 0x26, 0x90, 0x93, 0x4A, 0x22, 0x24, 0x42, \r
+0xF9, 0xE4, 0x34, 0xFC, 0x22, 0x7E, 0x00, 0x7F, 0x06, 0x02, 0x06, 0x63, 0xEE, 0xF0, 0xA3, 0xEF, \r
+0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
+0x93, 0x54, 0x12, 0x96, 0x66, 0x90, 0x93, 0x6C, 0x74, 0x18, 0xF0, 0x7E, 0x00, 0x7F, 0x80, 0x7D, \r
+0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x74, 0x12, 0x08, 0xAA, 0x90, 0x01, 0xC4, 0x74, 0x08, 0xF0, \r
+0x74, 0x58, 0xA3, 0xF0, 0x90, 0x93, 0x1B, 0xE0, 0xFF, 0x12, 0x57, 0xD3, 0x90, 0x93, 0x6B, 0xEF, \r
+0xF0, 0xF9, 0xE0, 0xFE, 0x24, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x41, 0xF0, \r
+0xEE, 0x24, 0x28, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x93, 0x6C, 0xE0, 0x7A, 0x00, 0x2D, 0xFE, 0xEA, \r
+0x3C, 0x90, 0x93, 0x70, 0xF0, 0xA3, 0xCE, 0xF0, 0x74, 0x28, 0x29, 0x12, 0x9F, 0xF5, 0x90, 0x93, \r
+0x56, 0xE0, 0xFD, 0x12, 0x98, 0x0A, 0x12, 0x9F, 0xDD, 0x90, 0x93, 0x70, 0xE0, 0xFF, 0xA3, 0xE0, \r
+0x90, 0x93, 0x6E, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x74, 0x74, 0x01, 0xF0, 0xA3, 0x74, \r
+0x03, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0x74, 0x5F, 0xF0, 0x90, 0x93, 0x70, 0x12, 0x94, 0x41, 0x90, \r
+0x8F, 0xDE, 0xE0, 0xFF, 0x7E, 0x02, 0xB4, 0xFE, 0x02, 0x7E, 0xFE, 0x90, 0x93, 0x70, 0xA3, 0xE0, \r
+0xFD, 0x51, 0xFA, 0xEE, 0xF0, 0x74, 0x00, 0x2D, 0x51, 0xFC, 0xE0, 0x90, 0x93, 0x78, 0xF0, 0x90, \r
+0x93, 0x70, 0x12, 0x61, 0x77, 0x90, 0x90, 0x73, 0xE0, 0x90, 0x93, 0x54, 0xB4, 0x01, 0x0B, 0xE0, \r
+0x44, 0x03, 0xFC, 0xA3, 0xE0, 0x44, 0x10, 0xFD, 0x80, 0x09, 0xE0, 0x44, 0x03, 0xFC, 0xA3, 0xE0, \r
+0x44, 0x20, 0xFD, 0x90, 0x93, 0x72, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x93, 0x79, 0x74, 0x03, \r
+0xF0, 0xA3, 0x74, 0x12, 0xF0, 0x12, 0xA0, 0xB6, 0xEF, 0x64, 0xFE, 0x70, 0x27, 0x90, 0x93, 0x70, \r
+0xA3, 0xE0, 0x24, 0x00, 0x12, 0x9A, 0x24, 0xC0, 0x03, 0x8B, 0x40, 0x12, 0xA0, 0xD5, 0xD0, 0x03, \r
+0x12, 0x35, 0x26, 0x75, 0x40, 0x01, 0x12, 0xA0, 0xD5, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x7B, 0x12, \r
+0x35, 0x26, 0x80, 0x58, 0x90, 0x93, 0x16, 0xE0, 0xFF, 0xB4, 0x02, 0x27, 0x90, 0x93, 0x70, 0xE0, \r
+0xFC, 0xA3, 0xE0, 0xFD, 0x24, 0x00, 0xF5, 0x82, 0x74, 0xFC, 0x3C, 0xF5, 0x83, 0xE4, 0xF0, 0x74, \r
+0x01, 0x2D, 0xF5, 0x82, 0x74, 0xFC, 0x3C, 0xF5, 0x83, 0x74, 0x20, 0x12, 0xA1, 0x58, 0x74, 0x20, \r
+0xF0, 0x80, 0x29, 0xEF, 0xB4, 0x04, 0x25, 0x90, 0x93, 0x70, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x24, \r
+0x00, 0xF5, 0x82, 0x74, 0xFC, 0x3E, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0x74, \r
+0xFC, 0x3E, 0xF5, 0x83, 0x74, 0x10, 0x12, 0xA1, 0x58, 0x74, 0x10, 0xF0, 0x12, 0xA0, 0xB6, 0xE4, \r
+0x90, 0x93, 0x6D, 0xF0, 0x12, 0xA0, 0x07, 0xFE, 0x90, 0x93, 0x70, 0xA3, 0xE0, 0xFD, 0xEF, 0x2D, \r
+0x51, 0xFA, 0xEE, 0xF0, 0x12, 0xA0, 0x07, 0xFE, 0x74, 0x7D, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x93, \r
+0xF5, 0x83, 0xEE, 0xF1, 0xBF, 0xE0, 0xB4, 0x08, 0xDB, 0x12, 0x9F, 0xE7, 0x90, 0x93, 0x70, 0xF1, \r
+0xF6, 0x90, 0x93, 0x70, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6, 0x12, 0x9F, 0xDD, 0xE4, 0x90, \r
+0x93, 0xF7, 0xF0, 0xE4, 0x90, 0x93, 0x6D, 0xF0, 0x12, 0xA0, 0xFC, 0x50, 0x0A, 0x12, 0x8F, 0xAA, \r
+0x51, 0xF9, 0xE4, 0xF1, 0xBF, 0x80, 0xF1, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x06, \r
+0x31, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x93, 0x1C, 0xE0, 0xFD, 0x12, 0x9A, 0x18, 0xCE, 0xC3, 0x13, \r
+0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xAC, 0x7B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xED, 0xFF, 0x90, \r
+0x93, 0x1B, 0xE0, 0xC3, 0x9F, 0xFF, 0xE4, 0x94, 0x00, 0xFE, 0xEF, 0x78, 0x07, 0xC3, 0x33, 0xCE, \r
+0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0x6C, 0xE0, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x3E, 0xCF, \r
+0x24, 0x38, 0xCF, 0x34, 0x00, 0xFE, 0x90, 0xAC, 0x7A, 0x74, 0x10, 0xF0, 0x7B, 0x63, 0xE4, 0xFD, \r
+0x12, 0x39, 0x9C, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x74, 0x90, 0xAC, 0xA0, 0x12, 0x44, 0x12, 0x7A, \r
+0x93, 0x79, 0x57, 0x90, 0xAC, 0xA3, 0x12, 0x44, 0x12, 0x90, 0xAC, 0xA6, 0x74, 0x10, 0xF0, 0x7A, \r
+0x8F, 0x79, 0x9A, 0x12, 0x35, 0x86, 0x90, 0x93, 0xF7, 0xE0, 0x04, 0xF0, 0x90, 0x06, 0x31, 0xE0, \r
+0x30, 0xE2, 0x07, 0x12, 0xA1, 0x50, 0x50, 0x02, 0x21, 0xC3, 0x12, 0xA1, 0x50, 0x40, 0x0A, 0x90, \r
+0x06, 0x35, 0xE0, 0x44, 0x20, 0x90, 0x06, 0x34, 0xF0, 0xE4, 0x90, 0x93, 0x6D, 0xF0, 0x12, 0xA0, \r
+0xFC, 0x50, 0x1C, 0x12, 0x8F, 0xAA, 0x90, 0x93, 0x6D, 0xE0, 0x24, 0x57, 0xF5, 0x82, 0xE4, 0x34, \r
+0x93, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x6B, 0x51, 0xF9, 0xEF, 0xF1, 0xBF, 0x80, 0xDF, 0x90, \r
+0x04, 0x1D, 0xE0, 0x60, 0x22, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, 0xF6, 0xF0, 0x7D, 0x1D, 0x12, \r
+0x8F, 0xCB, 0xBF, 0x01, 0x06, 0x12, 0x64, 0x2F, 0x12, 0xA0, 0x3E, 0x90, 0x93, 0xF6, 0xE0, 0xFF, \r
+0x7D, 0x1E, 0x12, 0x53, 0xD9, 0x80, 0x06, 0x12, 0x64, 0x2F, 0x12, 0xA0, 0x3E, 0x11, 0x01, 0x90, \r
+0x8E, 0x18, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x9B, 0x6C, 0x74, 0x08, 0x04, 0x90, 0x01, 0xC4, \r
+0xF0, 0x74, 0x58, 0xA3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x42, 0x90, 0xA8, 0x04, 0xA9, \r
+0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93, 0x4A, 0xA3, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x93, 0x4A, 0xF0, \r
+0xA3, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x93, 0x26, 0xE0, 0xFF, 0x12, \r
+0x57, 0xD3, 0x7E, 0x00, 0x90, 0x93, 0x4A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x51, 0xFA, 0xE0, 0x90, \r
+0x90, 0xCA, 0xF0, 0x74, 0x01, 0x2F, 0x12, 0x63, 0xE8, 0xE0, 0x90, 0x90, 0xCB, 0xF0, 0x90, 0x01, \r
+0xA0, 0xF0, 0x90, 0x93, 0x4A, 0x12, 0x94, 0x41, 0x90, 0x93, 0x4A, 0xA3, 0xE0, 0x24, 0x02, 0x12, \r
+0x67, 0x56, 0xFF, 0xE4, 0xFC, 0xFD, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xC0, 0x04, 0xC0, 0x05, 0xC0, \r
+0x06, 0xC0, 0x07, 0xF1, 0xE9, 0xB1, 0x7E, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, \r
+0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xF1, \r
+0xDC, 0xB1, 0x7E, 0x78, 0x08, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, \r
+0x51, 0xEA, 0xB1, 0x80, 0x12, 0x42, 0x90, 0x90, 0x90, 0xCE, 0xB1, 0x65, 0x78, 0x10, 0x12, 0x08, \r
+0x5A, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xF1, 0xE9, 0xB1, 0x7E, 0x78, 0x18, 0x12, \r
+0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0xC0, 0x04, 0xC0, \r
+0x05, 0xC0, 0x06, 0xC0, 0x07, 0xF1, 0xDC, 0xB1, 0x7E, 0x78, 0x08, 0x12, 0x08, 0x5A, 0xD0, 0x03, \r
+0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x51, 0xEA, 0xB1, 0x80, 0x12, 0x42, 0x90, 0x90, 0x90, 0xD2, \r
+0xB1, 0x65, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xF1, \r
+0xE9, 0xB1, 0x7E, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, \r
+0x12, 0x42, 0x90, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xF1, 0xDC, 0xB1, 0x7E, 0x78, \r
+0x08, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x51, 0xEA, 0xB1, 0x80, \r
+0x12, 0x42, 0x90, 0x90, 0x90, 0xD6, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x4A, 0xE4, 0x75, 0xF0, 0x04, \r
+0xF1, 0xB6, 0xF1, 0xC7, 0x51, 0xFA, 0xE0, 0xFF, 0x12, 0x96, 0x84, 0xB1, 0x87, 0xE0, 0xB4, 0x10, \r
+0xF1, 0xF1, 0xAF, 0xF1, 0xC7, 0x51, 0xFA, 0xE0, 0xFF, 0x74, 0xEA, 0x2E, 0xF5, 0x82, 0xE4, 0x34, \r
+0x90, 0xB1, 0x87, 0xE0, 0xB4, 0x10, 0xEC, 0xF1, 0xAF, 0xF1, 0xC7, 0x51, 0xFA, 0xE0, 0xFF, 0x74, \r
+0xFA, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xB1, 0x87, 0xE0, 0xB4, 0x10, 0xEC, 0xF1, 0xAF, 0x90, \r
+0x93, 0x4C, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x1F, 0x90, 0x93, 0x4A, 0xA3, 0xE0, 0xFE, 0xEF, \r
+0x2E, 0x51, 0xFA, 0xE0, 0xFE, 0x90, 0x93, 0x4F, 0xE0, 0xFD, 0xEE, 0x2D, 0xFE, 0x74, 0x0A, 0x2F, \r
+0x12, 0x83, 0x8D, 0xEE, 0xB1, 0x8A, 0x80, 0xD7, 0x90, 0x91, 0x0A, 0xE0, 0x90, 0x01, 0xA1, 0xF0, \r
+0x90, 0x91, 0x0B, 0xE0, 0x90, 0x01, 0xA2, 0xF0, 0x90, 0x91, 0x0C, 0xE0, 0x90, 0x01, 0xA3, 0xF0, \r
+0x90, 0x91, 0x0D, 0xE0, 0x90, 0x01, 0xA4, 0xF0, 0x90, 0x91, 0x0E, 0xE0, 0x90, 0x01, 0xA5, 0xF0, \r
+0x90, 0x93, 0x26, 0xE0, 0x04, 0x90, 0x93, 0x4E, 0xF0, 0xE4, 0x90, 0x93, 0x4D, 0xF0, 0x90, 0x90, \r
+0xCA, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, 0x4D, 0xE0, \r
+0xC3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x63, 0xA3, 0x12, 0x57, 0xC6, 0xE4, \r
+0x12, 0xA1, 0x31, 0x90, 0x93, 0x4C, 0xE0, 0xFD, 0xC3, 0x94, 0x04, 0x50, 0x46, 0xA3, 0xE0, 0x75, \r
+0xF0, 0x04, 0xA4, 0x7C, 0x00, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0xEF, 0x78, 0x05, 0xC3, 0x33, \r
+0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x24, 0x12, 0xF9, 0x74, 0x91, 0x3E, 0xFA, 0x7B, 0x01, 0xC0, 0x03, \r
+0xC0, 0x01, 0x90, 0x93, 0x4A, 0xA3, 0xE0, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, 0x8B, 0x40, 0xF5, \r
+0x41, 0x89, 0x42, 0x75, 0x43, 0x20, 0xD0, 0x01, 0xD0, 0x03, 0x12, 0x57, 0xE7, 0xF1, 0xF6, 0xB1, \r
+0x8B, 0x80, 0xB0, 0x12, 0xA0, 0x50, 0x90, 0x93, 0x4D, 0xE0, 0x04, 0xF0, 0x80, 0x80, 0xE4, 0x90, \r
+0x93, 0x4C, 0xF0, 0xE4, 0xFF, 0x0F, 0xEF, 0xB4, 0x20, 0xFB, 0xB1, 0x8B, 0xE0, 0xB4, 0x10, 0xF3, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x4A, 0xE4, 0x75, 0xF0, 0x04, 0x12, \r
+0x08, 0xD6, 0x90, 0x93, 0x4A, 0xA3, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
+0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x22, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x04, \r
+0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x2A, 0xED, 0xF0, 0xEF, 0x14, \r
+0x60, 0x02, 0xC1, 0x64, 0x90, 0x06, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x95, 0x2A, 0xE0, 0xC4, \r
+0x33, 0x54, 0xE0, 0xFF, 0x90, 0x04, 0x42, 0xE0, 0x54, 0x9F, 0x4F, 0xFF, 0xF0, 0x90, 0x94, 0x99, \r
+0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0x9D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, \r
+0x01, 0xF1, 0x30, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0x9D, 0x12, 0x08, 0x79, \r
+0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0xF1, 0x34, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, \r
+0x10, 0x90, 0x95, 0x2A, 0xB1, 0x80, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x01, 0x12, 0x08, 0x47, \r
+0x78, 0x04, 0xF1, 0xA6, 0x7F, 0x00, 0x7E, 0x0A, 0xF1, 0x34, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, \r
+0x00, 0x90, 0x95, 0x2A, 0xB1, 0x80, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x0A, 0xF1, 0xA6, 0x7F, \r
+0x00, 0x7E, 0x0D, 0xF1, 0x34, 0x12, 0x08, 0x79, 0x0C, 0x00, 0x00, 0x00, 0x90, 0x95, 0x2A, 0xB1, \r
+0x80, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x1A, 0xF1, 0xA6, 0x7F, 0x18, 0xF1, 0x32, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0x9D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xF1, \r
+0xD2, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0x8B, 0x12, 0x08, 0x79, 0x00, 0x00, \r
+0x04, 0x00, 0x80, 0x58, 0x90, 0x06, 0x03, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x94, 0x99, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0x9D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xF1, \r
+0x30, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0x9D, 0x12, 0x08, 0x79, 0x00, 0x00, \r
+0x00, 0x00, 0x7F, 0x00, 0x7E, 0x09, 0xF1, 0x34, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, \r
+0x94, 0x9D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0xF1, 0xD2, 0x12, 0x08, 0x79, 0x00, 0x00, \r
+0x0C, 0x00, 0x90, 0x94, 0x8B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x7D, 0x18, 0x7C, 0x00, \r
+0xE4, 0xFF, 0x12, 0x82, 0xBE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x58, 0x7E, 0x0C, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x97, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x37, 0x4E, \r
+0x90, 0x94, 0xA1, 0x12, 0x08, 0x6D, 0x90, 0x94, 0x99, 0x12, 0x43, 0xE5, 0x12, 0x08, 0x3A, 0x90, \r
+0x94, 0xA1, 0x12, 0x83, 0x43, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x94, 0x99, \r
+0x12, 0x43, 0xE5, 0x90, 0x94, 0x9D, 0x12, 0x83, 0x43, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, \r
+0x00, 0x12, 0x43, 0xC7, 0x90, 0x94, 0xA5, 0x12, 0x08, 0x6D, 0x90, 0x94, 0xA5, 0x12, 0x61, 0x58, \r
+0x90, 0x94, 0x97, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x7F, 0x00, 0x7E, 0x08, 0xD1, 0xCE, 0x90, 0x94, 0x99, 0x22, 0x90, 0x8D, 0xFB, 0x12, 0x67, 0xED, \r
+0x30, 0xE0, 0x08, 0x12, 0xA1, 0x48, 0xE4, 0x90, 0x94, 0x6E, 0xF0, 0x90, 0x94, 0x99, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, 0x54, 0xB1, 0x80, 0xF1, 0xA9, 0x7F, 0x50, 0x7E, 0x0C, \r
+0xF1, 0x34, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, 0x55, 0xB1, 0x80, 0xF1, 0xA9, \r
+0xD1, 0xCA, 0x90, 0x94, 0x6A, 0xE0, 0x90, 0x06, 0x08, 0xF0, 0x90, 0x94, 0x6C, 0xA3, 0xE0, 0x90, \r
+0x06, 0xA0, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x94, 0x58, 0xE0, 0xFF, 0x60, 0x05, 0xA3, 0xE0, 0xFD, \r
+0xB1, 0x92, 0x90, 0x94, 0x57, 0xE0, 0xFF, 0x60, 0x0C, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0x12, \r
+0x83, 0xA5, 0x12, 0x82, 0x4A, 0x22, 0x12, 0x08, 0x5A, 0x90, 0x94, 0x9D, 0x02, 0x08, 0x6D, 0x90, \r
+0x93, 0x4A, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x93, 0x4C, 0xF0, 0x22, 0xF0, \r
+0x90, 0x93, 0x6D, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x4A, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFE, \r
+0x2F, 0x22, 0x7F, 0x84, 0x7E, 0x08, 0xD1, 0xCE, 0x90, 0x94, 0x87, 0x22, 0x90, 0x93, 0x4A, 0xA3, \r
+0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0x22, 0x90, 0x93, 0x4A, 0xA3, 0xE0, 0x24, 0x03, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0x22, 0xE4, 0x75, 0xF0, 0x20, 0x02, 0x08, 0xD6, 0x75, 0xE8, 0x03, \r
+0x75, 0xA8, 0x85, 0x22, 0xE4, 0x90, 0x93, 0x3C, 0xF0, 0x90, 0x93, 0x3C, 0xE0, 0x64, 0x01, 0xF0, \r
+0x24, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x12, 0x3E, 0x44, 0xBF, 0x01, 0x03, \r
+0x12, 0x31, 0xFC, 0xC2, 0xAF, 0x90, 0x8E, 0x15, 0xE0, 0x60, 0x0F, 0x90, 0x8E, 0x18, 0xE0, 0xFF, \r
+0x90, 0x8E, 0x17, 0xE0, 0x6F, 0x60, 0x03, 0x12, 0x74, 0xB2, 0xC2, 0xAF, 0x12, 0x8B, 0xD3, 0xBF, \r
+0x01, 0x02, 0x11, 0x59, 0xD2, 0xAF, 0xD2, 0xAF, 0x90, 0x93, 0x34, 0xE0, 0xB4, 0x01, 0x02, 0x11, \r
+0xF6, 0x12, 0x4F, 0xF8, 0x12, 0x46, 0x38, 0x80, 0xB0, 0x90, 0x8E, 0x11, 0xE0, 0x30, 0xE0, 0x02, \r
+0x11, 0x63, 0x22, 0x90, 0x8E, 0x18, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x08, 0x12, 0x9A, 0xDB, \r
+0xBF, 0x01, 0x02, 0x11, 0x76, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x4D, 0x0C, \r
+0x11, 0x87, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x90, 0x14, 0x7F, 0x08, 0x12, 0x4A, 0x4E, 0xEF, \r
+0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x49, 0x39, 0xE4, 0xFF, 0x11, 0xA4, 0x90, 0x8E, 0x12, 0xE0, \r
+0x54, 0xEF, 0xF0, 0x22, 0x90, 0x95, 0x17, 0xEF, 0xF1, 0xE6, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, \r
+0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0x95, 0x17, 0xE0, 0x6F, 0x60, 0x39, 0xC3, 0x90, 0x95, 0x19, \r
+0xE0, 0x94, 0x88, 0x90, 0x95, 0x18, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, \r
+0x10, 0xF0, 0x22, 0x90, 0x95, 0x18, 0x31, 0x77, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, \r
+0x90, 0x95, 0x19, 0xE0, 0x94, 0x32, 0x90, 0x95, 0x18, 0xE0, 0x94, 0x00, 0x40, 0xBC, 0x90, 0x01, \r
+0xC6, 0xE0, 0x30, 0xE0, 0xB5, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, \r
+0x08, 0x12, 0x37, 0x4E, 0x90, 0x93, 0x3D, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, \r
+0x4E, 0x90, 0x93, 0x41, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x3D, 0x31, 0x6A, 0x60, 0x17, 0x90, 0x93, \r
+0x3D, 0x31, 0x61, 0x90, 0x93, 0x3D, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x3D, 0x31, 0x58, 0x7F, 0x00, \r
+0x7E, 0x08, 0x12, 0x38, 0x45, 0x90, 0x93, 0x41, 0x31, 0x6A, 0x60, 0x17, 0x90, 0x93, 0x41, 0x31, \r
+0x61, 0x90, 0x93, 0x41, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x41, 0x31, 0x58, 0x7F, 0x00, 0x7E, 0x09, \r
+0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x43, 0xE5, 0x90, 0xAA, 0xB9, 0x02, 0x08, \r
+0x6D, 0x12, 0x43, 0xE5, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x22, 0x12, 0x43, 0xE5, 0xEF, 0x54, 0x01, \r
+0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x22, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x08, 0xD6, 0xAD, 0x07, \r
+0x90, 0x90, 0x7E, 0x31, 0x77, 0x90, 0x90, 0x7E, 0xE0, 0xFF, 0xAE, 0x05, 0x74, 0x04, 0x2E, 0xD1, \r
+0xE7, 0xEF, 0xF0, 0x90, 0x90, 0x7E, 0xA3, 0xE0, 0xFF, 0x74, 0x05, 0x2E, 0xD1, 0xDB, 0xEF, 0xF0, \r
+0x22, 0xE4, 0x90, 0x93, 0xFB, 0xF0, 0xA3, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x20, 0xF0, 0x12, \r
+0x8F, 0x6B, 0xEF, 0x64, 0x01, 0x70, 0x63, 0x90, 0x93, 0x23, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, \r
+0x91, 0x38, 0x12, 0xA0, 0xF3, 0x90, 0x93, 0xF8, 0x12, 0x97, 0xC4, 0x90, 0x93, 0xFA, 0xEF, 0xF0, \r
+0x90, 0x93, 0xF8, 0x12, 0x9F, 0xF1, 0xE4, 0xFD, 0x12, 0x98, 0x0A, 0x90, 0x93, 0xFA, 0xE0, 0xFF, \r
+0x90, 0x93, 0xF9, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xF8, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x30, 0xCF, \r
+0x34, 0x00, 0xFE, 0x90, 0x93, 0xFB, 0xF0, 0xA3, 0xEF, 0xF0, 0x31, 0x7E, 0x91, 0x1B, 0x90, 0x93, \r
+0x23, 0xE0, 0xFB, 0xE4, 0xFF, 0x51, 0x1B, 0x91, 0x1B, 0x90, 0x93, 0x1F, 0xE0, 0xFB, 0x7F, 0x11, \r
+0x51, 0x1B, 0x12, 0x58, 0x01, 0x90, 0x90, 0x86, 0x31, 0x77, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
+0xC0, 0xD0, 0x90, 0x94, 0xC9, 0xEC, 0x12, 0x83, 0x9D, 0xAA, 0x07, 0x90, 0x94, 0xD0, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x00, 0x00, 0x91, 0x24, 0xEA, 0x24, 0xEF, 0x60, 0x3C, 0x24, 0xD7, 0x70, 0x02, \r
+0x61, 0x7A, 0x24, 0x3A, 0x60, 0x02, 0x61, 0xB3, 0x71, 0xF0, 0x24, 0x0A, 0x71, 0xFF, 0xED, 0xF0, \r
+0xFE, 0x12, 0x5A, 0xFA, 0x71, 0xE3, 0xE4, 0xF0, 0xFE, 0x74, 0x00, 0x2F, 0x91, 0x13, 0x7D, 0x14, \r
+0x71, 0xCC, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x00, 0x71, 0xD7, 0x90, 0xAC, 0x6A, 0x12, 0x08, 0x6D, \r
+0x7D, 0x14, 0x7C, 0x00, 0xE4, 0xFF, 0x61, 0x75, 0x90, 0x94, 0xC9, 0xE4, 0x75, 0xF0, 0x14, 0x12, \r
+0x08, 0xD6, 0x90, 0x94, 0xC9, 0xA3, 0xE0, 0xFB, 0xFF, 0x24, 0x06, 0xFC, 0x91, 0x00, 0xCC, 0xF0, \r
+0x90, 0x94, 0xD4, 0xA3, 0xE0, 0xFE, 0x12, 0x5A, 0xFA, 0x71, 0xE3, 0xE4, 0xD1, 0xE3, 0xE0, 0xFE, \r
+0xA9, 0x03, 0x74, 0x05, 0x29, 0xD1, 0xDB, 0x12, 0x84, 0xA3, 0xFE, 0x90, 0x94, 0xCE, 0xF0, 0xA3, \r
+0xEF, 0xF0, 0x90, 0x94, 0xC9, 0xE0, 0xFC, 0xA3, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xD3, 0xEF, \r
+0x94, 0x00, 0xEE, 0x94, 0x01, 0x90, 0x94, 0xC9, 0x40, 0x69, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE9, \r
+0x7C, 0x00, 0x24, 0x00, 0xF9, 0xEC, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC3, 0xE4, 0x9F, 0xFD, 0x74, \r
+0x01, 0x9E, 0xFC, 0x71, 0xCE, 0x90, 0x94, 0xCB, 0xE0, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, \r
+0x13, 0xEF, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x91, 0x0D, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, \r
+0x03, 0x7B, 0x01, 0x7A, 0xFC, 0x79, 0x00, 0x90, 0x94, 0xC9, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, \r
+0xE4, 0x9F, 0xFF, 0x74, 0x01, 0x9E, 0xFE, 0x71, 0xF7, 0xC3, 0x9F, 0xFD, 0xEC, 0x9E, 0xFC, 0x12, \r
+0x26, 0x4E, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0x71, 0xD1, 0x91, \r
+0x24, 0x80, 0x0D, 0xA3, 0xE0, 0x7E, 0x00, 0x24, 0x00, 0x91, 0x13, 0x71, 0xF7, 0xFD, 0x71, 0xCE, \r
+0x90, 0x94, 0xC9, 0x74, 0xFF, 0x75, 0xF0, 0xEC, 0x12, 0x08, 0xD6, 0x71, 0xF0, 0x7E, 0x00, 0x24, \r
+0x0C, 0xF9, 0xEE, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x02, 0xC0, 0x01, 0x74, 0x10, 0x2F, 0xF9, \r
+0xEE, 0x34, 0xFC, 0xFA, 0x71, 0xD7, 0x90, 0xAC, 0x6A, 0x12, 0x08, 0x6D, 0x71, 0xF7, 0xFD, 0xD0, \r
+0x01, 0xD0, 0x02, 0x7F, 0x11, 0x12, 0x1B, 0xAC, 0x80, 0x31, 0x71, 0xF0, 0x24, 0x2A, 0x71, 0xFF, \r
+0xED, 0xF0, 0xFE, 0x12, 0x5A, 0xFA, 0x71, 0xE3, 0xE4, 0xF0, 0x12, 0x9A, 0x21, 0x7D, 0x48, 0x71, \r
+0xCC, 0x71, 0xDD, 0x91, 0x08, 0x12, 0x42, 0x90, 0xE4, 0xFD, 0xFC, 0x71, 0xD1, 0x71, 0xDD, 0x91, \r
+0x08, 0x12, 0x42, 0x90, 0x71, 0xD1, 0x71, 0xDD, 0x12, 0x08, 0x3A, 0x90, 0x94, 0xCC, 0xEE, 0xF0, \r
+0xA3, 0xEF, 0xF0, 0x90, 0x94, 0xCC, 0x12, 0xA1, 0x98, 0x90, 0x94, 0xD4, 0xA3, 0xE0, 0xFE, 0x12, \r
+0x5A, 0xFA, 0xEF, 0x71, 0xE4, 0xED, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7C, 0x00, 0x12, 0x26, \r
+0x4E, 0x90, 0x94, 0xD0, 0x02, 0x08, 0x6D, 0x90, 0xAC, 0x67, 0x12, 0x44, 0x12, 0x90, 0x94, 0xD0, \r
+0x02, 0x43, 0xE5, 0xE4, 0xF0, 0x74, 0x01, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, \r
+0x90, 0x94, 0xC9, 0xA3, 0xE0, 0xFF, 0x22, 0x90, 0x94, 0xCE, 0xE0, 0xFC, 0xA3, 0xE0, 0x22, 0xFD, \r
+0xE4, 0x33, 0x90, 0x94, 0xD4, 0xF0, 0xA3, 0x22, 0x78, 0x10, 0x12, 0x08, 0x47, 0x90, 0x94, 0xD0, \r
+0x02, 0x43, 0xF1, 0xF9, 0xEE, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, 0x90, 0x93, 0xFB, 0xE0, 0xFC, \r
+0xA3, 0xE0, 0xFD, 0x22, 0x90, 0x94, 0xCB, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x22, 0x90, \r
+0x93, 0x1B, 0xE0, 0xFF, 0x7B, 0x18, 0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
+0x95, 0x15, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x95, 0x14, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0xF1, \r
+0x7C, 0x90, 0x95, 0x14, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x95, 0x15, 0xE0, 0x60, 0x05, 0xB1, \r
+0xF0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
+0xE0, 0x54, 0xC0, 0xF0, 0xB1, 0xF0, 0x54, 0xC0, 0xF0, 0x90, 0x00, 0x8B, 0xE0, 0xD3, 0x94, 0x03, \r
+0x74, 0x10, 0x40, 0x07, 0x91, 0xC2, 0x74, 0x04, 0xF0, 0x80, 0x04, 0x91, 0xC2, 0xE4, 0xF0, 0xAF, \r
+0x05, 0x91, 0xCB, 0xE0, 0x54, 0x01, 0xFE, 0x90, 0x95, 0x16, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, \r
+0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x91, 0xCB, 0xEE, 0xF0, 0x74, 0x11, 0x2F, 0xF1, 0x4E, 0x74, 0xFF, \r
+0xF0, 0x74, 0x29, 0x2F, 0xB1, 0xC6, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, \r
+0xAF, 0x22, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x74, 0x12, 0x2F, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x90, 0x8D, 0x09, 0xE0, 0xFF, 0x90, 0x94, 0xF1, 0xE0, 0xFB, \r
+0x7D, 0x01, 0x91, 0x38, 0x90, 0x94, 0xF2, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x94, \r
+0xF0, 0xE0, 0xFF, 0xB1, 0xA4, 0x90, 0x94, 0xF2, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x00, \r
+0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0xB1, 0xE4, 0x44, 0x01, 0xF0, 0xB1, 0xE4, 0x54, 0xFB, 0xF0, \r
+0xAC, 0x07, 0x74, 0x12, 0x2C, 0x91, 0xCE, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF1, 0x4E, \r
+0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF1, 0x45, 0x44, 0x0E, 0xF0, 0x90, 0x04, \r
+0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, \r
+0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xB1, 0xDC, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, \r
+0xB1, 0xDC, 0xED, 0xF0, 0x22, 0x7D, 0x08, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0x90, 0x94, 0xF0, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x8D, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x04, \r
+0x1D, 0xE0, 0x60, 0x22, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x94, 0xF4, 0xF0, 0x7D, 0x26, 0x12, 0x8F, \r
+0xCB, 0xEF, 0x64, 0x01, 0x70, 0x02, 0x91, 0xD6, 0x90, 0x94, 0xF4, 0xE0, 0xFF, 0x7D, 0x27, 0x12, \r
+0x53, 0xD9, 0xB1, 0xFC, 0x80, 0x04, 0xB1, 0xFC, 0x91, 0xD6, 0x12, 0x58, 0x01, 0x7F, 0x01, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0xB1, 0xD0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x0D, 0x74, 0x29, 0x2D, 0xB1, \r
+0xC6, 0x44, 0x10, 0xB1, 0xCF, 0x44, 0x80, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xB1, 0xC6, 0x54, 0xEF, \r
+0xB1, 0xCF, 0x44, 0x40, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF0, \r
+0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xF5, 0x83, 0x22, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, \r
+0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x90, 0x94, 0xF0, 0xE0, \r
+0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x31, 0xEF, 0xF0, 0x90, 0x8D, 0x09, \r
+0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x3D, 0x90, 0x8E, 0x18, 0xE0, 0x64, 0x0E, 0x70, \r
+0x14, 0x90, 0x95, 0x31, 0xE0, 0x70, 0x2F, 0x90, 0x8E, 0x11, 0xE0, 0x54, 0x7F, 0xF0, 0xF1, 0xF4, \r
+0x12, 0x4F, 0xD9, 0x80, 0x1E, 0x90, 0x8E, 0x18, 0xE0, 0x64, 0x06, 0x70, 0x19, 0x90, 0x95, 0x31, \r
+0xE0, 0x60, 0x13, 0x90, 0x8E, 0x11, 0xE0, 0x54, 0xBF, 0xF0, 0x12, 0xA0, 0x87, 0x90, 0x8E, 0x18, \r
+0x74, 0x04, 0xF0, 0x12, 0x4F, 0xE9, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFD, 0xFC, 0x90, 0x93, \r
+0x22, 0xF1, 0x7A, 0xAB, 0x05, 0x74, 0x01, 0x2B, 0x71, 0xE8, 0xE0, 0xFE, 0x74, 0x00, 0x2B, 0x12, \r
+0x5A, 0xFC, 0x12, 0xA0, 0x35, 0x90, 0x90, 0x74, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x03, 0x2B, 0xF1, \r
+0x5F, 0xFE, 0x74, 0x02, 0x2B, 0xF1, 0x56, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90, 0x76, 0xF0, \r
+0xA3, 0xEF, 0xF0, 0x74, 0x05, 0x2B, 0xD1, 0xDB, 0xE0, 0xFE, 0x74, 0x04, 0x2B, 0xD1, 0xE7, 0xE0, \r
+0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90, 0x78, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x07, 0x2B, 0xF1, \r
+0x71, 0xFE, 0x74, 0x06, 0x2B, 0xF1, 0x45, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90, 0x7A, 0xF0, \r
+0xA3, 0xEF, 0xF0, 0x74, 0x09, 0x2B, 0xB1, 0xD3, 0xFE, 0x74, 0x08, 0x2B, 0xF1, 0x68, 0x24, 0x00, \r
+0xFF, 0xEC, 0x3E, 0x90, 0x90, 0x7C, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
+0xF5, 0x83, 0x22, 0xF0, 0x74, 0x04, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x12, \r
+0x57, 0xCE, 0x74, 0x00, 0x2F, 0x12, 0x5A, 0xFC, 0xE0, 0x90, 0x94, 0x56, 0xF0, 0x74, 0x01, 0x2F, \r
+0x71, 0xE8, 0xE0, 0x90, 0x94, 0x57, 0xF0, 0x74, 0x02, 0x2F, 0xF1, 0x56, 0x90, 0x94, 0x58, 0xF0, \r
+0x74, 0x03, 0x2F, 0xF1, 0x5F, 0x90, 0x94, 0x59, 0xD1, 0xE3, 0xE0, 0x90, 0x94, 0x5A, 0xF0, 0x74, \r
+0x05, 0x2F, 0xD1, 0xDB, 0xE0, 0x90, 0x94, 0x5B, 0xF0, 0x74, 0x06, 0x2F, 0xF1, 0x45, 0x90, 0x94, \r
+0x5C, 0xF0, 0x74, 0x07, 0x2F, 0xF1, 0x71, 0x90, 0x94, 0x5D, 0xF0, 0x74, 0x08, 0x2F, 0xF1, 0x68, \r
+0x90, 0x94, 0x5E, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
+0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xE0, 0xFF, 0x12, 0x57, 0xD3, 0x7C, \r
+0x00, 0xAD, 0x07, 0x22, 0xF1, 0xAC, 0x90, 0x8E, 0x18, 0xE0, 0x64, 0x0C, 0x60, 0x05, 0x12, 0x53, \r
+0xD0, 0xB1, 0x55, 0x22, 0x90, 0x93, 0x28, 0xF1, 0xED, 0x30, 0xE0, 0x0E, 0x7B, 0x00, 0x7A, 0x00, \r
+0x79, 0x00, 0x12, 0xA0, 0x7A, 0x04, 0xF0, 0x02, 0x55, 0x67, 0xA1, 0x55, 0x12, 0xA0, 0x70, 0x30, \r
+0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x01, 0x3C, \r
+0x74, 0x04, 0xF0, 0xE4, 0x90, 0x94, 0xE2, 0xF0, 0x90, 0x8E, 0xBB, 0xE0, 0xC3, 0x13, 0x54, 0x7F, \r
+0x90, 0x94, 0xE3, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x50, 0x18, 0x90, 0x8E, \r
+0x11, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xE0, 0xFF, 0x13, \r
+0x13, 0x54, 0x3F, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, \r
+0x7F, 0x01, 0x12, 0x48, 0x39, 0x90, 0x93, 0x45, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x8D, 0x01, 0xE0, \r
+0xFF, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0xE5, 0xC2, 0xAF, 0xEF, 0x30, 0xE1, 0x0A, 0x90, 0x8D, 0x01, \r
+0xE0, 0x54, 0xFD, 0xF0, 0x12, 0x88, 0x5C, 0xF1, 0xA9, 0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, \r
+0x83, 0xD9, 0xF1, 0xA9, 0x30, 0xE4, 0x0B, 0x54, 0xEF, 0xF0, 0x12, 0x90, 0xB9, 0xBF, 0x01, 0x02, \r
+0x11, 0x51, 0xF1, 0xA9, 0x30, 0xE7, 0x06, 0x54, 0x7F, 0xF0, 0x12, 0x50, 0xBE, 0xD2, 0xAF, 0x80, \r
+0xBB, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x94, 0x79, 0x12, 0xA1, 0x80, 0xA3, \r
+0x12, 0x67, 0xE6, 0x90, 0x94, 0x81, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xC4, 0x74, 0x51, \r
+0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x12, 0xA1, 0x0E, 0x12, 0x84, 0xA3, 0x90, 0x94, 0x70, 0xF0, 0xA3, \r
+0xEF, 0xF0, 0x90, 0x02, 0x82, 0xE0, 0x90, 0x94, 0x78, 0xF0, 0x90, 0x8E, 0xC4, 0xE0, 0x20, 0xE0, \r
+0x02, 0x61, 0x3B, 0xE4, 0x90, 0x94, 0x77, 0xF0, 0x90, 0x94, 0x78, 0xE0, 0xFF, 0x90, 0x94, 0x77, \r
+0xE0, 0xC3, 0x9F, 0x40, 0x02, 0x61, 0x3B, 0x90, 0x94, 0x70, 0x12, 0xA1, 0x98, 0x90, 0xFD, 0x11, \r
+0xF0, 0x90, 0x94, 0x81, 0xEF, 0xF0, 0x12, 0x85, 0x37, 0x12, 0xA0, 0x35, 0x54, 0x3F, 0xFE, 0x90, \r
+0x94, 0x72, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x94, 0x7D, 0xEE, 0x12, 0x86, 0x01, 0xE0, 0x54, 0x03, \r
+0xFE, 0xEF, 0x24, 0x18, 0x2E, 0xFF, 0x90, 0x94, 0x82, 0xF0, 0x90, 0x94, 0x71, 0xE0, 0x2F, 0xFF, \r
+0x90, 0x94, 0x70, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x94, 0x74, 0xF1, 0xEB, 0xC0, 0x07, 0x71, 0x4C, \r
+0x7D, 0x01, 0x71, 0x77, 0xC0, 0x07, 0x71, 0x4C, 0x7D, 0x04, 0x71, 0x77, 0xAB, 0x07, 0xD0, 0x05, \r
+0xD0, 0x07, 0x12, 0x97, 0xEA, 0x90, 0x94, 0x79, 0xEF, 0x71, 0x4B, 0xE4, 0xFD, 0x71, 0x77, 0xEF, \r
+0x54, 0xFC, 0x90, 0x94, 0x76, 0xF0, 0x90, 0x94, 0x82, 0xE0, 0xFF, 0x90, 0x94, 0x72, 0xE4, 0x8F, \r
+0xF0, 0x12, 0x08, 0xD6, 0x90, 0x94, 0x72, 0x12, 0x85, 0xDA, 0x90, 0x94, 0x72, 0xEE, 0xF0, 0xA3, \r
+0xEF, 0xF0, 0x90, 0x94, 0x70, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x0F, 0x71, 0x77, 0x90, 0x94, \r
+0x72, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x94, 0x70, 0xEC, 0x8D, 0xF0, 0x12, 0xA1, 0x90, 0xFC, \r
+0xA3, 0xE0, 0xFD, 0xD3, 0x90, 0x94, 0x71, 0xE0, 0x9D, 0x90, 0x94, 0x70, 0xE0, 0x9C, 0x40, 0x18, \r
+0x90, 0x8D, 0xF9, 0xE0, 0x24, 0x01, 0xFD, 0x12, 0xA0, 0x5B, 0xFC, 0xC3, 0x90, 0x94, 0x71, 0xE0, \r
+0x9D, 0xF0, 0x90, 0x94, 0x70, 0xE0, 0x9C, 0xF0, 0xEF, 0x30, 0xE6, 0x06, 0x90, 0x01, 0xC7, 0x74, \r
+0x22, 0xF0, 0xEF, 0x30, 0xE7, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x21, 0xF0, 0xEF, 0x30, 0xE5, 0x06, \r
+0x90, 0x01, 0xC7, 0x74, 0x23, 0xF0, 0x90, 0x94, 0x6F, 0xE0, 0x60, 0x3B, 0x90, 0x94, 0x76, 0xE0, \r
+0x24, 0xB0, 0x60, 0x16, 0x24, 0xD0, 0x60, 0x02, 0x41, 0xD7, 0x12, 0xA1, 0x88, 0x20, 0xE0, 0x18, \r
+0x12, 0x89, 0xA1, 0x20, 0xE0, 0x02, 0x41, 0xD7, 0x80, 0x0E, 0x12, 0xA1, 0x88, 0x20, 0xE0, 0x08, \r
+0x12, 0x89, 0xA1, 0x20, 0xE0, 0x02, 0x41, 0xD7, 0x71, 0x4C, 0x90, 0x94, 0x7D, 0xE0, 0xFC, 0xA3, \r
+0xE0, 0xFD, 0x12, 0x94, 0x48, 0x41, 0xD7, 0x90, 0x94, 0x76, 0xE0, 0x24, 0x40, 0x60, 0x04, 0x24, \r
+0x20, 0x70, 0x2A, 0x90, 0x8E, 0xC7, 0x12, 0x79, 0x18, 0x20, 0xE0, 0x02, 0x41, 0xD7, 0x90, 0x8E, \r
+0xDA, 0xE0, 0x04, 0x71, 0x4B, 0x12, 0x91, 0x3C, 0xEF, 0x70, 0x02, 0x41, 0xD7, 0x90, 0x94, 0x76, \r
+0xE0, 0xFF, 0x12, 0x91, 0x2A, 0x90, 0x8E, 0xDB, 0xE0, 0x04, 0xF0, 0x41, 0xD7, 0xF1, 0xFA, 0x30, \r
+0xE0, 0x59, 0x90, 0x94, 0x79, 0xE0, 0xFF, 0x90, 0x94, 0x75, 0xE0, 0x2F, 0xFF, 0x90, 0x94, 0x74, \r
+0xE0, 0x34, 0x00, 0xCF, 0x24, 0x08, 0xCF, 0x34, 0x00, 0xFE, 0x90, 0x94, 0x7F, 0xF1, 0xEB, 0xEF, \r
+0x64, 0x45, 0x70, 0x37, 0xB1, 0x58, 0x12, 0x96, 0xB5, 0xEF, 0x64, 0x01, 0x70, 0x2D, 0xB1, 0x58, \r
+0xF1, 0xB3, 0xEF, 0x64, 0x01, 0x70, 0x24, 0x90, 0x94, 0x83, 0x04, 0xB1, 0x57, 0xA3, 0xE0, 0xFD, \r
+0x12, 0x97, 0x33, 0xEF, 0x70, 0x0D, 0x90, 0x94, 0x81, 0xE0, 0xFD, 0x90, 0xFD, 0x11, 0xB1, 0x57, \r
+0x12, 0x96, 0xEF, 0x90, 0x94, 0x81, 0xE0, 0x90, 0xFD, 0x11, 0xF0, 0x71, 0x4C, 0x12, 0x91, 0x3C, \r
+0xEF, 0x60, 0x1F, 0x71, 0x4C, 0x90, 0x94, 0x79, 0xE0, 0xFD, 0x90, 0x94, 0x7C, 0xE0, 0xFB, 0x90, \r
+0x94, 0x81, 0xE0, 0x90, 0x93, 0x4A, 0xF0, 0x71, 0xA6, 0xEF, 0x60, 0x06, 0x90, 0x94, 0x83, 0x74, \r
+0x01, 0xF0, 0x90, 0x8E, 0xC4, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x12, 0x71, 0x4C, 0x90, 0x94, 0x79, \r
+0xE0, 0xFD, 0x91, 0x2B, 0xEF, 0x60, 0x06, 0x90, 0x94, 0x83, 0x74, 0x01, 0xF0, 0x12, 0x7F, 0x44, \r
+0x54, 0x3F, 0x30, 0xE0, 0x0A, 0x71, 0x4C, 0x90, 0x94, 0x79, 0xE0, 0xFD, 0x12, 0x94, 0x97, 0x90, \r
+0x8E, 0xC4, 0x12, 0x79, 0x18, 0x30, 0xE0, 0x0F, 0x90, 0x94, 0x83, 0xE0, 0x70, 0x09, 0x71, 0x4C, \r
+0x90, 0x94, 0x79, 0xE0, 0xFD, 0xD1, 0xEE, 0x12, 0x99, 0x7F, 0xEF, 0x64, 0x01, 0x60, 0x07, 0x90, \r
+0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x79, 0x21, 0x12, 0x91, 0x04, 0xEF, 0x64, \r
+0x01, 0x70, 0x37, 0x90, 0x8E, 0xDC, 0xE0, 0x04, 0xF0, 0x12, 0x90, 0xEE, 0xAD, 0x07, 0xEF, 0x64, \r
+0x01, 0x60, 0x1F, 0xF1, 0x98, 0xED, 0xB4, 0x02, 0x08, 0x90, 0x01, 0xC7, 0x74, 0x42, 0xF0, 0x80, \r
+0x0A, 0xED, 0xB4, 0x04, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x43, 0xF0, 0x7F, 0x01, 0x12, 0x79, 0x21, \r
+0x80, 0x19, 0x90, 0x94, 0x70, 0x12, 0x90, 0xA6, 0x80, 0x09, 0x90, 0x8E, 0xC4, 0xE0, 0x54, 0xFE, \r
+0xF0, 0x80, 0x08, 0x90, 0x94, 0x77, 0xE0, 0x04, 0xF0, 0x01, 0x98, 0x74, 0x51, 0x04, 0x90, 0x01, \r
+0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF0, 0x90, 0x94, 0x74, 0xE0, \r
+0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x90, 0x93, 0x48, 0xE0, 0xFD, 0x90, 0x93, 0x47, 0xE0, 0x2D, 0xFD, \r
+0x90, 0x93, 0x46, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x10, 0xCD, 0x34, 0x00, 0xFC, 0x7E, 0x00, 0xED, \r
+0x2F, 0xFF, 0xEE, 0x3C, 0xFE, 0xE4, 0xFD, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, \r
+0xFA, 0xC3, 0x90, 0x8D, 0xF9, 0xE0, 0x9B, 0x90, 0x8D, 0xF8, 0xE0, 0x9A, 0x50, 0x0C, 0xA3, 0x12, \r
+0xA0, 0x57, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0x12, 0xA1, 0x60, 0x74, 0x00, 0x2F, \r
+0x12, 0x85, 0x46, 0xE0, 0xFF, 0x22, 0x90, 0x93, 0x48, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x12, 0x91, \r
+0x95, 0x90, 0x93, 0x4B, 0xF0, 0xFD, 0x71, 0x77, 0xEF, 0x54, 0x0C, 0x64, 0x08, 0x70, 0x5C, 0x91, \r
+0x22, 0xA3, 0xE0, 0xF1, 0x90, 0x64, 0x88, 0x70, 0x52, 0x91, 0x22, 0xA3, 0xE0, 0x24, 0x07, 0xFD, \r
+0x71, 0x77, 0xEF, 0x64, 0x8E, 0x70, 0x44, 0x90, 0x93, 0x4B, 0x04, 0x91, 0x21, 0x12, 0xA0, 0xAB, \r
+0x04, 0xFD, 0x71, 0x77, 0xEF, 0x64, 0x03, 0x70, 0x32, 0x91, 0x22, 0x12, 0xA0, 0xAB, 0xF1, 0x90, \r
+0x30, 0xE3, 0x07, 0x90, 0x01, 0xC7, 0x74, 0x01, 0x80, 0x1F, 0x90, 0x8E, 0xC4, 0x12, 0xA0, 0x73, \r
+0x30, 0xE0, 0x09, 0x91, 0x22, 0xA3, 0xE0, 0xFD, 0xB1, 0x78, 0x80, 0x0F, 0x90, 0x8E, 0xC7, 0xF1, \r
+0xFD, 0x30, 0xE0, 0x07, 0x90, 0x01, 0xC7, 0x74, 0x02, 0xF1, 0x97, 0x90, 0x93, 0x4B, 0xE0, 0xFF, \r
+0x22, 0xF0, 0x90, 0x93, 0x46, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x12, 0x96, 0x63, 0x12, 0x96, \r
+0x9F, 0x7A, 0x40, 0x79, 0x56, 0x12, 0x57, 0xF5, 0x78, 0x55, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, \r
+0x7A, 0x40, 0x79, 0x5C, 0xF1, 0xE4, 0x78, 0x59, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, \r
+0x79, 0x60, 0xF1, 0xE4, 0xE4, 0x90, 0x93, 0x5E, 0xF0, 0xD1, 0xA4, 0xCF, 0x24, 0x06, 0xCF, 0xB1, \r
+0x71, 0xEF, 0x64, 0x08, 0x60, 0x02, 0xA1, 0x4A, 0xD1, 0xA4, 0xCF, 0x24, 0x07, 0xCF, 0xB1, 0x71, \r
+0xEF, 0x64, 0x06, 0x60, 0x02, 0xA1, 0x4A, 0x90, 0x93, 0x5E, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x5D, \r
+0xF0, 0xB1, 0x50, 0x94, 0x06, 0x50, 0x17, 0x90, 0x93, 0x47, 0xE0, 0x24, 0x0A, 0xFD, 0x90, 0x93, \r
+0x46, 0xE0, 0x71, 0x6A, 0x90, 0x93, 0x5D, 0x12, 0x96, 0x96, 0xB1, 0x61, 0x80, 0xE3, 0xF1, 0xF3, \r
+0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xD4, 0x12, 0x91, 0x8C, 0x60, 0x02, 0xA1, 0x4A, 0x90, 0x93, 0x5D, \r
+0xF0, 0xB1, 0x50, 0x94, 0x04, 0x50, 0x19, 0x12, 0x96, 0x6F, 0xD1, 0xAF, 0xCD, 0x24, 0x20, 0x71, \r
+0x69, 0x90, 0x93, 0x5D, 0xE0, 0x24, 0x59, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xB1, 0x61, 0x80, 0xE1, \r
+0x78, 0x59, 0x7C, 0x93, 0x12, 0xA0, 0x17, 0xEF, 0x70, 0x67, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x01, \r
+0x54, 0xDF, 0xF0, 0x90, 0x8E, 0xC6, 0xE0, 0x30, 0xE0, 0x09, 0x90, 0x01, 0xC7, 0x74, 0x09, 0xF1, \r
+0x97, 0x80, 0x57, 0xE4, 0x90, 0x93, 0x5D, 0xF0, 0xB1, 0x50, 0x94, 0x06, 0x50, 0x0C, 0x71, 0x55, \r
+0x90, 0x93, 0x5D, 0x12, 0x96, 0x8D, 0xB1, 0x61, 0x80, 0xEE, 0xE4, 0x90, 0x93, 0x5D, 0xF0, 0xB1, \r
+0x50, 0x94, 0x04, 0x50, 0x19, 0x12, 0x96, 0x6F, 0xD1, 0xAF, 0xCD, 0x24, 0x16, 0x71, 0x69, 0x90, \r
+0x93, 0x5D, 0xE0, 0x24, 0x55, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xB1, 0x61, 0x80, 0xE1, 0x7B, 0x01, \r
+0x7A, 0x93, 0x79, 0x4F, 0x12, 0xA0, 0x7A, 0xF0, 0x7A, 0x93, 0x79, 0x55, 0x12, 0x55, 0x67, 0x80, \r
+0x09, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x21, 0x54, 0xEF, 0xF0, 0x90, 0x93, 0x5E, 0xE0, 0xFF, 0x22, \r
+0x90, 0x93, 0x5D, 0xE0, 0xFF, 0xC3, 0x22, 0xF0, 0x90, 0x94, 0x7F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, \r
+0x22, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x5D, 0xE0, 0x04, 0xF0, 0x22, 0xFF, 0x90, 0x93, 0x4F, \r
+0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x61, 0x77, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
+0x06, 0x31, 0xE0, 0x54, 0xEF, 0x44, 0x08, 0xF0, 0xED, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x7C, 0x00, \r
+0xEF, 0x24, 0x08, 0xFF, 0xEC, 0x3E, 0x90, 0x93, 0x4F, 0xF0, 0xA3, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, \r
+0x83, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xDA, 0x12, 0x08, 0xAA, 0x90, 0x93, 0x50, 0xE0, \r
+0x24, 0x01, 0xB1, 0x6C, 0x90, 0x8F, 0xDB, 0xD1, 0x9D, 0x24, 0x04, 0xB1, 0x6C, 0x90, 0x8F, 0xDE, \r
+0xD1, 0x9D, 0x24, 0x05, 0xB1, 0x6C, 0x90, 0x8F, 0xDF, 0xD1, 0x9D, 0x24, 0x06, 0xB1, 0x6C, 0x90, \r
+0x8F, 0xE0, 0xD1, 0x9D, 0x24, 0x07, 0xB1, 0x6C, 0x90, 0x8F, 0xE1, 0xD1, 0x9D, 0x24, 0x08, 0xB1, \r
+0x6C, 0x90, 0x8F, 0xE2, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0x4E, 0xF0, 0x90, 0x93, 0x4E, 0xE0, 0xFF, \r
+0xC3, 0x94, 0x08, 0x50, 0x1D, 0x90, 0x93, 0x50, 0xE0, 0x24, 0x09, 0xFD, 0x90, 0x93, 0x4F, 0xE0, \r
+0x71, 0x6A, 0x90, 0x93, 0x4E, 0xE0, 0x24, 0xE3, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0x12, 0xA0, 0x4C, \r
+0x80, 0xD9, 0xE4, 0x90, 0x93, 0x4E, 0xF0, 0x90, 0x93, 0x4E, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, \r
+0x1D, 0x90, 0x93, 0x50, 0xE0, 0x24, 0x63, 0xFD, 0x90, 0x93, 0x4F, 0xE0, 0x71, 0x6A, 0x90, 0x93, \r
+0x4E, 0xE0, 0x24, 0x3D, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0x12, 0xA0, 0x4C, 0x80, 0xD9, 0x90, 0x8F, \r
+0xDF, 0x12, 0x9E, 0x47, 0x12, 0xA1, 0x05, 0x30, 0xE3, 0x0D, 0x7F, 0x01, 0x12, 0x79, 0x21, 0x90, \r
+0x01, 0xC7, 0x74, 0x03, 0xF0, 0x80, 0x3F, 0x90, 0x93, 0x4C, 0xA3, 0xE0, 0xFF, 0x7C, 0x00, 0x54, \r
+0x07, 0xFD, 0x64, 0x01, 0x60, 0x05, 0xED, 0x64, 0x02, 0x70, 0x2B, 0xED, 0x64, 0x02, 0x4C, 0x70, \r
+0x25, 0xEF, 0x54, 0x30, 0xFF, 0xE4, 0xC4, 0xF8, 0x54, 0xF0, 0xC8, 0xEF, 0xC4, 0x54, 0x0F, 0x48, \r
+0x90, 0x90, 0x73, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xE4, 0xFD, 0x12, 0x9D, 0x3A, 0x90, 0x06, 0x31, \r
+0xE0, 0x54, 0xF7, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0xF0, 0x90, \r
+0x93, 0x50, 0xE0, 0x22, 0x90, 0x93, 0x48, 0xE0, 0xFF, 0x90, 0x93, 0x47, 0xE0, 0x2F, 0xFF, 0x90, \r
+0x93, 0x46, 0xE0, 0x34, 0x00, 0x22, 0x90, 0x93, 0x56, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7D, 0x09, \r
+0x71, 0x77, 0xEF, 0x64, 0x06, 0x70, 0x24, 0xF1, 0xA0, 0x7D, 0x14, 0x71, 0x77, 0xEF, 0x70, 0x1B, \r
+0xF1, 0xA0, 0x7D, 0x15, 0x71, 0x77, 0xEF, 0x64, 0x50, 0x70, 0x10, 0xF1, 0xA0, 0x7D, 0x21, 0x71, \r
+0x77, 0xEF, 0x20, 0xE0, 0x03, 0x30, 0xE2, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x12, 0x96, \r
+0x63, 0xF1, 0xF3, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x90, 0x12, 0x57, 0xF5, 0x78, 0x50, 0x7C, 0x93, \r
+0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x96, 0xF1, 0xE4, 0x91, 0x22, 0x12, 0x91, 0x3C, 0xEF, \r
+0x60, 0x7D, 0xD1, 0xA4, 0xFE, 0x90, 0x93, 0x54, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x06, 0xFF, 0xE4, \r
+0x3E, 0xB1, 0x73, 0xEF, 0x64, 0x08, 0x70, 0x67, 0x90, 0x93, 0x55, 0xE0, 0x24, 0x07, 0xFF, 0x90, \r
+0x93, 0x54, 0xB1, 0x70, 0xEF, 0x70, 0x58, 0x90, 0x93, 0x4F, 0xF0, 0x90, 0x93, 0x4F, 0xE0, 0xFF, \r
+0xC3, 0x94, 0x04, 0x50, 0x24, 0x90, 0x93, 0x55, 0xE0, 0x24, 0x18, 0xFD, 0x90, 0x93, 0x54, 0xE0, \r
+0x71, 0x6A, 0x90, 0x93, 0x4F, 0xE0, 0x24, 0x50, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, \r
+0xF0, 0x90, 0x93, 0x4F, 0xE0, 0x04, 0xF0, 0x80, 0xD2, 0x78, 0x50, 0x7C, 0x93, 0x12, 0xA0, 0x17, \r
+0xEF, 0x70, 0x1C, 0x90, 0x93, 0x55, 0xE0, 0x24, 0x08, 0xFF, 0x90, 0x93, 0x54, 0xE0, 0x34, 0x00, \r
+0xFE, 0xD1, 0xB6, 0xEF, 0x64, 0x01, 0x60, 0x07, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF1, 0x97, 0x22, \r
+0x24, 0x06, 0xFD, 0x71, 0x77, 0xEF, 0x22, 0xF0, 0x90, 0x8E, 0xCD, 0xE0, 0x44, 0x01, 0xF0, 0x22, \r
+0x90, 0x93, 0x56, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x8D, 0x01, \r
+0xE0, 0xFF, 0x22, 0x12, 0x96, 0x7B, 0x24, 0x16, 0xFF, 0xE4, 0x3E, 0xB1, 0x73, 0x90, 0x90, 0x84, \r
+0xA3, 0xE0, 0xB5, 0x07, 0x19, 0x90, 0x93, 0x47, 0xE0, 0x24, 0x16, 0xD1, 0xAE, 0xFE, 0x7D, 0x01, \r
+0x71, 0x77, 0xEF, 0xFD, 0x90, 0x90, 0x84, 0xE0, 0x6D, 0x70, 0x01, 0xE4, 0x60, 0x03, 0x7F, 0x00, \r
+0x22, 0x7F, 0x01, 0x22, 0x7E, 0x00, 0x7F, 0x04, 0x02, 0x06, 0x63, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, \r
+0xFD, 0x61, 0x77, 0x78, 0x49, 0x7C, 0x93, 0x7D, 0x01, 0x22, 0x90, 0x8E, 0xC4, 0xE0, 0xC4, 0x13, \r
+0x13, 0x54, 0x03, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, \r
+0x05, 0xC0, 0x07, 0x7D, 0x04, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x70, 0x11, 0x2B, 0xD0, 0x07, \r
+0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xFF, 0xA3, 0xF0, 0xED, 0x04, \r
+0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, \r
+0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x38, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x70, \r
+0x11, 0x2B, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, \r
 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, \r
 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, \r
-0xEF, 0xF0, 0x74, 0x77, 0xA3, 0xF0, 0x12, 0x92, 0x33, 0xE5, 0x21, 0x30, 0xE0, 0x03, 0x12, 0x92, \r
-0xA9, 0xE5, 0x21, 0x30, 0xE1, 0x02, 0x11, 0x7C, 0xE5, 0x21, 0x30, 0xE2, 0x02, 0x11, 0x85, 0xE5, \r
-0x22, 0x30, 0xE0, 0x02, 0xF1, 0x69, 0xE5, 0x24, 0x30, 0xE1, 0x05, 0x7F, 0x04, 0x12, 0x69, 0xEF, \r
-0xE5, 0x24, 0x30, 0xE4, 0x03, 0x12, 0x6E, 0xC4, 0xE5, 0x24, 0x30, 0xE5, 0x02, 0x11, 0x9A, 0xE5, \r
-0x24, 0x30, 0xE6, 0x02, 0x31, 0x05, 0x74, 0xEF, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x77, 0xA3, \r
+0x5F, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 0x12, 0x4B, 0x6E, 0xE5, 0x14, 0x30, 0xE7, 0x03, 0x12, 0x4E, \r
+0x6C, 0x74, 0x5F, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, \r
+0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, \r
+0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, \r
+0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, \r
+0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xB7, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 0x12, 0x8C, \r
+0x1B, 0xE5, 0x19, 0x30, 0xE3, 0x03, 0x12, 0x8C, 0x78, 0xE5, 0x19, 0x30, 0xE4, 0x02, 0x31, 0xDA, \r
+0xE5, 0x19, 0x30, 0xE5, 0x03, 0x12, 0x8C, 0x85, 0xE5, 0x1B, 0x30, 0xE0, 0x02, 0x31, 0x59, 0xE5, \r
+0x1B, 0x30, 0xE1, 0x03, 0x12, 0x8C, 0xC1, 0xE5, 0x1B, 0x30, 0xE2, 0x03, 0x12, 0x8E, 0x23, 0xE5, \r
+0x1B, 0x30, 0xE3, 0x02, 0x71, 0x1B, 0xE5, 0x1B, 0x30, 0xE4, 0x02, 0x71, 0x57, 0xE5, 0x1B, 0x30, \r
+0xE5, 0x02, 0x71, 0x87, 0xE5, 0x1B, 0x30, 0xE6, 0x02, 0x71, 0x70, 0xE5, 0x1C, 0x30, 0xE1, 0x03, \r
+0x12, 0x8E, 0x35, 0x74, 0xB7, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 0xD0, 0x07, \r
+0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, \r
+0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0xF5, 0x58, 0x90, 0x8E, 0x15, 0xE0, \r
+0x60, 0x6D, 0x71, 0x13, 0x70, 0x69, 0xF1, 0x6C, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x12, \r
+0xA0, 0x9F, 0x90, 0x8E, 0x13, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, \r
+0x70, 0x1E, 0x90, 0x8E, 0x1C, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x8E, 0x1E, 0xE0, \r
+0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0x8E, 0x1B, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x58, 0x01, \r
+0xE5, 0x58, 0x60, 0x2B, 0x12, 0xA1, 0x78, 0x90, 0x8E, 0x1E, 0xE0, 0x60, 0x03, 0xB4, 0x01, 0x04, \r
+0x31, 0xD0, 0x80, 0x08, 0x31, 0xD0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x8E, 0x1D, \r
+0xE0, 0x2F, 0x12, 0x50, 0x0D, 0x90, 0x8E, 0x18, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x51, 0xF9, 0x22, \r
+0xE4, 0x90, 0x94, 0xE2, 0xF0, 0x90, 0x8E, 0x1E, 0xE0, 0x22, 0x31, 0xED, 0x7F, 0x02, 0x8F, 0x59, \r
+0x7F, 0x02, 0x12, 0x48, 0x12, 0x90, 0x8D, 0x01, 0xE0, 0x45, 0x59, 0xF0, 0x22, 0x90, 0x01, 0xCC, \r
+0xE0, 0x54, 0x0F, 0x90, 0x95, 0x1C, 0xF0, 0x90, 0x95, 0x1C, 0xE0, 0xFD, 0x70, 0x02, 0x41, 0xE8, \r
+0x90, 0x8D, 0x5E, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, \r
+0x90, 0x8D, 0x5F, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, \r
+0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x95, 0x1A, 0x12, 0x89, 0xA8, 0x80, 0x05, \r
+0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x41, 0xCA, 0xE4, 0x90, \r
+0x95, 0x1D, 0xF0, 0x90, 0x95, 0x1D, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x31, 0x51, 0xE9, 0xA4, \r
+0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0x71, 0x01, 0x90, \r
+0x8D, 0x0E, 0x51, 0xF1, 0x51, 0xE9, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xF0, 0x71, \r
+0x01, 0x90, 0x8D, 0x12, 0x51, 0xF1, 0x90, 0x95, 0x1D, 0xE0, 0x04, 0xF0, 0x80, 0xC5, 0x90, 0x95, \r
+0x1C, 0xE0, 0xFF, 0x90, 0x95, 0x1A, 0x12, 0x4B, 0x14, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, \r
+0x5F, 0x90, 0x95, 0x1C, 0xF0, 0x90, 0x95, 0x1A, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, \r
+0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x95, 0x1A, 0xE0, 0x04, 0xF0, 0xE0, \r
+0x54, 0x03, 0xF0, 0x90, 0x8D, 0x5F, 0x12, 0x83, 0x7E, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, \r
+0x02, 0x21, 0xF7, 0xE4, 0x90, 0x8D, 0x5F, 0xF0, 0x21, 0xF7, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, \r
+0xF0, 0x90, 0x95, 0x1A, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0xF0, 0x51, 0xE9, 0x90, 0x01, 0xD0, \r
+0x12, 0x43, 0xFD, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0x90, 0x95, 0x1A, 0xE0, 0x75, 0xF0, 0x04, \r
+0x22, 0x12, 0x43, 0xFD, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, \r
+0x22, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x8D, 0x5F, 0xE0, 0x75, \r
+0xF0, 0x08, 0x22, 0xE4, 0xFF, 0x71, 0x2E, 0xEF, 0x64, 0x01, 0x22, 0x71, 0x13, 0x70, 0x0E, 0x90, \r
+0x8E, 0x15, 0xE0, 0x60, 0x08, 0xB1, 0x76, 0x12, 0x9B, 0xE5, 0x12, 0x50, 0x0D, 0x22, 0x12, 0x89, \r
+0xA1, 0xFE, 0xEF, 0x54, 0x07, 0xFF, 0x12, 0x89, 0x3C, 0xE0, 0xFD, 0x7C, 0x00, 0x12, 0x89, 0xAA, \r
+0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, 0x5D, 0x4E, \r
+0x7F, 0x00, 0x60, 0x02, 0x7F, 0x01, 0x22, 0x71, 0x13, 0x70, 0x14, 0x90, 0x8E, 0x15, 0xE0, 0x60, \r
+0x0E, 0xB1, 0x76, 0x90, 0x8E, 0x11, 0xE0, 0xF1, 0x53, 0x54, 0x07, 0x70, 0x02, 0x91, 0xB2, 0x22, \r
+0xE4, 0xFF, 0x71, 0x2E, 0xBF, 0x01, 0x0F, 0x90, 0x8E, 0x15, 0xE0, 0x60, 0x09, 0x12, 0x9B, 0xDD, \r
+0x54, 0x07, 0x70, 0x02, 0x91, 0xB2, 0x22, 0xE4, 0xFF, 0x71, 0x2E, 0xBF, 0x01, 0x12, 0x90, 0x8E, \r
+0x15, 0xE0, 0x60, 0x0C, 0xF1, 0xF5, 0x64, 0x02, 0x60, 0x03, 0x02, 0x9B, 0xEF, 0x12, 0x67, 0x84, \r
+0x22, 0xE4, 0x90, 0x93, 0xFD, 0xF0, 0x90, 0x8E, 0x15, 0xE0, 0x60, 0x3A, 0x71, 0x13, 0x70, 0x36, \r
+0x12, 0xA1, 0x68, 0xF1, 0x6B, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x12, 0xA0, 0x9F, 0x90, \r
+0x93, 0xFD, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x8E, 0x1C, 0xF0, 0x04, 0x60, 0x19, 0x12, 0xA1, 0x78, \r
+0xE4, 0x90, 0x94, 0xE2, 0xF0, 0x90, 0x8E, 0x1D, 0xE0, 0x12, 0x50, 0x0D, 0x90, 0x8E, 0x18, 0xE0, \r
+0x20, 0xE2, 0x03, 0x12, 0x51, 0xF9, 0x22, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0xF1, 0xC3, 0xFF, \r
+0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x7D, 0xB4, 0xF5, 0x56, \r
+0x80, 0x02, 0x8F, 0x56, 0x85, 0x55, 0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, 0x26, 0xAB, 0x51, \r
+0xAA, 0x52, 0xA9, 0x53, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFD, 0xAF, 0x54, 0x12, 0x88, 0xFC, 0xAF, \r
+0x54, 0x71, 0x2E, 0xEF, 0xAF, 0x54, 0x70, 0x05, 0x12, 0x8A, 0x77, 0x80, 0x03, 0x12, 0x8A, 0x63, \r
+0x05, 0x54, 0x80, 0xD3, 0xE5, 0x55, 0x70, 0x0E, 0xFF, 0x71, 0x2E, 0xEF, 0x70, 0x08, 0xB1, 0x69, \r
+0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0xF1, 0x48, 0x30, 0xE0, 0x0B, 0xEF, 0xC4, 0x13, 0x13, \r
+0x54, 0x03, 0x30, 0xE0, 0x02, 0xF1, 0x12, 0x90, 0x8E, 0x11, 0x12, 0x67, 0xED, 0x30, 0xE0, 0x09, \r
+0xEF, 0xF1, 0x53, 0x54, 0x07, 0x70, 0x42, 0x80, 0x3E, 0x90, 0x8E, 0x1E, 0xE0, 0x04, 0xF0, 0x90, \r
+0x8E, 0x19, 0xE0, 0x54, 0xEF, 0xF0, 0x12, 0xA0, 0x93, 0x40, 0x2C, 0x71, 0x13, 0x70, 0x2A, 0xF1, \r
+0xF5, 0x70, 0x04, 0x91, 0xBC, 0x80, 0x23, 0x91, 0xBC, 0x90, 0x8E, 0x1F, 0xE0, 0x04, 0xF0, 0xE0, \r
+0xD3, 0x94, 0x02, 0x40, 0x09, 0x91, 0xAA, 0xE4, 0x90, 0x8E, 0x1F, 0xF0, 0x80, 0x03, 0x12, 0x67, \r
+0x84, 0xE4, 0x90, 0x8E, 0x1E, 0xF0, 0x22, 0x91, 0xB2, 0x22, 0x90, 0x8E, 0x12, 0xE0, 0x54, 0xFB, \r
+0xF0, 0x22, 0x90, 0x8E, 0x17, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x51, 0xFD, 0x12, 0xA0, 0x93, 0x40, \r
+0x20, 0x90, 0x8E, 0x2F, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x94, 0x04, 0x50, 0x14, 0x90, 0x8E, 0x27, \r
+0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0x8E, 0x2E, 0xF0, 0xFB, 0x12, 0x8F, 0x1B, 0x12, 0x8E, \r
+0xB0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0xB1, \r
+0x25, 0x7D, 0x02, 0x7F, 0x03, 0xB1, 0x25, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0x12, 0xA0, 0xC0, \r
+0xE4, 0xFF, 0x71, 0x2E, 0xBF, 0x01, 0x10, 0x91, 0xAA, 0x90, 0x8E, 0x18, 0xE0, 0x20, 0xE2, 0x0A, \r
+0x7D, 0x01, 0x7F, 0x04, 0x02, 0x51, 0xFD, 0x12, 0xA1, 0x70, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0xB1, \r
+0x25, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0xF1, \r
+0x34, 0xF0, 0x22, 0xEF, 0x70, 0x31, 0x7D, 0x78, 0x7F, 0x02, 0xD1, 0x27, 0x7D, 0x02, 0x7F, 0x03, \r
+0xD1, 0x27, 0x7D, 0xC8, 0x7F, 0x02, 0xF1, 0x27, 0xB1, 0x76, 0xE4, 0xFF, 0x71, 0x2E, 0xEF, 0x70, \r
+0x0A, 0xB1, 0x69, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, \r
+0x51, 0xFD, 0xB1, 0x6E, 0x02, 0xA1, 0x29, 0x81, 0xE2, 0x12, 0x4D, 0xE7, 0xF1, 0x5E, 0x90, 0x8E, \r
+0x11, 0xE0, 0x54, 0xF7, 0xF0, 0x22, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, \r
+0xF0, 0x22, 0xF1, 0x6C, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0xA0, 0xF3, 0x71, \r
+0x13, 0x60, 0x02, 0xC1, 0x1C, 0x90, 0x8E, 0x15, 0xE0, 0x70, 0x02, 0xC1, 0x1C, 0xF1, 0x1E, 0x64, \r
+0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x8E, 0x1C, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, \r
+0x8E, 0x1B, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x8E, 0x1B, 0xE0, 0xFE, 0xFF, 0x80, 0x00, \r
+0x90, 0x8E, 0x1C, 0xEF, 0xF0, 0x12, 0x9C, 0x08, 0x12, 0xA1, 0x70, 0xE4, 0x90, 0x8E, 0x1E, 0x12, \r
+0xA0, 0xC0, 0xB1, 0x76, 0xF1, 0x56, 0x54, 0xEF, 0xF0, 0xF1, 0x1E, 0x24, 0xFD, 0x50, 0x02, 0x80, \r
+0x03, 0x12, 0x9B, 0x84, 0xF1, 0x48, 0x30, 0xE0, 0x33, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, \r
+0xE0, 0x2A, 0x90, 0x8E, 0x1B, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x20, 0x90, 0x8E, 0x12, 0xE0, \r
+0x44, 0x40, 0xF0, 0x12, 0xA1, 0x68, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, \r
+0xD1, 0xC1, 0xD1, 0x23, 0xF1, 0x12, 0x90, 0x8E, 0x1C, 0xE0, 0x14, 0xF0, 0x22, 0x7D, 0x02, 0x7F, \r
+0x02, 0xD1, 0x27, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x12, 0xA1, 0xA0, 0xFE, 0xF6, 0x74, 0x30, \r
+0xF1, 0x34, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x30, 0xEF, 0xF0, \r
+0x54, 0x01, 0xFF, 0x90, 0x8E, 0xC0, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, 0x8D, 0xFB, 0xF1, 0x4B, \r
+0x30, 0xE0, 0x39, 0x12, 0x83, 0xC2, 0x60, 0x10, 0x12, 0x83, 0xB8, 0x40, 0x0B, 0xE4, 0x7F, 0x0A, \r
+0xFE, 0xFD, 0xFC, 0x90, 0x90, 0xD6, 0x80, 0x09, 0xE4, 0x7F, 0x0A, 0xFE, 0xFD, 0xFC, 0x90, 0x90, \r
+0xCE, 0x12, 0x43, 0xF1, 0x12, 0x42, 0x9D, 0xC0, 0x07, 0x90, 0x8E, 0xC2, 0xE0, 0xFB, 0xE4, 0xFA, \r
+0xF9, 0xF8, 0xD0, 0x07, 0x12, 0x43, 0x28, 0x90, 0x8E, 0xC3, 0xEF, 0xF0, 0x90, 0x95, 0x30, 0xE0, \r
+0x64, 0x01, 0x70, 0x1F, 0x90, 0x01, 0x53, 0xF0, 0x90, 0x8E, 0xC2, 0xE0, 0x60, 0x0A, 0x7D, 0x10, \r
+0x7F, 0x03, 0xD1, 0xC1, 0xF1, 0x8D, 0x80, 0x14, 0xF1, 0x3E, 0xF1, 0x27, 0xD1, 0x1D, 0x12, 0x9D, \r
+0x2E, 0x80, 0x09, 0xF1, 0x3E, 0xD1, 0xC1, 0xB1, 0x1B, 0x12, 0x4F, 0xEF, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0xF1, 0x30, 0xF0, 0x22, 0x90, 0x8E, 0xC0, 0xE0, 0x30, \r
+0xE0, 0x3F, 0xF1, 0x8D, 0x90, 0x8E, 0xC3, 0xE0, 0x60, 0x05, 0x14, 0xF0, 0x02, 0x9D, 0x2E, 0x90, \r
+0x8E, 0xC1, 0xE0, 0x14, 0x90, 0x8E, 0xC3, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, \r
+0xD1, 0x34, 0xB1, 0x1B, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x20, 0xE0, 0x08, 0x13, 0x13, 0x13, 0x54, \r
+0x1F, 0x30, 0xE0, 0x0D, 0x90, 0x94, 0xE5, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x12, 0x50, \r
+0x45, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0xC1, 0x27, 0x71, 0xA1, 0xF1, 0xBC, 0x80, 0xAD, 0x90, 0x8E, \r
+0x13, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x22, 0x74, 0x1D, 0x12, 0xA1, 0xA0, 0xF1, 0x30, 0xF0, 0x22, \r
+0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0x22, 0x90, 0x01, \r
+0x53, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, 0x22, 0x90, 0x8E, 0x12, 0xE0, 0xFF, 0x13, 0x13, 0x13, \r
+0x54, 0x1F, 0x22, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x19, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x12, 0x67, \r
+0xF4, 0x12, 0x4F, 0xE9, 0x7D, 0x0C, 0x7F, 0x01, 0x02, 0x4E, 0xB5, 0xF0, 0x90, 0x05, 0x62, 0xE0, \r
+0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, 0x22, 0x90, 0x8E, 0xC0, 0xE0, 0x30, 0xE0, \r
+0x0B, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x04, 0xD1, 0x1D, 0xF1, 0x8D, 0x22, 0x90, 0x8E, 0xC2, \r
+0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x90, 0x8E, 0x11, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x8E, \r
+0x1E, 0xF0, 0xA3, 0xF0, 0x90, 0x8E, 0x19, 0xF0, 0x90, 0x8E, 0x12, 0xE0, 0x54, 0xF7, 0xF0, 0x54, \r
+0xBF, 0xF0, 0xB1, 0x21, 0xF1, 0xBC, 0x7D, 0x10, 0x7F, 0x03, 0xE1, 0x27, 0x7D, 0x02, 0x7F, 0x02, \r
+0xA1, 0x25, 0xF0, 0x90, 0x00, 0x01, 0x02, 0x06, 0xA2, 0x90, 0x93, 0x4D, 0x12, 0x44, 0x12, 0xF1, \r
+0x96, 0x90, 0x8E, 0x15, 0xE0, 0xFF, 0xB1, 0x33, 0x90, 0x8E, 0x15, 0xE0, 0x60, 0x12, 0x90, 0x93, \r
+0x4D, 0x12, 0x44, 0x09, 0xF1, 0xC3, 0x54, 0x0F, 0xFF, 0x12, 0x7D, 0xB4, 0xFD, 0x12, 0x9A, 0xAE, \r
+0x22, 0x7F, 0x80, 0x21, 0xDE, 0x90, 0x8E, 0x13, 0xE0, 0x54, 0x0F, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, \r
+0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, \r
+0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xFC, 0xF0, 0x74, \r
+0x77, 0xA3, 0xF0, 0x12, 0x8C, 0x48, 0xE5, 0x21, 0x30, 0xE0, 0x03, 0x12, 0x77, 0xF1, 0xE5, 0x21, \r
+0x30, 0xE1, 0x03, 0x12, 0x8E, 0x5B, 0xE5, 0x21, 0x30, 0xE2, 0x03, 0x12, 0x8E, 0x65, 0xE5, 0x22, \r
+0x30, 0xE0, 0x03, 0x12, 0x8E, 0x7C, 0xE5, 0x24, 0x30, 0xE1, 0x05, 0x7F, 0x04, 0x12, 0x71, 0xDE, \r
+0xE5, 0x24, 0x30, 0xE4, 0x03, 0x12, 0x77, 0x18, 0xE5, 0x24, 0x30, 0xE5, 0x02, 0x11, 0x8C, 0xE5, \r
+0x24, 0x30, 0xE6, 0x02, 0x11, 0xF1, 0x74, 0xFC, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x77, 0xA3, \r
 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, \r
-0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x8E, 0x84, 0xE0, \r
-0x60, 0x02, 0x31, 0x3C, 0x22, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x0E, 0x90, 0x06, 0x92, 0xE0, 0x30, \r
-0xE1, 0x02, 0x21, 0xEE, 0x12, 0x6D, 0x82, 0x31, 0x32, 0x22, 0x90, 0x8E, 0x80, 0x12, 0x9F, 0xD0, \r
-0x30, 0xE0, 0x1A, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x8E, 0x81, 0x30, 0xE0, \r
-0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x31, 0x32, 0xE4, 0xFF, 0x90, \r
-0x93, 0x8D, 0xE0, 0x30, 0xE0, 0x3E, 0x90, 0x93, 0x92, 0xE0, 0xFD, 0x60, 0x37, 0x12, 0xA0, 0x1F, \r
-0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, 0xE0, 0xE0, 0xFB, 0xEF, \r
-0x5B, 0x60, 0x0B, 0xE4, 0x90, 0x93, 0x92, 0xF0, 0x90, 0x93, 0x94, 0x04, 0xF0, 0x22, 0x90, 0x93, \r
-0x8F, 0xE0, 0xD3, 0x9D, 0x50, 0x05, 0x12, 0x9A, 0x0E, 0xF0, 0x22, 0x12, 0x57, 0x83, 0x90, 0x93, \r
-0x92, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x8E, 0x80, 0x12, 0x74, 0x19, 0x30, 0xE0, 0x20, 0xEF, 0x54, \r
-0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x8E, 0x81, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, \r
-0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x02, 0x31, 0x32, 0x7F, 0x01, \r
-0x80, 0x8D, 0x90, 0x8E, 0x86, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x51, 0xEB, 0x90, 0x8E, 0x80, 0x12, \r
-0x84, 0x0B, 0x30, 0xE0, 0x0A, 0xEF, 0x12, 0x9E, 0xD7, 0x54, 0x07, 0x70, 0x20, 0x80, 0x1C, 0x90, \r
-0x8E, 0x8D, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x88, 0xE0, 0x54, 0xEF, 0xF0, 0x12, 0x8D, 0x34, 0x40, \r
-0x0A, 0x90, 0x8D, 0xFF, 0xE0, 0xB4, 0x01, 0x05, 0x02, 0x9F, 0xFF, 0x31, 0x32, 0x22, 0x90, 0x8D, \r
-0xFF, 0xE0, 0xB4, 0x01, 0x0E, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x08, 0x31, 0x84, 0x54, 0x07, 0x70, \r
-0x02, 0x31, 0x32, 0x22, 0x90, 0x8E, 0x88, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xE4, 0xF5, 0x58, 0x90, \r
-0x06, 0xA9, 0xE0, 0xF5, 0x58, 0x54, 0xC0, 0x70, 0x07, 0x31, 0x84, 0x54, 0xFD, 0xF0, 0x80, 0x92, \r
-0xE5, 0x58, 0x30, 0xE6, 0x1D, 0x90, 0x8E, 0x84, 0xE0, 0x64, 0x01, 0x70, 0x17, 0x90, 0x8E, 0x88, \r
-0xE0, 0x44, 0x01, 0xF0, 0xF1, 0x0A, 0x64, 0x02, 0x60, 0x04, 0x51, 0x2E, 0x80, 0x06, 0x31, 0xDD, \r
-0x80, 0x02, 0x31, 0x84, 0xE5, 0x58, 0x90, 0x8E, 0x88, 0x30, 0xE7, 0x0C, 0xE0, 0x44, 0x02, 0x12, \r
-0x6E, 0xFF, 0x51, 0x24, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x31, 0xEE, 0x90, \r
-0x8E, 0x87, 0xE0, 0x64, 0x0C, 0x60, 0x06, 0x12, 0x54, 0x48, 0x12, 0x57, 0x83, 0x22, 0x90, 0x8E, \r
-0x80, 0x12, 0x9E, 0xBD, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, \r
-0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x95, 0x43, 0xF0, 0x90, 0x8F, 0x25, \r
-0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x95, 0x44, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x51, 0x24, \r
-0x44, 0x08, 0xF0, 0x22, 0x7E, 0x01, 0x12, 0x50, 0x02, 0x90, 0x8E, 0x80, 0xE0, 0x22, 0x90, 0x04, \r
-0x1D, 0xE0, 0x70, 0x11, 0x90, 0x8D, 0x08, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x51, 0x64, 0x90, \r
-0x95, 0x87, 0x12, 0x57, 0xE7, 0x22, 0x90, 0x8D, 0xFF, 0xE0, 0xB4, 0x01, 0x10, 0x90, 0x8E, 0x84, \r
-0xE0, 0x60, 0x0A, 0xF1, 0x0A, 0x64, 0x02, 0x60, 0x02, 0x80, 0xD3, 0x31, 0xDD, 0x22, 0xE0, 0xFF, \r
-0x7B, 0x18, 0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x76, 0xED, 0xF0, \r
-0xA3, 0xEB, 0xF0, 0x90, 0x95, 0x75, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0x67, 0xED, 0x90, 0x95, \r
-0x75, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x95, 0x76, 0xE0, 0x60, 0x05, 0xD1, 0xC9, 0x44, 0x80, \r
-0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, \r
-0xF0, 0xD1, 0xC9, 0x54, 0xC0, 0xF0, 0x90, 0x00, 0x8B, 0xE0, 0xD3, 0x94, 0x03, 0x74, 0x10, 0x40, \r
-0x0D, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x04, 0xF0, 0x80, 0x0A, 0x2D, 0xF5, \r
-0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0xAF, 0x05, 0xD1, 0x2A, 0xE0, 0x54, 0x01, 0xFE, \r
-0x90, 0x95, 0x77, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0xD1, 0x2A, \r
-0xEE, 0xF0, 0x74, 0x11, 0x2F, 0xF1, 0x11, 0x74, 0xFF, 0xF0, 0x74, 0x29, 0x2F, 0xD1, 0xF4, 0x54, \r
-0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
-0xC0, 0xD0, 0x90, 0x93, 0xB5, 0x12, 0x97, 0xE4, 0x90, 0x93, 0xCD, 0x74, 0x18, 0xF0, 0x7E, 0x00, \r
-0x7F, 0x80, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xD5, 0x12, 0x08, 0xAA, 0x90, 0x01, 0xC4, \r
-0x74, 0xFB, 0xF0, 0x74, 0x7A, 0xA3, 0xF0, 0x90, 0x93, 0x7C, 0xE0, 0xFF, 0x12, 0x66, 0x4A, 0x90, \r
-0x93, 0xCC, 0xEF, 0xF0, 0xF9, 0xE0, 0xFE, 0x24, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
-0x74, 0x41, 0xF0, 0xEE, 0x24, 0x28, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x93, 0xCD, 0xE0, 0x7A, 0x00, \r
-0x2D, 0xFE, 0xEA, 0x3C, 0x90, 0x93, 0xD1, 0xF0, 0xA3, 0xCE, 0xF0, 0x74, 0x28, 0x29, 0x12, 0x8D, \r
-0x20, 0x90, 0x93, 0xB7, 0xE0, 0xFD, 0x12, 0x8B, 0xCD, 0xB1, 0xF2, 0x90, 0x93, 0xD1, 0xE0, 0xFF, \r
-0xA3, 0xE0, 0x90, 0x93, 0xCF, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xD5, 0x74, 0x01, 0xF0, \r
-0xA3, 0x74, 0x03, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0x74, 0x5F, 0xF0, 0x90, 0x93, 0xD1, 0x12, 0x67, \r
-0xE4, 0x90, 0x90, 0x47, 0xE0, 0xFF, 0x7E, 0x02, 0xB4, 0xFE, 0x02, 0x7E, 0xFE, 0x90, 0x93, 0xD1, \r
-0xA3, 0xE0, 0xFD, 0x12, 0x63, 0x3F, 0xEE, 0xF0, 0x74, 0x00, 0x2D, 0x12, 0x63, 0x41, 0xE0, 0x90, \r
-0x93, 0xD9, 0xF0, 0x90, 0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x90, 0x90, 0xDC, \r
-0xE0, 0x90, 0x93, 0xB5, 0xB4, 0x01, 0x0B, 0xE0, 0x44, 0x03, 0xFC, 0xA3, 0xE0, 0x44, 0x10, 0xFD, \r
-0x80, 0x09, 0xE0, 0x44, 0x03, 0xFC, 0xA3, 0xE0, 0x44, 0x20, 0xFD, 0x90, 0x93, 0xD3, 0xEC, 0xF0, \r
-0xA3, 0xED, 0xF0, 0x90, 0x93, 0xDA, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x12, 0xF0, 0xD1, 0x16, 0xEF, \r
-0x64, 0xFE, 0x70, 0x25, 0x90, 0x93, 0xD1, 0xA3, 0xE0, 0x24, 0x00, 0x12, 0x99, 0x5F, 0xC0, 0x03, \r
-0x8B, 0x40, 0xD1, 0x20, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x75, 0x40, 0x01, 0xD1, 0x20, 0x7B, 0x01, \r
-0x7A, 0x93, 0x79, 0xDC, 0x12, 0x35, 0x26, 0x80, 0x56, 0x90, 0x93, 0x77, 0xE0, 0xFF, 0xB4, 0x02, \r
-0x26, 0x90, 0x93, 0xD1, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x24, 0x00, 0xF5, 0x82, 0x74, 0xFC, 0x3C, \r
-0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0x74, 0xFC, 0x3C, 0xF5, 0x83, 0x74, 0x20, \r
-0xD1, 0x0E, 0x74, 0x20, 0xF0, 0x80, 0x28, 0xEF, 0xB4, 0x04, 0x24, 0x90, 0x93, 0xD1, 0xE0, 0xFE, \r
-0xA3, 0xE0, 0xFF, 0x24, 0x00, 0xF5, 0x82, 0x74, 0xFC, 0x3E, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, \r
-0x2F, 0xF5, 0x82, 0x74, 0xFC, 0x3E, 0xF5, 0x83, 0x74, 0x10, 0xD1, 0x0E, 0x74, 0x10, 0xF0, 0xD1, \r
-0x16, 0xE4, 0x90, 0x93, 0xCE, 0xF0, 0xF1, 0x27, 0xFE, 0x90, 0x93, 0xD1, 0xA3, 0xE0, 0xFD, 0xEF, \r
-0x2D, 0x12, 0x63, 0x3F, 0xEE, 0xF0, 0xF1, 0x27, 0xFE, 0x74, 0xDE, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
-0x93, 0xF5, 0x83, 0xEE, 0xB1, 0xEA, 0xE0, 0xB4, 0x08, 0xDC, 0xB1, 0xFC, 0x90, 0x93, 0xD1, 0xE4, \r
-0x75, 0xF0, 0x20, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xD1, 0x12, 0x66, 0x79, 0xB1, 0xF2, 0xE4, 0x90, \r
-0x94, 0x58, 0xF0, 0xE4, 0x90, 0x93, 0xCE, 0xF0, 0x90, 0x93, 0xCE, 0xE0, 0xFF, 0xC3, 0x94, 0x10, \r
-0x50, 0x0A, 0xF1, 0x48, 0x12, 0x63, 0x3E, 0xE4, 0xB1, 0xEA, 0x80, 0xEC, 0x7F, 0x64, 0x7E, 0x00, \r
-0x12, 0x3E, 0x50, 0x90, 0x06, 0x31, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x93, 0x7D, 0xE0, 0xFD, 0x75, \r
-0xF0, 0x80, 0xA4, 0xAE, 0xF0, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, \r
-0xAC, 0x7B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xED, 0xFF, 0x90, 0x93, 0x7C, 0xE0, 0xC3, 0x9F, 0xFF, \r
-0xE4, 0x94, 0x00, 0xFE, 0xEF, 0x78, 0x07, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, \r
-0x93, 0xCD, 0xE0, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x3E, 0xCF, 0x24, 0x38, 0xCF, 0x34, 0x00, 0xFE, \r
-0x90, 0xAC, 0x7A, 0x74, 0x10, 0xF0, 0x7B, 0x63, 0xE4, 0xFD, 0x12, 0x39, 0x9C, 0x7B, 0x01, 0x7A, \r
-0x93, 0x79, 0xD5, 0x90, 0xAC, 0xA0, 0x12, 0x44, 0x12, 0x7A, 0x93, 0x79, 0xB8, 0x90, 0xAC, 0xA3, \r
-0x12, 0x44, 0x12, 0x90, 0xAC, 0xA6, 0x74, 0x10, 0xF0, 0x7A, 0x90, 0x79, 0x03, 0x12, 0x35, 0x86, \r
-0x90, 0x94, 0x58, 0xE0, 0x04, 0xF0, 0x90, 0x06, 0x31, 0xE0, 0x30, 0xE2, 0x06, 0xD1, 0x06, 0x50, \r
-0x02, 0x81, 0xB3, 0xD1, 0x06, 0x40, 0x0A, 0x90, 0x06, 0x35, 0xE0, 0x44, 0x20, 0x90, 0x06, 0x34, \r
-0xF0, 0xE4, 0x90, 0x93, 0xCE, 0xF0, 0x90, 0x93, 0xCE, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x1C, \r
-0xF1, 0x48, 0x90, 0x93, 0xCE, 0xE0, 0x24, 0xB8, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, \r
-0xFF, 0x90, 0x93, 0xCC, 0x12, 0x63, 0x3E, 0xEF, 0xB1, 0xEA, 0x80, 0xDA, 0x90, 0x04, 0x1D, 0xE0, \r
-0x60, 0x23, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x94, 0x57, 0xF0, 0x7D, 0x1D, 0x12, 0x57, 0xF8, 0xBF, \r
-0x01, 0x07, 0x90, 0x93, 0x7C, 0x51, 0x5E, 0xF1, 0x19, 0x90, 0x94, 0x57, 0xE0, 0xFF, 0x7D, 0x1E, \r
-0x12, 0x54, 0x51, 0x80, 0x07, 0x90, 0x93, 0x7C, 0x51, 0x5E, 0xF1, 0x19, 0x12, 0x57, 0xEC, 0x90, \r
-0x8E, 0x87, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x53, 0x91, 0x74, 0xFB, 0x04, 0x90, 0x01, 0xC4, \r
-0xF0, 0x74, 0x7A, 0xA3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF0, 0x90, 0x93, 0xCE, 0xE0, 0x04, \r
-0xF0, 0x22, 0x90, 0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xD1, 0xE4, \r
-0x75, 0xF0, 0x08, 0x02, 0x08, 0xD6, 0x90, 0x94, 0x58, 0xE0, 0xC3, 0x94, 0x0A, 0x22, 0xF0, 0xE4, \r
-0x90, 0x93, 0xDC, 0xF0, 0xA3, 0x22, 0x90, 0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x02, 0x02, 0x08, 0xD6, \r
-0x75, 0x41, 0x90, 0x75, 0x42, 0x4A, 0x75, 0x43, 0x02, 0x22, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0xF5, 0x83, 0x22, 0x90, 0x8D, 0x09, 0xE0, 0xFF, 0x90, 0x95, 0x52, 0xE0, 0xFB, 0x7D, \r
-0x01, 0x51, 0x64, 0x90, 0x95, 0x53, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x95, 0x51, \r
-0xE0, 0xFF, 0xD1, 0xD5, 0x90, 0x95, 0x53, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x00, 0xE0, \r
-0x54, 0x0F, 0xFD, 0xAC, 0x07, 0xD1, 0xBD, 0x44, 0x01, 0xF0, 0xD1, 0xBD, 0x54, 0xFB, 0xF0, 0xAC, \r
-0x07, 0x74, 0x12, 0x2C, 0xD1, 0x2D, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF1, 0x11, 0xE0, \r
-0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0x12, 0x67, 0xD0, 0x44, 0x0E, 0xF0, 0x90, 0x04, \r
-0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, \r
-0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xD1, 0xB5, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, \r
-0xD1, 0xB5, 0xED, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x74, 0x0D, 0x2C, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
-0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xD1, 0xFE, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x0A, 0xD1, 0xF1, 0x44, \r
-0x10, 0xD1, 0xFD, 0x44, 0x80, 0xF0, 0x22, 0xD1, 0xF1, 0x54, 0xEF, 0xD1, 0xFD, 0x44, 0x40, 0xF0, \r
-0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF0, 0x74, 0x09, \r
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x90, 0x8E, 0x82, 0xE0, 0x54, 0x0F, \r
-0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x90, 0x93, 0xCC, 0xEF, 0xF0, 0x90, 0x93, \r
-0x7C, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x22, 0x90, 0x93, 0xCE, 0xE0, 0xFF, 0x24, 0x4C, 0xF5, 0x82, \r
-0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, 0x0D, 0xED, 0x13, \r
-0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0x90, 0x93, 0xD2, 0xE0, 0x2F, 0xFF, 0x90, 0x93, \r
-0xD1, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x94, 0x55, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x7C, 0xE0, \r
-0xFD, 0xF1, 0x37, 0x90, 0x93, 0xCC, 0xEF, 0xF0, 0x22, 0x12, 0x92, 0xAE, 0x90, 0x94, 0x5E, 0xEF, \r
-0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x53, 0xDC, 0x90, \r
-0x94, 0x5E, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, \r
-0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x12, 0x8D, 0x0A, 0xFD, 0x90, 0x8E, 0x9A, 0xE0, 0xFB, \r
-0xA9, 0x07, 0x90, 0x8E, 0x80, 0xE0, 0x30, 0xE0, 0x45, 0x90, 0x8E, 0xBB, 0xE0, 0x24, 0x03, 0xFF, \r
-0xE4, 0x33, 0xFE, 0x90, 0x8E, 0x96, 0xE0, 0xD3, 0x12, 0x9F, 0xC0, 0x98, 0x50, 0x07, 0x90, 0x8E, \r
-0x8C, 0xEB, 0xF0, 0x80, 0x15, 0xED, 0x24, 0xFD, 0xFF, 0x90, 0x8E, 0xBB, 0xE0, 0x2F, 0x2B, 0x90, \r
-0x8E, 0x8C, 0xF0, 0x90, 0x8E, 0xBB, 0xE0, 0x24, 0x03, 0xFD, 0x90, 0x8E, 0xBB, 0xE0, 0x24, 0x04, \r
-0xC3, 0x9D, 0x29, 0xFF, 0x90, 0x8E, 0x99, 0x12, 0x8A, 0x4B, 0xEF, 0xF0, 0x80, 0x0B, 0x12, 0x8A, \r
-0x4C, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x8C, 0xEB, 0xF0, 0x90, 0x8E, 0x8F, 0xA3, 0xE0, 0x90, 0x05, \r
-0x58, 0xF0, 0x22, 0x32, 0x90, 0x95, 0x8A, 0x12, 0x88, 0x12, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x90, \r
-0x95, 0x8A, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x8D, 0x01, 0xF0, 0x22, 0x90, 0x93, 0xB6, 0x74, 0x12, \r
-0xF0, 0x90, 0x93, 0xC4, 0x74, 0x05, 0xF0, 0x90, 0x93, 0xB8, 0xEF, 0x12, 0xA0, 0x37, 0x90, 0x93, \r
-0xB4, 0xE0, 0x90, 0x93, 0xBB, 0xF0, 0x90, 0x93, 0xB5, 0xE0, 0x90, 0x93, 0xBC, 0xF0, 0x7B, 0x01, \r
-0x7A, 0x93, 0x79, 0xB6, 0x11, 0xCE, 0x7F, 0x04, 0x80, 0xBA, 0x11, 0xC7, 0x7F, 0xF5, 0x7E, 0x01, \r
-0x12, 0x34, 0xC1, 0xBF, 0x01, 0x06, 0x90, 0x93, 0xAB, 0xE0, 0xA3, 0xF0, 0x11, 0xC7, 0x7F, 0xF6, \r
-0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0xAB, 0xE0, 0x90, 0x93, 0xAD, 0xF0, \r
-0x11, 0xC7, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0xAB, 0xE0, \r
-0x90, 0x93, 0xAE, 0xF0, 0x11, 0xC7, 0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, \r
-0x90, 0x93, 0xAB, 0xE0, 0x90, 0x93, 0xAF, 0xF0, 0x11, 0xC7, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x34, \r
-0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0xAB, 0xE0, 0x90, 0x93, 0xB0, 0xF0, 0x90, 0x93, 0xAC, 0xE0, \r
-0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0xB4, 0xF0, 0x90, 0x93, 0xB0, \r
-0xE0, 0x90, 0x93, 0xB5, 0xF0, 0x01, 0x1B, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAB, 0x22, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0xF6, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, \r
-0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8D, 0xF7, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, \r
-0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x29, 0xC0, 0x01, \r
-0x90, 0x8D, 0xF7, 0xE0, 0x12, 0x9F, 0x2A, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, \r
-0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0x8D, 0xF7, 0x91, 0x2B, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, \r
-0x60, 0x05, 0xE4, 0x90, 0x8D, 0xF7, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, \r
-0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xC7, 0xE0, 0xFF, 0x12, 0x9D, 0x27, 0xEF, 0x60, 0x62, 0x90, 0x94, \r
-0xC8, 0xE0, 0xFB, 0xD3, 0x94, 0x00, 0x40, 0x19, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, \r
-0x00, 0x0F, 0xAF, 0x03, 0xE4, 0xFC, 0xFD, 0xFE, 0x71, 0x50, 0x7F, 0x08, 0x7E, 0x0E, 0x12, 0x4D, \r
-0x92, 0x90, 0x94, 0xC7, 0xE0, 0xFF, 0x90, 0x06, 0x33, 0xF0, 0x71, 0x56, 0xF0, 0xE4, 0xFB, 0xFD, \r
-0x31, 0xE3, 0x90, 0x8D, 0xFC, 0xE0, 0xFF, 0x12, 0x9D, 0x52, 0x90, 0x94, 0xC9, 0xE0, 0x90, 0x93, \r
-0xA8, 0xF0, 0x90, 0x94, 0xB4, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x71, 0x92, 0x90, 0x93, 0xA8, 0x12, \r
-0x65, 0x62, 0x90, 0x95, 0x46, 0x12, 0x08, 0x6D, 0x12, 0x9F, 0xD8, 0x12, 0x50, 0x3B, 0x80, 0x3E, \r
-0xE4, 0x90, 0x94, 0xB4, 0xF0, 0x90, 0x94, 0xD0, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x54, 0xFB, 0xF0, \r
-0x51, 0xDE, 0x90, 0x8D, 0xFF, 0xE0, 0xB4, 0x01, 0x0D, 0x90, 0x94, 0xCC, 0xE0, 0xFD, 0x7F, 0x02, \r
-0x12, 0x53, 0xDC, 0x12, 0x9B, 0x6C, 0x90, 0x93, 0xA9, 0x74, 0x07, 0xF0, 0x90, 0x93, 0xB7, 0xF0, \r
-0x7B, 0x01, 0x7A, 0x93, 0x79, 0xA9, 0x11, 0xCE, 0x7F, 0x04, 0x11, 0x04, 0x71, 0x5E, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x66, 0xEF, 0xF0, 0xED, \r
-0x64, 0x01, 0x70, 0x33, 0xEB, 0xB4, 0x01, 0x07, 0xE0, 0x24, 0x02, 0xF5, 0x5A, 0x80, 0x08, 0x90, \r
-0x95, 0x66, 0xE0, 0x24, 0xFE, 0xF5, 0x5A, 0x90, 0x94, 0xE8, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, \r
-0xFF, 0xAF, 0x5A, 0x51, 0x57, 0xE4, 0xFF, 0x51, 0x66, 0x90, 0x94, 0xE8, 0x12, 0x08, 0x79, 0x00, \r
-0x00, 0x00, 0xFF, 0xAF, 0x5A, 0x80, 0x25, 0x90, 0x94, 0xE8, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, \r
-0xFF, 0x90, 0x95, 0x66, 0x12, 0x65, 0x62, 0x51, 0x5B, 0xE4, 0xFF, 0x51, 0x66, 0x90, 0x94, 0xE8, \r
-0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0x95, 0x66, 0xE0, 0xFF, 0x51, 0x57, 0x7F, 0x01, \r
-0x51, 0x66, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x94, 0xEC, 0x12, 0x08, \r
-0x6D, 0x7D, 0x18, 0x7C, 0x00, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xE6, \r
-0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x94, 0xE5, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3E, \r
-0x02, 0x90, 0x94, 0xF0, 0x12, 0x08, 0x6D, 0x90, 0x94, 0xE8, 0x12, 0x43, 0xE5, 0x12, 0x08, 0x3A, \r
-0x90, 0x94, 0xF0, 0x12, 0x4F, 0xF4, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x94, \r
-0xE8, 0x12, 0x43, 0xE5, 0x90, 0x94, 0xEC, 0x12, 0x4F, 0xF4, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, \r
-0xD0, 0x00, 0x12, 0x43, 0xC7, 0x90, 0x94, 0xF4, 0x12, 0x08, 0x6D, 0x90, 0x94, 0xE6, 0xA3, 0xE0, \r
-0xFD, 0xC0, 0x05, 0x90, 0x94, 0xF4, 0x12, 0x43, 0xE5, 0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, \r
-0x94, 0xE5, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, 0x09, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8D, \r
-0xFB, 0x91, 0x0B, 0x30, 0xE0, 0x08, 0x12, 0x9F, 0xEF, 0xE4, 0x90, 0x94, 0xCF, 0xF0, 0x90, 0x94, \r
-0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, 0xB5, 0x12, 0x65, 0x62, 0x71, 0x50, \r
-0x7F, 0x50, 0x7E, 0x0C, 0x12, 0x4F, 0x38, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, \r
-0xB6, 0x12, 0x65, 0x62, 0x71, 0x50, 0x12, 0x4D, 0x8E, 0x90, 0x94, 0xCB, 0xE0, 0x90, 0x06, 0x08, \r
-0xF0, 0x90, 0x94, 0xCD, 0xA3, 0xE0, 0x90, 0x06, 0xA0, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x94, 0xB9, \r
-0xE0, 0xFF, 0x60, 0x06, 0xA3, 0xE0, 0xFD, 0x12, 0x4D, 0xF4, 0x90, 0x94, 0xB8, 0xE0, 0xFF, 0x60, \r
-0x0B, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0x71, 0x56, 0xF0, 0x31, 0xE3, 0x22, 0x12, 0x08, 0x5A, \r
-0x90, 0x94, 0xFE, 0x02, 0x08, 0x6D, 0x90, 0x94, 0xBF, 0xE0, 0x90, 0x95, 0x69, 0x22, 0x12, 0x9E, \r
-0xF1, 0x30, 0xE0, 0x25, 0x12, 0x9F, 0x5F, 0x60, 0x0C, 0x12, 0x9F, 0x55, 0x40, 0x07, 0x71, 0x8A, \r
-0x90, 0x91, 0x3F, 0x80, 0x05, 0x71, 0x8A, 0x90, 0x91, 0x37, 0x12, 0x43, 0xF1, 0x12, 0x42, 0x9D, \r
-0x90, 0x95, 0x46, 0x12, 0x08, 0x6D, 0x12, 0x50, 0x34, 0x22, 0xE4, 0x7F, 0xE8, 0x7E, 0x03, 0xFD, \r
-0xFC, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xB8, 0xEF, 0xF0, 0x90, 0x8D, \r
-0xFD, 0xE0, 0xFF, 0x12, 0x66, 0x4A, 0x74, 0x10, 0x2F, 0xFF, 0x90, 0x93, 0xB8, 0xE0, 0x25, 0xE0, \r
-0x25, 0xE0, 0x2F, 0xFF, 0x71, 0xC4, 0x71, 0xD5, 0x7A, 0x94, 0x79, 0xC7, 0x12, 0x35, 0x26, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x22, \r
-0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x22, 0x91, 0x03, 0x2F, \r
-0x71, 0xC6, 0x89, 0x42, 0x75, 0x43, 0x08, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xF9, 0x02, 0x35, 0x26, \r
-0x91, 0x03, 0x2F, 0x71, 0xC6, 0x89, 0x42, 0x75, 0x43, 0x70, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x61, \r
-0x02, 0x35, 0x26, 0x12, 0x66, 0x4A, 0x7E, 0x00, 0x74, 0x00, 0x22, 0xE0, 0xFF, 0x13, 0x13, 0x54, \r
-0x3F, 0x22, 0x90, 0x93, 0x89, 0x91, 0x0B, 0x30, 0xE0, 0x0E, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x00, \r
-0x12, 0x9F, 0x10, 0x04, 0xF0, 0x02, 0x55, 0xD5, 0x02, 0x57, 0x83, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, \r
-0x00, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0x5F, 0xE0, 0xFF, 0x90, 0x8D, \r
-0x5E, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x3F, 0x90, 0x8D, \r
-0x5E, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x8D, 0x0E, 0x12, 0x43, 0xFD, 0xE0, 0xFD, 0xEE, 0x75, \r
-0xF0, 0x08, 0xA4, 0x24, 0x0F, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x91, \r
-0x92, 0x90, 0x8D, 0x5E, 0x91, 0x2B, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, \r
-0x8D, 0x5E, 0xF0, 0x12, 0x69, 0xFE, 0x90, 0x8D, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, \r
-0xAF, 0x22, 0x90, 0x93, 0xA7, 0x12, 0x9F, 0xA0, 0x90, 0x93, 0xA7, 0xE0, 0xFF, 0x90, 0x06, 0x34, \r
-0xF0, 0xEF, 0x12, 0x44, 0x1B, 0x84, 0xE2, 0x00, 0x84, 0xEB, 0x01, 0x84, 0xF4, 0x02, 0x84, 0xFD, \r
-0x03, 0x85, 0x05, 0x04, 0x85, 0x0D, 0x12, 0x85, 0x15, 0x14, 0x85, 0x1E, 0x20, 0x85, 0x27, 0x21, \r
-0x85, 0x2F, 0x23, 0x85, 0x38, 0x25, 0x85, 0x41, 0x27, 0x85, 0x51, 0x80, 0x85, 0x49, 0x81, 0x85, \r
-0x5A, 0x82, 0x85, 0x63, 0x83, 0x85, 0x6B, 0x84, 0x85, 0x7D, 0x86, 0x85, 0x74, 0x88, 0x00, 0x00, \r
-0x85, 0x85, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x77, 0x89, 0x90, 0x93, 0xA8, 0x12, 0x44, \r
-0x09, 0x02, 0x88, 0x19, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x8D, 0xEA, 0x90, 0x93, 0xA8, \r
-0x12, 0x44, 0x09, 0xA1, 0xA8, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0xC1, 0x33, 0x90, 0x93, 0xA8, \r
-0x12, 0x44, 0x09, 0xA1, 0x95, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x8E, 0x27, 0x90, 0x93, \r
-0xA8, 0x12, 0x44, 0x09, 0x02, 0x74, 0x22, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0xA1, 0xC7, 0x90, \r
-0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x8E, 0x36, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x8E, \r
-0x3E, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0xA1, 0xF0, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0xE1, \r
-0x3E, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x75, 0xD0, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, \r
-0x02, 0x98, 0x87, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0xC1, 0xFD, 0x90, 0x93, 0xA8, 0x12, 0x44, \r
-0x09, 0x02, 0x98, 0x9D, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x98, 0xEB, 0x90, 0x93, 0xA8, \r
-0x12, 0x44, 0x09, 0xC1, 0x67, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, 0xA7, 0xE0, \r
-0x90, 0x01, 0xC2, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x8D, 0xFA, 0xF0, 0xBF, 0x01, 0x07, \r
-0x11, 0x4A, 0xE4, 0x90, 0x8D, 0xFA, 0xF0, 0x22, 0xD1, 0x2B, 0x90, 0x93, 0x89, 0xD1, 0x1D, 0x54, \r
-0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xF0, 0x12, 0x06, 0x89, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, \r
-0x75, 0xCA, 0x90, 0x93, 0x8A, 0xF0, 0x22, 0x12, 0x77, 0x7B, 0xFF, 0x30, 0xE0, 0x1D, 0x12, 0x06, \r
-0x89, 0x90, 0x8F, 0x23, 0x12, 0x75, 0xC9, 0x90, 0x8F, 0x24, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, \r
-0xE0, 0x54, 0x01, 0x12, 0x77, 0x81, 0x90, 0x8F, 0x26, 0xF0, 0x22, 0x12, 0x8D, 0x61, 0xF0, 0x22, \r
-0xD1, 0x2B, 0x90, 0x8F, 0x2A, 0xD1, 0x1D, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0x12, 0x75, \r
-0xC9, 0x90, 0x8F, 0x2B, 0x12, 0x77, 0x7A, 0x90, 0x8F, 0x2C, 0xF0, 0x90, 0x8F, 0x2B, 0xE0, 0x90, \r
-0x8F, 0x2D, 0xF0, 0x90, 0x8F, 0x2A, 0xE0, 0x54, 0x01, 0xFF, 0x02, 0x6D, 0xAF, 0xE0, 0x54, 0xFE, \r
-0x4E, 0xFE, 0xF0, 0xEF, 0x22, 0x90, 0x93, 0xAB, 0x12, 0x44, 0x09, 0x12, 0x06, 0x89, 0xFF, 0x54, \r
-0x01, 0xFE, 0x22, 0x12, 0x77, 0xCB, 0x12, 0x8D, 0x74, 0xD1, 0x25, 0x12, 0x9A, 0x19, 0x4E, 0xF0, \r
-0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x20, 0x12, 0x75, 0xCA, 0x90, 0x93, 0x8E, 0x12, 0x77, 0x7A, 0x90, \r
-0x93, 0x8F, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x04, 0xFF, 0x90, 0x93, 0x8D, 0xE0, 0x54, 0xFB, 0x12, \r
-0x77, 0x81, 0x90, 0x93, 0x90, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x02, \r
-0x09, 0xE0, 0xFD, 0xD1, 0x2B, 0x90, 0x8D, 0xFB, 0xF1, 0xE5, 0xFC, 0xEF, 0x54, 0xFB, 0x4C, 0xFF, \r
-0x90, 0x8D, 0xFB, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x12, 0x75, 0xC8, 0xFF, 0xED, \r
-0x2F, 0x90, 0x8D, 0xFC, 0x12, 0x77, 0x7A, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x8D, 0xFD, 0xF0, \r
-0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x20, 0xE0, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0A, \r
-0x90, 0x06, 0x31, 0xE0, 0x44, 0x40, 0xF0, 0x12, 0x66, 0xB0, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x30, \r
-0xE0, 0x36, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x06, 0x09, 0xE0, 0x54, 0xFE, 0x12, \r
-0x9D, 0x1F, 0xF0, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x09, 0x12, 0x9F, 0xF7, 0x90, 0x94, \r
-0xCF, 0x74, 0x01, 0xF0, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x6D, 0xA1, 0x90, 0x95, 0x46, 0x12, 0x08, \r
-0x79, 0x00, 0x00, 0x27, 0x10, 0x12, 0x50, 0x34, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x98, 0xDD, \r
-0x90, 0x93, 0x79, 0x12, 0x75, 0xC9, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x7A, 0x12, 0x77, 0x7A, 0xFF, \r
-0xED, 0x2F, 0x90, 0x93, 0x7B, 0x12, 0x77, 0x82, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x7C, 0x12, 0x77, \r
-0xC4, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x7D, 0x12, 0x77, 0xD1, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x7E, \r
-0xF0, 0x12, 0x74, 0xF8, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93, 0x7F, 0xF0, 0x22, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xD1, 0x2B, 0x90, 0x8F, 0x2E, 0xF1, 0xE5, 0xFD, 0xEF, 0x54, 0xFB, \r
-0x4D, 0xFF, 0x90, 0x8F, 0x2E, 0x12, 0x9E, 0xAA, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x12, 0x9F, \r
-0xB0, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x12, 0x9E, 0xB2, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, \r
-0x12, 0x9F, 0xB0, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x12, 0x77, 0x7A, 0x54, 0x01, 0xFF, \r
-0x90, 0x8F, 0x30, 0xE0, 0x54, 0xFE, 0x4F, 0x12, 0x75, 0xC9, 0x54, 0x01, 0xFF, 0x90, 0x8F, 0x2F, \r
-0xE0, 0x54, 0xFE, 0x4F, 0x12, 0x61, 0x53, 0x12, 0x9F, 0xB8, 0x90, 0x8F, 0x2E, 0xE0, 0xC3, 0x13, \r
-0x54, 0x01, 0xFF, 0x12, 0x98, 0xFB, 0xF1, 0xDE, 0x54, 0x01, 0xFF, 0x12, 0x99, 0x07, 0xF1, 0xDE, \r
-0x13, 0x54, 0x01, 0xFF, 0x12, 0x99, 0x13, 0x90, 0x8F, 0x2E, 0xE0, 0xC4, 0x54, 0x01, 0xFF, 0x12, \r
-0x99, 0x67, 0x90, 0x8F, 0x2E, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFF, 0x12, 0x67, 0xD9, 0x90, \r
-0x8F, 0x2E, 0xE0, 0x54, 0x01, 0xFF, 0x12, 0x6F, 0x87, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8F, \r
-0x2E, 0xE0, 0x13, 0x13, 0x22, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, \r
-0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0x22, 0x90, 0x95, 0x8B, 0x11, \r
-0x12, 0x90, 0x8D, 0x02, 0xE0, 0xFF, 0x90, 0x95, 0x8B, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x8D, 0x02, \r
-0xF0, 0x22, 0xEF, 0xF0, 0x7F, 0x02, 0x02, 0x48, 0x12, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, \r
-0x75, 0xCA, 0xFF, 0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x77, \r
-0x7B, 0xF5, 0x56, 0x80, 0x02, 0x8F, 0x56, 0x85, 0x55, 0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, \r
-0x21, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x11, 0x78, 0xEF, \r
-0xF0, 0x11, 0x78, 0xE0, 0xAF, 0x54, 0x70, 0x04, 0x11, 0x8A, 0x80, 0x02, 0x11, 0x84, 0x05, 0x54, \r
-0x80, 0xD8, 0x11, 0x9E, 0xE5, 0x55, 0x70, 0x0F, 0x90, 0x8D, 0xFF, 0xE0, 0x70, 0x09, 0x12, 0x6D, \r
-0x7E, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x74, 0xFF, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, \r
-0x8D, 0xF5, 0x83, 0x22, 0x11, 0x90, 0x54, 0xFB, 0xF0, 0x22, 0x11, 0x90, 0x44, 0x04, 0xF0, 0x22, \r
-0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x43, 0xFD, 0xE0, 0x22, 0xE4, 0xFF, \r
-0x11, 0xB7, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x19, 0xF7, 0xE4, 0x90, 0x8E, 0x97, 0xF0, 0x90, 0x8E, \r
-0x9B, 0xF0, 0x90, 0x8E, 0x95, 0xF0, 0x22, 0x74, 0x9C, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, \r
-0x83, 0x22, 0xE4, 0x90, 0x94, 0x59, 0xF0, 0xFD, 0xA3, 0xF0, 0xB1, 0x12, 0xFB, 0xEB, 0x78, 0x02, \r
-0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x8E, 0xB7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
-0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x8E, 0xB7, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3, 0x9F, \r
-0xEA, 0x9E, 0x40, 0x23, 0xEB, 0x9F, 0xFF, 0x90, 0x8E, 0x99, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, \r
-0x2F, 0xFD, 0xC3, 0x94, 0x19, 0x50, 0x0E, 0x74, 0x9C, 0x2D, 0x11, 0xBA, 0xE0, 0x04, 0xF0, 0x90, \r
-0x8E, 0x97, 0xE0, 0x04, 0xF0, 0x31, 0x7C, 0x90, 0x8E, 0x97, 0xE0, 0xC3, 0x94, 0x64, 0x40, 0x5B, \r
-0xE4, 0x90, 0x94, 0x5A, 0xF0, 0x90, 0x94, 0x59, 0xF0, 0x90, 0x94, 0x59, 0xE0, 0xFF, 0xC3, 0x94, \r
-0x19, 0x50, 0x3A, 0x11, 0xB7, 0x51, 0xF7, 0xF0, 0xE0, 0xD3, 0x94, 0x05, 0x40, 0x27, 0x90, 0x94, \r
-0x59, 0xE0, 0xFF, 0x94, 0x0A, 0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0x8E, 0x96, 0xF0, 0xE4, 0x80, \r
-0x0E, 0xE4, 0x90, 0x8E, 0x96, 0xF0, 0x90, 0x94, 0x59, 0xE0, 0xFF, 0xC3, 0x74, 0x0A, 0x9F, 0x90, \r
-0x8E, 0x95, 0xF0, 0x80, 0x08, 0x90, 0x94, 0x59, 0xE0, 0x04, 0xF0, 0x80, 0xBC, 0x90, 0x8E, 0x96, \r
-0xE0, 0xFD, 0x7B, 0x08, 0xE4, 0xFF, 0x12, 0x7F, 0xA0, 0x11, 0x9E, 0x22, 0xB1, 0x34, 0x40, 0x20, \r
-0x90, 0x8E, 0x9B, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x94, 0x04, 0x50, 0x14, 0x90, 0x8E, 0x95, 0xEF, \r
-0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0x8E, 0x9A, 0xF0, 0xFB, 0xB1, 0x0A, 0xFD, 0x12, 0x7F, 0xA0, \r
-0x22, 0x7E, 0x00, 0x7F, 0xA3, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0x80, 0x12, 0x08, 0xAA, \r
-0x51, 0x7D, 0x12, 0x08, 0xAA, 0x90, 0x8E, 0x83, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x8A, 0x14, 0xF0, \r
-0xA3, 0xF0, 0xA3, 0x74, 0x08, 0x51, 0x4B, 0x74, 0x02, 0x51, 0x3B, 0xE4, 0xFD, 0xFF, 0x12, 0x53, \r
-0xDC, 0x7D, 0x0C, 0x7F, 0x02, 0x12, 0x53, 0xDC, 0x51, 0x90, 0x90, 0x8D, 0x06, 0xE0, 0xFF, 0xB4, \r
-0x01, 0x08, 0x90, 0x8E, 0x8E, 0x74, 0xDD, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x8E, 0x8E, 0xB4, 0x03, \r
-0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x79, 0x12, 0x4A, 0x84, 0xEF, 0x54, \r
-0x03, 0xFF, 0xBF, 0x02, 0x0F, 0x7F, 0x28, 0x12, 0x4A, 0x84, 0xEF, 0x30, 0xE2, 0x06, 0x90, 0x8E, \r
-0xBB, 0x74, 0x02, 0xF0, 0xB1, 0x61, 0x51, 0x3B, 0x11, 0x9E, 0x7E, 0x00, 0x7F, 0x02, 0x7D, 0x00, \r
-0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x27, 0x12, 0x08, 0xAA, 0x51, 0xEF, 0x90, 0x06, 0x0A, 0xE0, 0x54, \r
-0xF8, 0xF0, 0x12, 0x57, 0xF3, 0xE4, 0x90, 0x8F, 0x29, 0xF0, 0x22, 0xF0, 0x90, 0x8E, 0xBB, 0xE0, \r
-0x24, 0x04, 0x90, 0x8E, 0x99, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x22, 0xF0, 0x90, 0x8E, 0x8F, 0xE4, \r
-0xF0, 0xA3, 0x22, 0x51, 0x8A, 0xB1, 0x40, 0x31, 0xA1, 0x51, 0x78, 0x12, 0x6F, 0xE1, 0xB1, 0x4E, \r
-0xB1, 0x74, 0x90, 0x93, 0x96, 0xE0, 0x54, 0x7F, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, \r
-0xF0, 0xF0, 0xE4, 0x90, 0x93, 0x98, 0xF0, 0x22, 0x51, 0x7D, 0x02, 0x08, 0xAA, 0x7E, 0x00, 0x7F, \r
-0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x2A, 0x22, 0xE4, 0x90, 0x8D, 0xFF, 0xF0, 0x22, \r
-0x7D, 0x0C, 0x7F, 0x01, 0x02, 0x53, 0xDC, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, \r
-0x93, 0xEF, 0xF0, 0x90, 0x8D, 0x09, 0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x3B, 0x90, \r
-0x8E, 0x87, 0xE0, 0x64, 0x0E, 0x70, 0x13, 0x90, 0x95, 0x93, 0xE0, 0x70, 0x2D, 0x90, 0x8E, 0x80, \r
-0xE0, 0x54, 0x7F, 0xF0, 0x51, 0xEF, 0x51, 0x90, 0x80, 0x1D, 0x90, 0x8E, 0x87, 0xE0, 0x64, 0x06, \r
-0x70, 0x18, 0x90, 0x95, 0x93, 0xE0, 0x60, 0x12, 0x90, 0x8E, 0x80, 0xE0, 0x54, 0xBF, 0xF0, 0xB1, \r
-0x28, 0x90, 0x8E, 0x87, 0x74, 0x04, 0xF0, 0x12, 0x57, 0xF3, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, \r
-0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x22, 0xE0, 0xFF, 0x90, 0x94, 0x5A, 0xE0, 0x2F, 0x22, 0xE4, \r
-0x90, 0x94, 0x5C, 0xF0, 0xA3, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x20, 0xF0, 0xB1, 0x8E, 0xEF, \r
-0x64, 0x01, 0x70, 0x6A, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0x12, 0x7A, 0x64, \r
-0x90, 0x94, 0x59, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x94, 0x59, 0x71, 0x87, 0x90, 0x94, 0x5B, \r
-0xEF, 0xF0, 0x90, 0x94, 0x59, 0xB1, 0x1C, 0xE4, 0xFD, 0x71, 0xCD, 0x90, 0x94, 0x5B, 0x51, 0xF7, \r
-0xFF, 0x90, 0x94, 0x59, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x30, 0xCF, 0x34, 0x00, 0xFE, 0x90, 0x94, \r
-0x5C, 0xF0, 0xA3, 0xEF, 0xF0, 0xB1, 0xBC, 0x71, 0x7F, 0xFD, 0x90, 0x93, 0x84, 0xE0, 0xFB, 0xE4, \r
-0xFF, 0x12, 0x61, 0x65, 0x71, 0x7F, 0xFD, 0x90, 0x93, 0x80, 0xE0, 0xFB, 0x7F, 0x11, 0x12, 0x61, \r
-0x65, 0x12, 0x57, 0xEC, 0x90, 0x90, 0xEF, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x22, 0x90, \r
-0x94, 0x5C, 0xE0, 0xFC, 0xA3, 0xE0, 0x22, 0xA3, 0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, \r
-0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x29, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
-0xFD, 0x74, 0x2C, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, \r
-0x30, 0xE7, 0x04, 0x7C, 0x02, 0x80, 0x02, 0xE4, 0xFC, 0xED, 0x30, 0xE6, 0x08, 0xAF, 0x03, 0x91, \r
-0xCB, 0xAE, 0x07, 0x80, 0x02, 0xE4, 0xFE, 0xEC, 0x24, 0x18, 0x2E, 0xFF, 0x22, 0x90, 0x95, 0x4E, \r
-0xED, 0xF0, 0x90, 0x95, 0x4B, 0x12, 0x44, 0x12, 0xE4, 0x90, 0x95, 0x4F, 0xF0, 0xA3, 0xF0, 0x12, \r
-0x06, 0x89, 0xFF, 0x12, 0x75, 0xCA, 0xFD, 0x12, 0x77, 0xC5, 0xFB, 0x71, 0xAD, 0x90, 0x95, 0x4F, \r
-0xEF, 0xF0, 0x90, 0x95, 0x4B, 0x12, 0x44, 0x09, 0x12, 0x77, 0xC5, 0xFF, 0x91, 0xCB, 0x90, 0x95, \r
-0x50, 0xEF, 0xF0, 0x90, 0x90, 0x02, 0xE0, 0x24, 0xFE, 0x60, 0x14, 0x24, 0xFE, 0x60, 0x10, 0x14, \r
-0x60, 0x07, 0x14, 0x60, 0x04, 0x24, 0x05, 0x70, 0x41, 0x91, 0x5B, 0x91, 0x67, 0x80, 0x0D, 0x91, \r
-0x5B, 0x90, 0x90, 0x02, 0xE0, 0x90, 0x95, 0x20, 0xF0, 0x12, 0x74, 0xFE, 0x90, 0x95, 0x50, 0xE0, \r
-0xFF, 0x90, 0x95, 0x4B, 0x12, 0x44, 0x09, 0x90, 0x95, 0x4F, 0xE0, 0x7C, 0x00, 0x29, 0xF9, 0xEC, \r
-0x3A, 0xFA, 0xC3, 0xE9, 0x9F, 0xF9, 0xEA, 0x94, 0x00, 0xFA, 0x75, 0x40, 0x01, 0x75, 0x41, 0x8F, \r
-0x75, 0x42, 0xF9, 0xA3, 0xE0, 0xF5, 0x43, 0x12, 0x35, 0x26, 0x22, 0x7B, 0x01, 0x7A, 0x8F, 0x79, \r
-0xF9, 0x90, 0x95, 0x4E, 0xE0, 0xFD, 0x22, 0x90, 0x95, 0x3A, 0xED, 0xF0, 0x90, 0x95, 0x37, 0x12, \r
-0x44, 0x12, 0x12, 0x77, 0x83, 0x90, 0x95, 0x3E, 0xF0, 0x90, 0x95, 0x37, 0x12, 0x56, 0xE5, 0x75, \r
-0x43, 0x03, 0x7B, 0x01, 0x7A, 0x95, 0x79, 0x3B, 0x12, 0x35, 0x26, 0x90, 0x95, 0x3A, 0xE0, 0x70, \r
-0x2E, 0xFF, 0x91, 0xC0, 0xE0, 0xB4, 0xFF, 0x06, 0x91, 0xC0, 0xE4, 0xF0, 0x80, 0x07, 0x91, 0xC0, \r
-0xE0, 0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x03, 0xE8, 0x75, 0x40, 0x01, 0x75, 0x41, 0x95, \r
-0x75, 0x42, 0x3B, 0x75, 0x43, 0x03, 0x90, 0x95, 0x37, 0x12, 0x44, 0x09, 0x12, 0x35, 0x26, 0x22, \r
-0x74, 0x3B, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
-0xC0, 0xD0, 0xEF, 0x20, 0xE0, 0x05, 0x90, 0x93, 0x77, 0x80, 0x03, 0x90, 0x93, 0x78, 0xE0, 0x90, \r
-0x90, 0x02, 0xF0, 0x90, 0x90, 0x02, 0xE0, 0x14, 0x60, 0x13, 0x14, 0x60, 0x14, 0x24, 0xFE, 0x60, \r
-0x10, 0x14, 0x60, 0x09, 0x14, 0x60, 0x06, 0x24, 0x06, 0xE4, 0xFE, 0x80, 0x06, 0x7E, 0x04, 0x80, \r
-0x02, 0x7E, 0x08, 0xAF, 0x06, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8E, 0x95, 0xE0, 0xFF, 0xA3, \r
-0xE0, 0x22, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0x22, 0xA3, 0xE0, 0x24, 0x28, \r
-0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, \r
-0x44, 0x80, 0xF0, 0x22, 0x90, 0x8F, 0x23, 0xE0, 0xFF, 0x90, 0x8E, 0x8D, 0xE0, 0xD3, 0x9F, 0x22, \r
-0xE4, 0x90, 0x8D, 0xF6, 0xF0, 0xA3, 0xF0, 0x90, 0x8D, 0x5E, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x93, \r
-0x89, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xFB, 0xF0, 0xA3, 0x74, 0x0A, 0x02, 0x59, \r
-0xBE, 0x90, 0x8F, 0x23, 0x74, 0x05, 0xF0, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, \r
-0xA3, 0x74, 0x05, 0x22, 0x7E, 0x00, 0x7F, 0x08, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x8D, \r
-0x12, 0x08, 0xAA, 0x90, 0x93, 0x8E, 0x74, 0x08, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x22, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, \r
-0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, \r
-0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAD, 0x07, 0x90, 0x90, \r
-0xE7, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x90, 0x90, 0xE7, 0xE0, 0xFF, 0xAE, 0x05, 0x74, \r
-0x04, 0x2E, 0x12, 0x67, 0xA7, 0xEF, 0xF0, 0x90, 0x90, 0xE7, 0xA3, 0xE0, 0xFF, 0x74, 0x05, 0x2E, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x8E, 0x7F, 0xF0, 0xBF, \r
-0x01, 0x0D, 0x12, 0x75, 0xCA, 0x64, 0x01, 0x60, 0x19, 0x7D, 0x13, 0x7F, 0x6F, 0x80, 0x10, 0xAB, \r
-0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x75, 0xCA, 0x64, 0x01, 0x60, 0x06, 0xE4, 0xFD, 0xFF, 0x12, \r
-0x54, 0x51, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0x93, 0x9B, \r
-0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x8E, 0x8E, 0xF0, 0x22, 0x12, 0x06, \r
-0x89, 0x90, 0x8F, 0x29, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x5A, \r
-0xEE, 0xF0, 0xA3, 0xEF, 0x12, 0x59, 0xBE, 0x90, 0x95, 0x5A, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, \r
-0x8E, 0x83, 0xE0, 0x60, 0x21, 0xC3, 0x90, 0x95, 0x5D, 0xE0, 0x94, 0xE8, 0x90, 0x95, 0x5C, 0xE0, \r
-0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x09, 0x90, \r
-0x95, 0x5C, 0xD1, 0x8D, 0x80, 0xD1, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x75, 0xF0, \r
-0x01, 0x12, 0x08, 0xD6, 0x7F, 0x0A, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90, 0x01, 0x9A, 0xE0, 0x54, \r
-0xC0, 0x44, 0x0B, 0xF0, 0xD1, 0x94, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, \r
-0x02, 0x7F, 0x01, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xF1, 0x09, 0xE4, 0xF0, 0x0C, 0xEC, \r
-0xB4, 0x18, 0xF3, 0xF1, 0x06, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, \r
-0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, \r
-0x83, 0xE0, 0x54, 0xF0, 0xF0, 0xF1, 0xC3, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, \r
-0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, \r
-0x22, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0x12, 0x61, 0x5C, 0x90, 0x93, 0xAB, 0xF0, \r
-0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x87, 0xE0, 0xF9, 0x90, 0x8F, 0x2E, 0xE0, 0x30, 0xE0, 0x7C, 0xEC, \r
-0xC3, 0x99, 0x50, 0x77, 0x90, 0x93, 0xAB, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xF1, 0xD6, 0xAD, 0x07, \r
-0xD1, 0xFA, 0x12, 0x9E, 0xFC, 0x54, 0x3F, 0x90, 0x93, 0xAD, 0xF1, 0xAC, 0xE0, 0x54, 0x03, 0xFB, \r
-0xEF, 0x24, 0x18, 0xFF, 0xE4, 0x33, 0xCF, 0x2B, 0xCF, 0x3A, 0x90, 0x93, 0xAD, 0x8F, 0xF0, 0x12, \r
-0x08, 0xD6, 0x90, 0x93, 0xAD, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x93, 0x78, 0xF1, 0xCE, 0xF0, \r
-0x90, 0x93, 0xAB, 0xEE, 0x8F, 0xF0, 0xF1, 0xDE, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x93, 0xAC, \r
-0xE0, 0x9F, 0x90, 0x93, 0xAB, 0xE0, 0x9E, 0x40, 0x14, 0x90, 0x8D, 0xF9, 0x12, 0x9F, 0x05, 0xFE, \r
-0xC3, 0x90, 0x93, 0xAC, 0xE0, 0x9F, 0xF0, 0x90, 0x93, 0xAB, 0xE0, 0x9E, 0xF0, 0x90, 0x93, 0xAB, \r
-0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x93, 0x6A, 0x0C, 0x80, 0x84, 0x22, 0xF0, 0xA3, 0xEF, 0xF0, \r
-0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, \r
-0x54, 0xF8, 0xFF, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0x22, 0x90, 0x93, \r
-0xAD, 0xEE, 0xF0, 0xA3, 0xEF, 0x22, 0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, 0x03, 0x22, 0x12, 0x08, \r
-0xD6, 0x90, 0x8D, 0xF8, 0xE0, 0x22, 0x90, 0x95, 0x5E, 0x12, 0x9F, 0xA0, 0x90, 0x95, 0x7C, 0xE0, \r
-0xFE, 0x04, 0xF0, 0x12, 0x90, 0x4B, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, \r
-0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x95, 0x5F, 0x12, 0x56, 0xE5, 0x75, 0x43, 0x02, 0xD0, \r
-0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x95, 0x5E, 0xE0, 0x24, 0x02, 0xF9, 0xE4, \r
-0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x44, 0x09, 0xE9, \r
-0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0x95, 0x5F, 0x11, 0x52, \r
-0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x35, 0x26, 0x90, 0x00, 0x01, 0xEE, 0x02, \r
-0x06, 0xE1, 0x12, 0x44, 0x09, 0x90, 0x00, 0x0E, 0x02, 0x06, 0xA2, 0xEF, 0x70, 0x04, 0x74, 0xF0, \r
-0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, \r
-0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, \r
-0xEB, 0xF0, 0x22, 0x90, 0x95, 0x72, 0x12, 0x44, 0x12, 0xE4, 0xFF, 0x90, 0x95, 0x72, 0x12, 0x44, \r
-0x09, 0x8F, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0x02, 0x11, 0xA8, 0xB4, 0x10, 0xE4, 0x22, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0x22, 0xE4, \r
-0xFF, 0x74, 0x18, 0x11, 0xD3, 0x74, 0x3D, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, \r
-0xF0, 0x74, 0x10, 0x11, 0xD3, 0x74, 0x37, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0x11, 0xA8, 0xB4, \r
-0x06, 0xDF, 0x22, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, 0x22, 0xE4, 0xFF, \r
-0x74, 0xF9, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x84, 0x2F, 0xF5, \r
-0x82, 0xE4, 0x34, 0x04, 0x11, 0xA8, 0xB4, 0x08, 0xE7, 0x90, 0x90, 0x01, 0xE0, 0x90, 0x04, 0x8C, \r
-0xF0, 0x22, 0x31, 0x27, 0x11, 0xDE, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x8D, 0x06, 0xE0, \r
-0xFF, 0xB4, 0x01, 0x07, 0x90, 0xFD, 0x00, 0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0x90, \r
-0xFE, 0x10, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, \r
-0x7F, 0x8F, 0x12, 0x49, 0x39, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0xF1, 0xE0, 0x54, 0xF0, \r
-0xC4, 0x54, 0x0F, 0xFF, 0x22, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, 0x0F, 0x75, 0x10, 0x80, 0xAD, \r
-0x0D, 0x7F, 0x50, 0x12, 0x49, 0x39, 0xAD, 0x0E, 0x7F, 0x51, 0x12, 0x49, 0x39, 0xAD, 0x0F, 0x7F, \r
-0x52, 0x12, 0x49, 0x39, 0xAD, 0x10, 0x7F, 0x53, 0x02, 0x49, 0x39, 0x12, 0x4F, 0x7B, 0x12, 0x4F, \r
-0x5A, 0x31, 0x77, 0x31, 0x96, 0x80, 0xCE, 0x75, 0x15, 0x10, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, \r
+0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x8E, 0x11, 0x12, \r
+0x9F, 0xD5, 0x30, 0xE0, 0x15, 0xEF, 0x54, 0xBF, 0xF1, 0xEE, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, \r
+0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x12, 0x74, 0xB2, 0xE4, 0xFF, 0x90, 0x93, 0x2C, 0xE0, \r
+0x30, 0xE0, 0x3D, 0x90, 0x93, 0x31, 0xE0, 0xFD, 0x60, 0x36, 0x12, 0x89, 0xAA, 0x80, 0x05, 0xC3, \r
+0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, 0xE0, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x0B, \r
+0xE4, 0x90, 0x93, 0x31, 0xF0, 0x90, 0x93, 0x33, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x2E, 0xE0, 0xD3, \r
+0x9D, 0x50, 0x04, 0x31, 0x6A, 0xF0, 0x22, 0x12, 0x65, 0x55, 0x90, 0x93, 0x31, 0xE0, 0x04, 0xF0, \r
+0x22, 0x90, 0x8E, 0x11, 0x31, 0x18, 0x30, 0xE0, 0x1B, 0xEF, 0x54, 0x7F, 0xF1, 0xEE, 0x30, 0xE1, \r
+0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x8E, 0x15, 0xE0, 0x60, \r
+0x03, 0x12, 0x74, 0xB2, 0x7F, 0x01, 0x80, 0x94, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, \r
+0x22, 0x90, 0x95, 0x2B, 0xEF, 0xF0, 0x90, 0x8D, 0x06, 0xE0, 0x64, 0x02, 0x70, 0x22, 0x90, 0x95, \r
+0x2B, 0xE0, 0xFD, 0x64, 0x01, 0x70, 0x28, 0x12, 0x6F, 0x98, 0x90, 0x8E, 0xC8, 0xE0, 0x31, 0x1A, \r
+0x30, 0xE0, 0x09, 0x90, 0x01, 0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x80, 0x13, 0xAF, 0x05, 0x80, 0x0C, \r
+0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x95, 0x2B, 0xE0, 0xFF, 0x12, 0x4C, 0x50, 0x31, \r
+0x74, 0xF0, 0x90, 0x8E, 0xC4, 0xE0, 0x54, 0xBF, 0xF0, 0x22, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, \r
+0x7F, 0x01, 0x31, 0x21, 0x90, 0x93, 0x2C, 0xE0, 0x54, 0xFE, 0x22, 0xF1, 0x3E, 0x12, 0x06, 0x89, \r
+0xFF, 0x54, 0x7F, 0x90, 0x8E, 0x15, 0xF0, 0xEF, 0x31, 0x1A, 0xA3, 0x12, 0x77, 0xC2, 0xFF, 0x54, \r
+0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x8E, 0x13, 0xE0, 0x54, 0xF0, 0x4E, 0xB1, 0xF7, 0x54, 0x01, \r
+0x25, 0xE0, 0xFE, 0x90, 0x8E, 0x11, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, \r
+0xF0, 0xFF, 0x12, 0x77, 0xF5, 0xB1, 0xB2, 0x90, 0x8E, 0x14, 0xF0, 0x91, 0x93, 0x30, 0xE0, 0x4D, \r
+0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x8E, 0x28, 0x50, 0x04, 0xEF, 0xF0, 0x80, \r
+0x25, 0x74, 0x03, 0xF0, 0x51, 0x25, 0xE9, 0x24, 0x06, 0xF1, 0xC5, 0xFF, 0x74, 0x03, 0x24, 0xFD, \r
+0xFE, 0xEF, 0xC4, 0x54, 0x0F, 0xFD, 0xEF, 0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F, 0xFE, 0xC4, \r
+0x54, 0xF0, 0x4F, 0x12, 0x06, 0xCF, 0x51, 0x25, 0x91, 0x93, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, \r
+0x04, 0x90, 0x8E, 0x1D, 0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x51, 0x25, 0xB1, \r
+0x70, 0xFD, 0x7F, 0x02, 0x12, 0x4E, 0xB5, 0x90, 0x94, 0x6F, 0xE0, 0x60, 0x03, 0x12, 0x4E, 0xA9, \r
+0x51, 0x25, 0x02, 0x77, 0xC9, 0x90, 0x93, 0x4A, 0x02, 0x44, 0x09, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
+0xC0, 0xD0, 0xF1, 0x3E, 0x12, 0x06, 0x89, 0x20, 0xE0, 0x05, 0x12, 0x8B, 0x24, 0x41, 0xEE, 0x90, \r
+0x8F, 0x98, 0x74, 0x05, 0xF0, 0xF1, 0x53, 0x90, 0x8E, 0xC7, 0x51, 0xF3, 0xF1, 0xD4, 0xFF, 0x90, \r
+0x8E, 0xC7, 0x12, 0x9E, 0xF1, 0x71, 0x01, 0xF1, 0xDC, 0x90, 0x8E, 0xC7, 0x12, 0xA0, 0xE9, 0x71, \r
+0x01, 0xF1, 0xE5, 0x90, 0x8E, 0xC7, 0x12, 0xA0, 0xDF, 0x12, 0x77, 0xC2, 0x54, 0x80, 0xFF, 0x90, \r
+0x8E, 0xC8, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x12, 0x06, 0x89, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, \r
+0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x04, 0xF0, 0x51, 0x25, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, \r
+0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x8D, 0x06, 0xE0, \r
+0xB4, 0x02, 0x09, 0x90, 0x8E, 0xC8, 0xE0, 0x31, 0x1A, 0x20, 0xE0, 0x34, 0x12, 0x77, 0xC3, 0x54, \r
+0x7F, 0xFF, 0x90, 0x8E, 0xC8, 0xE0, 0x54, 0x80, 0xB1, 0xB2, 0x90, 0x8E, 0xC9, 0xB1, 0xF7, 0xFF, \r
+0x54, 0x01, 0xFE, 0x90, 0x8E, 0xCA, 0xF1, 0xCC, 0x54, 0xFE, 0xFF, 0xEE, 0x54, 0x01, 0x4F, 0xF0, \r
+0x12, 0x4C, 0xF0, 0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x12, 0x4A, 0x6A, \r
+0x90, 0x8D, 0x06, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, \r
+0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, \r
+0x59, 0x90, 0x8E, 0xC4, 0x51, 0xF3, 0xF1, 0xD4, 0xFF, 0x90, 0x8E, 0xC4, 0x12, 0x9E, 0xF1, 0x71, \r
+0x01, 0xF1, 0xDC, 0x90, 0x8E, 0xC4, 0x12, 0xA0, 0xE9, 0x71, 0x01, 0xF1, 0xE5, 0x90, 0x8E, 0xC4, \r
+0x12, 0xA0, 0xDF, 0xB1, 0xB3, 0x54, 0x01, 0xFF, 0x90, 0x8E, 0xC6, 0xE0, 0x54, 0xFE, 0x4F, 0x12, \r
+0x77, 0xC2, 0x54, 0x01, 0xFF, 0x90, 0x8E, 0xC5, 0xE0, 0x54, 0xFE, 0x4F, 0x12, 0x84, 0x9A, 0x12, \r
+0x87, 0xE4, 0x90, 0x8E, 0xC4, 0xE0, 0xC3, 0x13, 0x54, 0x01, 0xFF, 0x12, 0x99, 0xC9, 0xF1, 0x44, \r
+0x54, 0x01, 0xFF, 0x12, 0x99, 0x35, 0xF1, 0x44, 0x13, 0x54, 0x01, 0xFF, 0x12, 0x99, 0xD5, 0x90, \r
+0x8E, 0xC4, 0xE0, 0xC4, 0x54, 0x01, 0xFF, 0x12, 0x9A, 0x2C, 0x90, 0x8E, 0xC4, 0xE0, 0xC4, 0x13, \r
+0x13, 0x54, 0x01, 0xFF, 0x12, 0x9A, 0x3A, 0x90, 0x8E, 0xC4, 0xE0, 0x54, 0x01, 0xFF, 0x12, 0x86, \r
+0x70, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x47, 0x12, 0x44, 0x12, 0x90, 0x93, 0x46, 0xEF, \r
+0xF0, 0x12, 0x44, 0x1B, 0x7B, 0xE1, 0x00, 0x7B, 0xE9, 0x01, 0x7B, 0xF2, 0x02, 0x7B, 0xFB, 0x03, \r
+0x7C, 0x04, 0x04, 0x7C, 0x0C, 0x12, 0x7C, 0x15, 0x14, 0x7C, 0x1E, 0x20, 0x7C, 0x26, 0x21, 0x7C, \r
+0x2E, 0x23, 0x7C, 0x37, 0x25, 0x7C, 0x40, 0x27, 0x7C, 0x50, 0x80, 0x7C, 0x48, 0x81, 0x7C, 0x58, \r
+0x82, 0x7C, 0x61, 0x83, 0x7C, 0x69, 0x84, 0x7C, 0x7A, 0x86, 0x7C, 0x71, 0x88, 0x00, 0x00, 0x7C, \r
+0x83, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0xA1, 0x76, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0x02, \r
+0x73, 0xE7, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0x02, 0x87, 0xEC, 0x90, 0x93, 0x47, 0x12, 0x44, \r
+0x09, 0x02, 0x90, 0x85, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0xE1, 0x07, 0x90, 0x93, 0x47, 0x12, \r
+0x44, 0x09, 0x02, 0x88, 0x29, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0x02, 0x88, 0x3D, 0x90, 0x93, \r
+0x47, 0x12, 0x44, 0x09, 0x21, 0x7B, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0xE1, 0x61, 0x90, 0x93, \r
+0x47, 0x12, 0x44, 0x09, 0x02, 0x88, 0x4C, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0x02, 0x88, 0x54, \r
+0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0xE1, 0x99, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0x61, 0x08, \r
+0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0x41, 0x2B, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0x02, 0x99, \r
+0xA3, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0xA1, 0xBA, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0xA1, \r
+0xFE, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, 0x02, 0x99, 0xB9, 0x90, 0x93, 0x47, 0x12, 0x44, 0x09, \r
+0x02, 0x9E, 0x4F, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, 0x46, 0xE0, 0x90, 0x01, \r
+0xC2, 0xF0, 0x22, 0x90, 0x00, 0x06, 0x02, 0x06, 0xA2, 0x90, 0x94, 0xBB, 0x12, 0x44, 0x12, 0x12, \r
+0x06, 0x89, 0x90, 0x94, 0xC0, 0x12, 0x77, 0xC2, 0x90, 0x94, 0xC1, 0xB1, 0x6F, 0x90, 0x94, 0xC2, \r
+0xF1, 0x37, 0x90, 0x94, 0xC3, 0xF0, 0x91, 0x93, 0x90, 0x94, 0xC4, 0xF0, 0x90, 0x00, 0x07, 0x12, \r
+0x06, 0xA2, 0x90, 0x94, 0xC5, 0xB1, 0xF7, 0x90, 0x94, 0xC8, 0xF0, 0xED, 0x70, 0x19, 0xFF, 0xB1, \r
+0x64, 0xE0, 0xB4, 0xFF, 0x06, 0xB1, 0x64, 0xE4, 0xF0, 0x80, 0x07, 0xB1, 0x64, 0xE0, 0x04, 0xF0, \r
+0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x06, 0xE8, 0x90, 0x94, 0xBF, 0xE0, 0xFF, 0xB4, 0x04, 0x14, 0xA3, \r
+0xE0, 0xFE, 0xB1, 0x5E, 0xEE, 0xF1, 0x4B, 0xFE, 0xB1, 0x5E, 0x12, 0x8A, 0x53, 0x90, 0x00, 0x02, \r
+0xE4, 0x80, 0x20, 0xEF, 0xB4, 0x02, 0x1F, 0x90, 0x94, 0xC1, 0xB1, 0x5C, 0xEF, 0xF1, 0x4B, 0x44, \r
+0x20, 0x54, 0x7F, 0xB1, 0x5D, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x06, 0xE1, 0x90, 0x94, 0xC0, 0xE0, \r
+0x90, 0x00, 0x02, 0x12, 0x06, 0xE1, 0xB1, 0x5E, 0xE9, 0x24, 0x03, 0xF1, 0xC5, 0x44, 0x20, 0x12, \r
+0x06, 0xCF, 0x90, 0x94, 0xC2, 0xB1, 0x5C, 0x90, 0x00, 0x04, 0xEF, 0x12, 0x06, 0xE1, 0x90, 0x94, \r
+0xC3, 0xE0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xE1, 0x90, 0x94, 0xC4, 0xE0, 0x90, 0x00, 0x06, 0x12, \r
+0x06, 0xE1, 0x90, 0x94, 0xC5, 0xE0, 0x90, 0x00, 0x07, 0x02, 0x06, 0xE1, 0xE0, 0xFF, 0x90, 0x94, \r
+0xBB, 0x02, 0x44, 0x09, 0x74, 0xC0, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0xF0, \r
+0x90, 0x00, 0x04, 0x02, 0x06, 0xA2, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25, \r
+0x51, 0x90, 0x8D, 0x07, 0x12, 0x77, 0xC2, 0x25, 0x51, 0x90, 0x8D, 0x08, 0xB1, 0xB3, 0x25, 0x51, \r
+0x90, 0x8D, 0x09, 0xB1, 0xF7, 0x25, 0x51, 0x90, 0x8D, 0x0A, 0xB1, 0x6F, 0x25, 0x51, 0x90, 0x8D, \r
+0x0B, 0xF1, 0x37, 0x25, 0x51, 0x90, 0x8D, 0x0C, 0xF0, 0x91, 0x93, 0x25, 0x51, 0x90, 0x8D, 0x0D, \r
+0xF0, 0x22, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x02, 0x06, 0xA2, 0x12, 0xA0, 0x62, 0x90, 0x93, 0x18, \r
+0x12, 0x77, 0xC2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x19, 0xB1, 0xB3, 0xFF, 0xED, 0x2F, 0x90, 0x93, \r
+0x1A, 0xB1, 0xF7, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x1B, 0xB1, 0x6F, 0xFF, 0xED, 0x2F, 0x90, 0x93, \r
+0x1C, 0xF1, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x1D, 0xF0, 0x91, 0x93, 0xFF, 0xAE, 0x05, 0xED, \r
+0x2F, 0x90, 0x93, 0x1E, 0xF0, 0x22, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x02, 0x06, 0xA2, 0x12, 0xA0, \r
+0x62, 0x90, 0x93, 0x1F, 0x12, 0x77, 0xC2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x20, 0xB1, 0xB3, 0xFF, \r
+0xED, 0x2F, 0x90, 0x93, 0x21, 0xB1, 0xF7, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x22, 0xB1, 0x6F, 0xFF, \r
+0xED, 0x2F, 0x90, 0x93, 0x23, 0xF1, 0x37, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x24, 0xF0, 0x91, 0x93, \r
+0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93, 0x25, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x06, 0x74, \r
+0x12, 0x77, 0xC2, 0x90, 0x06, 0x75, 0xB1, 0xB3, 0x90, 0x06, 0x76, 0xB1, 0xF7, 0x90, 0x06, 0x77, \r
+0xF0, 0x90, 0x06, 0x70, 0xEF, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x74, 0x80, 0xF0, \r
+0x7F, 0x01, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90, 0x93, 0xA8, 0xEF, 0xF0, 0xA3, 0x12, 0x44, 0x12, \r
+0x90, 0x93, 0xA9, 0x12, 0x56, 0x7A, 0xD1, 0xE1, 0x24, 0x02, 0xD1, 0xF6, 0x24, 0x04, 0xD1, 0xD8, \r
+0x24, 0x03, 0xD1, 0xF6, 0x24, 0x08, 0xD1, 0xD8, 0x24, 0x04, 0xD1, 0xF6, 0x24, 0x0C, 0xD1, 0xD8, \r
+0x24, 0x05, 0xFF, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAC, 0xD1, 0x3A, 0x90, 0x93, 0xA8, 0xE0, 0xFE, \r
+0x44, 0x10, 0x90, 0x93, 0xAC, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, \r
+0xEE, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAC, 0xD1, 0x3A, 0x90, 0x93, \r
+0xAC, 0x74, 0xFF, 0x12, 0x4D, 0xB3, 0xD1, 0xED, 0x04, 0xFF, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAC, \r
+0xD1, 0x3A, 0x90, 0x06, 0x72, 0xE4, 0xF0, 0x22, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, \r
+0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAC, 0x12, 0x35, 0x26, 0x90, 0x93, 0xA8, \r
+0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x22, 0xFF, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAC, 0xD1, 0x3A, 0x90, \r
+0x93, 0xA9, 0x12, 0x44, 0x09, 0xE9, 0x22, 0xF1, 0x3E, 0x12, 0x89, 0xD2, 0xF1, 0x53, 0x31, 0x74, \r
+0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x1E, 0x12, 0x77, 0xC3, 0x90, 0x93, 0x2D, 0xB1, 0xB3, \r
+0x90, 0x93, 0x2E, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x04, 0xFF, 0x90, 0x93, 0x2C, 0xE0, 0x54, 0xFB, \r
+0xB1, 0xF6, 0x90, 0x93, 0x2F, 0xF0, 0x22, 0xF0, 0x90, 0x00, 0x05, 0x02, 0x06, 0xA2, 0x90, 0x93, \r
+0x4A, 0x02, 0x44, 0x12, 0x90, 0x8E, 0xC4, 0xE0, 0x13, 0x13, 0x22, 0x12, 0x06, 0xCF, 0x90, 0x94, \r
+0xC1, 0xE0, 0x22, 0x90, 0x93, 0x4A, 0x12, 0x44, 0x09, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, \r
+0x22, 0xB1, 0xB4, 0xFF, 0x30, 0xE0, 0x1C, 0x12, 0x06, 0x89, 0x90, 0x8E, 0xB9, 0x12, 0x77, 0xC2, \r
+0x90, 0x8E, 0xBA, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0xB1, 0xF6, 0x90, 0x8E, \r
+0xBC, 0xF0, 0x22, 0x90, 0x8E, 0xB9, 0x74, 0x05, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xA3, 0xE0, 0x54, \r
+0x01, 0x44, 0x1E, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xF1, 0x59, 0x90, 0x8E, 0xC0, 0xF1, 0xCC, \r
+0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0x12, 0x77, 0xC2, 0x90, 0x8E, 0xC1, 0xB1, 0xB3, 0x90, \r
+0x8E, 0xC2, 0xF0, 0x90, 0x8E, 0xC1, 0xE0, 0x90, 0x8E, 0xC3, 0xF0, 0x90, 0x8E, 0xC0, 0xE0, 0x54, \r
+0x01, 0xFF, 0x02, 0x76, 0x34, 0xF9, 0xE4, 0x3A, 0xFA, 0x02, 0x06, 0x89, 0xE0, 0x54, 0xFE, 0x4E, \r
+0xFE, 0xF0, 0xEF, 0x22, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0x22, 0x54, 0x10, 0xFD, 0xEF, \r
+0x54, 0xEF, 0x4D, 0xFF, 0x22, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0x22, 0xF0, 0x90, \r
+0x04, 0xE0, 0xE0, 0x90, 0x8E, 0x12, 0x22, 0x32, 0x90, 0x95, 0x27, 0xEF, 0xF0, 0x7F, 0x02, 0x12, \r
+0x48, 0x12, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x90, 0x95, 0x27, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x8D, \r
+0x01, 0xF0, 0x22, 0x90, 0x93, 0x55, 0x74, 0x12, 0xF0, 0x90, 0x93, 0x63, 0x74, 0x05, 0xF0, 0x90, \r
+0x93, 0x57, 0xEF, 0x71, 0x9D, 0x90, 0x93, 0x53, 0xE0, 0x90, 0x93, 0x5A, 0xF0, 0x90, 0x93, 0x54, \r
+0xE0, 0x90, 0x93, 0x5B, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x55, 0x11, 0xC5, 0x7F, 0x04, 0x80, \r
+0xB7, 0x11, 0xBE, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x06, 0x90, 0x93, 0x4A, \r
+0xE0, 0xA3, 0xF0, 0x11, 0xBE, 0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, \r
+0x93, 0x4A, 0xE0, 0x90, 0x93, 0x4C, 0xF0, 0x11, 0xBE, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, \r
+0xBF, 0x01, 0x08, 0x90, 0x93, 0x4A, 0xE0, 0x90, 0x93, 0x4D, 0xF0, 0x11, 0xBE, 0x7F, 0xF3, 0x7E, \r
+0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0x4A, 0xE0, 0x90, 0x93, 0x4E, 0xF0, 0x11, \r
+0xBE, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0x4A, 0xE0, 0x90, \r
+0x93, 0x4F, 0xF0, 0x90, 0x93, 0x4B, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, \r
+0x90, 0x93, 0x53, 0xF0, 0x90, 0x93, 0x4F, 0xE0, 0x90, 0x93, 0x54, 0xF0, 0x01, 0x13, 0x7B, 0x01, \r
+0x7A, 0x93, 0x79, 0x4A, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0xF6, 0xE0, \r
+0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8D, 0xF7, 0xE0, \r
+0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, \r
+0x44, 0x02, 0xF0, 0x80, 0x28, 0xC0, 0x01, 0x90, 0x8D, 0xF7, 0xE0, 0x71, 0xCD, 0xA8, 0x01, 0xFC, \r
+0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0x8D, 0xF7, 0x71, 0x7E, \r
+0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0xF7, 0xF0, 0xD0, 0xD0, 0x92, \r
+0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x66, 0xE0, 0xFF, 0x12, 0x9F, \r
+0x9E, 0xEF, 0x70, 0x02, 0x21, 0xDB, 0x90, 0x94, 0x67, 0xE0, 0xFB, 0xD3, 0x94, 0x00, 0x40, 0x1A, \r
+0x90, 0x94, 0x99, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x0F, 0xAF, 0x03, 0xE4, 0xFC, 0xFD, 0xFE, \r
+0x12, 0x5F, 0xA9, 0x7F, 0x08, 0x7E, 0x0E, 0x12, 0x5E, 0xCE, 0x90, 0x94, 0x66, 0xE0, 0xFF, 0x90, \r
+0x06, 0x33, 0xF0, 0x71, 0xA5, 0xE4, 0xFB, 0xFD, 0x51, 0x4A, 0x90, 0x94, 0x69, 0xE0, 0x60, 0x07, \r
+0x90, 0x8D, 0xFC, 0xE0, 0xFF, 0x51, 0x20, 0x71, 0x85, 0x30, 0xE0, 0x39, 0x90, 0x90, 0xCB, 0xE0, \r
+0x60, 0x33, 0xE4, 0x90, 0x93, 0x48, 0xF0, 0x90, 0x90, 0xCB, 0xE0, 0xFF, 0x90, 0x93, 0x48, 0xE0, \r
+0xC3, 0x9F, 0x50, 0x21, 0x7F, 0x03, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x90, 0x93, 0x48, 0xE0, 0x24, \r
+0x0A, 0x71, 0x8D, 0xE0, 0xFF, 0x51, 0x20, 0x90, 0x01, 0xA6, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x48, \r
+0xE0, 0x04, 0xF0, 0x80, 0xD2, 0x90, 0x94, 0x68, 0xE0, 0x90, 0x93, 0x47, 0xF0, 0x90, 0x94, 0x53, \r
+0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x12, 0x9F, 0x6D, 0x90, 0x93, 0x47, 0x12, 0x5D, 0x80, 0x90, 0x94, \r
+0xE5, 0x12, 0x08, 0x6D, 0x71, 0x95, 0x12, 0x50, 0x4C, 0x80, 0x40, 0xE4, 0x90, 0x94, 0x53, 0xF0, \r
+0x90, 0x94, 0x6F, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x5F, 0x3A, 0xE4, 0xFF, \r
+0x12, 0x73, 0x2E, 0xBF, 0x01, 0x0C, 0x90, 0x94, 0x6B, 0xE0, 0xFD, 0x7F, 0x02, 0x12, 0x4E, 0xB5, \r
+0x71, 0xAE, 0x90, 0x93, 0x49, 0x74, 0x07, 0xF0, 0x90, 0x93, 0x57, 0xF0, 0x7B, 0x01, 0x7A, 0x93, \r
+0x79, 0x49, 0x11, 0xC5, 0x7F, 0x04, 0x12, 0x7F, 0xF8, 0x71, 0x49, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x58, 0xEF, 0xF0, 0x12, 0x8F, 0x6B, 0xBF, \r
+0x01, 0x13, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x93, 0x58, 0x12, 0x64, 0x32, 0x90, \r
+0x93, 0x59, 0x12, 0x57, 0xFC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x90, 0x95, 0x05, 0xEF, 0xF0, 0xED, 0x64, 0x01, 0x70, 0x33, 0xEB, 0xB4, 0x01, 0x07, 0xE0, \r
+0x24, 0x02, 0xF5, 0x5A, 0x80, 0x08, 0x90, 0x95, 0x05, 0xE0, 0x24, 0xFE, 0xF5, 0x5A, 0x90, 0x94, \r
+0x87, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x5A, 0x71, 0x34, 0xE4, 0xFF, 0x51, 0xBE, \r
+0x90, 0x94, 0x87, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x5A, 0x80, 0x25, 0x90, 0x94, \r
+0x87, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0x95, 0x05, 0x12, 0x5D, 0x80, 0x71, 0x38, \r
+0xE4, 0xFF, 0x51, 0xBE, 0x90, 0x94, 0x87, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0x95, \r
+0x05, 0xE0, 0xFF, 0x71, 0x34, 0x7F, 0x01, 0x51, 0xBE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x85, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x94, 0x84, \r
+0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3E, 0x02, 0x90, 0x94, 0x8F, 0x12, 0x08, 0x6D, 0x90, \r
+0x94, 0x87, 0x12, 0x43, 0xE5, 0x12, 0x08, 0x3A, 0x90, 0x94, 0x8F, 0x71, 0x43, 0xC0, 0x04, 0xC0, \r
+0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x94, 0x87, 0x12, 0x43, 0xE5, 0x90, 0x94, 0x8B, 0x71, 0x43, \r
+0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0xC7, 0x90, 0x94, 0x93, 0x12, 0x08, \r
+0x6D, 0x90, 0x94, 0x85, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0x94, 0x93, 0x12, 0x43, 0xE5, 0x90, \r
+0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, 0x94, 0x84, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, 0x09, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x94, 0x8B, 0x12, 0x08, 0x6D, 0x7D, 0x18, \r
+0x7C, 0x00, 0x22, 0x12, 0x43, 0xF1, 0x02, 0x43, 0xBA, 0x90, 0x8D, 0xFB, 0x12, 0x77, 0x4B, 0x30, \r
+0xE0, 0x23, 0x71, 0xC2, 0x60, 0x0B, 0x71, 0xB8, 0x40, 0x07, 0x71, 0x76, 0x90, 0x90, 0xD6, 0x80, \r
+0x05, 0x71, 0x76, 0x90, 0x90, 0xCE, 0x12, 0x43, 0xF1, 0x12, 0x42, 0x9D, 0x90, 0x94, 0xE5, 0x12, \r
+0x08, 0x6D, 0x12, 0x50, 0x45, 0x22, 0xE4, 0x7F, 0xE8, 0x7E, 0x03, 0xFD, 0xFC, 0x22, 0xE0, 0x04, \r
+0xF0, 0xE0, 0x7F, 0x00, 0x22, 0x90, 0x8E, 0xC4, 0xE0, 0xC4, 0x54, 0x0F, 0x22, 0xF5, 0x82, 0xE4, \r
+0x34, 0x91, 0xF5, 0x83, 0x22, 0xE4, 0x90, 0x94, 0xE9, 0xF0, 0x7F, 0x04, 0x22, 0xF0, 0xA3, 0xED, \r
+0xF0, 0xA3, 0xEB, 0xF0, 0x22, 0x90, 0x94, 0x5E, 0xE0, 0x90, 0x95, 0x08, 0xF0, 0x22, 0x12, 0x4F, \r
+0xE9, 0x7D, 0x04, 0x7F, 0x01, 0x02, 0x4E, 0xB5, 0x90, 0x93, 0x12, 0x12, 0x43, 0xF1, 0xD3, 0x02, \r
+0x43, 0xD4, 0x90, 0x90, 0xD2, 0x12, 0x43, 0xE5, 0xEC, 0x4D, 0x4E, 0x4F, 0x22, 0x75, 0xF0, 0x0F, \r
+0xA4, 0x24, 0x60, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0xE4, 0xFF, 0x90, 0x8D, 0xF7, 0xE0, 0xFE, 0x90, 0x8D, 0xF6, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, \r
+0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x3F, 0xED, 0x71, 0xCD, 0xFA, 0x7B, 0x01, \r
+0x91, 0x3E, 0x7F, 0x01, 0xEF, 0x60, 0x32, 0x90, 0x8D, 0xF6, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, \r
+0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0xF6, 0xF0, 0x90, 0x8D, 0xF7, \r
+0xE0, 0xFF, 0x90, 0x8D, 0xF6, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, \r
+0x70, 0x07, 0x90, 0x8D, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x01, 0x12, 0x44, 0x12, 0x7F, 0x96, 0x7E, 0x02, 0x91, \r
+0xAC, 0xEF, 0x60, 0x41, 0x91, 0x9B, 0xFE, 0x12, 0xA1, 0x40, 0x90, 0x95, 0x04, 0xEF, 0xF0, 0xEE, \r
+0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x95, 0x04, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, \r
+0xF0, 0x90, 0x95, 0x01, 0x12, 0x8A, 0x5A, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x91, 0xF1, 0x90, \r
+0x95, 0x04, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0x95, 0x01, 0x12, 0x44, 0x09, 0x12, 0x89, 0xEC, 0x90, \r
+0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE, \r
+0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x22, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xF9, 0x12, 0x91, 0x98, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x94, 0xF9, \r
+0x12, 0xA1, 0x17, 0xE0, 0x60, 0x24, 0xC3, 0x90, 0x94, 0xFC, 0xE0, 0x94, 0xE8, 0x90, 0x94, 0xFB, \r
+0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x0C, \r
+0x90, 0x94, 0xFB, 0x12, 0x61, 0x77, 0xF1, 0xDD, 0x80, 0xD3, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xB1, 0x46, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xF3, \r
+0xB1, 0x43, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, \r
+0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, \r
+0xF0, 0xF0, 0xD1, 0x18, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, \r
+0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, \r
+0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0x22, 0x12, 0xA1, \r
+0x0E, 0x91, 0xA3, 0x90, 0x93, 0x4A, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x87, 0xE0, 0xF9, 0x90, \r
+0x8E, 0xC4, 0xE0, 0x30, 0xE0, 0x73, 0xEC, 0xC3, 0x99, 0x50, 0x6E, 0x90, 0x93, 0x4A, 0xE0, 0xFA, \r
+0xA3, 0xE0, 0xFB, 0x12, 0xA1, 0x60, 0xAD, 0x07, 0xB1, 0x37, 0x12, 0xA0, 0x35, 0x54, 0x3F, 0x90, \r
+0x93, 0x4C, 0xD1, 0x01, 0xE0, 0x54, 0x03, 0xFB, 0xEF, 0x24, 0x18, 0xFF, 0xE4, 0x33, 0xCF, 0x2B, \r
+0xCF, 0x3A, 0x90, 0x93, 0x4C, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x93, 0x4C, 0xB1, 0xDA, 0x12, \r
+0xA1, 0x05, 0x90, 0x93, 0x4A, 0xEE, 0x8F, 0xF0, 0x12, 0xA1, 0x90, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, \r
+0x90, 0x93, 0x4B, 0xE0, 0x9F, 0x90, 0x93, 0x4A, 0xE0, 0x9E, 0x40, 0x14, 0x90, 0x8D, 0xF9, 0x12, \r
+0xA0, 0x57, 0xFE, 0xC3, 0x90, 0x93, 0x4B, 0xE0, 0x9F, 0xF0, 0x90, 0x93, 0x4A, 0xE0, 0x9E, 0xF0, \r
+0x90, 0x93, 0x4A, 0x12, 0x90, 0xA6, 0x0C, 0x80, 0x8D, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, \r
+0x07, 0xEF, 0x5D, 0xC3, 0x60, 0x0A, 0xB1, 0xF4, 0x24, 0x08, 0xFF, 0xE4, 0x3E, 0xFE, 0x80, 0x03, \r
+0xB1, 0xF4, 0xFF, 0x22, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, \r
+0x22, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, \r
+0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, \r
+0xF5, 0x83, 0x22, 0x12, 0x90, 0xEE, 0xAD, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x23, 0xF0, 0x74, 0x86, \r
+0xA3, 0xF0, 0xED, 0x64, 0x01, 0x60, 0x1E, 0x12, 0x6F, 0x98, 0xED, 0xB4, 0x02, 0x08, 0x90, 0x01, \r
+0xC7, 0x74, 0x40, 0xF0, 0x80, 0x0A, 0xED, 0xB4, 0x04, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x41, 0xF0, \r
+0x7F, 0x01, 0x02, 0x79, 0x21, 0xB1, 0x4E, 0x90, 0x02, 0x87, 0xE0, 0x70, 0xF8, 0x90, 0x06, 0x90, \r
+0xE0, 0x44, 0x02, 0xF0, 0x74, 0x23, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x86, 0xA3, 0xF0, 0x22, \r
+0xEF, 0x60, 0x37, 0x90, 0x93, 0x18, 0xE0, 0xFF, 0x60, 0x03, 0x12, 0x99, 0x0A, 0x90, 0x01, 0xC7, \r
+0xE4, 0x91, 0x9A, 0xF1, 0xE4, 0x90, 0x06, 0x09, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x35, 0x12, 0x4B, \r
+0x1C, 0x12, 0x9E, 0xE0, 0xD1, 0x23, 0xF1, 0xA6, 0x12, 0x4F, 0xE7, 0x12, 0x8A, 0xD1, 0x90, 0x01, \r
+0x34, 0x74, 0x08, 0xF0, 0xFD, 0xE4, 0xFF, 0x02, 0x75, 0x25, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x76, \r
+0x27, 0x90, 0x06, 0x90, 0xE0, 0x54, 0xF0, 0xF0, 0x12, 0xA1, 0x48, 0x12, 0x8B, 0x24, 0xF1, 0xD7, \r
+0x12, 0x9E, 0x3E, 0x7A, 0x8E, 0x79, 0xC4, 0x12, 0x08, 0xAA, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x20, \r
+0xF0, 0x12, 0x8B, 0x49, 0x12, 0x4E, 0x87, 0x90, 0x8D, 0x06, 0xE0, 0xFF, 0x64, 0x02, 0x70, 0x2A, \r
+0xF1, 0x9F, 0x30, 0xE0, 0x02, 0x7E, 0x01, 0x90, 0x8E, 0xE3, 0xF1, 0x9D, 0x30, 0xE1, 0x02, 0x7E, \r
+0x01, 0x90, 0x8E, 0xE1, 0xF1, 0x9D, 0x30, 0xE2, 0x02, 0x7E, 0x01, 0x90, 0x8E, 0xE2, 0xEE, 0xF0, \r
+0x90, 0xFD, 0x80, 0xE0, 0x90, 0x02, 0xFB, 0xF0, 0x80, 0x4A, 0xEF, 0x64, 0x01, 0x70, 0x1D, 0xF1, \r
+0x96, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0x8E, 0xE3, 0xF1, 0x94, 0x30, 0xE1, 0x02, 0x7F, 0x01, \r
+0x90, 0x8E, 0xE1, 0xF1, 0x94, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x80, 0x23, 0x90, 0x8D, 0x06, 0xE0, \r
+0x64, 0x03, 0x70, 0x20, 0xF1, 0x8D, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0x8E, 0xE3, 0xF1, 0x8B, \r
+0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0x8E, 0xE1, 0xF1, 0x8B, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x90, \r
+0x8E, 0xE2, 0xEF, 0xF0, 0x90, 0x8E, 0xC4, 0xE0, 0x54, 0xEF, 0xF0, 0xE4, 0x90, 0x90, 0xCA, 0xF0, \r
+0xA3, 0xF0, 0x90, 0x90, 0xD2, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90, 0xD6, 0x12, \r
+0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90, 0xCE, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, \r
+0x90, 0x93, 0x12, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x22, 0xEF, 0xF0, 0x90, 0xFD, 0x78, \r
+0xE0, 0x7F, 0x00, 0x22, 0xEF, 0xF0, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x22, 0xEE, 0xF0, 0x90, \r
+0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x22, 0xF1, 0xDC, 0x71, 0x85, 0x30, 0xE0, 0x18, 0x90, 0x8D, 0xFB, \r
+0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x0D, 0x90, 0x94, 0xE5, 0x12, 0x08, 0x79, 0x00, 0x00, \r
+0x00, 0x14, 0x12, 0x50, 0x45, 0x22, 0x90, 0x8E, 0xC4, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, \r
+0x05, 0x12, 0x90, 0x4C, 0xF1, 0x54, 0x22, 0x12, 0x9F, 0xC9, 0x80, 0xEA, 0x22, 0x7F, 0x0A, 0x7E, \r
+0x00, 0x02, 0x3E, 0x50, 0x90, 0x8D, 0xF8, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x8E, 0x10, \r
+0xF0, 0xBF, 0x01, 0x0D, 0x12, 0x77, 0xC3, 0x64, 0x01, 0x60, 0x19, 0x7D, 0x13, 0x7F, 0x6F, 0x80, \r
+0x10, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x77, 0xC3, 0x64, 0x01, 0x60, 0x06, 0xE4, 0xFD, \r
+0xFF, 0x12, 0x53, 0xD9, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x8D, 0xFA, \r
+0xF0, 0xBF, 0x01, 0x08, 0x12, 0x80, 0x41, 0xE4, 0x90, 0x8D, 0xFA, 0xF0, 0x22, 0x12, 0x06, 0x89, \r
+0x54, 0x01, 0xFF, 0x90, 0x93, 0x3A, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, \r
+0x8E, 0x20, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x8E, 0xBF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0x5F, 0xE0, 0xFF, 0x90, 0x8D, 0x5E, 0xE0, 0xB5, 0x07, 0x04, 0x7F, \r
+0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x41, 0x90, 0x8D, 0x5E, 0xE0, 0xFE, 0x75, 0xF0, 0x08, \r
+0x90, 0x8D, 0x0E, 0x12, 0x43, 0xFD, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x0F, 0xF9, \r
+0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x7B, 0x96, 0x90, 0x8D, 0x5E, 0x12, \r
+0x83, 0x7E, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0x5E, 0xF0, 0x12, \r
+0x71, 0xED, 0x90, 0x8D, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, \r
+0x8D, 0xF6, 0xF0, 0xA3, 0xF0, 0x90, 0x8D, 0x5E, 0xF0, 0xA3, 0xF0, 0x22, 0x11, 0xF9, 0x11, 0xBE, \r
+0x12, 0x4F, 0x1F, 0x31, 0x9C, 0x12, 0x86, 0xC0, 0x31, 0xBF, 0x31, 0xD2, 0x90, 0x93, 0x35, 0xE0, \r
+0x54, 0x7F, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xF0, 0xF0, 0xE4, 0x90, 0x93, 0x37, \r
+0xF0, 0x90, 0x93, 0x35, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x31, 0xA1, 0xFE, 0xEF, \r
+0x54, 0x07, 0xFF, 0xED, 0x70, 0x12, 0x31, 0x3C, 0xC0, 0x83, 0xC0, 0x82, 0x31, 0x34, 0x80, 0x02, \r
+0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5E, 0x80, 0x0F, 0x31, 0x3C, 0xC0, 0x83, 0xC0, 0x82, 0x31, 0x34, \r
+0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x31, 0x47, 0x90, 0x8E, \r
+0x0F, 0xEF, 0xF0, 0x22, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x22, 0x74, 0xFF, 0x2E, 0xF5, \r
+0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7D, 0x10, \r
+0xED, 0x14, 0xF9, 0x24, 0xFF, 0x31, 0x3F, 0xE0, 0x60, 0x39, 0x7C, 0x08, 0xEC, 0x14, 0x90, 0x95, \r
+0x28, 0xF0, 0x74, 0xFF, 0x29, 0x31, 0x3F, 0xE0, 0xFB, 0x7A, 0x00, 0x90, 0x95, 0x28, 0x31, 0xA8, \r
+0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5A, 0xFE, 0xEF, 0x5B, 0x4E, \r
+0x60, 0x0F, 0xE9, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, 0x95, 0x28, 0xE0, 0x2F, 0x04, 0xFF, 0x80, \r
+0x06, 0xDC, 0xC9, 0xDD, 0xBB, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x31, 0xB2, 0x02, 0x08, \r
+0xAA, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, \r
+0x08, 0x22, 0x7E, 0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xC0, 0x22, 0x90, \r
+0x93, 0x28, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xFB, 0xF0, 0xA3, 0x74, 0x0A, 0x02, \r
+0x67, 0xE6, 0x7E, 0x00, 0x7F, 0x08, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x2C, 0x12, 0x08, \r
+0xAA, 0x90, 0x93, 0x2D, 0x74, 0x08, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x94, 0xFD, 0xEF, \r
+0xF0, 0xA3, 0x12, 0x44, 0x12, 0x90, 0x95, 0x1B, 0xE0, 0xFE, 0x04, 0xF0, 0x51, 0x53, 0x74, 0x00, \r
+0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x94, \r
+0xFE, 0x12, 0x56, 0x7A, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, \r
+0x90, 0x94, 0xFD, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, \r
+0x02, 0xC0, 0x01, 0xA3, 0x12, 0x44, 0x09, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, \r
+0x41, 0x89, 0x42, 0x90, 0x94, 0xFE, 0x51, 0x5A, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, \r
+0x02, 0x35, 0x26, 0x90, 0x00, 0x01, 0xEE, 0x02, 0x06, 0xE1, 0x12, 0x44, 0x09, 0x90, 0x00, 0x0E, \r
+0x02, 0x06, 0xA2, 0x51, 0x69, 0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x90, \r
+0x81, 0x05, 0x12, 0x43, 0xFD, 0xE0, 0x22, 0x51, 0x69, 0x44, 0x04, 0xF0, 0x22, 0xEF, 0x70, 0x04, \r
+0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, \r
+0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, \r
+0xF5, 0x83, 0xEB, 0xF0, 0x22, 0x90, 0x95, 0x11, 0x12, 0x44, 0x12, 0xE4, 0xFF, 0x90, 0x95, 0x11, \r
+0x12, 0x44, 0x09, 0x8F, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, \r
+0x82, 0xE4, 0x34, 0x02, 0x51, 0xCA, 0xB4, 0x10, 0xE4, 0x22, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, \r
+0x22, 0xE4, 0xFF, 0x74, 0x18, 0x51, 0xF5, 0x74, 0xD4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, \r
+0x83, 0xEE, 0xF0, 0x74, 0x10, 0x51, 0xF5, 0x74, 0xCE, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0x51, \r
+0xCA, 0xB4, 0x06, 0xDF, 0x22, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, 0x22, \r
+0xE4, 0xFF, 0x74, 0x90, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x84, \r
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0x51, 0xCA, 0xB4, 0x08, 0xE7, 0x90, 0x8F, 0x98, 0xE0, 0x90, \r
+0x04, 0x8C, 0xF0, 0x22, 0x71, 0x49, 0x71, 0x00, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x8D, \r
+0x06, 0xE0, 0xFF, 0xB4, 0x01, 0x07, 0x90, 0xFD, 0x00, 0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, \r
+0x07, 0x90, 0xFE, 0x10, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0xE4, 0xFD, 0x7F, 0x8F, 0x12, 0x49, 0x39, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0xF1, 0xE0, \r
+0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFF, 0x22, 0x75, 0x15, 0x10, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, \r
 0x75, 0x18, 0x02, 0x90, 0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, \r
 0xF0, 0xA3, 0xE5, 0x18, 0xF0, 0x22, 0x75, 0x1D, 0x07, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, \r
 0x20, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0, \r
 0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, \r
-0xF0, 0x22, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0xC9, \r
-0xF0, 0x74, 0x91, 0xA3, 0xF0, 0x90, 0x93, 0x88, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED, \r
-0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE6, 0x7F, \r
-0x01, 0x22, 0xE4, 0x90, 0x8D, 0x01, 0x12, 0x4F, 0x9F, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, \r
-0x1D, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, \r
-0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, \r
-0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, \r
-0x1C, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, \r
-0x22, 0xA3, 0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, \r
-0xE5, 0x21, 0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, \r
-0x91, 0xDF, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0x94, 0x59, 0xF0, 0xE0, 0xFF, 0x30, 0xE0, 0x07, \r
-0x90, 0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x23, 0x90, 0x01, 0xCF, 0xE0, 0x54, \r
-0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x12, 0x4F, 0x7B, \r
-0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x49, 0x39, 0x80, 0xFE, 0x22, 0x90, \r
-0x8E, 0x84, 0xE0, 0x60, 0x03, 0x12, 0x57, 0x68, 0x22, 0x7F, 0x80, 0x02, 0x69, 0xEF, 0xE4, 0x90, \r
-0x94, 0x5F, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x4A, 0x84, 0x90, 0x94, 0x5F, 0xEF, \r
-0xF0, 0x7F, 0x83, 0x12, 0x4A, 0x84, 0xAE, 0x07, 0x90, 0x94, 0x5F, 0xE0, 0xFF, 0xB5, 0x06, 0x01, \r
-0x22, 0xC3, 0x90, 0x94, 0x61, 0xE0, 0x94, 0x64, 0x90, 0x94, 0x60, 0xE0, 0x94, 0x00, 0x40, 0x0D, \r
-0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x94, 0x5F, 0xE0, 0xFF, 0x22, 0x90, 0x94, 0x60, \r
-0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xBE, 0x90, 0x01, 0xC4, 0x74, 0xF9, 0xF0, 0x74, \r
-0x92, 0xA3, 0xF0, 0x7F, 0x90, 0x12, 0x4A, 0x84, 0xEF, 0x20, 0xE0, 0xF7, 0x74, 0xF9, 0x04, 0x90, \r
-0x01, 0xC4, 0xF0, 0x74, 0x92, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, \r
-0xFF, 0xEF, 0x12, 0x51, 0x4A, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x08, 0xF5, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0x90, 0x01, 0x53, 0xE4, 0xF0, 0xFF, 0xEF, 0x12, 0x51, 0x4A, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, \r
-0x08, 0xF5, 0x22, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x9C, 0x7F, 0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1, \r
-0xBF, 0x01, 0x16, 0x90, 0x93, 0x9C, 0xE0, 0x54, 0x30, 0xFF, 0xBF, 0x20, 0x07, 0x90, 0x93, 0x95, \r
-0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x95, 0xF0, 0x22, 0x90, 0x02, 0x84, 0xEF, 0xF0, 0xEE, \r
-0xA3, 0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x7D, 0x07, 0xEF, 0x5D, 0xC3, 0x60, 0x0A, 0x71, \r
-0x8D, 0x24, 0x08, 0xFF, 0xE4, 0x3E, 0xFE, 0x80, 0x03, 0x71, 0x8D, 0xFF, 0x22, 0x74, 0xFF, 0x9D, \r
-0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, 0x22, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE2, \r
-0x03, 0x7F, 0x04, 0x22, 0x90, 0x02, 0x86, 0xE0, 0x7F, 0x01, 0x20, 0xE1, 0x02, 0x7F, 0x02, 0x22, \r
-0x71, 0x9A, 0xAD, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xB0, 0xF0, 0x74, 0x93, 0xA3, 0xF0, 0xED, 0x64, \r
-0x01, 0x60, 0x1E, 0x12, 0x5F, 0xD8, 0xED, 0xB4, 0x02, 0x08, 0x90, 0x01, 0xC7, 0x74, 0x40, 0xF0, \r
-0x80, 0x0A, 0xED, 0xB4, 0x04, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x41, 0xF0, 0x7F, 0x01, 0x02, 0x73, \r
-0xCF, 0x12, 0x8F, 0x11, 0x90, 0x02, 0x87, 0xE0, 0x70, 0xF7, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x02, \r
-0xF0, 0x74, 0xB0, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x93, 0xA3, 0xF0, 0x22, 0x90, 0x8F, 0x36, \r
-0xE0, 0xFF, 0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x14, 0xEF, 0x44, 0x01, 0x90, \r
-0x8F, 0x36, 0xF0, 0x90, 0x8F, 0x31, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x03, 0x7F, 0x00, 0x22, \r
-0x7F, 0x01, 0x22, 0xEF, 0x90, 0x01, 0xC7, 0xB4, 0xA0, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x03, 0x74, \r
-0x08, 0xF0, 0x02, 0x5F, 0xD8, 0x12, 0xA0, 0x3F, 0xF0, 0xE4, 0x90, 0x93, 0xBF, 0xF0, 0x90, 0x93, \r
-0xBF, 0xE0, 0xFD, 0xC3, 0x94, 0x06, 0x50, 0x28, 0x90, 0x93, 0xB8, 0xE0, 0x24, 0x04, 0xFF, 0x90, \r
-0x93, 0xB7, 0xE0, 0x34, 0x00, 0xFE, 0x12, 0x5C, 0xFE, 0x90, 0x93, 0xBF, 0xE0, 0x24, 0xB9, 0xF5, \r
-0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xBF, 0xE0, 0x04, 0xF0, 0x80, 0xCE, \r
-0x78, 0x37, 0x7C, 0x8F, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB9, 0x91, 0x86, 0xEF, 0x7F, \r
-0x00, 0x70, 0x02, 0x7F, 0x01, 0x22, 0x7E, 0x00, 0x7F, 0x06, 0x02, 0x45, 0xC7, 0xF1, 0xE1, 0x78, \r
-0xB0, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x56, 0xF1, 0xBD, 0x78, 0xB6, 0x7C, \r
-0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x5C, 0xF1, 0xC4, 0x78, 0xBA, 0x7C, 0x93, 0x7D, \r
-0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x60, 0xF1, 0xC4, 0xE4, 0x90, 0x93, 0xBF, 0xF0, 0xB1, 0xDA, \r
-0xCF, 0x24, 0x06, 0xCF, 0x12, 0x5F, 0x1B, 0xEF, 0x64, 0x08, 0x60, 0x02, 0xA1, 0xC2, 0xB1, 0xDA, \r
-0xCF, 0x24, 0x07, 0xCF, 0x12, 0x5F, 0x1B, 0xEF, 0x64, 0x06, 0x60, 0x02, 0xA1, 0xC2, 0x90, 0x93, \r
-0xBF, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0xBE, 0xF0, 0xB1, 0xC8, 0x94, 0x06, 0x50, 0x1D, 0x90, 0x93, \r
-0xA8, 0xE0, 0x24, 0x0A, 0xFD, 0x90, 0x93, 0xA7, 0xE0, 0x12, 0x5C, 0xF1, 0x90, 0x93, 0xBE, 0xE0, \r
-0x24, 0xAA, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xB1, 0xCF, 0x80, 0xDD, 0xF1, 0xCB, 0x7B, 0x01, 0x7A, \r
-0x8F, 0x79, 0x3D, 0x91, 0x86, 0xEF, 0x60, 0x02, 0xA1, 0xC2, 0x90, 0x93, 0xBE, 0xF0, 0xB1, 0xC8, \r
-0x94, 0x04, 0x50, 0x1B, 0xF1, 0xA1, 0x2D, 0xFD, 0xB1, 0xE5, 0xCD, 0x24, 0x20, 0x12, 0x5C, 0xF0, \r
-0x90, 0x93, 0xBE, 0xE0, 0x24, 0xBA, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xB1, 0xCF, 0x80, 0xDF, 0x78, \r
-0xBA, 0x7C, 0x93, 0x12, 0x9E, 0xE2, 0xEF, 0x70, 0x70, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x01, 0x54, \r
-0xDF, 0xF0, 0x90, 0x8F, 0x30, 0xE0, 0x30, 0xE0, 0x0A, 0x90, 0x01, 0xC7, 0x74, 0x09, 0x12, 0x5F, \r
-0xD7, 0x80, 0x5F, 0xE4, 0x90, 0x93, 0xBE, 0xF0, 0xB1, 0xC8, 0x94, 0x06, 0x50, 0x12, 0x12, 0x5C, \r
-0xDC, 0x90, 0x93, 0xBE, 0xE0, 0x24, 0xB0, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xB1, 0xCF, 0x80, 0xE8, \r
-0xE4, 0x90, 0x93, 0xBE, 0xF0, 0xB1, 0xC8, 0x94, 0x04, 0x50, 0x1B, 0xF1, 0xA1, 0x2D, 0xFD, 0xB1, \r
-0xE5, 0xCD, 0x24, 0x16, 0x12, 0x5C, 0xF0, 0x90, 0x93, 0xBE, 0xE0, 0x24, 0xB6, 0xF5, 0x82, 0xE4, \r
-0x34, 0x93, 0xB1, 0xCF, 0x80, 0xDF, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB0, 0x12, 0x9F, 0x10, 0xF0, \r
-0x7A, 0x93, 0x79, 0xB6, 0x12, 0x55, 0xD5, 0x80, 0x09, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x21, 0x54, \r
-0xEF, 0xF0, 0x90, 0x93, 0xBF, 0xE0, 0xFF, 0x22, 0x90, 0x93, 0xBE, 0xE0, 0xFF, 0xC3, 0x22, 0xF5, \r
-0x83, 0xEF, 0xF0, 0x90, 0x93, 0xBE, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x93, 0xA9, 0xE0, 0xFF, 0x90, \r
-0x93, 0xA8, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00, 0x22, 0xF1, 0xE1, 0xF1, 0xCB, \r
-0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x6A, 0xF1, 0xBD, 0x78, 0xB0, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, \r
-0x7A, 0x40, 0x79, 0x70, 0xF1, 0xD2, 0x78, 0xC0, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, \r
-0x79, 0x80, 0xF1, 0xD2, 0xE4, 0x90, 0x93, 0xD3, 0x12, 0x5D, 0xA9, 0xA3, 0xE0, 0xFD, 0xF1, 0xED, \r
-0xEF, 0x64, 0x01, 0x60, 0x02, 0xE1, 0x9B, 0xB1, 0xDA, 0xCF, 0x24, 0x0E, 0xCF, 0x12, 0x5F, 0x1B, \r
-0xEF, 0x64, 0x3A, 0x60, 0x02, 0xE1, 0x9B, 0xB1, 0xDA, 0xCF, 0x24, 0x30, 0xCF, 0x12, 0x5F, 0x1B, \r
-0xEF, 0x64, 0x87, 0x60, 0x02, 0xE1, 0x9B, 0x90, 0x93, 0xD3, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0xD0, \r
-0xF0, 0xF1, 0xAB, 0x94, 0x10, 0x50, 0x1B, 0xF1, 0xA1, 0x2D, 0xFD, 0xB1, 0xE5, 0xCD, 0x24, 0x38, \r
-0x12, 0x5C, 0xF0, 0x90, 0x93, 0xD0, 0xE0, 0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF1, 0xB2, \r
-0x80, 0xDF, 0xE4, 0x90, 0x93, 0xD1, 0xF0, 0x90, 0x93, 0xD1, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, \r
-0x02, 0xE1, 0x9B, 0x75, 0xF0, 0x38, 0xEF, 0xF1, 0xD9, 0x20, 0xE0, 0x02, 0xE1, 0x9B, 0xE4, 0x90, \r
-0x93, 0xD2, 0xF0, 0x90, 0x93, 0xD1, 0xE0, 0xFF, 0x75, 0xF0, 0x38, 0x90, 0x8F, 0x62, 0x12, 0x43, \r
-0xFD, 0xE0, 0xFE, 0x90, 0x93, 0xD2, 0xE0, 0xC3, 0x9E, 0x40, 0x02, 0xE1, 0x93, 0xEF, 0x75, 0xF0, \r
-0x38, 0xA4, 0x24, 0x79, 0xF9, 0x74, 0x8F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xE0, 0x75, 0xF0, 0x10, \r
-0xA4, 0x29, 0xF9, 0xEA, 0x35, 0xF0, 0xFA, 0x78, 0xC0, 0x7C, 0x93, 0x12, 0x9F, 0x80, 0x60, 0x02, \r
-0xE1, 0x84, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x01, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x93, 0xD0, 0xF0, \r
-0xF1, 0xAB, 0x94, 0x06, 0x50, 0x1B, 0xF1, 0xA1, 0x2D, 0xFD, 0xB1, 0xE5, 0xCD, 0x24, 0x4A, 0x12, \r
-0x5C, 0xF0, 0x90, 0x93, 0xD0, 0xE0, 0x24, 0xAA, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF1, 0xB2, 0x80, \r
-0xDF, 0xE4, 0x90, 0x93, 0xD0, 0xF0, 0xF1, 0xAB, 0x94, 0x10, 0x50, 0x12, 0x12, 0x5C, 0xDC, 0x90, \r
-0x93, 0xD0, 0xE0, 0x24, 0xB0, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF1, 0xB2, 0x80, 0xE8, 0x90, 0x93, \r
-0xD1, 0xE0, 0xFF, 0x75, 0xF0, 0x38, 0xF1, 0xD9, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x1A, 0xEF, 0x75, \r
-0xF0, 0x38, 0xA4, 0x24, 0x69, 0xF9, 0x74, 0x8F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x78, 0xB0, 0x7C, \r
-0x93, 0x12, 0x9F, 0x80, 0x70, 0x45, 0x80, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAA, 0x90, 0x93, \r
-0xD7, 0x12, 0x44, 0x12, 0x7A, 0x93, 0x79, 0xC0, 0x90, 0x93, 0xDA, 0x12, 0x44, 0x12, 0x90, 0x93, \r
-0xD1, 0xE0, 0x75, 0xF0, 0x38, 0xA4, 0x24, 0x63, 0xF9, 0x74, 0x8F, 0x35, 0xF0, 0xFA, 0x90, 0x93, \r
-0xDD, 0x12, 0x44, 0x12, 0xE4, 0x90, 0x93, 0xE0, 0xF0, 0xA3, 0xF0, 0x7A, 0x93, 0x79, 0xB0, 0x12, \r
-0x54, 0x5C, 0x80, 0x07, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x05, 0xF0, 0x90, 0x93, 0xD2, 0xE0, 0x04, \r
-0xF0, 0xC1, 0x93, 0x90, 0x93, 0xD1, 0xE0, 0x04, 0xF0, 0xC1, 0x77, 0x90, 0x93, 0xD3, 0xE0, 0xFF, \r
-0x22, 0x90, 0x93, 0xA9, 0xE0, 0xFD, 0x90, 0x93, 0xA8, 0xE0, 0x22, 0x90, 0x93, 0xD0, 0xE0, 0xFF, \r
-0xC3, 0x22, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xD0, 0xE0, 0x04, 0xF0, 0x22, 0x7E, 0x00, 0x7F, \r
-0x06, 0x02, 0x06, 0x63, 0x7E, 0x00, 0x7F, 0x04, 0x02, 0x06, 0x63, 0x78, 0xAA, 0x7C, 0x93, 0x7D, \r
-0x01, 0x22, 0x7E, 0x00, 0x7F, 0x10, 0x02, 0x06, 0x63, 0x90, 0x8F, 0x61, 0x12, 0x43, 0xFD, 0xE0, \r
-0x22, 0x90, 0x93, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x22, 0x90, 0x93, 0xD4, \r
-0xF1, 0xE4, 0x2F, 0xFF, 0xE4, 0x3E, 0xCF, 0x24, 0x06, 0xCF, 0x12, 0x5F, 0x1B, 0xBF, 0x86, 0x19, \r
-0x90, 0x93, 0xD6, 0xE0, 0xFF, 0x90, 0x93, 0xD5, 0xE0, 0x2F, 0x11, 0x1C, 0xCF, 0x24, 0x07, 0xCF, \r
-0x12, 0x5F, 0x1B, 0xBF, 0xDD, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xFF, 0x90, 0x93, 0xD4, \r
-0xE0, 0x34, 0x00, 0x22, 0x90, 0x94, 0x0F, 0x12, 0x44, 0x12, 0x90, 0x94, 0x12, 0x12, 0x56, 0xE5, \r
-0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xD1, 0x12, 0x35, 0x26, 0x90, 0x94, 0x0F, 0x12, \r
-0x56, 0xE5, 0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xE1, 0x12, 0x35, 0x26, 0x90, 0x94, \r
-0x15, 0x12, 0x43, 0xE5, 0x90, 0x8F, 0xF1, 0x12, 0x08, 0x6D, 0x90, 0x94, 0x19, 0xE0, 0x90, 0x8F, \r
-0xF8, 0xF0, 0x22, 0x90, 0x8F, 0x36, 0xE0, 0x30, 0xE0, 0x03, 0x7F, 0x01, 0x22, 0x90, 0x06, 0x90, \r
-0xE0, 0x20, 0xE5, 0x10, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x09, 0x90, 0x01, 0xC7, 0x74, 0x25, \r
-0xF0, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x93, 0xAB, 0xF0, 0x12, \r
-0x06, 0x89, 0x90, 0x93, 0x77, 0x12, 0x75, 0xC9, 0x90, 0x93, 0x78, 0xF0, 0x22, 0x11, 0xDD, 0x90, \r
-0x93, 0x80, 0x12, 0x75, 0xC9, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x81, 0x12, 0x77, 0x7A, 0xFF, 0xED, \r
-0x2F, 0x90, 0x93, 0x82, 0x12, 0x77, 0x82, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x83, 0x12, 0x77, 0xC4, \r
-0xFF, 0xED, 0x2F, 0x90, 0x93, 0x84, 0x12, 0x77, 0xD1, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x85, 0xF0, \r
-0x12, 0x74, 0xF8, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93, 0x86, 0xF0, 0x22, 0x90, 0x02, 0x09, \r
-0xE0, 0xFD, 0x12, 0x06, 0x89, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFF, \r
-0x12, 0x06, 0x89, 0xFE, 0xEF, 0x2E, 0x90, 0x93, 0x87, 0xF0, 0x22, 0xEF, 0x60, 0x08, 0x90, 0x93, \r
-0x7A, 0xE0, 0xFF, 0x12, 0x57, 0x03, 0x22, 0xEF, 0x60, 0x08, 0x90, 0x93, 0x7F, 0xE0, 0xFF, 0x12, \r
-0x83, 0xF0, 0x22, 0xE4, 0xFD, 0xFC, 0xEF, 0x60, 0x42, 0x90, 0x93, 0x7D, 0x12, 0x67, 0xEB, 0x31, \r
-0x5C, 0x12, 0x77, 0xCB, 0x90, 0x93, 0xAB, 0x12, 0x56, 0xE5, 0x75, 0x43, 0x40, 0x7B, 0x01, 0x7A, \r
-0x90, 0x79, 0x03, 0x12, 0x35, 0x26, 0xE4, 0xFD, 0x7F, 0x03, 0x12, 0x30, 0xCE, 0x90, 0x93, 0x7E, \r
-0xE0, 0x75, 0xF0, 0x80, 0xA4, 0xAE, 0xF0, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, \r
-0xFF, 0x12, 0x39, 0xD6, 0x7D, 0x01, 0x7F, 0x03, 0x12, 0x30, 0xCE, 0x22, 0x74, 0x00, 0x2F, 0xF9, \r
-0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, 0xEF, 0x60, 0x0A, 0x90, 0x06, 0x31, 0xE0, 0x44, 0x80, \r
-0xF0, 0x12, 0x63, 0x49, 0x22, 0x31, 0x9A, 0x90, 0x8F, 0x2E, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, \r
-0x18, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x0D, 0x90, 0x95, 0x46, 0x12, \r
-0x08, 0x79, 0x00, 0x00, 0x00, 0x14, 0x12, 0x50, 0x34, 0x22, 0x22, 0x90, 0x93, 0x8D, 0xE0, 0x30, \r
-0xE0, 0x6B, 0x90, 0x93, 0x91, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x94, 0xE0, 0x64, 0x01, 0x70, 0x20, \r
-0x90, 0x93, 0x8D, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x15, 0x90, 0x93, 0x93, 0xE0, 0x70, \r
-0x0F, 0x90, 0x93, 0x90, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x40, 0x04, 0x51, 0x0E, 0xF0, 0x22, \r
-0x90, 0x93, 0x91, 0xE0, 0xFF, 0x90, 0x93, 0x8E, 0xE0, 0xD3, 0x9F, 0x50, 0x30, 0x90, 0x06, 0x92, \r
-0xE0, 0x20, 0xE2, 0x1A, 0x90, 0x93, 0x93, 0xE0, 0x70, 0x14, 0x7D, 0x08, 0xFF, 0x12, 0x57, 0x87, \r
-0x90, 0x93, 0x92, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x8C, 0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90, 0x06, \r
-0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x91, 0xF0, 0x90, 0x93, 0x93, 0xF0, 0x22, 0x90, 0x01, \r
-0xC7, 0x74, 0x10, 0xF0, 0x7F, 0x01, 0x12, 0x73, 0xCF, 0x90, 0x93, 0x8D, 0xE0, 0x54, 0xFE, 0x22, \r
-0x90, 0x8E, 0x80, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x8E, 0x8D, 0xF0, 0x90, 0x8E, 0x88, 0xF0, \r
-0x90, 0x8E, 0x81, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x6D, 0x9D, 0x7D, 0x02, 0x7F, 0x02, 0x02, 0x6D, \r
-0xA1, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, \r
-0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x51, 0x41, 0xEF, 0x64, 0x01, 0x70, \r
-0x47, 0x90, 0x8E, 0x88, 0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3E, 0x90, 0x8E, 0x86, 0xE0, 0xFE, 0xE4, \r
-0xC3, 0x9E, 0x40, 0x34, 0xEF, 0x20, 0xE2, 0x30, 0x90, 0x8E, 0x88, 0xE0, 0x20, 0xE4, 0x29, 0x90, \r
-0x8E, 0x81, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1E, 0x90, 0x8F, 0x29, 0xE0, 0x70, 0x18, \r
-0x90, 0x06, 0x62, 0xE0, 0x20, 0xE1, 0x11, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, 0x07, 0xE0, 0x54, \r
-0xFC, 0x64, 0x80, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0B, \r
-0x04, 0x70, 0x27, 0x90, 0x8E, 0x8A, 0x74, 0x02, 0xF0, 0x80, 0x16, 0xED, 0x70, 0x0A, 0x90, 0x8F, \r
-0x26, 0xE0, 0x90, 0x8E, 0x8A, 0xF0, 0x80, 0x05, 0x90, 0x8E, 0x8A, 0xED, 0xF0, 0x90, 0x8E, 0x8A, \r
-0xE0, 0xA3, 0xF0, 0x90, 0x8E, 0x81, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x8F, 0x2A, 0xE0, 0xC3, \r
-0x13, 0x20, 0xE0, 0x21, 0x90, 0x02, 0x87, 0xE0, 0x70, 0x24, 0x90, 0x8F, 0x2E, 0xE0, 0x30, 0xE0, \r
-0x06, 0x90, 0x02, 0x82, 0xE0, 0x70, 0x17, 0x90, 0x8F, 0x36, 0xE0, 0x20, 0xE0, 0x10, 0x90, 0x02, \r
+0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x12, 0x87, 0xDD, 0x90, 0x01, \r
+0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xC7, 0x74, \r
+0xFE, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0xD3, 0xF0, 0x74, 0x8B, 0xA3, 0xF0, 0x90, \r
+0x93, 0x27, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, \r
+0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE6, 0x74, 0xD3, 0x04, 0x90, 0x01, 0xC4, 0xF0, \r
+0x74, 0x8B, 0xA3, 0xF0, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x8D, 0x01, 0x12, 0x4D, 0xB3, 0xA3, 0xF0, \r
+0x22, 0x90, 0x01, 0xE4, 0x74, 0x1F, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, \r
+0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, \r
+0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, \r
+0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, \r
+0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, \r
+0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, \r
+0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0x8E, 0xC4, 0xE0, 0x30, 0xE0, 0x05, 0x7F, \r
+0x10, 0x12, 0x71, 0xDE, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0x93, 0xF8, 0xF0, 0xE0, 0xFF, 0x30, \r
+0xE0, 0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x23, 0x90, 0x01, 0xCF, \r
+0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x12, \r
+0x4D, 0x6E, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x49, 0x39, 0x80, 0xFE, \r
+0x22, 0x90, 0x8E, 0x15, 0xE0, 0x60, 0x46, 0x90, 0x8E, 0x11, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0x8E, \r
+0x2C, 0xE0, 0x04, 0x12, 0x77, 0x6B, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x8E, \r
+0x4C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x77, 0x48, 0x30, 0xE0, 0x0A, 0x90, 0x01, 0x3B, 0xE0, \r
+0x30, 0xE4, 0x03, 0x12, 0x76, 0x1D, 0x90, 0x95, 0x29, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x80, \r
+0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xB1, 0xAF, 0xB1, \r
+0x72, 0xE4, 0x90, 0x93, 0x2B, 0xF0, 0x12, 0x77, 0x7A, 0x12, 0x6F, 0xFA, 0x30, 0xE0, 0x52, 0x90, \r
+0x90, 0x74, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7C, 0x00, 0x7D, 0x64, 0x12, 0x07, 0x15, 0x90, 0x90, \r
+0xC8, 0xE0, 0x6E, 0x70, 0x03, 0xA3, 0xE0, 0x6F, 0x60, 0x0A, 0x90, 0x90, 0xC8, 0xE4, 0x75, 0xF0, \r
+0x01, 0x02, 0x08, 0xD6, 0x90, 0x90, 0x78, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, 0x86, 0xE0, \r
+0xB5, 0x06, 0x14, 0xA3, 0xE0, 0xB5, 0x07, 0x0F, 0xEF, 0x4E, 0x60, 0x0B, 0x90, 0x01, 0xC7, 0x74, \r
+0x31, 0xF0, 0x7F, 0x01, 0x02, 0x79, 0x21, 0x12, 0x61, 0xA1, 0xE4, 0x90, 0x90, 0xC8, 0xF0, 0xA3, \r
+0xF0, 0x22, 0x90, 0x93, 0x28, 0xE0, 0x30, 0xE0, 0x35, 0x12, 0x73, 0x13, 0x70, 0x30, 0x90, 0x95, \r
+0x2C, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x93, 0x2A, 0xE0, 0x04, 0xF0, 0xE4, 0x90, \r
+0x95, 0x2C, 0xF0, 0x90, 0x93, 0x2A, 0xE0, 0xFF, 0x90, 0x93, 0x29, 0xE0, 0xD3, 0x9F, 0x50, 0x0E, \r
+0x90, 0x93, 0x2B, 0xE0, 0x70, 0x08, 0xE4, 0x90, 0x93, 0x2A, 0xF0, 0x12, 0x67, 0x94, 0x22, 0x90, \r
+0x93, 0x2C, 0xE0, 0x30, 0xE0, 0x6C, 0x90, 0x93, 0x30, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x33, 0xE0, \r
+0x64, 0x01, 0x70, 0x21, 0x90, 0x93, 0x2C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x16, 0x90, \r
+0x93, 0x32, 0xE0, 0x70, 0x10, 0x90, 0x93, 0x2F, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x40, 0x05, \r
+0x12, 0x79, 0x6A, 0xF0, 0x22, 0x90, 0x93, 0x30, 0xE0, 0xFF, 0x90, 0x93, 0x2D, 0xE0, 0xD3, 0x9F, \r
+0x50, 0x30, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x1A, 0x90, 0x93, 0x32, 0xE0, 0x70, 0x14, 0x7D, \r
+0x08, 0xFF, 0x12, 0x65, 0x59, 0x90, 0x93, 0x31, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x2B, 0xE0, 0x04, \r
+0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x30, 0xF0, 0x90, 0x93, \r
+0x32, 0xF0, 0x22, 0x90, 0x93, 0x32, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x18, 0xE0, 0x64, 0x02, 0x60, \r
+0x03, 0x12, 0x75, 0x82, 0x22, 0x90, 0x8E, 0x15, 0xE0, 0x60, 0x02, 0xD1, 0x3E, 0x22, 0x90, 0x8E, \r
+0x15, 0xE0, 0x64, 0x01, 0x70, 0x14, 0x12, 0x77, 0xF5, 0x60, 0x06, 0x12, 0x53, 0xD0, 0x02, 0x67, \r
+0xAC, 0x90, 0x8E, 0x18, 0xE0, 0x70, 0x03, 0x12, 0x51, 0xF9, 0x22, 0x90, 0x8E, 0x15, 0xE0, 0x60, \r
+0x03, 0x12, 0x74, 0x47, 0x22, 0x90, 0x8E, 0x15, 0xE0, 0x60, 0x10, 0x90, 0x06, 0x92, 0xE0, 0x30, \r
+0xE1, 0x03, 0x02, 0x67, 0xAC, 0x12, 0x75, 0x6E, 0x12, 0x74, 0xB2, 0x22, 0xF1, 0x24, 0x90, 0x93, \r
+0xFD, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, \r
+0xB5, 0x90, 0x93, 0xFD, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, \r
+0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0xF1, 0x1B, 0x90, 0x8E, 0x2E, 0xE0, 0xFB, \r
+0xAC, 0x07, 0x90, 0x8E, 0x11, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x8E, 0x4B, 0xE0, 0x24, 0x04, 0x90, \r
+0x8E, 0x2A, 0xF0, 0x90, 0x8E, 0x4B, 0xE0, 0x24, 0x03, 0x90, 0x8E, 0x29, 0xF0, 0x80, 0x0B, 0x90, \r
+0x8E, 0x2A, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x29, 0x14, 0xF0, 0x90, 0x8E, 0x29, 0xE0, 0xFA, 0x90, \r
+0x8E, 0x28, 0xE0, 0xD3, 0x9A, 0x50, 0x09, 0x90, 0x8E, 0x1D, 0xEB, 0xF1, 0x13, 0x2C, 0x80, 0x0B, \r
+0xAD, 0x02, 0xC3, 0xED, 0x9D, 0x2B, 0x90, 0x8E, 0x1D, 0xF1, 0x13, 0x90, 0x8E, 0x2D, 0xF0, 0x90, \r
+0x8E, 0x2D, 0xE0, 0xFF, 0x7E, 0x00, 0x90, 0x8E, 0x21, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x05, \r
+0x58, 0xF0, 0x22, 0xF0, 0x90, 0x8E, 0x2A, 0xE0, 0xC3, 0x9D, 0x22, 0x90, 0x8E, 0x27, 0xE0, 0xFF, \r
+0xA3, 0xE0, 0xFD, 0x22, 0xE4, 0x90, 0x93, 0xFE, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, \r
+0x4A, 0x4E, 0x90, 0x93, 0xFE, 0xEF, 0xF0, 0x7F, 0x83, 0x12, 0x4A, 0x4E, 0xAE, 0x07, 0x90, 0x93, \r
+0xFE, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x94, 0x00, 0xE0, 0x94, 0x64, 0x90, 0x93, \r
+0xFF, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x93, 0xFE, \r
+0xE0, 0xFF, 0x22, 0x90, 0x93, 0xFF, 0x12, 0x61, 0x77, 0x80, 0xC2, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
+0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, \r
+0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, \r
+0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, 0x0D, \r
+0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0x90, 0x93, 0x71, 0xE0, 0x2F, 0xFF, \r
+0x90, 0x93, 0x70, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x93, 0xF4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, \r
+0x1B, 0xE0, 0xFD, 0xF1, 0x99, 0x90, 0x93, 0x6B, 0xEF, 0xF0, 0x22, 0x7F, 0xFF, 0x12, 0x53, 0xD9, \r
+0xE4, 0x90, 0x95, 0x1E, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, \r
+0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x95, 0x1F, \r
+0xE0, 0x94, 0xE8, 0x90, 0x95, 0x1E, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, \r
+0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x95, 0x1E, 0x12, \r
+0x61, 0x77, 0x80, 0xC3, 0x90, 0x01, 0xC4, 0x74, 0x14, 0xF0, 0x74, 0x90, 0xA3, 0xF0, 0x7F, 0x90, \r
+0x12, 0x4A, 0x4E, 0xEF, 0x20, 0xE0, 0xF7, 0x74, 0x14, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x90, \r
+0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0xEF, 0x12, 0x51, 0x5B, \r
+0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x08, 0xF5, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x53, 0xE4, \r
+0xF0, 0xFF, 0xEF, 0x12, 0x51, 0x5B, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x08, 0xF5, 0x22, 0x7B, 0x01, \r
+0x7A, 0x93, 0x79, 0x3B, 0x7F, 0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x16, 0x90, 0x93, \r
+0x3B, 0xE0, 0x54, 0x30, 0xFF, 0xBF, 0x20, 0x07, 0x90, 0x93, 0x34, 0x74, 0x01, 0xF0, 0x22, 0xE4, \r
+0x90, 0x93, 0x34, 0xF0, 0x22, 0x12, 0x7F, 0x59, 0x90, 0x93, 0x28, 0x12, 0x7F, 0xCC, 0x54, 0x04, \r
+0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xF0, 0x12, 0x06, 0x89, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x77, \r
+0xC3, 0x90, 0x93, 0x29, 0xF0, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x02, 0x84, 0xEF, 0xF0, \r
+0xEE, 0xA3, 0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x95, 0x22, 0xF0, 0xA3, 0xF0, \r
+0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x24, 0xC3, 0x90, 0x95, 0x23, 0xE0, 0x94, 0xD0, 0x90, 0x95, \r
+0x22, 0xE0, 0x94, 0x07, 0x40, 0x0A, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, \r
+0x90, 0x95, 0x22, 0x12, 0x61, 0x77, 0x12, 0x87, 0xDD, 0x80, 0xD5, 0x7F, 0x01, 0x22, 0x90, 0x02, \r
+0x86, 0xE0, 0x20, 0xE2, 0x03, 0x7F, 0x04, 0x22, 0x90, 0x02, 0x86, 0xE0, 0x7F, 0x01, 0x20, 0xE1, \r
+0x02, 0x7F, 0x02, 0x22, 0x90, 0x8E, 0xCD, 0xE0, 0xFF, 0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, \r
+0x30, 0xE2, 0x14, 0xEF, 0x44, 0x01, 0x90, 0x8E, 0xCD, 0xF0, 0x90, 0x8E, 0xC7, 0xE0, 0xC4, 0x54, \r
+0x0F, 0x20, 0xE0, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22, 0xEF, 0x90, 0x01, 0xC7, 0xB4, 0xA0, \r
+0x05, 0x74, 0x04, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x02, 0x6F, 0x98, 0x90, 0x93, 0x56, 0x31, \r
+0x98, 0x90, 0x93, 0x5E, 0xF0, 0x90, 0x93, 0x5E, 0xE0, 0xFD, 0xC3, 0x94, 0x06, 0x50, 0x28, 0x90, \r
+0x93, 0x57, 0xE0, 0x24, 0x04, 0xFF, 0x90, 0x93, 0x56, 0xE0, 0x34, 0x00, 0xFE, 0x12, 0x6B, 0x77, \r
+0x90, 0x93, 0x5E, 0xE0, 0x24, 0x58, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, \r
+0x93, 0x5E, 0xE0, 0x04, 0xF0, 0x80, 0xCE, 0x78, 0xCE, 0x7C, 0x8E, 0x7D, 0x01, 0x7B, 0x01, 0x7A, \r
+0x93, 0x79, 0x58, 0x31, 0x8C, 0x7F, 0x00, 0x70, 0x02, 0x7F, 0x01, 0x22, 0x7E, 0x00, 0x7F, 0x06, \r
+0x12, 0x45, 0xC7, 0xEF, 0x22, 0x90, 0x93, 0x46, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x22, 0x90, \r
+0x93, 0x4A, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x93, 0x48, 0x31, 0x98, 0x90, 0x93, 0x6E, 0xF0, \r
+0xEF, 0x24, 0x24, 0xFF, 0xE4, 0x3E, 0xFE, 0xC0, 0x06, 0x91, 0x20, 0xD0, 0x06, 0xE4, 0xFB, 0xFA, \r
+0x71, 0xF0, 0x4E, 0x60, 0x3E, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x93, 0x6F, 0x12, 0x6D, 0x70, 0x90, \r
+0x93, 0x4D, 0x91, 0x09, 0x90, 0x93, 0x4D, 0x71, 0xFF, 0xFE, 0xC3, 0x9F, 0x50, 0x25, 0x90, 0x93, \r
+0x70, 0xE0, 0x24, 0x02, 0xFD, 0x90, 0x93, 0x6F, 0xE0, 0x34, 0x00, 0xFC, 0xEE, 0x7E, 0x00, 0x2D, \r
+0x12, 0x6B, 0x71, 0x90, 0x93, 0x4C, 0xE0, 0x24, 0x4E, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0x12, 0x5D, \r
+0x87, 0x80, 0xD1, 0x91, 0x11, 0xC0, 0x06, 0x91, 0x20, 0xD0, 0x06, 0x7B, 0x03, 0x71, 0xED, 0x90, \r
+0x93, 0x49, 0xE0, 0x24, 0x22, 0x91, 0x17, 0x90, 0x93, 0x6F, 0x12, 0x6F, 0xEB, 0xEF, 0x20, 0xE4, \r
+0x02, 0x41, 0xD5, 0x90, 0x93, 0x6E, 0xE0, 0x04, 0xF0, 0x91, 0x11, 0xC0, 0x06, 0x91, 0x20, 0xD0, \r
+0x06, 0x7B, 0x30, 0x71, 0xED, 0x4E, 0x60, 0x45, 0xE0, 0x24, 0x08, 0xFF, 0x90, 0x93, 0x6F, 0x12, \r
+0x6D, 0x70, 0x91, 0x06, 0x71, 0xFC, 0xC3, 0x9F, 0x50, 0x33, 0x90, 0x93, 0x70, 0xE0, 0x24, 0x0D, \r
+0xFF, 0x90, 0x93, 0x6F, 0x12, 0x6D, 0x70, 0x90, 0x93, 0x71, 0xEF, 0xF0, 0xBF, 0x02, 0x09, 0x90, \r
+0x93, 0x6E, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x0E, 0x90, 0x93, 0x71, 0xE0, 0xB4, 0x04, 0x07, 0x90, \r
+0x93, 0x6E, 0xE0, 0x24, 0x40, 0xF0, 0x91, 0x3E, 0x12, 0x5D, 0x8B, 0x80, 0xC7, 0x91, 0x11, 0xC0, \r
+0x06, 0x91, 0x20, 0xD0, 0x06, 0x7B, 0xDD, 0x7A, 0x00, 0x7D, 0x01, 0x71, 0xF1, 0x4E, 0x60, 0x4A, \r
+0xE0, 0x24, 0x0C, 0xFF, 0x90, 0x93, 0x6F, 0x12, 0x6D, 0x70, 0x91, 0x06, 0x71, 0xFC, 0xC3, 0x9F, \r
+0x50, 0x38, 0x90, 0x93, 0x70, 0xE0, 0x24, 0x11, 0xFF, 0x90, 0x93, 0x6F, 0x12, 0x6D, 0x70, 0x90, \r
+0x93, 0x71, 0xEF, 0xF0, 0xBF, 0x02, 0x09, 0x90, 0x93, 0x6E, 0xE0, 0x24, 0x02, 0xF0, 0x80, 0x0E, \r
+0x90, 0x93, 0x71, 0xE0, 0xB4, 0x04, 0x07, 0x90, 0x93, 0x6E, 0xE0, 0x24, 0x04, 0xF0, 0x91, 0x3E, \r
+0x12, 0x5D, 0x8B, 0x80, 0xC7, 0xE4, 0x90, 0x93, 0x6E, 0xF0, 0x90, 0x90, 0xCA, 0xE0, 0x90, 0x04, \r
+0xFD, 0x91, 0x0A, 0x90, 0x90, 0xCA, 0x71, 0xFF, 0xFE, 0xC3, 0x9F, 0x50, 0x6C, 0xD1, 0x84, 0xF5, \r
+0x83, 0xE0, 0xFF, 0x90, 0x93, 0x4D, 0xE0, 0xFE, 0x6F, 0x70, 0x59, 0x90, 0x04, 0xFC, 0xE0, 0x04, \r
+0xF0, 0x90, 0x93, 0x4C, 0xE0, 0x24, 0xEA, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFF, \r
+0x90, 0x93, 0x6E, 0xE0, 0xFD, 0x4F, 0x60, 0x04, 0xED, 0x5F, 0x60, 0x38, 0xEE, 0xFF, 0x7E, 0x00, \r
+0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0x4C, 0xE0, 0x75, 0xF0, 0x20, 0xA4, 0x24, 0x12, 0xF9, 0x74, \r
+0x91, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x78, 0x4E, 0x7C, 0x93, 0x7D, 0x01, 0xD0, 0x07, 0xD0, 0x06, \r
+0x12, 0x45, 0xC7, 0xEF, 0x70, 0x0E, 0x90, 0x01, 0xC7, 0x74, 0x55, 0xF0, 0x7F, 0x01, 0x12, 0x79, \r
+0x21, 0x12, 0x87, 0xC6, 0x12, 0x5D, 0x8B, 0x80, 0x8A, 0x22, 0x90, 0x93, 0x73, 0xD1, 0x66, 0xA3, \r
+0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0xC3, 0x90, 0x93, 0x79, 0xE0, 0x94, 0x01, 0x90, 0x93, 0x78, 0xE0, \r
+0x94, 0x00, 0x50, 0x02, 0x80, 0x73, 0xE4, 0x90, 0x93, 0x7C, 0xF0, 0xA3, 0xF0, 0x91, 0x35, 0xE4, \r
+0xFD, 0x12, 0x6B, 0x77, 0x90, 0x93, 0x76, 0xE0, 0x70, 0x03, 0xA3, 0xE0, 0x6F, 0x70, 0x17, 0x90, \r
+0x93, 0x74, 0xE0, 0x24, 0x02, 0x91, 0x60, 0xFE, 0x90, 0x93, 0x75, 0xE0, 0xFD, 0xD1, 0xA8, 0xBF, \r
+0x01, 0x02, 0x81, 0x35, 0x80, 0x00, 0x90, 0x93, 0x74, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x93, 0x73, \r
+0x12, 0x6D, 0x70, 0x7E, 0x00, 0x90, 0x93, 0x7A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x02, 0xFF, \r
+0xEE, 0x33, 0xFE, 0x90, 0x93, 0x73, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x93, 0x7C, 0xEE, 0x8F, \r
+0xF0, 0x12, 0x08, 0xD6, 0x90, 0x93, 0x78, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x90, 0x93, 0x7D, \r
+0xE0, 0x9F, 0x90, 0x93, 0x7C, 0xE0, 0x9E, 0x40, 0x94, 0xE4, 0xFE, 0xFF, 0x22, 0x7A, 0x00, 0xE4, \r
+0xFD, 0x71, 0x5A, 0x90, 0x93, 0x6F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x90, 0x93, 0x72, 0xE0, \r
+0xFF, 0x90, 0x93, 0x4C, 0xE0, 0x22, 0x90, 0x93, 0x72, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0x4C, 0xF0, \r
+0x22, 0x90, 0x93, 0x49, 0xE0, 0x24, 0x24, 0xFF, 0x90, 0x93, 0x48, 0xE0, 0x34, 0x00, 0xFE, 0x22, \r
+0x90, 0x93, 0x4B, 0xE0, 0x24, 0xDC, 0xFE, 0x90, 0x93, 0x4A, 0xE0, 0x34, 0xFF, 0x90, 0x93, 0x78, \r
+0xF0, 0xA3, 0xCE, 0xF0, 0x22, 0x90, 0x93, 0x73, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x90, 0x93, \r
+0x6F, 0xE4, 0x75, 0xF0, 0x04, 0x02, 0x08, 0xD6, 0xD1, 0x7B, 0x90, 0x94, 0x51, 0xE0, 0x64, 0x01, \r
+0xF0, 0xE0, 0x24, 0x48, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x94, 0xA3, 0x12, 0x6C, 0x21, 0x21, 0x9F, \r
+0xFF, 0x90, 0x93, 0x73, 0xE0, 0x34, 0x00, 0x22, 0x90, 0x93, 0x73, 0xD1, 0x66, 0x2F, 0xFF, 0xE4, \r
+0x3E, 0xCF, 0x24, 0x06, 0xCF, 0x12, 0x6D, 0x71, 0xBF, 0x86, 0x19, 0x90, 0x93, 0x75, 0xE0, 0xFF, \r
+0x90, 0x93, 0x74, 0xE0, 0x2F, 0x91, 0x60, 0xCF, 0x24, 0x07, 0xCF, 0x12, 0x6D, 0x71, 0xBF, 0xDD, \r
+0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xD1, 0x63, 0x12, 0x6F, 0xF3, 0x7B, 0xFF, 0x7A, 0x40, \r
+0x79, 0x6A, 0x12, 0x57, 0xF5, 0xD1, 0x9F, 0x7A, 0x40, 0x79, 0x70, 0xD1, 0x40, 0x78, 0x5F, 0x7C, \r
+0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x80, 0xD1, 0x40, 0xE4, 0x90, 0x93, 0x72, 0x12, \r
+0x6C, 0x21, 0xA3, 0xE0, 0xFD, 0x91, 0x68, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xC1, 0x28, 0x12, 0x6E, \r
+0xA4, 0xCF, 0x24, 0x0E, 0xCF, 0x12, 0x6D, 0x71, 0xEF, 0x64, 0x3A, 0x60, 0x02, 0xC1, 0x28, 0x12, \r
+0x6E, 0xA4, 0xCF, 0x24, 0x30, 0xCF, 0x12, 0x6D, 0x71, 0xEF, 0x64, 0x87, 0x60, 0x02, 0xC1, 0x28, \r
+0x90, 0x93, 0x72, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x6F, 0xF0, 0xD1, 0x2E, 0x94, 0x10, 0x50, 0x1A, \r
+0xD1, 0x6F, 0x12, 0x6E, 0xAF, 0xCD, 0x24, 0x38, 0x12, 0x6B, 0x69, 0x90, 0x93, 0x6F, 0xE0, 0x24, \r
+0x5F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xD1, 0x35, 0x80, 0xE0, 0xE4, 0x90, 0x93, 0x70, 0xF0, 0x90, \r
+0x93, 0x70, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, 0x02, 0xC1, 0x28, 0x75, 0xF0, 0x38, 0xEF, 0xD1, \r
+0x47, 0x20, 0xE0, 0x02, 0xC1, 0x28, 0xE4, 0x90, 0x93, 0x71, 0xF0, 0xD1, 0x4F, 0x90, 0x8E, 0xF9, \r
+0x12, 0x43, 0xFD, 0xE0, 0xFE, 0x90, 0x93, 0x71, 0xE0, 0xC3, 0x9E, 0x40, 0x02, 0xC1, 0x20, 0xEF, \r
+0x75, 0xF0, 0x38, 0xA4, 0x24, 0x10, 0xF9, 0x74, 0x8F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xE0, 0x75, \r
+0xF0, 0x10, 0xA4, 0x29, 0xF9, 0xEA, 0x35, 0xF0, 0xFA, 0x78, 0x5F, 0x7C, 0x93, 0xD1, 0x58, 0x60, \r
+0x02, 0xC1, 0x11, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x01, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x93, 0x6F, \r
+0xF0, 0xD1, 0x2E, 0x94, 0x06, 0x50, 0x14, 0xD1, 0x6F, 0x12, 0x6E, 0xAF, 0xCD, 0x24, 0x4A, 0x12, \r
+0x6B, 0x69, 0x90, 0x93, 0x6F, 0xD1, 0x96, 0xD1, 0x35, 0x80, 0xE6, 0xE4, 0x90, 0x93, 0x6F, 0xF0, \r
+0xD1, 0x2E, 0x94, 0x10, 0x50, 0x0C, 0x12, 0x6B, 0x55, 0x90, 0x93, 0x6F, 0xD1, 0x8D, 0xD1, 0x35, \r
+0x80, 0xEE, 0xD1, 0x4F, 0xD1, 0x47, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x19, 0xEF, 0x75, 0xF0, 0x38, \r
+0xA4, 0x24, 0x00, 0xF9, 0x74, 0x8F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x78, 0x4F, 0x7C, 0x93, 0xD1, \r
+0x58, 0x70, 0x45, 0x80, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x49, 0x90, 0x93, 0x76, 0x12, 0x44, \r
+0x12, 0x7A, 0x93, 0x79, 0x5F, 0x90, 0x93, 0x79, 0x12, 0x44, 0x12, 0x90, 0x93, 0x70, 0xE0, 0x75, \r
+0xF0, 0x38, 0xA4, 0x24, 0xFA, 0xF9, 0x74, 0x8E, 0x35, 0xF0, 0xFA, 0x90, 0x93, 0x7C, 0x12, 0x44, \r
+0x12, 0xE4, 0x90, 0x93, 0x7F, 0xF0, 0xA3, 0xF0, 0x7A, 0x93, 0x79, 0x4F, 0x12, 0x53, 0xE4, 0x80, \r
+0x07, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x05, 0xF0, 0x90, 0x93, 0x71, 0xE0, 0x04, 0xF0, 0xA1, 0x3B, \r
+0x90, 0x93, 0x70, 0xE0, 0x04, 0xF0, 0xA1, 0x1F, 0x90, 0x93, 0x72, 0xE0, 0xFF, 0x22, 0x90, 0x93, \r
+0x6F, 0xE0, 0xFF, 0xC3, 0x22, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0x6F, 0xE0, 0x04, 0xF0, 0x22, \r
+0x7E, 0x00, 0x7F, 0x10, 0x02, 0x06, 0x63, 0x90, 0x8E, 0xF8, 0x12, 0x43, 0xFD, 0xE0, 0x22, 0x90, \r
+0x93, 0x70, 0xE0, 0xFF, 0x75, 0xF0, 0x38, 0x22, 0x7D, 0x01, 0x7E, 0x00, 0x7F, 0x10, 0x12, 0x45, \r
+0xC7, 0xEF, 0x22, 0x90, 0x93, 0x46, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x22, 0x90, \r
+0x93, 0x48, 0xE0, 0xFD, 0x90, 0x93, 0x47, 0xE0, 0x2D, 0xFD, 0x22, 0x90, 0x93, 0x46, 0xEE, 0xF0, \r
+0xA3, 0xEF, 0xF0, 0x22, 0x74, 0xDA, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0x22, 0xE0, 0x24, 0x4F, \r
+0xF5, 0x82, 0xE4, 0x34, 0x93, 0x22, 0xE0, 0x24, 0x49, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0x22, 0x78, \r
+0x4F, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x22, 0xED, 0x14, 0x60, 0x06, 0x04, 0x70, 0x03, 0x7F, \r
+0x01, 0x22, 0x7F, 0x01, 0x22, 0x31, 0x95, 0xA3, 0xF0, 0x90, 0x93, 0x48, 0xE0, 0xFD, 0xC3, 0x94, \r
+0x04, 0x50, 0x29, 0x90, 0x93, 0x47, 0xE0, 0x24, 0x10, 0x12, 0x6E, 0xAE, 0xFE, 0x12, 0x6B, 0x77, \r
+0x90, 0x93, 0x48, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x6F, 0x60, \r
+0x03, 0x7F, 0x00, 0x22, 0x90, 0x93, 0x48, 0xE0, 0x04, 0xF0, 0x80, 0xCD, 0x7F, 0x01, 0x22, 0xD1, \r
+0x63, 0xE4, 0xA3, 0xF0, 0xF1, 0x2A, 0x50, 0x1A, 0x12, 0x6C, 0x22, 0xF1, 0x79, 0x24, 0xA8, 0xF5, \r
+0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xB5, 0x07, 0x1D, 0x90, 0x93, 0x49, 0xE0, 0x04, 0xF0, \r
+0x80, 0xE2, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0x30, 0xF0, 0x7F, \r
+0x01, 0x12, 0x79, 0x21, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x93, 0x49, 0xE0, 0xFD, 0xC3, \r
+0x94, 0x02, 0x22, 0xD1, 0x63, 0x90, 0x90, 0x7A, 0xE0, 0x70, 0x02, 0xA3, 0xE0, 0x60, 0x26, 0xE4, \r
+0x90, 0x93, 0x49, 0xF0, 0xF1, 0x2A, 0x50, 0x20, 0x12, 0x6C, 0x22, 0xF1, 0x79, 0x24, 0x88, 0xF5, \r
+0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x6F, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x93, 0x49, \r
+0xE0, 0x04, 0xF0, 0x80, 0xDF, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x40, 0xF0, 0xE4, \r
+0x90, 0x90, 0x86, 0xF0, 0xA3, 0xF0, 0x7F, 0x01, 0x22, 0xED, 0x24, 0x1C, 0xFD, 0x12, 0x6B, 0x77, \r
+0x90, 0x93, 0x49, 0xE0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x20, 0xE0, 0x05, \r
+0x90, 0x93, 0x16, 0x80, 0x03, 0x90, 0x93, 0x17, 0xE0, 0x90, 0x8F, 0x99, 0xF0, 0x90, 0x8F, 0x99, \r
+0xE0, 0x14, 0x60, 0x13, 0x14, 0x60, 0x14, 0x24, 0xFE, 0x60, 0x10, 0x14, 0x60, 0x09, 0x14, 0x60, \r
+0x06, 0x24, 0x06, 0xE4, 0xFE, 0x80, 0x06, 0x7E, 0x04, 0x80, 0x02, 0x7E, 0x08, 0xAF, 0x06, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0xA3, 0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
+0xE0, 0xFF, 0x74, 0x29, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFD, 0x74, 0x2C, \r
+0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x30, 0xE7, 0x04, \r
+0x7C, 0x02, 0x80, 0x02, 0xE4, 0xFC, 0xED, 0x30, 0xE6, 0x08, 0xAF, 0x03, 0xF1, 0x85, 0xAE, 0x07, \r
+0x80, 0x02, 0xE4, 0xFE, 0xEC, 0x24, 0x18, 0x2E, 0xFF, 0x22, 0x90, 0x94, 0xED, 0xED, 0xF0, 0x90, \r
+0x94, 0xEA, 0x12, 0x44, 0x12, 0xE4, 0x90, 0x94, 0xEE, 0xF0, 0xA3, 0xF0, 0x12, 0x06, 0x89, 0xFF, \r
+0x12, 0x77, 0xC3, 0xFD, 0x12, 0x7D, 0x70, 0xFB, 0x12, 0x97, 0xEA, 0x90, 0x94, 0xEE, 0xEF, 0xF0, \r
+0x90, 0x94, 0xEA, 0x12, 0x44, 0x09, 0x12, 0x7D, 0x70, 0xFF, 0x12, 0x97, 0x85, 0x90, 0x94, 0xEF, \r
+0xEF, 0xF0, 0x90, 0x8F, 0x99, 0xE0, 0x24, 0xFE, 0x60, 0x14, 0x24, 0xFE, 0x60, 0x10, 0x14, 0x60, \r
+0x07, 0x14, 0x60, 0x04, 0x24, 0x05, 0x70, 0x41, 0x11, 0x9A, 0x11, 0xA6, 0x80, 0x0D, 0x11, 0x9A, \r
+0x90, 0x8F, 0x99, 0xE0, 0x90, 0x94, 0xBF, 0xF0, 0x12, 0x7C, 0x99, 0x90, 0x94, 0xEF, 0xE0, 0xFF, \r
+0x90, 0x94, 0xEA, 0x12, 0x44, 0x09, 0x90, 0x94, 0xEE, 0xE0, 0x7C, 0x00, 0x29, 0xF9, 0xEC, 0x3A, \r
+0xFA, 0xC3, 0xE9, 0x9F, 0xF9, 0xEA, 0x94, 0x00, 0xFA, 0x75, 0x40, 0x01, 0x75, 0x41, 0x8F, 0x75, \r
+0x42, 0x90, 0xA3, 0xE0, 0xF5, 0x43, 0x12, 0x35, 0x26, 0x22, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x90, \r
+0x90, 0x94, 0xED, 0xE0, 0xFD, 0x22, 0x90, 0x94, 0xD9, 0xED, 0xF0, 0x90, 0x94, 0xD6, 0x12, 0x44, \r
+0x12, 0x12, 0x7D, 0xF8, 0x90, 0x94, 0xDD, 0xF0, 0x90, 0x94, 0xD6, 0x12, 0x56, 0x7A, 0x75, 0x43, \r
+0x03, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0xDA, 0x12, 0x35, 0x26, 0x90, 0x94, 0xD9, 0xE0, 0x70, 0x2E, \r
+0xFF, 0x11, 0xFF, 0xE0, 0xB4, 0xFF, 0x06, 0x11, 0xFF, 0xE4, 0xF0, 0x80, 0x07, 0x11, 0xFF, 0xE0, \r
+0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x03, 0xE8, 0x75, 0x40, 0x01, 0x75, 0x41, 0x94, 0x75, \r
+0x42, 0xDA, 0x75, 0x43, 0x03, 0x90, 0x94, 0xD6, 0x12, 0x44, 0x09, 0x12, 0x35, 0x26, 0x22, 0x74, \r
+0xDA, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x22, 0x31, 0x1B, 0x12, 0x57, 0x00, 0x75, \r
+0x43, 0x08, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x90, 0x02, 0x35, 0x26, 0x12, 0x57, 0xD3, 0x7E, 0x00, \r
+0x74, 0x00, 0x2F, 0x22, 0x31, 0x1B, 0x12, 0x57, 0x00, 0x75, 0x43, 0x70, 0x7B, 0x01, 0x7A, 0x8E, \r
+0x79, 0xF8, 0x02, 0x35, 0x26, 0xEF, 0x60, 0x07, 0x90, 0x93, 0x1E, 0xE0, 0xFF, 0x31, 0x24, 0x22, \r
+0x90, 0x93, 0xAD, 0x12, 0x44, 0x12, 0x90, 0x93, 0xB0, 0x12, 0x56, 0x7A, 0x75, 0x43, 0x10, 0x7B, \r
+0x01, 0x7A, 0x8F, 0x79, 0x68, 0x12, 0x35, 0x26, 0x90, 0x93, 0xAD, 0x12, 0x56, 0x7A, 0x75, 0x43, \r
+0x10, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x78, 0x12, 0x35, 0x26, 0x90, 0x93, 0xB3, 0x12, 0x43, 0xE5, \r
+0x90, 0x8F, 0x88, 0x12, 0x08, 0x6D, 0x90, 0x93, 0xB7, 0xE0, 0x90, 0x8F, 0x8F, 0xF0, 0x22, 0x90, \r
+0x8E, 0xCD, 0xE0, 0x30, 0xE0, 0x03, 0x7F, 0x01, 0x22, 0x90, 0x06, 0x90, 0xE0, 0x20, 0xE5, 0x10, \r
+0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x09, 0x90, 0x01, 0xC7, 0x74, 0x25, 0xF0, 0x7F, 0x01, 0x22, \r
+0x7F, 0x00, 0x22, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x93, 0x4A, 0xF0, 0x12, 0x06, 0x89, 0x90, 0x93, \r
+0x16, 0x12, 0x77, 0xC2, 0x90, 0x93, 0x17, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x12, 0x06, \r
+0x89, 0xFE, 0xEF, 0x2E, 0x90, 0x93, 0x26, 0xF0, 0x22, 0xEF, 0x60, 0x08, 0x90, 0x93, 0x19, 0xE0, \r
+0xFF, 0x12, 0x56, 0x98, 0x22, 0xE4, 0xFD, 0xFC, 0xEF, 0x60, 0x3C, 0x90, 0x93, 0x1C, 0x12, 0x67, \r
+0x7A, 0x51, 0x21, 0x12, 0x7F, 0x3E, 0x90, 0x93, 0x4A, 0x12, 0x56, 0x7A, 0x75, 0x43, 0x40, 0x7B, \r
+0x01, 0x7A, 0x8F, 0x79, 0x9A, 0x12, 0x35, 0x26, 0xE4, 0xFD, 0x7F, 0x03, 0x12, 0x30, 0xCE, 0x90, \r
+0x93, 0x1D, 0xE0, 0x51, 0x18, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x39, 0xD6, \r
+0x7D, 0x01, 0x7F, 0x03, 0x12, 0x30, 0xCE, 0x22, 0x75, 0xF0, 0x80, 0xA4, 0xAE, 0xF0, 0x78, 0x03, \r
+0x22, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, 0xEF, 0x60, 0x0A, 0x90, \r
+0x06, 0x31, 0xE0, 0x44, 0x80, 0xF0, 0x12, 0x5B, 0x04, 0x22, 0xEF, 0x60, 0x06, 0x12, 0x66, 0x5B, \r
+0x12, 0x57, 0x0C, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, \r
+0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x51, 0x44, 0xEF, \r
+0x64, 0x01, 0x70, 0x47, 0x90, 0x8E, 0x19, 0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3E, 0x90, 0x8E, 0x17, \r
+0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x40, 0x34, 0xEF, 0x20, 0xE2, 0x30, 0x90, 0x8E, 0x19, 0xE0, 0x20, \r
+0xE4, 0x29, 0x90, 0x8E, 0x12, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1E, 0x90, 0x8E, 0xBF, \r
+0xE0, 0x70, 0x18, 0x90, 0x06, 0x62, 0xE0, 0x20, 0xE1, 0x11, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, \r
+0x07, 0xE0, 0x54, 0xFC, 0x64, 0x80, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xEF, 0x24, \r
+0xFE, 0x60, 0x0B, 0x04, 0x70, 0x24, 0x90, 0x8E, 0x1B, 0x74, 0x02, 0xF0, 0x80, 0x13, 0xED, 0x70, \r
+0x06, 0x90, 0x8E, 0xBC, 0xE0, 0x80, 0x02, 0xED, 0x14, 0x90, 0x8E, 0x1B, 0xF0, 0x90, 0x8E, 0x1B, \r
+0xE0, 0xA3, 0xF0, 0x90, 0x8E, 0x12, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x8E, 0xC0, 0xE0, 0xC3, \r
+0x13, 0x20, 0xE0, 0x21, 0x90, 0x02, 0x87, 0xE0, 0x70, 0x24, 0x90, 0x8E, 0xC4, 0xE0, 0x30, 0xE0, \r
+0x06, 0x90, 0x02, 0x82, 0xE0, 0x70, 0x17, 0x90, 0x8E, 0xCD, 0xE0, 0x20, 0xE0, 0x10, 0x90, 0x02, \r
 0x86, 0xE0, 0x30, 0xE1, 0x09, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, \r
-0x22, 0xEF, 0x60, 0x2E, 0x12, 0x6B, 0x46, 0x70, 0x29, 0x90, 0x8E, 0x81, 0xE0, 0x54, 0xFE, 0xF0, \r
-0x7D, 0x2B, 0x7F, 0x0F, 0x12, 0x54, 0x51, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x12, 0x57, \r
-0x83, 0xBF, 0x01, 0x0E, 0x90, 0x8E, 0x80, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0x7F, 0x01, 0x12, \r
-0x53, 0xDC, 0x22, 0x7D, 0x2D, 0x12, 0x57, 0xF8, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, \r
-0x03, 0x12, 0x6D, 0xA1, 0x12, 0x4B, 0x5A, 0xE4, 0xFD, 0x7F, 0x01, 0x02, 0x53, 0xDC, 0x7D, 0x2E, \r
-0x7F, 0x6F, 0x12, 0x54, 0x51, 0x7D, 0x02, 0x7F, 0x01, 0x02, 0x53, 0xDC, 0x12, 0x57, 0xF3, 0x7D, \r
-0x04, 0x7F, 0x01, 0x02, 0x53, 0xDC, 0x7D, 0x2F, 0x7F, 0xFF, 0x12, 0x54, 0x51, 0x12, 0x4B, 0x5A, \r
-0x7D, 0x08, 0x7F, 0x01, 0x02, 0x53, 0xDC, 0x12, 0x6F, 0x13, 0x12, 0x57, 0xF3, 0x7D, 0x0C, 0x7F, \r
-0x01, 0x02, 0x53, 0xDC, 0x90, 0x93, 0xB4, 0xED, 0xF0, 0x90, 0x93, 0xB2, 0xEE, 0xF0, 0xA3, 0xEF, \r
-0xF0, 0x71, 0xB1, 0x90, 0x93, 0xB2, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x02, 0x7A, \r
-0xFB, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x78, 0xE0, 0xFD, 0xB4, 0x02, 0x07, \r
-0x91, 0x9C, 0x74, 0x08, 0xF0, 0x80, 0x09, 0xED, 0xB4, 0x04, 0x05, 0x91, 0x9C, 0x74, 0x10, 0xF0, \r
-0xEF, 0x64, 0x02, 0x4E, 0x60, 0x02, 0x81, 0x97, 0x90, 0x90, 0x44, 0xE0, 0xFF, 0x64, 0xFE, 0x70, \r
-0x02, 0x81, 0x97, 0xEF, 0x64, 0x02, 0x60, 0x07, 0xEF, 0x64, 0x03, 0x60, 0x02, 0x81, 0x97, 0x90, \r
-0x90, 0xA4, 0x91, 0xA4, 0x90, 0x94, 0x07, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, 0x20, \r
-0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xC5, 0x12, 0x08, 0xAA, 0x7E, 0x00, 0x7F, 0x20, 0x7D, \r
-0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xE5, 0x12, 0x08, 0xAA, 0x90, 0xAC, 0x7A, 0x74, 0x10, 0x12, \r
-0x59, 0xBE, 0x7B, 0x20, 0xFD, 0xFC, 0xFF, 0xFE, 0x12, 0x39, 0x9C, 0x7B, 0x01, 0x7A, 0x90, 0x79, \r
-0xA6, 0x90, 0xAC, 0x89, 0x12, 0x44, 0x12, 0x7A, 0x93, 0x79, 0xE5, 0x90, 0xAC, 0x8C, 0x12, 0x44, \r
-0x12, 0x90, 0xAC, 0x8F, 0x74, 0x20, 0xF0, 0x7A, 0x90, 0x79, 0x13, 0x12, 0x34, 0x5B, 0x75, 0x40, \r
-0x01, 0x75, 0x41, 0x93, 0x75, 0x42, 0xED, 0x75, 0x43, 0x18, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xC5, \r
-0x12, 0x35, 0x26, 0x75, 0x40, 0x01, 0x75, 0x41, 0x93, 0x75, 0x42, 0xCD, 0x75, 0x43, 0x10, 0x7B, \r
-0x01, 0x7A, 0x93, 0x79, 0xB5, 0x12, 0x35, 0x26, 0x90, 0x93, 0xCB, 0xE0, 0x54, 0x03, 0xFF, 0xC3, \r
-0x94, 0x04, 0x90, 0x90, 0x01, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x03, 0x74, 0x05, 0xF0, 0x7B, 0x01, \r
-0x7A, 0x93, 0x79, 0xB5, 0x12, 0x76, 0xDF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x94, 0x05, 0x74, \r
-0x80, 0xF0, 0xA3, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFD, 0xED, 0xFF, 0x22, 0x7F, 0x50, 0x7E, 0x0C, \r
-0x12, 0x37, 0x4E, 0x90, 0x94, 0xB5, 0xEF, 0xF0, 0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x37, 0x4E, 0x90, \r
-0x94, 0xB6, 0xEF, 0xF0, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, \r
-0xFE, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x17, 0x7F, 0x50, 0x7E, 0x0C, 0x12, 0x4F, 0x38, 0x12, \r
-0x08, 0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x17, \r
-0x12, 0x4D, 0x8E, 0x90, 0x06, 0x08, 0xE0, 0x90, 0x94, 0xCB, 0xF0, 0x90, 0x06, 0xA1, 0xE0, 0xFE, \r
-0x90, 0x06, 0xA0, 0x12, 0x61, 0x5C, 0x90, 0x94, 0xCD, 0xF0, 0xA3, 0xEF, 0xB1, 0x1F, 0xF0, 0x90, \r
-0x06, 0xA0, 0x74, 0x20, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x4D, 0xF4, 0xF0, \r
-0x90, 0x06, 0x08, 0xE0, 0x54, 0x7F, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, \r
-0xB7, 0xE0, 0xFE, 0x90, 0x94, 0xB4, 0xE0, 0xC3, 0x9E, 0x40, 0x04, 0x7F, 0x00, 0x80, 0x0E, 0xEF, \r
-0x60, 0x05, 0xD3, 0x94, 0x0E, 0x40, 0x04, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, \r
-0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xB8, 0xEF, 0xF0, 0x7D, 0x38, \r
-0x7F, 0xFF, 0x12, 0x54, 0x51, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x13, 0x90, 0x06, 0x32, 0xE0, 0x44, \r
-0x08, 0xF0, 0x90, 0x93, 0xB8, 0x12, 0x7A, 0x5E, 0x90, 0x93, 0xB9, 0x12, 0x57, 0xE7, 0x7D, 0x38, \r
-0xE4, 0xFF, 0x12, 0x54, 0x51, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xED, 0x14, 0x60, 0x06, 0x04, 0x70, \r
-0x03, 0x7F, 0x01, 0x22, 0x7F, 0x01, 0x22, 0x12, 0x97, 0xE1, 0x90, 0x90, 0xE3, 0xE0, 0x70, 0x02, \r
-0xA3, 0xE0, 0x60, 0x2D, 0xE4, 0x90, 0x93, 0xAA, 0xF0, 0x90, 0x93, 0xAA, 0xE0, 0xFD, 0xC3, 0x94, \r
-0x02, 0x50, 0x21, 0x12, 0x5D, 0xAA, 0xB1, 0xE5, 0xE0, 0x24, 0xF1, 0xF5, 0x82, 0xE4, 0x34, 0x90, \r
-0xF5, 0x83, 0xE0, 0x6F, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xAA, 0xE0, 0x04, 0xF0, 0x80, \r
-0xD8, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x40, 0xF0, 0xE4, 0x90, 0x90, 0xEF, 0xF0, \r
-0xA3, 0xF0, 0x7F, 0x01, 0x22, 0xED, 0x24, 0x1C, 0xFD, 0x12, 0x5C, 0xFE, 0x90, 0x93, 0xAA, 0x22, \r
-0x12, 0x97, 0xE1, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0xAA, 0xE0, 0xFD, 0xC3, 0x94, 0x02, 0x50, 0x1B, \r
-0x12, 0x5D, 0xAA, 0xB1, 0xE5, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, \r
-0xB5, 0x07, 0x1D, 0x90, 0x93, 0xAA, 0xE0, 0x04, 0xF0, 0x80, 0xDB, 0x90, 0x06, 0x32, 0xE0, 0x44, \r
-0x80, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0x30, 0xF0, 0x7F, 0x01, 0x12, 0x73, 0xCF, 0x7F, 0x01, 0x22, \r
-0x7F, 0x00, 0x22, 0xD1, 0x6E, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0xA9, 0xE0, 0xFD, 0xC3, 0x94, 0x04, \r
-0x50, 0x29, 0x90, 0x93, 0xA8, 0xE0, 0x24, 0x10, 0x12, 0x95, 0xE4, 0xFE, 0x12, 0x5C, 0xFE, 0x90, \r
-0x93, 0xA9, 0xE0, 0x24, 0xE9, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x6F, 0x60, 0x03, \r
-0x7F, 0x00, 0x22, 0x90, 0x93, 0xA9, 0xE0, 0x04, 0xF0, 0x80, 0xCD, 0x7F, 0x01, 0x22, 0x90, 0x93, \r
-0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xD1, 0x6E, 0x24, 0x16, 0xFF, 0xE4, 0x3E, 0x12, 0x5F, \r
-0x1D, 0x90, 0x90, 0xED, 0xA3, 0xE0, 0xB5, 0x07, 0x1B, 0x90, 0x93, 0xA8, 0xE0, 0x24, 0x16, 0x12, \r
-0x95, 0xE4, 0xFE, 0x7D, 0x01, 0x12, 0x5C, 0xFE, 0xEF, 0xFD, 0x90, 0x90, 0xED, 0xE0, 0x6D, 0x70, \r
-0x01, 0xE4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, \r
-0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x22, 0x90, 0x8E, 0x81, 0xE0, 0x13, 0x13, \r
-0x13, 0x54, 0x1F, 0x22, 0x90, 0x8F, 0x4B, 0xE0, 0xFF, 0x90, 0x8F, 0x4A, 0xE0, 0xFB, 0x90, 0x8F, \r
-0x4C, 0xE0, 0x90, 0x95, 0x59, 0xF0, 0x22, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x88, 0xE0, 0x54, 0xFD, \r
-0xF0, 0x22, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x53, 0x7E, 0x00, 0x7F, 0x04, 0x02, 0x45, \r
-0xC7, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, 0xE0, 0x7A, 0x00, 0x24, \r
-0x00, 0xFF, 0xEA, 0x3E, 0x22, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x8D, 0xF8, 0xE0, 0x34, 0x00, 0x22, \r
-0x90, 0x95, 0x0D, 0x12, 0x44, 0x12, 0xE4, 0x90, 0x95, 0x10, 0xF0, 0xA3, 0x22, 0x75, 0x40, 0x01, \r
-0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0x7B, 0x01, 0x22, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x60, \r
-0xF9, 0x74, 0x8D, 0x35, 0xF0, 0x22, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0x22, 0x90, \r
-0x93, 0xAA, 0xE0, 0xFD, 0x90, 0x93, 0xA9, 0xE0, 0x2D, 0x22, 0x74, 0x43, 0x2E, 0xF5, 0x82, 0xE4, \r
-0x34, 0x91, 0xF5, 0x83, 0x22, 0x90, 0x93, 0x73, 0x12, 0x43, 0xF1, 0xD3, 0x02, 0x43, 0xD4, 0x90, \r
-0x91, 0x3B, 0x12, 0x43, 0xE5, 0xEC, 0x4D, 0x4E, 0x4F, 0x22, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, \r
-0xAF, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x95, 0x2C, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x22, \r
-0x7D, 0x01, 0x7E, 0x00, 0x7F, 0x10, 0x12, 0x45, 0xC7, 0xEF, 0x22, 0x7F, 0x84, 0x7E, 0x08, 0x12, \r
-0x4D, 0x92, 0x90, 0x94, 0xE8, 0x22, 0x24, 0x30, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, \r
-0xEF, 0xF0, 0xA3, 0x02, 0x44, 0x12, 0x90, 0x8E, 0x8A, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x22, \r
-0x4D, 0xFF, 0x90, 0x8F, 0x2E, 0xF0, 0xEE, 0x22, 0x90, 0x8D, 0xF8, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, \r
-0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0x22, \r
-0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0xE4, 0x90, 0x95, 0x4A, 0xF0, 0x7F, 0x04, 0x22, \r
-0x7F, 0x01, 0x7E, 0x00, 0x02, 0x3D, 0xC2, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x22, 0x90, \r
-0x02, 0x86, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, \r
-0x8E, 0x81, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x90, 0x8E, 0x8A, 0xE0, 0xFF, 0xA3, 0xE0, 0x22, 0x90, \r
-0x8E, 0x81, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x8E, 0x88, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x74, \r
-0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x22, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0xC3, 0x13, 0x22, 0xE0, \r
-0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x22, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x22, 0x90, \r
-0x93, 0xB7, 0xEE, 0xF0, 0xA3, 0xEF, 0x22, 0x12, 0x49, 0x39, 0x90, 0x95, 0x84, 0xE0, 0x22, 0x2F, \r
-0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0x22, 0x00, 0x01, 0x93, \r
+0x22, 0xEF, 0x60, 0x2E, 0x12, 0x73, 0x13, 0x70, 0x29, 0x90, 0x8E, 0x12, 0xE0, 0x54, 0xFE, 0xF0, \r
+0x7D, 0x2B, 0x7F, 0x0F, 0x12, 0x53, 0xD9, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x12, 0x65, \r
+0x55, 0xBF, 0x01, 0x0E, 0x90, 0x8E, 0x11, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0x7F, 0x01, 0x12, \r
+0x4E, 0xB5, 0x22, 0x7D, 0x2D, 0x12, 0x8F, 0xCB, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, \r
+0x03, 0x12, 0x75, 0x25, 0x12, 0x4B, 0x21, 0xE4, 0xFD, 0x7F, 0x01, 0x02, 0x4E, 0xB5, 0x7D, 0x2E, \r
+0x7F, 0x6F, 0x12, 0x53, 0xD9, 0x7D, 0x02, 0x7F, 0x01, 0x02, 0x4E, 0xB5, 0x90, 0x95, 0x2E, 0xEF, \r
+0xF0, 0x12, 0x4D, 0xE7, 0x90, 0x95, 0x2E, 0xE0, 0x60, 0x03, 0x12, 0x4F, 0xE9, 0x7D, 0x04, 0x7F, \r
+0x01, 0x02, 0x4E, 0xB5, 0xE4, 0xF5, 0x58, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x58, 0x54, 0xC0, 0x70, \r
+0x08, 0x71, 0xDD, 0x54, 0xFD, 0xF0, 0x02, 0x74, 0xB2, 0xE5, 0x58, 0x30, 0xE6, 0x1F, 0x90, 0x8E, \r
+0x15, 0xE0, 0x64, 0x01, 0x70, 0x19, 0x90, 0x8E, 0x19, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0x77, 0xF5, \r
+0x64, 0x02, 0x60, 0x04, 0x71, 0xEF, 0x80, 0x07, 0x12, 0x67, 0x84, 0x80, 0x02, 0x71, 0xDD, 0xE5, \r
+0x58, 0x90, 0x8E, 0x19, 0x30, 0xE7, 0x11, 0xE0, 0x44, 0x02, 0xF0, 0x71, 0xE5, 0x12, 0x50, 0x0D, \r
+0x90, 0x8E, 0x11, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x8E, 0x19, \r
+0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xE4, 0x90, 0x94, 0xE2, 0xF0, 0x90, 0x8E, 0xBA, 0xE0, 0x22, 0x90, \r
+0x04, 0x1D, 0xE0, 0x70, 0x12, 0x90, 0x8D, 0x08, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x12, 0x64, \r
+0x38, 0x90, 0x95, 0x24, 0x12, 0x57, 0xFC, 0x22, 0xE4, 0xFD, 0xF9, 0xFC, 0x90, 0x05, 0x62, 0xE0, \r
+0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFB, 0xEB, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, \r
+0xFF, 0xEE, 0x54, 0x3F, 0x90, 0x8E, 0x4E, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, \r
+0xFF, 0x90, 0x8E, 0x4E, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3, 0x9F, 0xEA, 0x9E, 0x40, 0x21, 0xEB, \r
+0x9F, 0xFF, 0x90, 0x8E, 0x2D, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F, 0xF9, 0xC3, 0x94, 0x19, \r
+0x50, 0x0E, 0x74, 0x32, 0x29, 0x91, 0xF5, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x2B, 0xE0, 0x04, 0xF0, \r
+0x90, 0x8E, 0x2B, 0xE0, 0xC3, 0x94, 0x64, 0x50, 0x02, 0x81, 0xF1, 0xE4, 0xFC, 0xFD, 0x91, 0xF2, \r
+0xE0, 0x2C, 0xFC, 0xD3, 0x94, 0x05, 0x40, 0x07, 0x90, 0x93, 0xFA, 0xED, 0xF0, 0x80, 0x05, 0x0D, \r
+0xED, 0xB4, 0x19, 0xEA, 0xE4, 0xFC, 0xFD, 0x91, 0xF2, 0xE0, 0x2C, 0xFC, 0xD3, 0x94, 0x5F, 0x40, \r
+0x07, 0x90, 0x93, 0xFB, 0xED, 0xF0, 0x80, 0x05, 0x0D, 0xED, 0xB4, 0x19, 0xEA, 0x90, 0x93, 0xFA, \r
+0xE0, 0x90, 0x8E, 0x30, 0xF0, 0x90, 0x93, 0xFB, 0xE0, 0x90, 0x8E, 0x31, 0x91, 0xFD, 0x94, 0x0B, \r
+0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0x8E, 0x28, 0xF0, 0xE4, 0x80, 0x09, 0xE4, 0x90, 0x8E, 0x28, \r
+0x91, 0xFD, 0x74, 0x0A, 0x9F, 0x90, 0x8E, 0x27, 0xF0, 0x90, 0x8E, 0x30, 0xE0, 0xFF, 0xA3, 0xE0, \r
+0xC3, 0x9F, 0x90, 0x8E, 0x2E, 0xF0, 0xC3, 0x94, 0x08, 0x50, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x8E, \r
+0x28, 0xE0, 0xFD, 0x90, 0x8E, 0x2E, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x8E, 0xB0, 0xE4, 0xFF, 0xB1, \r
+0x05, 0x22, 0x74, 0x32, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0x22, 0xF0, 0x90, 0x8E, \r
+0x30, 0xE0, 0xFF, 0xC3, 0x22, 0xE4, 0xFE, 0x74, 0x32, 0x2E, 0x91, 0xF5, 0xE4, 0xF0, 0x0E, 0xEE, \r
+0xB4, 0x19, 0xF4, 0xE4, 0x90, 0x8E, 0x2B, 0xF0, 0x90, 0x8E, 0x2F, 0xF0, 0x90, 0x8E, 0x27, 0xF0, \r
+0xEF, 0xB4, 0x01, 0x09, 0x90, 0x8E, 0x30, 0x74, 0x19, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0x7D, 0x2F, \r
+0x12, 0x4B, 0x1C, 0x7D, 0x08, 0x7F, 0x01, 0x02, 0x4E, 0xB5, 0x90, 0x93, 0x53, 0xED, 0xF0, 0x90, \r
+0x93, 0x51, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xB1, 0x57, 0x90, 0x93, 0x51, 0xE0, 0xFE, 0xA3, 0xE0, \r
+0xFF, 0xA3, 0xE0, 0xFD, 0x02, 0x58, 0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, \r
+0x17, 0xE0, 0xFD, 0xB4, 0x02, 0x07, 0xD1, 0x36, 0x74, 0x08, 0xF0, 0x80, 0x09, 0xED, 0xB4, 0x04, \r
+0x05, 0xD1, 0x36, 0x74, 0x10, 0xF0, 0xEF, 0x64, 0x02, 0x4E, 0x60, 0x02, 0xC1, 0x31, 0x90, 0x8F, \r
+0xDB, 0xE0, 0xFF, 0x64, 0xFE, 0x70, 0x02, 0xC1, 0x31, 0xEF, 0x64, 0x02, 0x60, 0x07, 0xEF, 0x64, \r
+0x03, 0x60, 0x02, 0xC1, 0x31, 0x90, 0x90, 0x3B, 0xD1, 0x47, 0x90, 0x93, 0xA6, 0xEE, 0xF0, 0xA3, \r
+0xEF, 0xF0, 0xD1, 0x3E, 0x7A, 0x93, 0x79, 0x64, 0x12, 0x08, 0xAA, 0xD1, 0x3E, 0x7A, 0x93, 0x79, \r
+0x84, 0x12, 0x08, 0xAA, 0x90, 0xAC, 0x7A, 0x74, 0x10, 0x12, 0x67, 0xE6, 0x7B, 0x20, 0xFD, 0xFC, \r
+0xFF, 0xFE, 0x12, 0x39, 0x9C, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x3D, 0x90, 0xAC, 0x89, 0x12, 0x44, \r
+0x12, 0x7A, 0x93, 0x79, 0x84, 0x90, 0xAC, 0x8C, 0x12, 0x44, 0x12, 0x90, 0xAC, 0x8F, 0x74, 0x20, \r
+0xF0, 0x7A, 0x8F, 0x79, 0xAA, 0x12, 0x34, 0x5B, 0x75, 0x40, 0x01, 0x75, 0x41, 0x93, 0x75, 0x42, \r
+0x8C, 0x75, 0x43, 0x18, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x64, 0x12, 0x35, 0x26, 0x75, 0x40, 0x01, \r
+0x75, 0x41, 0x93, 0x75, 0x42, 0x6C, 0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x54, 0x12, \r
+0x35, 0x26, 0x90, 0x93, 0x6A, 0xE0, 0x54, 0x03, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x8F, 0x98, 0x50, \r
+0x04, 0xEF, 0xF0, 0x80, 0x03, 0x74, 0x05, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x54, 0x12, 0x7E, \r
+0x67, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0xA4, 0x74, 0x80, 0xF0, 0xA3, 0x22, 0x7E, 0x00, \r
+0x7F, 0x20, 0x7D, 0x00, 0x7B, 0x01, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFD, 0xED, 0xFF, 0x22, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x7F, 0x59, 0x90, 0x8D, \r
+0xFB, 0x12, 0x7A, 0xF3, 0x54, 0x04, 0xFC, 0xEF, 0x54, 0xFB, 0x4C, 0xFF, 0x90, 0x8D, 0xFB, 0xD1, \r
+0xF1, 0x12, 0x77, 0xC2, 0xFF, 0xED, 0x2F, 0x90, 0x8D, 0xFC, 0x12, 0x7D, 0xB3, 0xFF, 0xAE, 0x05, \r
+0xED, 0x2F, 0x90, 0x8D, 0xFD, 0xF0, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x20, 0xE0, 0x08, 0x13, 0x13, \r
+0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0A, 0x90, 0x06, 0x31, 0xE0, 0x44, 0x40, 0xF0, 0x12, 0x66, 0xEF, \r
+0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x30, 0xE0, 0x33, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x01, 0xF0, 0x90, \r
+0x06, 0x09, 0xE0, 0x54, 0xFE, 0xD1, 0xE8, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0xD1, \r
+0xE0, 0x90, 0x94, 0x6E, 0x74, 0x01, 0xF0, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x75, 0x25, 0x90, 0x94, \r
+0xE5, 0x12, 0x08, 0x79, 0x00, 0x00, 0x27, 0x10, 0x12, 0x50, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xF0, 0x90, 0x06, 0x08, 0xE0, 0x54, 0x7F, 0xF0, \r
+0x22, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0x22, 0x7F, 0x50, 0x7E, 0x0C, 0x12, \r
+0x37, 0x4E, 0x90, 0x94, 0x54, 0xEF, 0xF0, 0x7F, 0x58, 0x7E, 0x0C, 0x12, 0x37, 0x4E, 0x90, 0x94, \r
+0x55, 0xEF, 0xF0, 0x90, 0x94, 0x99, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, 0x9D, \r
+0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x17, 0x7F, 0x50, 0x7E, 0x0C, 0x12, 0x5F, 0x34, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, 0x9D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x17, 0x12, \r
+0x5E, 0xCA, 0x90, 0x06, 0x08, 0xE0, 0x90, 0x94, 0x6A, 0xF0, 0x90, 0x06, 0xA1, 0xE0, 0xFE, 0x90, \r
+0x06, 0xA0, 0x12, 0x84, 0xA3, 0x90, 0x94, 0x6C, 0xF0, 0xA3, 0xEF, 0xD1, 0xE8, 0x90, 0x06, 0xA0, \r
+0x74, 0x20, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x5D, 0x92, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x58, 0xEF, 0xF0, 0x12, 0x57, 0xCE, 0x74, 0x10, 0x2F, 0xFF, \r
+0x90, 0x93, 0x58, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x2F, 0xFF, 0x12, 0x56, 0xFE, 0x75, 0x43, 0x04, \r
+0x7B, 0x01, 0x7A, 0x94, 0x79, 0x66, 0x12, 0x35, 0x26, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x56, 0xE0, 0xFE, 0x90, 0x94, 0x53, 0xE0, 0xC3, 0x9E, \r
+0x40, 0x04, 0x7F, 0x00, 0x80, 0x0E, 0xEF, 0x60, 0x05, 0xD3, 0x94, 0x0E, 0x40, 0x04, 0x7F, 0x00, \r
+0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8E, 0xC4, 0xF1, 0xD5, 0x30, 0xE0, \r
+0x03, 0x12, 0x4E, 0x87, 0x22, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0x90, 0x93, 0x70, \r
+0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x93, 0x70, 0xE4, 0x75, 0xF0, 0x08, 0x02, 0x08, \r
+0xD6, 0xA3, 0xE0, 0x24, 0x28, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, 0x24, 0x48, 0xF9, \r
+0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x22, 0x90, 0x93, 0x6D, 0xE0, 0xFF, 0x24, 0xE3, 0xF5, 0x82, \r
+0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0x22, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8E, 0x79, 0xEA, 0x7E, \r
+0x00, 0x7F, 0x04, 0x02, 0x45, 0xC7, 0x90, 0x8E, 0x4B, 0xE0, 0x24, 0x04, 0x90, 0x8E, 0x2D, 0xF0, \r
+0xA3, 0x74, 0x08, 0xF0, 0x22, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x22, 0x90, 0x93, \r
+0x6B, 0xEF, 0xF0, 0x90, 0x93, 0x1B, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x22, 0xF5, 0x83, 0xEF, 0xF0, \r
+0x90, 0x93, 0x4E, 0xE0, 0x04, 0xF0, 0x22, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x8D, 0xF8, 0xE0, 0x34, \r
+0x00, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x22, \r
+0x90, 0x8E, 0x11, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, 0x90, 0x94, 0xAC, 0x12, 0x44, 0x12, \r
+0xE4, 0x90, 0x94, 0xAF, 0xF0, 0xA3, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, \r
+0x80, 0xF0, 0x22, 0x90, 0x8E, 0xB9, 0xE0, 0xFF, 0x90, 0x8E, 0x1E, 0xE0, 0xD3, 0x9F, 0x22, 0xFF, \r
+0xEE, 0x54, 0x3F, 0x90, 0x8E, 0x50, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x90, 0x93, 0x49, 0xE0, 0xFD, \r
+0x90, 0x93, 0x48, 0xE0, 0x2D, 0x22, 0x90, 0x93, 0x70, 0xE4, 0x75, 0xF0, 0x02, 0x02, 0x08, 0xD6, \r
+0xF0, 0x90, 0x8E, 0x21, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x24, 0x30, 0xF9, 0xE4, 0x34, \r
+0xFC, 0xFA, 0x7B, 0x01, 0x22, 0x75, 0x41, 0x8F, 0x75, 0x42, 0xE1, 0x75, 0x43, 0x02, 0x22, 0xF0, \r
+0xEE, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x22, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, \r
+0xDF, 0x4E, 0x22, 0x90, 0x93, 0xF8, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x90, 0x93, 0x6D, 0xE0, \r
+0xFF, 0xC3, 0x94, 0x10, 0x22, 0x90, 0x93, 0x4C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x90, 0x01, \r
+0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0x22, \r
+0x90, 0x94, 0xF8, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x22, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, \r
+0x22, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0x7F, 0x01, 0x7E, 0x00, 0x02, 0x3D, 0xC2, \r
+0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x22, 0x90, 0x02, 0x86, 0xE0, 0x54, 0xFB, 0xF0, 0x22, \r
+0x90, 0x93, 0xF7, 0xE0, 0xC3, 0x94, 0x0A, 0x22, 0xF0, 0xE4, 0x90, 0x93, 0x7B, 0xF0, 0xA3, 0x22, \r
+0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, 0x03, 0x22, 0x90, 0x8E, 0x1B, 0xE0, 0x90, 0x05, 0x73, 0x22, \r
+0x90, 0x8E, 0x12, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x8E, 0x19, 0xE0, 0x44, 0x10, 0xF0, 0x22, \r
+0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x22, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0xC3, 0x13, 0x22, \r
+0x12, 0x08, 0xD6, 0x90, 0x8D, 0xF8, 0xE0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x22, \r
+0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0x22, 0x54, 0xDC\r
 };\r
-u4Byte ArrayLength_MP_8723B_FW_WoWLAN = 24698;\r
+u4Byte ArrayLength_MP_8723B_FW_WoWLAN = 25034;\r
 \r
 \r
 void\r
index 98068e6b201bade48585e407cfd3f8394e87fad5..74c100e9f9317fcd7a80dcebddff1a2824426c6e 100755 (executable)
@@ -18,8 +18,8 @@
 * \r
 ******************************************************************************/\r
 \r
-\r
-#include "../odm_precomp.h"\r
+#include "Mp_Precomp.h"\r
+#include "../phydm_precomp.h"\r
 \r
 #if (RTL8723B_SUPPORT == 1)\r
 static BOOLEAN\r
@@ -224,72 +224,69 @@ ODM_ReadAndConfig_MP_8723B_MAC_REG(
        )\r
 {\r
     u4Byte     i         = 0;\r
+    u1Byte     cCond;\r
+    BOOLEAN bMatched = TRUE, bSkipped = FALSE;\r
+//ask by Luke.Lee\r
     u4Byte     ArrayLen    = sizeof(Array_MP_8723B_MAC_REG)/sizeof(u4Byte);\r
     pu4Byte    Array       = Array_MP_8723B_MAC_REG;\r
        \r
     ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_MAC_REG\n"));\r
 \r
-    for (i = 0; i < ArrayLen; i += 2 )\r
-    {\r
-        u4Byte v1 = Array[i];\r
-        u4Byte v2 = Array[i+1];\r
-    \r
-        // This (offset, data) pair doesn't care the condition.\r
-        if ( v1 < 0x40000000 )\r
-        {\r
-           odm_ConfigMAC_8723B(pDM_Odm, v1, (u1Byte)v2);\r
-           continue;\r
-        }\r
-        else\r
-        {   // This line is the beginning of branch.\r
-            BOOLEAN bMatched = TRUE;\r
-            u1Byte  cCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
-\r
-            if (cCond == COND_ELSE) { // ELSE, ENDIF\r
-                bMatched = TRUE;\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-            } else if ( ! CheckPositive(pDM_Odm, v1, v2) ) { \r
-                bMatched = FALSE;\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-            } else {\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-                if ( ! CheckNegative(pDM_Odm, v1, v2) )\r
-                    bMatched = FALSE;\r
-                else\r
-                    bMatched = TRUE;\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-            }\r
+       while(( i+1) < ArrayLen)\r
+       {\r
+               u4Byte v1 = Array[i];\r
+               u4Byte v2 = Array[i+1];\r
 \r
-            if ( bMatched == FALSE )\r
-            {   // Condition isn't matched. Discard the following (offset, data) pairs.\r
-                while (v1 < 0x40000000 && i < ArrayLen -2)\r
-                    READ_NEXT_PAIR(v1, v2, i);\r
-\r
-                i -= 2; // prevent from for-loop += 2\r
-            }\r
-            else // Configure matched pairs and skip to end of if-else.\r
-            {\r
-                while (v1 < 0x40000000 && i < ArrayLen-2) {\r
-                    odm_ConfigMAC_8723B(pDM_Odm, v1, (u1Byte)v2);\r
-                    READ_NEXT_PAIR(v1, v2, i);\r
-                }\r
-\r
-                // Keeps reading until ENDIF.\r
-                cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
-                while (cCond != COND_ENDIF && i < ArrayLen-2) {\r
-                    READ_NEXT_PAIR(v1, v2, i);\r
-                    cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
-                }\r
-            }\r
-        } \r
-    }\r
+               if(v1 & (BIT31|BIT30)) //positive & negative condition\r
+               {\r
+                       if(v1 & BIT31) // positive condition\r
+                       {\r
+                               cCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
+                               if(cCond == COND_ENDIF) //end\r
+                               {\r
+                                       bMatched = TRUE;\r
+                                       bSkipped = FALSE;\r
+                               }\r
+                               else if(cCond == COND_ELSE) //else\r
+                               {\r
+                                       bMatched = bSkipped?FALSE:TRUE;\r
+                               }\r
+                               else //if , else if\r
+                               {\r
+                                       if(bSkipped)\r
+                                               bMatched = FALSE;\r
+                                       else\r
+                                       {\r
+                                               if(CheckPositive(pDM_Odm, v1, v2))\r
+                                               {\r
+                                                       bMatched = TRUE;\r
+                                                       bSkipped = TRUE;\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       bMatched = FALSE;\r
+                                                       bSkipped = FALSE;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+                       else if(v1 & BIT30){ //negative condition\r
+                       //do nothing\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(bMatched)\r
+                       odm_ConfigMAC_8723B(pDM_Odm, v1, (u1Byte)v2);\r
+               }\r
+       i = i + 2;\r
+       }\r
 }\r
 \r
 u4Byte\r
 ODM_GetVersion_MP_8723B_MAC_REG(void)\r
 {\r
-          return 11;\r
+          return 12;\r
 }\r
 \r
 #endif // end of HWIMG_SUPPORT\r
index 494cc887f7c30e7c29a6a2822c99ab5f07b0112b..24f19fc835ad2b1184896e7631a2462d9e7cf276 100755 (executable)
@@ -18,7 +18,7 @@
 *\r
 ******************************************************************************/\r
 \r
-#include "../odm_precomp.h"\r
+#include "../phydm_precomp.h"\r
 \r
 #if (RTL8723B_SUPPORT==1)\r
 \r
index a7d6e5156d7080936272604dfaaf104b19b4491f..e4480ccf56be310318c839b38df53222a55eaf27 100755 (executable)
@@ -18,8 +18,8 @@
 * \r
 ******************************************************************************/\r
 \r
-\r
-#include "../odm_precomp.h"\r
+#include "Mp_Precomp.h"\r
+#include "../phydm_precomp.h"\r
 \r
 #if (RTL8723B_SUPPORT == 1)\r
 static BOOLEAN\r
@@ -245,72 +245,69 @@ ODM_ReadAndConfig_MP_8723B_RadioA(
        )\r
 {\r
     u4Byte     i         = 0;\r
+    u1Byte     cCond;\r
+    BOOLEAN bMatched = TRUE, bSkipped = FALSE;\r
+//ask by Luke.Lee\r
     u4Byte     ArrayLen    = sizeof(Array_MP_8723B_RadioA)/sizeof(u4Byte);\r
     pu4Byte    Array       = Array_MP_8723B_RadioA;\r
        \r
     ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_RadioA\n"));\r
 \r
-    for (i = 0; i < ArrayLen; i += 2 )\r
-    {\r
-        u4Byte v1 = Array[i];\r
-        u4Byte v2 = Array[i+1];\r
-    \r
-        // This (offset, data) pair doesn't care the condition.\r
-        if ( v1 < 0x40000000 )\r
-        {\r
-           odm_ConfigRF_RadioA_8723B(pDM_Odm, v1, v2);\r
-           continue;\r
-        }\r
-        else\r
-        {   // This line is the beginning of branch.\r
-            BOOLEAN bMatched = TRUE;\r
-            u1Byte  cCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
-\r
-            if (cCond == COND_ELSE) { // ELSE, ENDIF\r
-                bMatched = TRUE;\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-            } else if ( ! CheckPositive(pDM_Odm, v1, v2) ) { \r
-                bMatched = FALSE;\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-            } else {\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-                if ( ! CheckNegative(pDM_Odm, v1, v2) )\r
-                    bMatched = FALSE;\r
-                else\r
-                    bMatched = TRUE;\r
-                READ_NEXT_PAIR(v1, v2, i);\r
-            }\r
-\r
-            if ( bMatched == FALSE )\r
-            {   // Condition isn't matched. Discard the following (offset, data) pairs.\r
-                while (v1 < 0x40000000 && i < ArrayLen -2)\r
-                    READ_NEXT_PAIR(v1, v2, i);\r
-\r
-                i -= 2; // prevent from for-loop += 2\r
-            }\r
-            else // Configure matched pairs and skip to end of if-else.\r
-            {\r
-                while (v1 < 0x40000000 && i < ArrayLen-2) {\r
-                    odm_ConfigRF_RadioA_8723B(pDM_Odm, v1, v2);\r
-                    READ_NEXT_PAIR(v1, v2, i);\r
-                }\r
-\r
-                // Keeps reading until ENDIF.\r
-                cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
-                while (cCond != COND_ENDIF && i < ArrayLen-2) {\r
-                    READ_NEXT_PAIR(v1, v2, i);\r
-                    cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
-                }\r
-            }\r
-        } \r
-    }\r
+       while(( i+1) < ArrayLen)\r
+       {\r
+               u4Byte v1 = Array[i];\r
+               u4Byte v2 = Array[i+1];\r
+\r
+               if(v1 & (BIT31|BIT30)) //positive & negative condition\r
+               {\r
+                       if(v1 & BIT31) // positive condition\r
+                       {\r
+                               cCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
+                               if(cCond == COND_ENDIF) //end\r
+                               {\r
+                                       bMatched = TRUE;\r
+                                       bSkipped = FALSE;\r
+                               }\r
+                               else if(cCond == COND_ELSE) //else\r
+                               {\r
+                                       bMatched = bSkipped?FALSE:TRUE;\r
+                               }\r
+                               else //if , else if\r
+                               {\r
+                                       if(bSkipped)\r
+                                               bMatched = FALSE;\r
+                                       else\r
+                                       {\r
+                                               if(CheckPositive(pDM_Odm, v1, v2))\r
+                                               {\r
+                                                       bMatched = TRUE;\r
+                                                       bSkipped = TRUE;\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       bMatched = FALSE;\r
+                                                       bSkipped = FALSE;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+                       else if(v1 & BIT30){ //negative condition\r
+                       //do nothing\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(bMatched)\r
+                       odm_ConfigRF_RadioA_8723B(pDM_Odm, v1, v2);\r
+               }\r
+       i = i + 2;\r
+       }\r
 }\r
 \r
 u4Byte\r
 ODM_GetVersion_MP_8723B_RadioA(void)\r
 {\r
-          return 11;\r
+          return 12;\r
 }\r
 \r
 /******************************************************************************\r
index 4788c31091527190288efc924814ba3c8542b9ed..0cbf190188cdf946a6e2bd2aa283d83cd4a25242 100755 (executable)
@@ -18,7 +18,8 @@
  *\r
  ******************************************************************************/\r
 \r
-#include "../odm_precomp.h"\r
+#include "Mp_Precomp.h"\r
+#include "../phydm_precomp.h"\r
 \r
 \r
 \r
@@ -65,8 +66,6 @@ void setIqkMatrix_8723B(
 \r
        if (OFDM_index >= OFDM_TABLE_SIZE)\r
                OFDM_index = OFDM_TABLE_SIZE-1;\r
-       else if (OFDM_index < 0)\r
-               OFDM_index = 0;\r
 \r
        ele_D = (OFDMSwingTable_New[OFDM_index] & 0xFFC00000)>>22;              \r
        \r
@@ -251,8 +250,7 @@ ODM_TxPwrTrackSetPwr_8723B(
        u1Byte          Final_CCK_Swing_Index = 0; \r
        u1Byte          i = 0;\r
 \r
-#if (MP_DRIVER==1)\r
-       if ( *(pDM_Odm->mp_mode) == 1)\r
+       if (pDM_Odm->mp_mode == TRUE)\r
        {\r
 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE ))\r
        #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))\r
@@ -264,7 +262,6 @@ ODM_TxPwrTrackSetPwr_8723B(
 #endif\r
        }\r
        else\r
-#endif\r
        {\r
                u2Byte  rate     = *(pDM_Odm->pForcedDataRate);\r
        \r
@@ -320,8 +317,8 @@ ODM_TxPwrTrackSetPwr_8723B(
                pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = pDM_Odm->Absolute_OFDMSwingIdx[RFPath];\r
 \r
 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE ))\r
-       #if (MP_DRIVER == 1)\r
-               if ( *(pDM_Odm->mp_mode) == 1) {\r
+               if (pDM_Odm->mp_mode == TRUE)\r
+               {\r
                        pwr = PHY_QueryBBReg(Adapter, rTxAGC_A_Rate18_06, 0xFF);\r
                        pwr += pDM_Odm->RFCalibrateInfo.PowerIndexOffset[RFPath];\r
                        PHY_SetBBReg(Adapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, pwr);\r
@@ -341,7 +338,6 @@ ODM_TxPwrTrackSetPwr_8723B(
                        ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("ODM_TxPwrTrackSetPwr8723B: OFDM Tx-rf(A) Power = 0x%x\n", TxAGC));\r
                }\r
                else            \r
-       #endif\r
                {\r
                        pDM_Odm->Modify_TxAGC_Flag_PathA = TRUE;\r
                        pDM_Odm->Modify_TxAGC_Flag_PathA_CCK = TRUE;\r
@@ -661,21 +657,12 @@ phy_PathA_IQK_8723B(
        ODM_GetBBReg(pDM_Odm, 0xe90, bMaskDWord), ODM_GetBBReg(pDM_Odm, 0xe98, bMaskDWord)));\r
 \r
 \r
-       //Allen 20131125\r
-       tmp=(regE9C & 0x03FF0000)>>16;\r
-    if ((tmp & 0x200)> 0)\r
-               tmp = 0x400 - tmp;\r
-               \r
        if(!(regEAC & BIT28) &&         \r
                (((regE94 & 0x03FF0000)>>16) != 0x142) &&\r
-               (((regE9C & 0x03FF0000)>>16) != 0x42) &&\r
-               (((regE94 & 0x03FF0000)>>16) <0x110) &&\r
-               (((regE94 & 0x03FF0000)>>16) >0xf0) &&\r
-               (tmp <0xf))\r
-               \r
+               (((regE9C & 0x03FF0000)>>16) != 0x42))\r
                result |= 0x01;\r
-       else                                                    //if Tx not OK, ignore Rx\r
-               return result;  \r
+\r
+       return result;\r
 \r
 #if 0\r
        if(!(regEAC & BIT27) &&         //if Tx is OK, check whether Rx is OK\r
@@ -685,10 +672,6 @@ phy_PathA_IQK_8723B(
        else\r
                RT_DISP(FINIT, INIT_IQK, ("Path A Rx IQK fail!!\n"));\r
 #endif \r
-\r
-       return result;\r
-\r
-\r
        }\r
 \r
 u1Byte                 //bit0 = 1 => Tx OK, bit1 = 1 => Rx OK\r
@@ -795,17 +778,9 @@ phy_PathA_RxIQK8723B(
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xe90(before IQK)= 0x%x, 0xe98(afer IQK) = 0x%x\n", \r
                ODM_GetBBReg(pDM_Odm, 0xe90, bMaskDWord), ODM_GetBBReg(pDM_Odm, 0xe98, bMaskDWord)));\r
 \r
-       //Allen 20131125\r
-               tmp=(regE9C & 0x03FF0000)>>16;\r
-               if ((tmp & 0x200)> 0)\r
-                       tmp = 0x400 - tmp;\r
-                       \r
                if(!(regEAC & BIT28) &&         \r
                (((regE94 & 0x03FF0000)>>16) != 0x142) &&\r
-               (((regE9C & 0x03FF0000)>>16) != 0x42) &&\r
-                       (((regE94 & 0x03FF0000)>>16) <0x110) &&\r
-                       (((regE94 & 0x03FF0000)>>16) >0xf0) &&\r
-                       (tmp <0xf))\r
+               (((regE9C & 0x03FF0000)>>16) != 0x42))\r
 \r
                        result |= 0x01;\r
                else                                                    //if Tx not OK, ignore Rx\r
@@ -900,16 +875,7 @@ phy_PathA_RxIQK8723B(
        ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      \r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xdf, bRFRegOffsetMask, 0x780 );\r
 \r
-#if 0  \r
-       if(!(regEAC & BIT28) &&         \r
-               (((regE94 & 0x03FF0000)>>16) != 0x142) &&\r
-               (((regE9C & 0x03FF0000)>>16) != 0x42) )\r
-               result |= 0x01;\r
-       else                                                    //if Tx not OK, ignore Rx\r
-               return result;\r
-#endif \r
-\r
-       //Allen 20131125\r
+       /* Allen 20141201 */\r
                tmp=(regEAC & 0x03FF0000)>>16;\r
                if ((tmp & 0x200)> 0)\r
                        tmp = 0x400 - tmp;\r
@@ -917,9 +883,9 @@ phy_PathA_RxIQK8723B(
        if(!(regEAC & BIT27) &&         //if Tx is OK, check whether Rx is OK\r
                (((regEA4 & 0x03FF0000)>>16) != 0x132) &&\r
                (((regEAC & 0x03FF0000)>>16) != 0x36)&&         \r
-                       (((regEA4 & 0x03FF0000)>>16) < 0x110) &&\r
-                       (((regEA4 & 0x03FF0000)>>16) > 0xf0) &&\r
-                       (tmp <0xf))\r
+                       (((regEA4 & 0x03FF0000)>>16) < 0x11a) &&\r
+                       (((regEA4 & 0x03FF0000)>>16) > 0xe6) &&\r
+                       (tmp < 0x1a))\r
                result |= 0x02;\r
        else                                                    //if Tx not OK, ignore Rx\r
                ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("Path A Rx IQK fail!!\n"));\r
@@ -1031,20 +997,12 @@ phy_PathB_IQK_8723B(
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xe90(before IQK)= 0x%x, 0xe98(afer IQK) = 0x%x\n", \r
                ODM_GetBBReg(pDM_Odm, 0xe90, bMaskDWord), ODM_GetBBReg(pDM_Odm, 0xe98, bMaskDWord)));\r
 \r
-       //Allen 20131125\r
-       tmp=(regE9C & 0x03FF0000)>>16;\r
-    if ((tmp & 0x200)> 0)\r
-               tmp = 0x400 - tmp;\r
-               \r
        if(!(regEAC & BIT28) &&         \r
                (((regE94 & 0x03FF0000)>>16) != 0x142) &&\r
-               (((regE9C & 0x03FF0000)>>16) != 0x42)&&         \r
-               (((regE94 & 0x03FF0000)>>16) <0x110) &&\r
-               (((regE94 & 0x03FF0000)>>16) >0xf0) &&\r
-               (tmp <0xf))\r
+               (((regE9C & 0x03FF0000)>>16) != 0x42))\r
                result |= 0x01;\r
-       else\r
-               return result;  \r
+\r
+       return result;\r
 \r
 #if 0\r
        if(!(regEAC & BIT30) &&\r
@@ -1055,7 +1013,6 @@ phy_PathB_IQK_8723B(
                ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("Path B Rx IQK fail!!\n"));\r
        \r
 #endif\r
-       return result;\r
 }\r
 \r
 \r
@@ -1164,19 +1121,10 @@ phy_PathB_RxIQK8723B(
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xe90(before IQK)= 0x%x, 0xe98(afer IQK) = 0x%x\n", \r
                ODM_GetBBReg(pDM_Odm, 0xe90, bMaskDWord), ODM_GetBBReg(pDM_Odm, 0xe98, bMaskDWord)));\r
 \r
-       //Allen 20131125\r
-               tmp=(regE9C & 0x03FF0000)>>16;\r
-//             ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("tmp1 = 0x%x\n", tmp));\r
-               if ((tmp & 0x200)> 0)\r
-                       tmp = 0x400 - tmp;\r
-//             ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("tmp2 = 0x%x\n", tmp));\r
 \r
                if(!(regEAC & BIT28) &&         \r
                (((regE94 & 0x03FF0000)>>16) != 0x142) &&\r
-               (((regE9C & 0x03FF0000)>>16) != 0x42)  &&       \r
-                       (((regE94 & 0x03FF0000)>>16) <0x110) &&\r
-                       (((regE94 & 0x03FF0000)>>16) >0xf0) &&\r
-                       (tmp <0xf))\r
+               (((regE9C & 0x03FF0000)>>16) != 0x42))\r
                        result |= 0x01;\r
                else                                                    //if Tx not OK, ignore Rx\r
                        return result;  \r
@@ -1284,7 +1232,7 @@ phy_PathB_RxIQK8723B(
 #endif \r
 \r
 \r
-       //Allen 20131125\r
+       /* Allen 20141201 */\r
                tmp=(regEAC & 0x03FF0000)>>16;\r
                if ((tmp & 0x200)> 0)\r
                        tmp = 0x400 - tmp;\r
@@ -1292,9 +1240,9 @@ phy_PathB_RxIQK8723B(
        if(!(regEAC & BIT27) &&         //if Tx is OK, check whether Rx is OK\r
                (((regEA4 & 0x03FF0000)>>16) != 0x132) &&\r
                (((regEAC & 0x03FF0000)>>16) != 0x36) &&        \r
-                       (((regEA4 & 0x03FF0000)>>16) <0x110) &&\r
-                       (((regEA4 & 0x03FF0000)>>16) >0xf0) &&\r
-                       (tmp <0xf))\r
+                       (((regEA4 & 0x03FF0000)>>16) < 0x11a) &&\r
+                       (((regEA4 & 0x03FF0000)>>16) > 0xe6) &&\r
+                       (tmp < 0x1a))\r
                        \r
                result |= 0x02;\r
        else\r
@@ -3026,13 +2974,13 @@ PHY_IQCalibrate_8723B(
                //#define PATH_S0       1 // RF_PATH_B\r
                //#define PATH_S1       0 // RF_PATH_A\r
 \r
-               path = (ODM_GetBBReg(pDM_Odm,rS0S1_PathSwitch,bMaskByte0)==0x00) ? ODM_RF_PATH_A : ODM_RF_PATH_B;\r
+               path = (RF_Path==0 ? ODM_RF_PATH_A : ODM_RF_PATH_B);\r
 \r
                // Restore TX IQK\r
                for (i = 0; i < 3; ++i) {\r
                        offset = pRFCalibrateInfo->TxIQC_8723B[path][i][0];\r
                        data = pRFCalibrateInfo->TxIQC_8723B[path][i][1];\r
-                       if ((offset==0) || (data==0)) {\r
+                       if ((offset==0) || (i==1 && data==0)) { // 0xc80, 0xc88 ==> index=1\r
                                DBG_871X("%s =>path:%s Restore TX IQK result failed \n",__FUNCTION__,(path==ODM_RF_PATH_A)?"A":"B");\r
                                bResult = FAIL;\r
                                break;\r
@@ -3045,7 +2993,7 @@ PHY_IQCalibrate_8723B(
                for (i = 0; i < 2; ++i) {\r
                        offset = pRFCalibrateInfo->RxIQC_8723B[path][i][0];\r
                        data = pRFCalibrateInfo->RxIQC_8723B[path][i][1];\r
-                       if ((offset==0) || (data==0)) {\r
+                       if ((offset==0) || (i==0 && data==0)) {         // 0xc14, 0xc1c ==> index=0\r
                                DBG_871X("%s =>path:%s  Restore RX IQK result failed \n",__FUNCTION__,(path==ODM_RF_PATH_A)?"A":"B");\r
                                bResult = FAIL;\r
                                break;\r
@@ -3063,7 +3011,7 @@ PHY_IQCalibrate_8723B(
                }\r
 \r
                if (bResult == SUCCESS)\r
-                       return;\r
+                       goto out;\r
        }\r
 \r
 #if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP))\r
@@ -3078,8 +3026,9 @@ PHY_IQCalibrate_8723B(
 #else\r
                _PHY_ReloadADDARegisters8723B(pDM_Odm, IQK_BB_REG_92C, pDM_Odm->RFCalibrateInfo.IQK_BB_backup_recover, 9);\r
 #endif\r
-               return;         \r
+               goto out;\r
        }\r
+\r
        StartTime = ODM_GetCurrentTime( pDM_Odm);\r
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("IQK:Start!!!\n"));\r
 \r
@@ -3206,7 +3155,7 @@ PHY_IQCalibrate_8723B(
        }\r
 \r
 #if MP_DRIVER == 1\r
-       if ((pMptCtx->MptRfPath == ODM_RF_PATH_A) || ( *(pDM_Odm->mp_mode) == 0))\r
+       if ((pMptCtx->MptRfPath == ODM_RF_PATH_A) || (pDM_Odm->mp_mode == FALSE))\r
 #endif\r
        {\r
                if (RegE94 != 0)\r
@@ -3221,7 +3170,7 @@ PHY_IQCalibrate_8723B(
        \r
 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
 #if MP_DRIVER == 1\r
-       if ((pMptCtx->MptRfPath == ODM_RF_PATH_A) || ( *(pDM_Odm->mp_mode) == 0))\r
+       if ((pMptCtx->MptRfPath == ODM_RF_PATH_A) || (pDM_Odm->mp_mode == FALSE))\r
 #endif\r
        {\r
                if (RegEB4 != 0)\r
@@ -3279,15 +3228,14 @@ PHY_IQCalibrate_8723B(
                        ODM_SetIQCbyRFpath(pDM_Odm, 1);\r
        }\r
 \r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK finished\n"));\r
+       ProgressingTime = ODM_GetProgressingTime( pDM_Odm, StartTime);\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK ProgressingTime = %d\n", ProgressingTime));\r
+\r
+out:\r
        ODM_AcquireSpinLock(pDM_Odm, RT_IQK_SPINLOCK);\r
        pDM_Odm->RFCalibrateInfo.bIQKInProgress = FALSE;\r
        ODM_ReleaseSpinLock(pDM_Odm, RT_IQK_SPINLOCK);\r
-\r
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("IQK finished\n"));\r
-       ProgressingTime = ODM_GetProgressingTime( pDM_Odm, StartTime);\r
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("IQK ProgressingTime = %d\n", ProgressingTime));\r
-       \r
-\r
 }\r
 \r
 \r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/Mp_Precomp.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/Mp_Precomp.h
new file mode 100755 (executable)
index 0000000..43ea006
--- /dev/null
@@ -0,0 +1,24 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//#include <Precomp.h>\r
+//#include "phydm_precomp.h"\r
+//#include "../phydm_precomp.h"\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/phydm_RTL8723B.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/phydm_RTL8723B.c
new file mode 100755 (executable)
index 0000000..f2defeb
--- /dev/null
@@ -0,0 +1,71 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+\r
+#include "Mp_Precomp.h"\r
+#include "../phydm_precomp.h"\r
+\r
+#if (RTL8723B_SUPPORT == 1)\r
+\r
+ s1Byte\r
+odm_CCKRSSI_8723B(\r
+       IN              u1Byte  LNA_idx,\r
+       IN              u1Byte  VGA_idx\r
+       )\r
+{\r
+       s1Byte  rx_pwr_all=0x00;\r
+       switch(LNA_idx)\r
+       {\r
+               //46  53 73 95 201301231630\r
+               // 46 53 77 99 201301241630\r
+               \r
+               case 6: \r
+                        rx_pwr_all = -34 - (2 * VGA_idx);\r
+                       break;\r
+               case 4: \r
+                        rx_pwr_all = -14 - (2 * VGA_idx);\r
+                       break;\r
+               case 1: \r
+                        rx_pwr_all = 6 - (2 * VGA_idx);\r
+                       break;\r
+               case 0: \r
+                        rx_pwr_all = 16 - (2 * VGA_idx);       \r
+                       break;\r
+               default:\r
+                        //rx_pwr_all = -53+(2*(31-VGA_idx));\r
+                        //DbgPrint("wrong LNA index\n");\r
+                       break;\r
+                       \r
+       }\r
+       return  rx_pwr_all;\r
+}\r
+\r
+#endif         // end if RTL8723B \r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/phydm_RTL8723B.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/phydm_RTL8723B.h
new file mode 100755 (executable)
index 0000000..c41a696
--- /dev/null
@@ -0,0 +1,29 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+#ifndef        __ODM_RTL8723B_H__\r
+#define __ODM_RTL8723B_H__\r
+\r
+s1Byte\r
+odm_CCKRSSI_8723B(\r
+       IN              u1Byte  LNA_idx,\r
+       IN              u1Byte  VGA_idx\r
+       );\r
+\r
+#endif\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/phydm_RegConfig8723B.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/phydm_RegConfig8723B.c
new file mode 100755 (executable)
index 0000000..d30e60e
--- /dev/null
@@ -0,0 +1,235 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *                                        
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+#include "Mp_Precomp.h"
+#include "../phydm_precomp.h"
+
+#if (RTL8723B_SUPPORT == 1)  
+
+void
+odm_ConfigRFReg_8723B(
+       IN      PDM_ODM_T                               pDM_Odm,
+       IN      u4Byte                                  Addr,
+       IN      u4Byte                                  Data,
+       IN  ODM_RF_RADIO_PATH_E     RF_PATH,
+       IN      u4Byte                              RegAddr
+       )
+{
+    if(Addr == 0xfe || Addr == 0xffe)
+       {                                         
+               #ifdef CONFIG_LONG_DELAY_ISSUE
+               ODM_sleep_ms(50);
+               #else           
+               ODM_delay_ms(50);
+               #endif
+       }
+       else
+       {
+               ODM_SetRFReg(pDM_Odm, RF_PATH, RegAddr, bRFRegOffsetMask, Data);
+               // Add 1us delay between BB/RF register setting.
+               ODM_delay_us(1);
+
+               //For disable/enable test in high temperature, the B6 value will fail to fill. Suggestion by BB Stanley, 2013.06.25.
+               if(Addr == 0xb6)
+               {
+                       u4Byte getvalue=0;
+                       u1Byte  count =0;
+                       getvalue = ODM_GetRFReg(pDM_Odm, RF_PATH, Addr, bMaskDWord);    
+
+                       ODM_delay_us(1);
+                       
+                       while((getvalue>>8)!=(Data>>8))
+                       {
+                               count++;
+                               ODM_SetRFReg(pDM_Odm, RF_PATH, RegAddr, bRFRegOffsetMask, Data);
+                               ODM_delay_us(1);
+                               getvalue = ODM_GetRFReg(pDM_Odm, RF_PATH, Addr, bMaskDWord);
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigRFWithHeaderFile: [B6] getvalue 0x%x, Data 0x%x, count %d\n", getvalue, Data,count));                       
+                               if(count>5)
+                                       break;
+                       }
+               }
+
+               if(Addr == 0xb2)
+               {
+                       u4Byte getvalue=0;
+                       u1Byte  count =0;
+                       getvalue = ODM_GetRFReg(pDM_Odm, RF_PATH, Addr, bMaskDWord);    
+
+                       ODM_delay_us(1);
+                       
+                       while(getvalue!=Data)
+                       {
+                               count++;
+                               ODM_SetRFReg(pDM_Odm, RF_PATH, RegAddr, bRFRegOffsetMask, Data);
+                               ODM_delay_us(1);
+                               //Do LCK againg 
+                               ODM_SetRFReg(pDM_Odm, RF_PATH, 0x18, bRFRegOffsetMask, 0x0fc07);
+                               ODM_delay_us(1);
+                               getvalue = ODM_GetRFReg(pDM_Odm, RF_PATH, Addr, bMaskDWord);
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigRFWithHeaderFile: [B2] getvalue 0x%x, Data 0x%x, count %d\n", getvalue, Data,count));                       
+                               if(count>5)
+                                       break;
+                       }
+               }                       
+       }       
+}
+
+
+void 
+odm_ConfigRF_RadioA_8723B(
+       IN      PDM_ODM_T                               pDM_Odm,
+       IN      u4Byte                                  Addr,
+       IN      u4Byte                                  Data
+       )
+{
+       u4Byte  content = 0x1000; // RF_Content: radioa_txt
+       u4Byte  maskforPhySet= (u4Byte)(content&0xE000);
+
+    odm_ConfigRFReg_8723B(pDM_Odm, Addr, Data, ODM_RF_PATH_A, Addr|maskforPhySet);
+
+    ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigRFWithHeaderFile: [RadioA] %08X %08X\n", Addr, Data));
+}
+
+void 
+odm_ConfigRF_RadioB_8723B(
+       IN      PDM_ODM_T                               pDM_Odm,
+       IN      u4Byte                                  Addr,
+       IN      u4Byte                                  Data
+       )
+{
+       u4Byte  content = 0x1001; // RF_Content: radiob_txt
+       u4Byte  maskforPhySet= (u4Byte)(content&0xE000);
+
+    odm_ConfigRFReg_8723B(pDM_Odm, Addr, Data, ODM_RF_PATH_B, Addr|maskforPhySet);
+       
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigRFWithHeaderFile: [RadioB] %08X %08X\n", Addr, Data));
+    
+}
+
+void 
+odm_ConfigMAC_8723B(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      u4Byte          Addr,
+       IN      u1Byte          Data
+       )
+{
+       ODM_Write1Byte(pDM_Odm, Addr, Data);
+    ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigMACWithHeaderFile: [MAC_REG] %08X %08X\n", Addr, Data));
+}
+
+void 
+odm_ConfigBB_AGC_8723B(
+    IN         PDM_ODM_T       pDM_Odm,
+    IN         u4Byte          Addr,
+    IN         u4Byte          Bitmask,
+    IN         u4Byte          Data
+    )
+{
+       ODM_SetBBReg(pDM_Odm, Addr, Bitmask, Data);             
+       // Add 1us delay between BB/RF register setting.
+       ODM_delay_us(1);
+
+    ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigBBWithHeaderFile: [AGC_TAB] %08X %08X\n", Addr, Data));
+}
+
+void
+odm_ConfigBB_PHY_REG_PG_8723B(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      u4Byte          Band,
+       IN      u4Byte          RfPath,
+       IN      u4Byte          TxNum,
+    IN         u4Byte          Addr,
+    IN         u4Byte          Bitmask,
+    IN         u4Byte          Data
+    )
+{    
+       if (Addr == 0xfe || Addr == 0xffe)
+               #ifdef CONFIG_LONG_DELAY_ISSUE
+               ODM_sleep_ms(50);
+               #else           
+               ODM_delay_ms(50);
+               #endif
+    else 
+    {
+#if    !(DM_ODM_SUPPORT_TYPE&ODM_AP)
+           PHY_StoreTxPowerByRate(pDM_Odm->Adapter, Band, RfPath, TxNum, Addr, Bitmask, Data);
+#endif
+    }
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ConfigBBWithHeaderFile: [PHY_REG] %08X %08X %08X\n", Addr, Bitmask, Data));
+}
+
+void 
+odm_ConfigBB_PHY_8723B(
+       IN      PDM_ODM_T       pDM_Odm,
+    IN         u4Byte          Addr,
+    IN         u4Byte          Bitmask,
+    IN         u4Byte          Data
+    )
+{    
+       if (Addr == 0xfe)
+               #ifdef CONFIG_LONG_DELAY_ISSUE
+               ODM_sleep_ms(50);
+               #else           
+               ODM_delay_ms(50);
+               #endif
+       else if (Addr == 0xfd)
+               ODM_delay_ms(5);
+       else if (Addr == 0xfc)
+               ODM_delay_ms(1);
+       else if (Addr == 0xfb)
+               ODM_delay_us(50);
+       else if (Addr == 0xfa)
+               ODM_delay_us(5);
+       else if (Addr == 0xf9)
+               ODM_delay_us(1);
+       else 
+       {
+               ODM_SetBBReg(pDM_Odm, Addr, Bitmask, Data);             
+       }
+       
+       // Add 1us delay between BB/RF register setting.
+       ODM_delay_us(1);
+    ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigBBWithHeaderFile: [PHY_REG] %08X %08X\n", Addr, Data));
+}
+
+void
+odm_ConfigBB_TXPWR_LMT_8723B(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      pu1Byte         Regulation,
+       IN      pu1Byte         Band,
+       IN      pu1Byte         Bandwidth,
+       IN      pu1Byte         RateSection,
+       IN      pu1Byte         RfPath,
+       IN      pu1Byte         Channel,
+       IN      pu1Byte         PowerLimit
+       )
+{      
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
+               PHY_SetTxPowerLimit(pDM_Odm, Regulation, Band,
+                       Bandwidth, RateSection, RfPath, Channel, PowerLimit);
+#elif (DM_ODM_SUPPORT_TYPE & (ODM_CE))
+               PHY_SetTxPowerLimit(pDM_Odm->Adapter, Regulation, Band,
+                       Bandwidth, RateSection, RfPath, Channel, PowerLimit);
+#endif
+}
+
+#endif
+
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/phydm_RegConfig8723B.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/OUTSRC/rtl8723b/phydm_RegConfig8723B.h
new file mode 100755 (executable)
index 0000000..4f2d388
--- /dev/null
@@ -0,0 +1,96 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *                                        
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+#ifndef __INC_ODM_REGCONFIG_H_8723B
+#define __INC_ODM_REGCONFIG_H_8723B
+#if (RTL8723B_SUPPORT == 1)
+
+void
+odm_ConfigRFReg_8723B(
+       IN      PDM_ODM_T                               pDM_Odm,
+       IN      u4Byte                                  Addr,
+       IN      u4Byte                                  Data,
+       IN  ODM_RF_RADIO_PATH_E     RF_PATH,
+       IN      u4Byte                              RegAddr
+       );
+
+void 
+odm_ConfigRF_RadioA_8723B(
+       IN      PDM_ODM_T                               pDM_Odm,
+       IN      u4Byte                                  Addr,
+       IN      u4Byte                                  Data
+       );
+
+void 
+odm_ConfigRF_RadioB_8723B(
+       IN      PDM_ODM_T                               pDM_Odm,
+       IN      u4Byte                                  Addr,
+       IN      u4Byte                                  Data
+       );
+
+void 
+odm_ConfigMAC_8723B(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      u4Byte          Addr,
+       IN      u1Byte          Data
+       );
+
+void 
+odm_ConfigBB_AGC_8723B(
+    IN         PDM_ODM_T       pDM_Odm,
+    IN         u4Byte          Addr,
+    IN         u4Byte          Bitmask,
+    IN         u4Byte          Data
+    );
+
+void
+odm_ConfigBB_PHY_REG_PG_8723B(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      u4Byte          Band,
+       IN      u4Byte          RfPath,
+       IN      u4Byte          TxNum,
+    IN         u4Byte          Addr,
+    IN         u4Byte          Bitmask,
+    IN         u4Byte          Data
+    );
+
+void 
+odm_ConfigBB_PHY_8723B(
+       IN      PDM_ODM_T       pDM_Odm,
+    IN         u4Byte          Addr,
+    IN         u4Byte          Bitmask,
+    IN         u4Byte          Data
+    );
+
+void
+odm_ConfigBB_TXPWR_LMT_8723B(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      pu1Byte         Regulation,
+       IN      pu1Byte         Band,
+       IN      pu1Byte         Bandwidth,
+       IN      pu1Byte         RateSection,
+       IN      pu1Byte         RfPath,
+       IN      pu1Byte         Channel,
+       IN      pu1Byte         PowerLimit
+    );
+
+#endif
+#endif // end of SUPPORT
+
index 221226abb177cd276485b8057b9e4fd4b6d3b171..119aaf78ef5e4f03b934f564ba35426c02ce7ac0 100755 (executable)
@@ -77,9 +77,27 @@ const char *const ioStaString[] =
        "h2c stopped",
 };
 
+const char *const GLBtcWifiBwString[]={
+       "11bg",
+       "HT20",
+       "HT40",
+       "HT80",
+       "HT160"
+};
+
+const char *const GLBtcWifiFreqString[]={
+       "2.4G",
+       "5G"
+};
+
+#define HALBTCOUTSRC_AGG_CHK_WINDOW_IN_MS      8000
+
 BTC_COEXIST GLBtCoexist;
 u8 GLBtcWiFiInScanState;
 u8 GLBtcWiFiInIQKState;
+u8 GLBtcWiFiInIPS;
+u8 GLBtcWiFiInLPS;
+u8 GLBtcBtCoexAliveRegistered;
 
 u32 GLBtcDbgType[BTC_MSG_MAX];
 u8 GLBtcDbgBuf[BT_TMP_BUF_SIZE];
@@ -269,6 +287,9 @@ void halbtcoutsrc_LeaveLowPower(PBTC_COEXIST pBtCoexist)
        timeout = 30;
 #endif // !LPS_RPWM_WAIT_MS
 
+       if (GLBtcBtCoexAliveRegistered == _TRUE)
+               return;
+
        stime = rtw_get_current_time();
        do {
                ready = rtw_register_task_alive(padapter, BTCOEX_ALIVE);
@@ -281,6 +302,8 @@ void halbtcoutsrc_LeaveLowPower(PBTC_COEXIST pBtCoexist)
 
                rtw_msleep_os(1);
        } while (1);
+
+       GLBtcBtCoexAliveRegistered = _TRUE;
 #endif // CONFIG_LPS_LCLK
 }
 
@@ -293,9 +316,13 @@ void halbtcoutsrc_NormalLowPower(PBTC_COEXIST pBtCoexist)
 #ifdef CONFIG_LPS_LCLK
        PADAPTER padapter;
 
+       if (GLBtcBtCoexAliveRegistered == _FALSE)
+               return;
 
        padapter = pBtCoexist->Adapter;
        rtw_unregister_task_alive(padapter, BTCOEX_ALIVE);
+
+       GLBtcBtCoexAliveRegistered = _FALSE;
 #endif // CONFIG_LPS_LCLK
 }
 
@@ -311,16 +338,41 @@ void halbtcoutsrc_DisableLowPower(PBTC_COEXIST pBtCoexist, u8 bLowPwrDisable)
 void halbtcoutsrc_AggregationCheck(PBTC_COEXIST pBtCoexist)
 {
        PADAPTER padapter;
-       BOOLEAN bNeedToAct;
-
+       BOOLEAN bNeedToAct = _FALSE;
+       static u32 preTime = 0;
+       u32 curTime = 0;
 
        padapter = pBtCoexist->Adapter;
-       bNeedToAct = _FALSE;
+
+       //=====================================
+       // To void continuous deleteBA=>addBA=>deleteBA=>addBA
+       // This function is not allowed to continuous called.
+       // It can only be called after 8 seconds.
+       //=====================================
+
+       curTime = rtw_systime_to_ms(rtw_get_current_time());
+       if((curTime - preTime) < HALBTCOUTSRC_AGG_CHK_WINDOW_IN_MS)     // over 8 seconds you can execute this function again.
+       {
+               return;
+       }
+       else
+       {
+               preTime = curTime;
+       }
 
        if (pBtCoexist->btInfo.bRejectAggPkt)
+       {
                rtw_btcoex_RejectApAggregatedPacket(padapter, _TRUE);
+               pBtCoexist->btInfo.bPreRejectAggPkt = pBtCoexist->btInfo.bRejectAggPkt;
+       }
        else
        {
+               if(pBtCoexist->btInfo.bPreRejectAggPkt)
+               {
+                       bNeedToAct = _TRUE;
+                       pBtCoexist->btInfo.bPreRejectAggPkt = pBtCoexist->btInfo.bRejectAggPkt;
+               }
+               
                if (pBtCoexist->btInfo.bPreBtCtrlAggBufSize !=
                        pBtCoexist->btInfo.bBtCtrlAggBufSize)
                {
@@ -515,10 +567,10 @@ static u8 halbtcoutsrc_GetWifiScanAPNum(PADAPTER padapter)
        pmlmeext = &padapter->mlmeextpriv;
 
        if (GLBtcWiFiInScanState == _FALSE) {
-               if (pmlmeext->sitesurvey_res.bss_cnt > 0xFF)
+               if (pmlmepriv->num_of_scanned > 0xFF)
                        scan_AP_num = 0xFF;
                else
-                       scan_AP_num = (u8)pmlmeext->sitesurvey_res.bss_cnt;
+                       scan_AP_num = (u8)pmlmepriv->num_of_scanned;
        }
 
        return scan_AP_num;
@@ -658,6 +710,10 @@ u8 halbtcoutsrc_Get(void *pBtcContext, u8 getType, void *pOutBuf)
                case BTC_GET_BL_EXT_SWITCH:
                        *pu8 = _FALSE;
                        break;
+               case BTC_GET_BL_IS_ASUS_8723B:
+                       /* Always return FALSE in linux driver since this case is added only for windows driver */
+                       *pu8 = _FALSE;
+                       break;
 
                case BTC_GET_S4_WIFI_RSSI:
                        *pS4Tmp = halbtcoutsrc_GetWifiRssi(padapter);
@@ -727,6 +783,9 @@ u8 halbtcoutsrc_Get(void *pBtcContext, u8 getType, void *pOutBuf)
                case BTC_GET_U1_AP_NUM:
                        *pU1Tmp = halbtcoutsrc_GetWifiScanAPNum(padapter);
                        break;
+               case BTC_GET_U1_ANT_TYPE:
+                       *pU1Tmp = (u1Byte)BTC_ANT_TYPE_0;
+                       break;
 
                //=======1Ant===========
                case BTC_GET_U1_LPS_MODE:
@@ -870,15 +929,24 @@ u8 halbtcoutsrc_Set(void *pBtcContext, u8 setType, void *pInBuf)
                        break;
 
                case BTC_SET_ACT_SEND_MIMO_PS:
-#if 0 // not implement yet
                        {
-                               u8 newMimoPsMode = *pU1Tmp;
+                                u8 newMimoPsMode = 3;
+                                struct mlme_ext_priv   *pmlmeext = &(padapter->mlmeextpriv);
+                               struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+
+                                // *pU1Tmp = 0 use SM_PS static type 
+                                // *pU1Tmp = 1 disable SM_PS
+                                if(*pU1Tmp==0)
+                                       newMimoPsMode = WLAN_HT_CAP_SM_PS_STATIC;
+                               else if(*pU1Tmp==1)
+                                       newMimoPsMode = WLAN_HT_CAP_SM_PS_DISABLED;
+                                                  
                                if (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE) == _TRUE)
-                                       SendMimoPsFrame(padapter, padapter->MgntInfo.Bssid, newMimoPsMode);
+                               {
+                                       //issue_action_SM_PS(padapter, get_my_bssid(&(pmlmeinfo->network)), newMimoPsMode);
+                                        issue_action_SM_PS_wait_ack(padapter, get_my_bssid(&(pmlmeinfo->network)), newMimoPsMode, 3, 1);
+                               }
                        }
-#else
-                       ret = _FALSE;
-#endif
                        break;
 
                case BTC_SET_ACT_CTRL_BT_INFO:
@@ -936,6 +1004,48 @@ u8 halbtcoutsrc_Set(void *pBtcContext, u8 setType, void *pInBuf)
        return ret;
 }
 
+u8 halbtcoutsrc_UnderIps(PBTC_COEXIST pBtCoexist)
+{
+       PADAPTER padapter;
+       struct pwrctrl_priv *pwrpriv;
+       u8 bMacPwrCtrlOn;
+
+       padapter = pBtCoexist->Adapter;
+       pwrpriv = &padapter->dvobj->pwrctl_priv;
+       bMacPwrCtrlOn = _FALSE;
+
+       if ((_TRUE == pwrpriv->bips_processing)
+               && (IPS_NONE != pwrpriv->ips_mode_req)
+               )
+       {
+               return _TRUE;
+       }
+
+       if (rf_off == pwrpriv->rf_pwrstate)
+       {
+               return _TRUE;
+       }
+
+       rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
+       if (_FALSE == bMacPwrCtrlOn)
+       {
+               return _TRUE;
+       }
+
+       return _FALSE;
+}
+
+u8 halbtcoutsrc_UnderLps(PBTC_COEXIST pBtCoexist)
+{
+       return GLBtcWiFiInLPS;
+}
+
+u8 halbtcoutsrc_Under32K(PBTC_COEXIST pBtCoexist)
+{
+       /* todo: the method to check whether wifi is under 32K or not */
+       return _FALSE;
+}
+
 void halbtcoutsrc_DisplayCoexStatistics(PBTC_COEXIST pBtCoexist)
 {
 #if 0
@@ -1036,17 +1146,95 @@ void halbtcoutsrc_DisplayBtLinkInfo(PBTC_COEXIST pBtCoexist)
 #endif
 }
 
-void halbtcoutsrc_DisplayFwPwrModeCmd(PBTC_COEXIST pBtCoexist)
+void halbtcoutsrc_DisplayWifiStatus(PBTC_COEXIST pBtCoexist)
 {
-       u8 *cliBuf = pBtCoexist->cliBuf;
+       PADAPTER        padapter = pBtCoexist->Adapter;
+       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
+       u8*                     cliBuf=pBtCoexist->cliBuf;
+       s32                     wifiRssi=0, btHsRssi=0;
+       BOOLEAN bScan=_FALSE, bLink=_FALSE, bRoam=_FALSE, bWifiBusy=_FALSE, bWifiUnderBMode=_FALSE;
+       u32                     wifiBw=BTC_WIFI_BW_HT20, wifiTrafficDir=BTC_WIFI_TRAFFIC_TX, wifiFreq=BTC_FREQ_2_4G;
+       u32                     wifiLinkStatus=0x0;
+       BOOLEAN bBtHsOn=_FALSE, bLowPower=_FALSE;
+       u8                      wifiChnl=0, wifiHsChnl=0, nScanAPNum = 0, FwPSState;
 
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x %02x ", "Power mode cmd ", \
+       wifiLinkStatus = halbtcoutsrc_GetWifiLinkStatus(pBtCoexist);
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d/ %d", "STA/vWifi/HS/p2pGo/p2pGc", \
+               ((wifiLinkStatus&WIFI_STA_CONNECTED)? 1:0), ((wifiLinkStatus&WIFI_AP_CONNECTED)? 1:0), 
+               ((wifiLinkStatus&WIFI_HS_CONNECTED)? 1:0), ((wifiLinkStatus&WIFI_P2P_GO_CONNECTED)? 1:0), 
+               ((wifiLinkStatus&WIFI_P2P_GC_CONNECTED)? 1:0) );
+       CL_PRINTF(cliBuf);
+
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiChnl);
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);  CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsChnl(High Speed)", \
+               wifiChnl, wifiHsChnl, bBtHsOn);
+       CL_PRINTF(cliBuf);
+
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \
+               wifiRssi-100, btHsRssi-100);
+       CL_PRINTF(cliBuf);
+
+
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \
+               bLink, bRoam, bScan);
+       CL_PRINTF(cliBuf);
+
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifiFreq);
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &nScanAPNum);
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s/ AP=%d ", "Wifi freq/ bw/ traffic", \
+               GLBtcWifiFreqString[wifiFreq], ((bWifiUnderBMode)? "11b": GLBtcWifiBwString[wifiBw]),
+               ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")), 
+               nScanAPNum);
+       CL_PRINTF(cliBuf);
+
+       // power status
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s%s%s", "Power Status", \
+               ((halbtcoutsrc_UnderIps(pBtCoexist) == _TRUE)? "IPS ON":"IPS OFF"),
+               ((halbtcoutsrc_UnderLps(pBtCoexist) == _TRUE)? ", LPS ON":", LPS OFF"), 
+               ((halbtcoutsrc_Under32K(pBtCoexist) == _TRUE)? ", 32k":""));
+       CL_PRINTF(cliBuf);
+
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x %02x (0x%x/0x%x)", "Power mode cmd(lps/rpwm)", \
                pBtCoexist->pwrModeVal[0], pBtCoexist->pwrModeVal[1],
                pBtCoexist->pwrModeVal[2], pBtCoexist->pwrModeVal[3],
-               pBtCoexist->pwrModeVal[4], pBtCoexist->pwrModeVal[5]);
+               pBtCoexist->pwrModeVal[4], pBtCoexist->pwrModeVal[5],
+               pBtCoexist->btInfo.lpsVal, 
+               pBtCoexist->btInfo.rpwmVal);
        CL_PRINTF(cliBuf);
 }
 
+void halbtcoutsrc_DisplayDbgMsg(void *pBtcContext, u8 dispType)
+{
+       PBTC_COEXIST pBtCoexist;
+
+
+       pBtCoexist = (PBTC_COEXIST)pBtcContext;
+       switch(dispType)
+       {
+               case BTC_DBG_DISP_COEX_STATISTICS:
+                       halbtcoutsrc_DisplayCoexStatistics(pBtCoexist);
+                       break;
+               case BTC_DBG_DISP_BT_LINK_INFO:
+                       halbtcoutsrc_DisplayBtLinkInfo(pBtCoexist);
+                       break;
+               case BTC_DBG_DISP_WIFI_STATUS:
+                       halbtcoutsrc_DisplayWifiStatus(pBtCoexist);
+                       break;
+               default:
+                       break;
+       }
+}
+
 //====================================
 //             IO related function
 //====================================
@@ -1111,7 +1299,7 @@ void halbtcoutsrc_BitMaskWrite1Byte(void *pBtcContext, u32 regAddr, u8 bitMask,
        originalValue = 0;
        bitShift = 0;
 
-       if (bitMask != 0xFF)
+       if(bitMask != 0xff)
        {
                originalValue = rtw_read8(padapter, regAddr);
 
@@ -1267,59 +1455,6 @@ void halbtcoutsrc_FillH2cCmd(void *pBtcContext, u8 elementId, u32 cmdLen, u8 *pC
        rtw_hal_fill_h2c_cmd(padapter, elementId, cmdLen, pCmdBuffer);
 }
 
-void halbtcoutsrc_DisplayDbgMsg(void *pBtcContext, u8 dispType)
-{
-       PBTC_COEXIST pBtCoexist;
-
-
-       pBtCoexist = (PBTC_COEXIST)pBtcContext;
-       switch(dispType)
-       {
-               case BTC_DBG_DISP_COEX_STATISTICS:
-                       halbtcoutsrc_DisplayCoexStatistics(pBtCoexist);
-                       break;
-               case BTC_DBG_DISP_BT_LINK_INFO:
-                       halbtcoutsrc_DisplayBtLinkInfo(pBtCoexist);
-                       break;
-               case BTC_DBG_DISP_FW_PWR_MODE_CMD:
-                       halbtcoutsrc_DisplayFwPwrModeCmd(pBtCoexist);
-                       break;
-               default:
-                       break;
-       }
-}
-
-u8 halbtcoutsrc_UnderIps(PBTC_COEXIST pBtCoexist)
-{
-       PADAPTER padapter;
-       struct pwrctrl_priv *pwrpriv;
-       u8 bMacPwrCtrlOn;
-
-       padapter = pBtCoexist->Adapter;
-       pwrpriv = &padapter->dvobj->pwrctl_priv;
-       bMacPwrCtrlOn = _FALSE;
-
-       if ((_TRUE == pwrpriv->bips_processing)
-               && (IPS_NONE != pwrpriv->ips_mode_req)
-               )
-       {
-               return _TRUE;
-       }
-
-       if (rf_off == pwrpriv->rf_pwrstate)
-       {
-               return _TRUE;
-       }
-
-       rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
-       if (_FALSE == bMacPwrCtrlOn)
-       {
-               return _TRUE;
-       }
-
-       return _FALSE;
-}
-
 //====================================
 //             Extern functions called by other module
 //====================================
@@ -1408,6 +1543,12 @@ u8 EXhalbtcoutsrc_InitlizeVariables(void *padapter)
 
        GLBtcWiFiInIQKState = _FALSE;
 
+       GLBtcWiFiInIPS = _FALSE;
+
+       GLBtcWiFiInLPS = _FALSE;
+
+       GLBtcBtCoexAliveRegistered = _FALSE;
+
        return _TRUE;
 }
 
@@ -1426,6 +1567,22 @@ void EXhalbtcoutsrc_PowerOnSetting(PBTC_COEXIST pBtCoexist)
        }
 }
 
+void EXhalbtcoutsrc_PreLoadFirmware(PBTC_COEXIST pBtCoexist)
+{
+       if(!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))
+               return;
+       
+       pBtCoexist->statistics.cntPreLoadFirmware++;
+
+       if(IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))
+       {
+               if(pBtCoexist->boardInfo.btdmAntNum == 2)
+                       EXhalbtc8723b2ant_PreLoadFirmware(pBtCoexist);
+               else if(pBtCoexist->boardInfo.btdmAntNum == 1)
+                       EXhalbtc8723b1ant_PreLoadFirmware(pBtCoexist);
+       }
+}
+
 void EXhalbtcoutsrc_InitHwConfig(PBTC_COEXIST pBtCoexist, u8 bWifiOnly)
 {
        if (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))
@@ -1548,10 +1705,16 @@ void EXhalbtcoutsrc_IpsNotify(PBTC_COEXIST pBtCoexist, u8 type)
                return;
 
        if (IPS_NONE == type)
+       {
                ipsType = BTC_IPS_LEAVE;
+               GLBtcWiFiInIPS = _FALSE;
+       }
        else
+       {
                ipsType = BTC_IPS_ENTER;
-
+               GLBtcWiFiInIPS = _TRUE;
+       }
+       
        // All notify is called in cmd thread, don't need to leave low power again
 //     halbtcoutsrc_LeaveLowPower(pBtCoexist);
 
@@ -1617,10 +1780,16 @@ void EXhalbtcoutsrc_LpsNotify(PBTC_COEXIST pBtCoexist, u8 type)
                return;
 
        if (PS_MODE_ACTIVE == type)
+       {
                lpsType = BTC_LPS_DISABLE;
+               GLBtcWiFiInLPS = _FALSE;
+       }
        else
+       {
                lpsType = BTC_LPS_ENABLE;
-
+               GLBtcWiFiInLPS = _TRUE;
+       }
+       
        if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
        {
                if (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)
@@ -2301,6 +2470,35 @@ void EXhalbtcoutsrc_DbgControl(PBTC_COEXIST pBtCoexist, u8 opCode, u8 opLen, u8
 //     halbtcoutsrc_NormalLowPower(pBtCoexist);
 }
 
+#if 0
+VOID
+EXhalbtcoutsrc_AntennaDetection(
+       IN      PBTC_COEXIST                    pBtCoexist,
+       IN      u4Byte                                  centFreq,
+       IN      u4Byte                                  offset,
+       IN      u4Byte                                  span,
+       IN      u4Byte                                  seconds
+       )
+{
+       if(!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))
+               return;
+
+       /* Need to refine the following power save operations to enable this function in the future */  
+#if 0
+       IPSDisable(pBtCoexist->Adapter, FALSE, 0);
+       LeisurePSLeave(pBtCoexist->Adapter, LPS_DISABLE_BT_COEX);
+#endif
+
+       if(IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))
+       {
+               if(pBtCoexist->boardInfo.btdmAntNum == 1)
+                       EXhalbtc8723b1ant_AntennaDetection(pBtCoexist, centFreq, offset, span, seconds);
+       }
+
+       //IPSReturn(pBtCoexist->Adapter, 0xff);
+}
+#endif
+
 void EXhalbtcoutsrc_StackUpdateProfileInfo(void)
 {
 #if 0
@@ -2521,6 +2719,25 @@ void EXhalbtcoutsrc_DisplayBtCoexInfo(PBTC_COEXIST pBtCoexist)
        halbtcoutsrc_NormalLowPower(pBtCoexist);
 }
 
+VOID
+EXhalbtcoutsrc_DisplayAntIsolation(
+       IN      PBTC_COEXIST            pBtCoexist
+       )
+{
+       if(!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))
+               return;
+
+       halbtcoutsrc_LeaveLowPower(pBtCoexist);
+
+       if(IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))
+       {
+               if(pBtCoexist->boardInfo.btdmAntNum == 1)
+                       EXhalbtc8723b1ant_DisplayAntIsolation(pBtCoexist);
+       }
+       
+       halbtcoutsrc_NormalLowPower(pBtCoexist);
+}
+
 static void halbt_InitHwConfig92C(PADAPTER padapter)
 {
        PHAL_DATA_TYPE pHalData;
@@ -2680,6 +2897,11 @@ void hal_btcoex_PowerOnSetting(PADAPTER padapter)
        EXhalbtcoutsrc_PowerOnSetting(&GLBtCoexist);
 }
 
+void hal_btcoex_PreLoadFirmware(PADAPTER padapter)
+{
+       EXhalbtcoutsrc_PreLoadFirmware(&GLBtCoexist);
+}
+
 void hal_btcoex_InitHwConfig(PADAPTER padapter, u8 bWifiOnly)
 {
        if (!hal_btcoex_IsBtExist(padapter))
@@ -2833,13 +3055,15 @@ u8 hal_btcoex_LpsVal(PADAPTER padapter)
 u32 hal_btcoex_GetRaMask(PADAPTER padapter)
 {
        if (!hal_btcoex_IsBtExist(padapter))
-               return 0;
+                return 0;
 
        if (GLBtCoexist.btInfo.bBtDisabled)
-               return 0;
+                return 0;
 
-       if (GLBtCoexist.boardInfo.btdmAntNum != 1)
-               return 0;
+        // Modify by YiWei , suggest by Cosa and Jenyu
+        // Remove the limit antenna number , because 2 antenna case (ex: 8192eu)also want to get BT coex report rate mask.
+       //if (GLBtCoexist.boardInfo.btdmAntNum != 1)
+        //        return 0;
 
        return GLBtCoexist.btInfo.raMask;
 }
@@ -3021,5 +3245,183 @@ u8 hal_btcoex_IsBtLinkExist(PADAPTER padapter)
 
        return _FALSE;
 }
+
+/*
+ * Description:
+ *     Setting BT coex antenna isolation type .
+ *                         coex mechanisn/ spital stream/ best throughput
+ *      anttype = 0  ,  PSTDMA  / 2SS / 0.5T , bad isolation      (<20dB) for 2,3 antenna
+ *      anttype = 1  ,  PSTDMA  / 1SS / 0.5T , normal isolaiton (>20dB) for 2 antenna
+ *      anttype = 2  ,  TDMA      / 2SS / T      , normal isolaiton (>20dB) for 3 antenna
+ *      anttype = 3  ,  no TDMA / 1SS / 0.5T , good isolation    (>40dB) for 2 antenna
+ *      anttype = 4  ,  no TDMA / 2SS / T      , good isolation    (>40dB) for 3 antenna
+ *    wifi only throughput ~ T
+ *    wifi/BT share one antenna with SPDT
+ */
+void hal_btcoex_SetAntIsolationType(PADAPTER padapter, u8 anttype)
+{
+        PHAL_DATA_TYPE pHalData;
+
+        //DBG_871X("####%s , anttype = %d  , %d \n", __FUNCTION__,anttype,__LINE__);
+        pHalData = GET_HAL_DATA(padapter);
+
+
+        pHalData->bt_coexist.btAntisolation= anttype;
+
+}
+
+#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
+int
+hal_btcoex_ParseAntIsolationConfigFile(
+  PADAPTER             Adapter,
+  char*                        buffer
+)
+{
+        HAL_DATA_TYPE  *pHalData = GET_HAL_DATA(Adapter);
+        u32    i = 0 , j=0;
+        char   *szLine, *ptmp;
+        int    rtStatus = _SUCCESS;
+        char param_value_string[10];
+        u8 param_value;
+        u8 anttype = 4;
+        
+        u8 ant_num=3, ant_distance=50;
+        
+        typedef struct ant_isolation
+        {
+            char *param_name; // antenna isolation config parameter name 
+            u8 *value; // antenna isolation config parameter value
+        }ANT_ISOLATION;
+
+        ANT_ISOLATION ant_isolation_param[]= {
+                                                                                    {"ANT_NUMBER",&ant_num},
+                                                                                    {"ANT_DISTANCE",&ant_distance},
+                                                                                    {NULL,0}
+                                                                           };
+
+
+        
+       //DBG_871X("===>Hal_ParseAntIsolationConfigFile()\n" );
+                    
+       ptmp = buffer;
+       for (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp))
+       {
+               // skip comment 
+               if ( IsCommentString( szLine ) ) {
+                       continue;
+               }         
+
+                //DBG_871X("%s : szLine = %s , strlen(szLine) = %d  \n", __FUNCTION__,szLine,strlen(szLine));
+                for ( j=0 ;ant_isolation_param[j].param_name != NULL ; j++ )
+                {
+                        if ( strstr(szLine,ant_isolation_param[j].param_name)!= NULL )
+                        {
+                                i=0;
+                                while ( i < strlen(szLine) )
+                                {
+                                        if (szLine[i] != '"')
+                                                ++i;
+                                        else
+                                        {
+                                                // skip only has one "
+                                                if( strpbrk(szLine, "\"") == strrchr(szLine, '"'))
+                                                {
+                                                        DBG_871X("Fail to parse parameters , format error!\n");
+                                                        break;
+                                                }
+                                                _rtw_memset( ( PVOID ) param_value_string, 0, 10 );
+                                                if ( ! ParseQualifiedString( szLine, &i, param_value_string, '"' , '"' ) ) {
+                                                        DBG_871X("Fail to parse parameters \n");
+                                                        return _FAIL;
+                                                }
+                                                else
+                                                {
+                                                        GetU1ByteIntegerFromStringInDecimal( param_value_string, ant_isolation_param[j].value );                                              
+                                                 }
+                                                break;
+                                        }
+                                }
+                        }
+                }
+        } 
+
+        // YiWei 20140716 , for BT coex antenna isolation control
+        if ( ant_num==3 && ant_distance>=50)
+        {
+                pHalData->EEPROMBluetoothCoexist = 0;
+                anttype = 4;
+        }
+        else if ( ant_num==2 && ant_distance>=50 ) 
+        {
+                anttype = 3;
+        }
+        else if ( ant_num==3 &&  ant_distance>=15 &&  ant_distance<50  ) 
+        {
+                anttype = 2;
+        }
+        else if ( ant_num==2 && ant_distance>=15 &&  ant_distance<50 ) 
+        {
+                anttype = 1;
+        }
+        else if ( (ant_num==2 && ant_distance<15) ||  (ant_num==3 && ant_distance<15)) 
+        {
+                anttype = 0;
+        } 
+        else
+        {
+                pHalData->EEPROMBluetoothCoexist = 1;
+                anttype = 1;             
+        }
+
+        hal_btcoex_SetAntIsolationType(Adapter, anttype); 
+                                                
+        DBG_871X("%s : ant_num = %d   \n", __FUNCTION__,ant_num);
+        DBG_871X("%s : ant_distance = %d  \n", __FUNCTION__,ant_distance);
+        //DBG_871X("<===Hal_ParseAntIsolationConfigFile()\n");
+        return rtStatus;    
+}
+
+
+int
+hal_btcoex_AntIsolationConfig_ParaFile(
+       IN      PADAPTER        Adapter,
+       IN      char*           pFileName
+)
+{
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+       int     rlen = 0, rtStatus = _FAIL;
+       //char  file_path[1024];
+
+       //if(!(Adapter->registrypriv.load_phy_file & LOAD_RF_TXPWR_LMT_PARA_FILE))
+       //      return rtStatus;
+
+       _rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);
+
+
+       rtw_merge_string(file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName);
+
+       if (rtw_is_file_readable(file_path) == _TRUE)
+       {
+               rlen = rtw_retrive_from_file(file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);
+               if (rlen > 0)
+               {
+                       rtStatus = _SUCCESS;
+               }
+       }
+
+
+       if(rtStatus == _SUCCESS)
+       {
+               //DBG_871X("%s(): read %s ok\n", __FUNCTION__, pFileName);
+               rtStatus = hal_btcoex_ParseAntIsolationConfigFile( Adapter, pHalData->para_file_buf );
+       }
+       else
+       {
+               DBG_871X("%s(): No File %s, Load from *** Array!\n", __FUNCTION__, pFileName);
+       }
+
+       return rtStatus;
+}
+#endif // CONFIG_LOAD_PHY_PARA_FROM_FILE
 #endif // CONFIG_BT_COEXIST
 
index 9e1dfe53ada587f7df78f241c865d8410d0d4971..bf5256f0b80c81d09745c056f83f4c4f91bcb08f 100755 (executable)
 #include <drv_types.h>
 #include "hal_com_h2c.h"
 
-#include "../hal/OUTSRC/odm_precomp.h"
+#include "hal_data.h"
+
+//#define CONFIG_GTK_OL_DBG
+
+#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
+char   file_path[PATH_LENGTH_MAX];
+#endif
 
 u8 rtw_hal_data_init(_adapter *padapter)
 {
-       if(is_primary_adapter(padapter))        //if(padapter->isprimary)
+       if(is_primary_adapter(padapter))
        {
                padapter->hal_data_sz = sizeof(HAL_DATA_TYPE);
                padapter->HalData = rtw_zvmalloc(padapter->hal_data_sz);
@@ -34,19 +40,19 @@ u8 rtw_hal_data_init(_adapter *padapter)
                        DBG_8192C("cant not alloc memory for HAL DATA \n");
                        return _FAIL;
                }
-       }       
+       }
        return _SUCCESS;
 }
 
 void rtw_hal_data_deinit(_adapter *padapter)
 {      
-       if(is_primary_adapter(padapter))        //if(padapter->isprimary)
+       if(is_primary_adapter(padapter))
        {
                if (padapter->HalData) 
                {
                        #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
                        phy_free_filebuf(padapter);                             
-                       #endif          
+                       #endif
                        rtw_vmfree(padapter->HalData, padapter->hal_data_sz);
                        padapter->HalData = NULL;
                        padapter->hal_data_sz = 0;
@@ -54,7 +60,6 @@ void rtw_hal_data_deinit(_adapter *padapter)
        }
 }
 
-
 void dump_chip_info(HAL_VERSION        ChipVersion)
 {
        int cnt = 0;
@@ -957,87 +962,4066 @@ void hw_var_port_switch(_adapter *adapter)
        for (i=0; i<6; i++)
                rtw_write8(adapter, REG_BSSID1+i, bssid[i]);
 
-       /* write bcn ctl */
-#ifdef CONFIG_BT_COEXIST
-#if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)
-       // always enable port0 beacon function for PSTDMA
-       bcn_ctrl_1 |= EN_BCN_FUNCTION;
-       // always disable port1 beacon function for PSTDMA
-       bcn_ctrl &= ~EN_BCN_FUNCTION;
-#endif
-#endif
-       rtw_write8(adapter, REG_BCN_CTRL, bcn_ctrl_1);
-       rtw_write8(adapter, REG_BCN_CTRL_1, bcn_ctrl);
+       /* write bcn ctl */
+#ifdef CONFIG_BT_COEXIST
+#if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)
+       // always enable port0 beacon function for PSTDMA
+       bcn_ctrl_1 |= EN_BCN_FUNCTION;
+       // always disable port1 beacon function for PSTDMA
+       bcn_ctrl &= ~EN_BCN_FUNCTION;
+#endif
+#endif
+       rtw_write8(adapter, REG_BCN_CTRL, bcn_ctrl_1);
+       rtw_write8(adapter, REG_BCN_CTRL_1, bcn_ctrl);
+
+       if (adapter->iface_type == IFACE_PORT0) {
+               adapter->iface_type = IFACE_PORT1;
+               adapter->pbuddy_adapter->iface_type = IFACE_PORT0;
+               DBG_871X_LEVEL(_drv_always_, "port switch - port0("ADPT_FMT"), port1("ADPT_FMT")\n",
+                       ADPT_ARG(adapter->pbuddy_adapter), ADPT_ARG(adapter));
+       } else {
+               adapter->iface_type = IFACE_PORT0;
+               adapter->pbuddy_adapter->iface_type = IFACE_PORT1;
+               DBG_871X_LEVEL(_drv_always_, "port switch - port0("ADPT_FMT"), port1("ADPT_FMT")\n",
+                       ADPT_ARG(adapter), ADPT_ARG(adapter->pbuddy_adapter));
+       }
+
+#ifdef DBG_RUNTIME_PORT_SWITCH
+       msr = rtw_read8(adapter, MSR);
+       bcn_ctrl = rtw_read8(adapter, REG_BCN_CTRL);
+       bcn_ctrl_1 = rtw_read8(adapter, REG_BCN_CTRL_1);
+
+       for (i=0; i<2; i++)
+               atimwnd[i] = rtw_read8(adapter, REG_ATIMWND+i);
+       for (i=0; i<2; i++)
+               atimwnd_1[i] = rtw_read8(adapter, REG_ATIMWND_1+i);
+
+       for (i=0; i<8; i++)
+               tsftr[i] = rtw_read8(adapter, REG_TSFTR+i);
+       for (i=0; i<8; i++)
+               tsftr_1[i] = rtw_read8(adapter, REG_TSFTR1+i);
+
+       for (i=0; i<6; i++)
+               macid[i] = rtw_read8(adapter, REG_MACID+i);
+
+       for (i=0; i<6; i++)
+               bssid[i] = rtw_read8(adapter, REG_BSSID+i);
+
+       for (i=0; i<6; i++)
+               macid_1[i] = rtw_read8(adapter, REG_MACID1+i);
+
+       for (i=0; i<6; i++)
+               bssid_1[i] = rtw_read8(adapter, REG_BSSID1+i);
+
+       DBG_871X(FUNC_ADPT_FMT" after switch\n"
+               "msr:0x%02x\n"
+               "bcn_ctrl:0x%02x\n"
+               "bcn_ctrl_1:0x%02x\n"
+               "atimwnd:%u\n"
+               "atimwnd_1:%u\n"
+               "tsftr:%llu\n"
+               "tsftr1:%llu\n"
+               "macid:"MAC_FMT"\n"
+               "bssid:"MAC_FMT"\n"
+               "macid_1:"MAC_FMT"\n"
+               "bssid_1:"MAC_FMT"\n"
+               , FUNC_ADPT_ARG(adapter)
+               , msr
+               , bcn_ctrl
+               , bcn_ctrl_1
+               , *((u16*)atimwnd)
+               , *((u16*)atimwnd_1)
+               , *((u64*)tsftr)
+               , *((u64*)tsftr_1)
+               , MAC_ARG(macid)
+               , MAC_ARG(bssid)
+               , MAC_ARG(macid_1)
+               , MAC_ARG(bssid_1)
+       );
+#endif /* DBG_RUNTIME_PORT_SWITCH */
+
+#endif /* CONFIG_RUNTIME_PORT_SWITCH */
+#endif /* CONFIG_CONCURRENT_MODE */
+}
+
+void rtw_hal_set_FwRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc)
+{
+       struct  hal_ops *pHalFunc = &padapter->HalFunc;
+       u8      u1H2CRsvdPageParm[H2C_RSVDPAGE_LOC_LEN]={0};
+       u8      ret = 0;
+
+       DBG_871X("RsvdPageLoc: ProbeRsp=%d PsPoll=%d Null=%d QoSNull=%d BTNull=%d\n",
+               rsvdpageloc->LocProbeRsp, rsvdpageloc->LocPsPoll,
+               rsvdpageloc->LocNullData, rsvdpageloc->LocQosNull,
+               rsvdpageloc->LocBTQosNull);
+
+       SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1H2CRsvdPageParm, rsvdpageloc->LocProbeRsp);
+       SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1H2CRsvdPageParm, rsvdpageloc->LocPsPoll);
+       SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocNullData);
+       SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocQosNull);
+       SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocBTQosNull);
+
+       if (pHalFunc->fill_h2c_cmd != NULL) {
+               ret = pHalFunc->fill_h2c_cmd(padapter,
+                               H2C_RSVD_PAGE,
+                               H2C_RSVDPAGE_LOC_LEN,
+                               u1H2CRsvdPageParm);
+       } else {
+               DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
+               ret = _FAIL;
+       }
+}
+
+#ifdef CONFIG_GPIO_WAKEUP
+static void rtw_hal_set_output_gpio(_adapter* padapter, u8 index, u8 outputval)
+{
+       u8 val8;
+
+
+       if ( index <= 7 ) {
+               /* config GPIO mode */
+               rtw_write8(padapter, REG_GPIO_PIN_CTRL + 3,
+                               rtw_read8(padapter, REG_GPIO_PIN_CTRL + 3) & ~BIT(index) );
+
+               /* config GPIO Sel */
+               /* 0: input */
+               /* 1: output */
+               rtw_write8(padapter, REG_GPIO_PIN_CTRL + 2,
+                               rtw_read8(padapter, REG_GPIO_PIN_CTRL + 2) | BIT(index));
+
+               /* set output value */
+               if ( outputval ) {
+                       rtw_write8(padapter, REG_GPIO_PIN_CTRL + 1,
+                                       rtw_read8(padapter, REG_GPIO_PIN_CTRL + 1) | BIT(index));
+               } else {
+                       rtw_write8(padapter, REG_GPIO_PIN_CTRL + 1,
+                                       rtw_read8(padapter, REG_GPIO_PIN_CTRL + 1) & ~BIT(index));
+               }
+       } else if (index <= 15) {
+               /* 88C Series: */
+               /* index: 11~8 transform to 3~0 */
+               /* 8723 Series: */
+               /* index: 12~8 transform to 4~0 */
+#ifdef CONFIG_RTL8723B
+               if ((index == 13) || (index == 14)) {
+                       // Set BIT_GPIO13_14_WL_CTRL_EN to 0
+                       val8 = rtw_read8(padapter, 0x4e);
+                       if (val8 & BIT(6)) {
+                               val8 &= ~BIT(6);
+                               rtw_write8(padapter, 0x4e, val8);
+                               DBG_871X("%s: set GPIO%d to WL control, 0x4E=0x%02X\n",
+                                       __FUNCTION__, index, rtw_read8(padapter, 0x4e));
+                       }
+               }
+#endif // CONFIG_RTL8723B
+
+               index -= 8;
+
+               /* config GPIO mode */
+               rtw_write8(padapter, REG_GPIO_PIN_CTRL_2 + 3,
+                               rtw_read8(padapter, REG_GPIO_PIN_CTRL_2 + 3) & ~BIT(index) );
+
+               /* config GPIO Sel */
+               /* 0: input */
+               /* 1: output */
+               rtw_write8(padapter, REG_GPIO_PIN_CTRL_2 + 2,
+                               rtw_read8(padapter, REG_GPIO_PIN_CTRL_2 + 2) | BIT(index));
+
+               /* set output value */
+               if ( outputval ) {
+                       rtw_write8(padapter, REG_GPIO_PIN_CTRL_2 + 1,
+                                       rtw_read8(padapter, REG_GPIO_PIN_CTRL_2 + 1) | BIT(index));
+               } else {
+                       rtw_write8(padapter, REG_GPIO_PIN_CTRL_2 + 1,
+                                       rtw_read8(padapter, REG_GPIO_PIN_CTRL_2 + 1) & ~BIT(index));
+               }
+       } else {
+               DBG_871X("%s: invalid GPIO%d=%d\n", __FUNCTION__, index, outputval);
+       }
+}
+
+/*
+ * Set GPIO high/low under init and
+ * fw will trigger Low/High Pulse when need to wake up host
+ */
+void rtw_clear_hostwakeupgpio(PADAPTER padapter)
+{
+       u8 high = 0;
+
+
+#ifdef CONFIG_GPIO_WAKEUP_LOW_ACTIVE
+       high = 1;
+#endif // CONFIG_GPIO_WAKEUP_LOW_ACTIVE
+       DBG_871X("%s: Set GPIO%d to %s for wake\n",
+               __FUNCTION__, WAKEUP_GPIO_IDX, high?"high":"low");
+       rtw_hal_set_output_gpio(padapter, WAKEUP_GPIO_IDX, high);
+}
+#endif
+
+void rtw_hal_set_FwAoacRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc)
+{
+       struct  hal_ops *pHalFunc = &padapter->HalFunc;
+       struct  pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
+       struct  mlme_priv *pmlmepriv = &padapter->mlmepriv;
+       u8      res = 0, count = 0, ret = 0;
+#ifdef CONFIG_WOWLAN   
+       u8 u1H2CAoacRsvdPageParm[H2C_AOAC_RSVDPAGE_LOC_LEN]={0};
+
+       DBG_871X("AOACRsvdPageLoc: RWC=%d ArpRsp=%d NbrAdv=%d GtkRsp=%d GtkInfo=%d ProbeReq=%d NetworkList=%d\n",
+                       rsvdpageloc->LocRemoteCtrlInfo, rsvdpageloc->LocArpRsp,
+                       rsvdpageloc->LocNbrAdv, rsvdpageloc->LocGTKRsp,
+                       rsvdpageloc->LocGTKInfo, rsvdpageloc->LocProbeReq,
+                       rsvdpageloc->LocNetList);
+
+       if (check_fwstate(pmlmepriv, _FW_LINKED)) {
+               SET_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocRemoteCtrlInfo);
+               SET_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1H2CAoacRsvdPageParm, rsvdpageloc->LocArpRsp);
+               //SET_H2CCMD_AOAC_RSVDPAGE_LOC_NEIGHBOR_ADV(u1H2CAoacRsvdPageParm, rsvdpageloc->LocNbrAdv);
+               SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_RSP(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKRsp);
+               SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKInfo);
+#ifdef CONFIG_GTK_OL
+               SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKEXTMEM);
+#endif // CONFIG_GTK_OL
+               if (pHalFunc->fill_h2c_cmd != NULL) {
+                       ret = pHalFunc->fill_h2c_cmd(padapter,
+                                       H2C_AOAC_RSVD_PAGE,
+                                       H2C_AOAC_RSVDPAGE_LOC_LEN,
+                                       u1H2CAoacRsvdPageParm);
+               } else {
+                       DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
+                       ret = _FAIL;
+               }
+       }
+#ifdef CONFIG_PNO_SUPPORT
+       else
+       {
+
+               if(!pwrpriv->pno_in_resume) {
+                       DBG_871X("NLO_INFO=%d\n", rsvdpageloc->LocPNOInfo);
+                       _rtw_memset(&u1H2CAoacRsvdPageParm, 0,
+                                       sizeof(u1H2CAoacRsvdPageParm));
+                       SET_H2CCMD_AOAC_RSVDPAGE_LOC_NLO_INFO(u1H2CAoacRsvdPageParm,
+                                       rsvdpageloc->LocPNOInfo);
+                       if (pHalFunc->fill_h2c_cmd != NULL) {
+                               ret = pHalFunc->fill_h2c_cmd(padapter,
+                                               H2C_AOAC_RSVDPAGE3,
+                                               H2C_AOAC_RSVDPAGE_LOC_LEN,
+                                               u1H2CAoacRsvdPageParm);
+                       } else {
+                               DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
+                               ret = _FAIL;
+                       }
+               }
+       }
+#endif //CONFIG_PNO_SUPPORT
+#endif // CONFIG_WOWLAN
+}
+
+#ifdef CONFIG_WOWLAN
+// rtw_hal_check_wow_ctrl
+// chk_type: _TRUE means to check enable, if 0x690 & bit1, WOW enable successful
+//           _FALSE means to check disable, if 0x690 & bit1, WOW disable fail
+static u8 rtw_hal_check_wow_ctrl(_adapter* adapter, u8 chk_type)
+{
+       u8 mstatus = 0;
+       u8 trycnt = 25;
+       u8 res = _FALSE;
+
+       mstatus = rtw_read8(adapter, REG_WOW_CTRL);
+       DBG_871X_LEVEL(_drv_info_, "%s mstatus:0x%02x\n", __func__, mstatus);
+
+       if (chk_type) {
+               while(!(mstatus&BIT1) && trycnt>1) {
+                       mstatus = rtw_read8(adapter, REG_WOW_CTRL);
+                       DBG_871X_LEVEL(_drv_always_,
+                                       "Loop index: %d :0x%02x\n",
+                                       trycnt, mstatus);
+                       trycnt --;
+                       rtw_msleep_os(2);
+               }
+               if (mstatus & BIT1)
+                       res = _TRUE;
+               else
+                       res = _FALSE;
+       } else {
+               while (mstatus&BIT1 && trycnt>1) {
+                       mstatus = rtw_read8(adapter, REG_WOW_CTRL);
+                       DBG_871X_LEVEL(_drv_always_,
+                                       "Loop index: %d :0x%02x\n",
+                                       trycnt, mstatus);
+                       trycnt --;
+                       rtw_msleep_os(2);
+               }
+
+               if (mstatus & BIT1)
+                       res = _FALSE;
+               else
+                       res = _TRUE;
+       }
+       DBG_871X_LEVEL(_drv_always_, "%s check_type: %d res: %d trycnt: %d\n",
+                       __func__, chk_type, res, (25 - trycnt));
+       return res;
+}
+
+#ifdef CONFIG_PNO_SUPPORT
+static u8 rtw_hal_check_pno_enabled(_adapter* adapter)
+{
+       struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(adapter);
+       u8 res = 0, count = 0;
+       u8 ret = _FALSE;
+       if (ppwrpriv->wowlan_pno_enable && ppwrpriv->pno_in_resume == _FALSE) {
+               res = rtw_read8(adapter, REG_PNO_STATUS);
+               while(!(res&BIT(7)) && count < 25) {
+                       DBG_871X("[%d] cmd: 0x81 REG_PNO_STATUS: 0x%02x\n",
+                                       count, res);
+                       res = rtw_read8(adapter, REG_PNO_STATUS);
+                       count++;
+                       rtw_msleep_os(2);
+               }
+               if (res & BIT(7))
+                       ret = _TRUE;
+               else
+                       ret = _FALSE;
+               DBG_871X("cmd: 0x81 REG_PNO_STATUS: ret(%d)\n", ret);
+       }
+       return ret;
+}
+#endif
+
+static void rtw_hal_force_enable_rxdma(_adapter* adapter)
+{
+       DBG_871X("%s: Set 0x690=0x00\n", __func__);
+       rtw_write8(adapter, REG_WOW_CTRL,
+                       (rtw_read8(adapter, REG_WOW_CTRL)&0xf0));
+       DBG_871X_LEVEL(_drv_always_, "%s: Release RXDMA\n", __func__);
+       rtw_write32(adapter, REG_RXPKT_NUM,
+                       (rtw_read32(adapter,REG_RXPKT_NUM)&(~RW_RELEASE_EN)));
+}
+
+static void rtw_hal_disable_tx_report(_adapter* adapter)
+{
+       rtw_write8(adapter, REG_TX_RPT_CTRL,
+                       ((rtw_read8(adapter, REG_TX_RPT_CTRL)&~BIT(1)))&~BIT(5));
+       DBG_871X("disable TXRPT:0x%02x\n", rtw_read8(adapter, REG_TX_RPT_CTRL));
+}
+
+static void rtw_hal_enable_tx_report(_adapter* adapter)
+{
+       rtw_write8(adapter, REG_TX_RPT_CTRL,
+                       ((rtw_read8(adapter, REG_TX_RPT_CTRL)|BIT(1)))|BIT(5));
+       DBG_871X("enable TX_RPT:0x%02x\n", rtw_read8(adapter, REG_TX_RPT_CTRL));
+}
+
+void rtw_hal_fill_fake_txdesc(_adapter* padapter, u8* pDesc, u32 BufferLen,
+               u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame)
+{
+
+       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+       struct hal_ops *pHalFunc = &padapter->HalFunc;
+       struct tx_desc *ptxdesc;
+
+       // Clear all status
+       _rtw_memset(pDesc, 0, TXDESC_SIZE);
+
+       if (TXDESC_SIZE == 32) {
+               ptxdesc = (struct tx_desc*)pDesc;
+               //offset 0
+               //own, bFirstSeg, bLastSeg;
+               ptxdesc->txdw0 |=
+                       cpu_to_le32( BIT(31) | BIT(27)| BIT(26));
+
+               //32 bytes for TX Desc
+               ptxdesc->txdw0 |=
+                       cpu_to_le32(((TXDESC_SIZE + 0) << 16)&0x00ff0000);
+
+               // Buffer size + command header
+               ptxdesc->txdw0 |=
+                       cpu_to_le32(BufferLen&0x0000ffff);
+
+               //offset 4
+               // Fixed queue of Mgnt queue
+               ptxdesc->txdw1 |= cpu_to_le32((QSLT_MGNT<< 8)&0x00001f00);
+
+               //Set NAVUSEHDR to prevent Ps-poll AId filed to be changed to error vlaue by Hw.
+               if (IsPsPoll) {
+                       ptxdesc->txdw1 |= cpu_to_le32(BIT(20));
+               } else {
+                       // Hw set sequence number
+                       ptxdesc->txdw4 |= cpu_to_le32(BIT(7));
+                       //set bit3 to 1. Suugested by TimChen. 2009.12.29.
+                       ptxdesc->txdw3 |= cpu_to_le32((8 <<28));
+               }
+
+               if (_TRUE == IsBTQosNull) {
+                       ptxdesc->txdw2 |= cpu_to_le32(BIT(23)); // BT NULL
+               }
+
+               //offset 16
+               //driver uses rate
+               ptxdesc->txdw4 |= cpu_to_le32(BIT(8));
+
+       } else if (TXDESC_SIZE == 40) {
+               SET_TX_DESC_FIRST_SEG(pDesc, 1); //bFirstSeg;
+               SET_TX_DESC_LAST_SEG(pDesc, 1); //bLastSeg;
+
+               SET_TX_DESC_OFFSET(pDesc, TXDESC_SIZE);
+
+               SET_TX_DESC_PKT_SIZE(pDesc, BufferLen); // Buffer size + command header
+
+               if (pmlmeext->cur_wireless_mode & WIRELESS_11B) {
+                       SET_TX_DESC_RATE_ID(pDesc, RATR_INX_WIRELESS_B);
+               } else {
+                       SET_TX_DESC_RATE_ID(pDesc, RATR_INX_WIRELESS_G);
+               }
+
+               SET_TX_DESC_QUEUE_SEL(pDesc, QSLT_MGNT); // Fixed queue of Mgnt queue
+
+               // Set NAVUSEHDR to prevent Ps-poll AId filed to be changed to error vlaue by Hw.
+               if (_TRUE == IsPsPoll) {
+                       SET_TX_DESC_NAV_USE_HDR(pDesc, 1);
+               } else {
+                       SET_TX_DESC_HWSEQ_EN(pDesc, 1); // Hw set sequence number
+                       SET_TX_DESC_HWSEQ_SEL(pDesc, 0);
+               }
+
+               if (_TRUE ==IsBTQosNull) {
+                       SET_TX_DESC_BT_INT(pDesc, 1);
+               }
+
+               SET_TX_DESC_USE_RATE(pDesc, 1); // use data rate which is set by Sw
+               SET_TX_DESC_OWN((pu1Byte)pDesc, 1);
+
+               SET_TX_DESC_TX_RATE(pDesc, MRateToHwRate(pmlmeext->tx_rate));
+
+       }
+
+       //
+       // Encrypt the data frame if under security mode excepct null data.
+       // Suggested by CCW.
+       //
+       if (_TRUE ==bDataFrame)
+       {
+               u32 EncAlg;
+
+               EncAlg = padapter->securitypriv.dot11PrivacyAlgrthm;
+               switch (EncAlg)
+               {
+                       case _NO_PRIVACY_:
+                               SET_TX_DESC_SEC_TYPE(pDesc, 0x0);
+                               break;
+                       case _WEP40_:
+                       case _WEP104_:
+                       case _TKIP_:
+                               SET_TX_DESC_SEC_TYPE(pDesc, 0x1);
+                               break;
+                       case _SMS4_:
+                               SET_TX_DESC_SEC_TYPE(pDesc, 0x2);
+                               break;
+                       case _AES_:
+                               SET_TX_DESC_SEC_TYPE(pDesc, 0x3);
+                               break;
+                       default:
+                               SET_TX_DESC_SEC_TYPE(pDesc, 0x0);
+                               break;
+               }
+       }
+
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
+       // USB interface drop packet if the checksum of descriptor isn't correct.
+       // Using this checksum can let hardware recovery from packet bulk out error (e.g. Cancel URC, Bulk out error.).
+       if(pHalFunc->hal_cal_txdesc_chksum != NULL)
+#if defined(CONFIG_RTL8188E) || defined(CONFIG_RTL8723A) ||defined(CONFIG_RTL8723B)
+               pHalFunc->hal_cal_txdesc_chksum((struct tx_desc*)pDesc);
+#else
+               pHalFunc->hal_cal_txdesc_chksum(pDesc);
+#endif //CONFIG_RTL8188E || CONFIG_RTL8723B
+#endif
+}
+
+static void rtw_hal_backup_rate(_adapter* adapter)
+{
+       DBG_871X("%s\n", __func__);
+       //backup data rate to register 0x8b for wowlan FW
+       rtw_write8(adapter, 0x8d, 1);
+       rtw_write8(adapter, 0x8c, 0);
+       rtw_write8(adapter, 0x8f, 0x40);
+       rtw_write8(adapter, 0x8b, rtw_read8(adapter, 0x2f0));
+}
+
+static u8 rtw_hal_pause_rx_dma(_adapter* adapter)
+{
+       u8 ret = 0;
+       u8 trycnt = 100;
+       u16 len = 0;
+       u32 tmp = 0;
+       int res = 0;
+       //RX DMA stop
+       DBG_871X_LEVEL(_drv_always_, "Pause DMA\n");
+       rtw_write32(adapter, REG_RXPKT_NUM,
+                       (rtw_read32(adapter,REG_RXPKT_NUM)|RW_RELEASE_EN));
+       do{
+               if((rtw_read32(adapter, REG_RXPKT_NUM)&RXDMA_IDLE)) {
+                       DBG_871X_LEVEL(_drv_always_, "RX_DMA_IDLE is true\n");
+                       ret = _SUCCESS;
+                       break;
+               }
+#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
+               else {
+                       // If RX_DMA is not idle, receive one pkt from DMA
+                       res = sdio_local_read(adapter,
+                                       SDIO_REG_RX0_REQ_LEN, 4, (u8*)&tmp);
+                       len = le16_to_cpu(tmp);
+                       DBG_871X_LEVEL(_drv_always_, "RX len:%d\n", len);
+
+                       if (len > 0)
+                               res = RecvOnePkt(adapter, len);
+                       else
+                               DBG_871X_LEVEL(_drv_always_, "read length fail %d\n", len);
+
+                       DBG_871X_LEVEL(_drv_always_, "RecvOnePkt Result: %d\n", res);
+               }
+#endif //CONFIG_SDIO_HCI || CONFIG_GSPI_HCI
+       }while(trycnt--);
+
+       if(trycnt ==0) {
+               DBG_871X_LEVEL(_drv_always_, "Stop RX DMA failed...... \n");
+               ret = _FAIL;
+       }
+
+       return ret;
+}
+
+#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
+static u8 rtw_hal_enable_cpwm2(_adapter* adapter)
+{
+       u8 ret = 0;
+       int res = 0;
+       u32 tmp = 0;
+
+       DBG_871X_LEVEL(_drv_always_, "%s\n", __func__);
+
+       res = sdio_local_read(adapter, SDIO_REG_HIMR, 4, (u8*)&tmp);
+       if (!res)
+               DBG_871X_LEVEL(_drv_info_, "read SDIO_REG_HIMR: 0x%08x\n", tmp);
+       else
+               DBG_871X_LEVEL(_drv_info_, "sdio_local_read fail\n");
+
+       tmp = SDIO_HIMR_CPWM2_MSK;
+
+       res = sdio_local_write(adapter, SDIO_REG_HIMR, 4, (u8*)&tmp);
+
+       if (!res){
+               res = sdio_local_read(adapter, SDIO_REG_HIMR, 4, (u8*)&tmp);
+               DBG_871X_LEVEL(_drv_info_, "read again SDIO_REG_HIMR: 0x%08x\n", tmp);
+               ret = _SUCCESS;
+       }else {
+               DBG_871X_LEVEL(_drv_info_, "sdio_local_write fail\n");
+               ret = _FAIL;
+       }
+
+       return ret;
+}
+#endif //CONFIG_SDIO_HCI, CONFIG_GSPI_HCI
+
+#ifdef CONFIG_GTK_OL
+static void rtw_hal_fw_sync_cam_id(_adapter* adapter)
+{
+       struct security_priv *psecuritypriv = &adapter->securitypriv;
+       u8 null_addr[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
+       int cam_id;
+       u32 algorithm = 0;
+       u16 ctrl = 0;
+       u8 *addr;
+       u8 index = 0;
+       u8 get_key[16];
+
+       addr = get_bssid(&adapter->mlmepriv);
+
+       if (addr == NULL) {
+               DBG_871X("%s: get bssid MAC addr fail!!\n", __func__);
+               return;
+       }
+
+       do{
+               cam_id = rtw_camid_search(adapter, addr, index);
+               if (cam_id == -1) {
+                       DBG_871X("%s: cam_id: %d, key_id:%d\n",
+                                       __func__, cam_id, index);
+               } else if (rtw_camid_is_gk(adapter, cam_id) != _TRUE) {
+                       DBG_871X("%s: cam_id: %d key_id(%d) is not GK\n",
+                                       __func__, cam_id, index);
+               } else {
+                       read_cam(adapter ,cam_id, get_key);
+                       algorithm = psecuritypriv->dot11PrivacyAlgrthm;
+                       ctrl = BIT(15) | BIT6 |(algorithm << 2) | index;
+                       write_cam(adapter, index, ctrl, addr, get_key);
+                       ctrl = 0;
+                       write_cam(adapter, cam_id, ctrl, null_addr, get_key);
+               }
+               index++;
+       }while(cam_id != -1);
+
+       rtw_write8(adapter, REG_SECCFG, 0xcc);
+}
+
+static void rtw_hal_update_gtk_offload_info(_adapter* adapter)
+{
+       struct security_priv *psecuritypriv = &adapter->securitypriv;
+       int cam_id;
+       u8 *addr;
+       u8 null_addr[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
+       u8 gtk_keyindex=0;
+       u8 get_key[16];
+       u8 null_key[16];
+       u8 index = 0;
+       u16 ctrl = 0;
+       u32 algorithm = 0;
+
+       addr = get_bssid(&adapter->mlmepriv);
+
+       if (addr == NULL) {
+               DBG_871X("%s: get bssid MAC addr fail!!\n", __func__);
+               return;
+       }
+
+       _rtw_memset(null_key, 0, sizeof(null_key));
+
+       algorithm = psecuritypriv->dot11PrivacyAlgrthm;
+
+       if(psecuritypriv->binstallKCK_KEK == _TRUE) {
+               //read gtk key index
+               gtk_keyindex = rtw_read8(adapter, 0x48c);
+
+               do{
+                       cam_id = rtw_camid_search(adapter, addr, index);
+                       if (cam_id == -1) {
+                               DBG_871X("%s: cam_id: %d, key_id:%d\n",
+                                               __func__, cam_id, index);
+                       } else if (read_phy_cam_is_gtk(adapter, cam_id) ==
+                                       _FALSE){
+                               DBG_871X("%s: cam_id: %d, key_id:%d is not GK\n",
+                                               __func__, cam_id, index);
+                       } else if (cam_id >= 4) {
+                               DBG_871X("%s: cam_id(%d) is not in default key\n",
+                                               __func__, cam_id);
+                       } else {
+                               read_cam(adapter ,cam_id, get_key);
+                               algorithm = psecuritypriv->dot11PrivacyAlgrthm;
+                               ctrl = BIT(15) | BIT6 |(algorithm << 2) | index;
+                               write_cam(adapter, cam_id+4, ctrl,
+                                               addr, get_key);
+                               ctrl = 0;
+                               write_cam(adapter, cam_id, ctrl,
+                                               null_addr, get_key);
+                       }
+
+                       if (gtk_keyindex < 4 &&(index == gtk_keyindex)) {
+                               psecuritypriv->dot118021XGrpKeyid = gtk_keyindex;
+                               _rtw_memcpy(psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey,
+                                               get_key, 16);
+
+                               DBG_871X_LEVEL(_drv_always_, "GTK (%d) = 0x%08x, 0x%08x, 0x%08x, 0x%08x\n",
+                                               gtk_keyindex,
+                               psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].lkey[0], 
+                               psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].lkey[1],
+                               psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].lkey[2],
+                               psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].lkey[3]);
+                       }
+                       index++;
+               }while(index < 4);
+
+               rtw_write8(adapter, REG_SECCFG, 0x0c);
+#ifdef CONFIG_GTK_OL_DBG
+               //if (gtk_keyindex != 5)
+               dump_cam_table(adapter);
+#endif
+       }
+}
+#endif
+
+static void rtw_hal_update_tx_iv(_adapter* adapter)
+{
+       struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);
+       u64 iv_low = 0, iv_high = 0;
+
+       // 3.1 read fw iv
+       iv_low = rtw_read32(adapter, REG_TXPKTBUF_IV_LOW);
+       //only low two bytes is PN, check AES_IV macro for detail
+       iv_low &= 0xffff;
+       iv_high = rtw_read32(adapter, REG_TXPKTBUF_IV_HIGH);
+       //get the real packet number
+       pwrctl->wowlan_fw_iv = iv_high << 16 | iv_low;
+       DBG_871X_LEVEL(_drv_always_,
+                       "fw_iv: 0x%016llx\n", pwrctl->wowlan_fw_iv);
+       //Update TX iv data.
+       rtw_set_sec_pn(adapter);
+}
+
+static u8 rtw_hal_set_keep_alive_cmd(_adapter *adapter, u8 enable, u8 pkt_type)
+{
+       struct hal_ops *pHalFunc = &adapter->HalFunc;
+
+       u8 u1H2CKeepAliveParm[H2C_KEEP_ALIVE_CTRL_LEN]={0};
+       u8 adopt = 1, check_period = 5;
+       u8 ret = _FAIL;
+
+       DBG_871X("%s(): enable = %d\n", __func__, enable);
+       SET_H2CCMD_KEEPALIVE_PARM_ENABLE(u1H2CKeepAliveParm, enable);
+       SET_H2CCMD_KEEPALIVE_PARM_ADOPT(u1H2CKeepAliveParm, adopt);
+       SET_H2CCMD_KEEPALIVE_PARM_PKT_TYPE(u1H2CKeepAliveParm, pkt_type);
+       SET_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(u1H2CKeepAliveParm, check_period);
+
+       if (pHalFunc->fill_h2c_cmd != NULL) {
+               ret = pHalFunc->fill_h2c_cmd(adapter,
+                               H2C_KEEP_ALIVE,
+                               H2C_KEEP_ALIVE_CTRL_LEN,
+                               u1H2CKeepAliveParm);
+       } else {
+               DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
+               ret = _FAIL;
+       }
+
+       return ret;
+}
+
+static u8 rtw_hal_set_disconnect_decision_cmd(_adapter *adapter, u8 enable)
+{
+       struct hal_ops *pHalFunc = &adapter->HalFunc;
+       u8 u1H2CDisconDecisionParm[H2C_DISCON_DECISION_LEN]={0};
+       u8 adopt = 1, check_period = 10, trypkt_num = 0;
+       u8 ret = _FAIL;
+
+       DBG_871X("%s(): enable = %d\n", __func__, enable);
+       SET_H2CCMD_DISCONDECISION_PARM_ENABLE(u1H2CDisconDecisionParm, enable);
+       SET_H2CCMD_DISCONDECISION_PARM_ADOPT(u1H2CDisconDecisionParm, adopt);
+       SET_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(u1H2CDisconDecisionParm, check_period);
+       SET_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(u1H2CDisconDecisionParm, trypkt_num);
+
+       if (pHalFunc->fill_h2c_cmd != NULL) {
+               ret = pHalFunc->fill_h2c_cmd(adapter,
+                               H2C_DISCON_DECISION,
+                               H2C_DISCON_DECISION_LEN,
+                               u1H2CDisconDecisionParm);
+       } else {
+               DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
+               ret = _FAIL;
+       }
+
+       return ret;
+}
+
+static u8 rtw_hal_set_ap_offload_ctrl_cmd(_adapter *adapter, u8 enable)
+{
+       struct hal_ops *pHalFunc = &adapter->HalFunc;
+       u8 u1H2CAPOffloadCtrlParm[H2C_WOWLAN_LEN]={0};
+       u8 ret = _FAIL;
+
+       DBG_871X("%s(): bFuncEn=%d\n", __func__, enable);
+
+       SET_H2CCMD_AP_WOWLAN_EN(u1H2CAPOffloadCtrlParm, enable);
+
+       if (pHalFunc->fill_h2c_cmd != NULL) {
+               ret = pHalFunc->fill_h2c_cmd(adapter,
+                               H2C_AP_OFFLOAD,
+                               H2C_AP_OFFLOAD_LEN,
+                               u1H2CAPOffloadCtrlParm);
+       } else {
+               DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
+               ret = _FAIL;
+       }
+       return ret;
+}
+
+static u8 rtw_hal_set_ap_rsvdpage_loc_cmd(_adapter *adapter,
+               PRSVDPAGE_LOC rsvdpageloc)
+{
+       struct hal_ops *pHalFunc = &adapter->HalFunc;
+       u8 rsvdparm[H2C_AOAC_RSVDPAGE_LOC_LEN]={0};
+       u8 ret = _FAIL, header = 0;
+
+       if (pHalFunc->fill_h2c_cmd == NULL) {
+               DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
+               return ret;
+       }
+
+       header = rtw_read8(adapter, REG_BCNQ_BDNY);
+
+       DBG_871X("%s: beacon: %d, probeRsp: %d, header:0x%02x\n", __func__,
+                       rsvdpageloc->LocApOffloadBCN,
+                       rsvdpageloc->LocProbeRsp,
+                       header);
+
+       SET_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_BCN(rsvdparm,
+                       rsvdpageloc->LocApOffloadBCN + header);
+
+       ret = pHalFunc->fill_h2c_cmd(adapter, H2C_BCN_RSVDPAGE,
+                               H2C_BCN_RSVDPAGE_LEN, rsvdparm);
+
+       if (ret == _FAIL)
+               DBG_871X("%s: H2C_BCN_RSVDPAGE cmd fail\n", __func__);
+
+       _rtw_memset(&rsvdparm, 0, sizeof(rsvdparm));
+
+       SET_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_ProbeRsp(rsvdparm,
+                       rsvdpageloc->LocProbeRsp + header);
+
+       ret = pHalFunc->fill_h2c_cmd(adapter, H2C_PROBERSP_RSVDPAGE,
+                               H2C_PROBERSP_RSVDPAGE_LEN, rsvdparm);
+
+       if (ret == _FAIL)
+               DBG_871X("%s: H2C_PROBERSP_RSVDPAGE cmd fail\n", __func__);
+
+       return ret;
+}
+
+u8 rtw_hal_set_wowlan_ctrl_cmd(_adapter *adapter, u8 enable)
+{
+       struct security_priv *psecpriv = &adapter->securitypriv;
+       struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(adapter);
+       struct hal_ops *pHalFunc = &adapter->HalFunc;
+
+       u8 u1H2CWoWlanCtrlParm[H2C_WOWLAN_LEN]={0};
+       u8 discont_wake = 1, gpionum = 0, gpio_dur = 0;
+       u8 hw_unicast = 0, gpio_pulse_cnt = 0;
+       u8 sdio_wakeup_enable = 1;
+       u8 gpio_high_active = 0; //0: low active, 1: high active
+       u8 magic_pkt = 0;
+       u8 ret = _FAIL;
+
+#ifdef CONFIG_GPIO_WAKEUP
+       gpionum = WAKEUP_GPIO_IDX;
+       sdio_wakeup_enable = 0;
+       gpio_dur = 32; // 32*32us = 1024us
+#ifdef CONFIG_GPIO_WAKEUP_LOW_ACTIVE
+       gpio_high_active = 0;
+#else // !CONFIG_GPIO_WAKEUP_LOW_ACTIVE
+       gpio_high_active = 1;
+#endif // !CONFIG_GPIO_WAKEUP_LOW_ACTIVE
+#endif //CONFIG_GPIO_WAKEUP
+
+       if (!ppwrpriv->wowlan_pno_enable)
+               magic_pkt = enable;
+
+       if (psecpriv->dot11PrivacyAlgrthm == _WEP40_ || psecpriv->dot11PrivacyAlgrthm == _WEP104_)
+               hw_unicast = 1;
+       else if (IS_HARDWARE_TYPE_8192E(adapter))
+               hw_unicast = 1;
+       else
+               hw_unicast = 0;
+
+       DBG_871X("%s: enable=%d GPIO=%d\n", __FUNCTION__, enable, gpionum);
+
+       SET_H2CCMD_WOWLAN_FUNC_ENABLE(u1H2CWoWlanCtrlParm, enable);
+       SET_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(u1H2CWoWlanCtrlParm, 0);
+       SET_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(u1H2CWoWlanCtrlParm, magic_pkt);
+       SET_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(u1H2CWoWlanCtrlParm, hw_unicast);
+       SET_H2CCMD_WOWLAN_ALL_PKT_DROP(u1H2CWoWlanCtrlParm, 0);
+       SET_H2CCMD_WOWLAN_GPIO_ACTIVE(u1H2CWoWlanCtrlParm, gpio_high_active);
+#ifndef CONFIG_GTK_OL
+       SET_H2CCMD_WOWLAN_REKEY_WAKE_UP(u1H2CWoWlanCtrlParm, enable);
+#endif
+       SET_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(u1H2CWoWlanCtrlParm, discont_wake);
+       SET_H2CCMD_WOWLAN_GPIONUM(u1H2CWoWlanCtrlParm, gpionum);
+       SET_H2CCMD_WOWLAN_DATAPIN_WAKE_UP(u1H2CWoWlanCtrlParm, sdio_wakeup_enable);
+       SET_H2CCMD_WOWLAN_GPIO_DURATION(u1H2CWoWlanCtrlParm, gpio_dur); // (real)unit: 32us
+       SET_H2CCMD_WOWLAN_GPIO_PULSE_EN(u1H2CWoWlanCtrlParm, 1);
+#ifdef CONFIG_PLATFORM_ARM_RK3188
+       SET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(u1H2CWoWlanCtrlParm, 4);
+#else
+       SET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(u1H2CWoWlanCtrlParm, gpio_pulse_cnt);
+#endif
+
+       if (pHalFunc->fill_h2c_cmd != NULL) {
+               ret = pHalFunc->fill_h2c_cmd(adapter,
+                               H2C_WOWLAN,
+                               H2C_WOWLAN_LEN,
+                               u1H2CWoWlanCtrlParm);
+       } else {
+               DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
+               ret = _FAIL;
+       }
+       return ret;
+}
+
+static u8 rtw_hal_set_remote_wake_ctrl_cmd(_adapter *adapter, u8 enable)
+{
+       struct hal_ops *pHalFunc = &adapter->HalFunc;
+       struct security_priv* psecuritypriv=&(adapter->securitypriv);
+       struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(adapter);
+       u8 u1H2CRemoteWakeCtrlParm[H2C_REMOTE_WAKE_CTRL_LEN]={0};
+       u8 ret = _FAIL, count = 0;
+
+       DBG_871X("%s(): enable=%d\n", __func__, enable);
+
+       if (!ppwrpriv->wowlan_pno_enable) {
+               SET_H2CCMD_REMOTE_WAKECTRL_ENABLE(
+                               u1H2CRemoteWakeCtrlParm, enable);
+               SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(
+                               u1H2CRemoteWakeCtrlParm, 1);
+#ifdef CONFIG_GTK_OL
+               if (psecuritypriv->binstallKCK_KEK == _TRUE &&
+                               psecuritypriv->dot11PrivacyAlgrthm == _AES_) {
+                       SET_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(
+                                       u1H2CRemoteWakeCtrlParm, 1);
+               } else {
+                       DBG_871X("no kck or security is not AES\n");
+                       SET_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(
+                                       u1H2CRemoteWakeCtrlParm, 0);
+               }
+#endif //CONFIG_GTK_OL
+
+               SET_H2CCMD_REMOTE_WAKE_CTRL_FW_UNICAST_EN(
+                               u1H2CRemoteWakeCtrlParm, 1);
+               if ((psecuritypriv->dot11PrivacyAlgrthm == _AES_) ||
+                       (psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_)) {
+                       SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION(
+                                       u1H2CRemoteWakeCtrlParm, 0);
+               } else {
+                       SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION(
+                                       u1H2CRemoteWakeCtrlParm, 1);
+               }
+       }
+#ifdef CONFIG_PNO_SUPPORT
+       else {
+               SET_H2CCMD_REMOTE_WAKECTRL_ENABLE(
+                               u1H2CRemoteWakeCtrlParm, enable);
+               SET_H2CCMD_REMOTE_WAKE_CTRL_NLO_OFFLOAD_EN(
+                               u1H2CRemoteWakeCtrlParm, enable);
+       }
+#endif
+
+#ifdef CONFIG_P2P_WOWLAN
+       if (_TRUE == ppwrpriv->wowlan_p2p_mode)
+       {
+               DBG_871X("P2P OFFLOAD ENABLE\n");
+               SET_H2CCMD_REMOTE_WAKE_CTRL_P2P_OFFLAD_EN(u1H2CRemoteWakeCtrlParm,1);
+       }
+       else
+       {
+               DBG_871X("P2P OFFLOAD DISABLE\n");
+               SET_H2CCMD_REMOTE_WAKE_CTRL_P2P_OFFLAD_EN(u1H2CRemoteWakeCtrlParm,0);
+       }
+#endif //CONFIG_P2P_WOWLAN
+
+
+       if (pHalFunc->fill_h2c_cmd != NULL) {
+               ret = pHalFunc->fill_h2c_cmd(adapter,
+                               H2C_REMOTE_WAKE_CTRL,
+                               H2C_REMOTE_WAKE_CTRL_LEN,
+                               u1H2CRemoteWakeCtrlParm);
+       } else {
+               DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
+               ret = _FAIL;
+       }
+       return ret;
+}
+
+static u8 rtw_hal_set_global_info_cmd(_adapter* adapter, u8 group_alg, u8 pairwise_alg)
+{
+       struct hal_ops *pHalFunc = &adapter->HalFunc;
+       u8 ret = _FAIL;
+       u8 u1H2CAOACGlobalInfoParm[H2C_AOAC_GLOBAL_INFO_LEN]={0};
+
+       DBG_871X("%s(): group_alg=%d pairwise_alg=%d\n",
+                       __func__, group_alg, pairwise_alg);
+       SET_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(u1H2CAOACGlobalInfoParm,
+                       pairwise_alg);
+       SET_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(u1H2CAOACGlobalInfoParm,
+                       group_alg);
+
+       if (pHalFunc->fill_h2c_cmd != NULL) {
+               ret = pHalFunc->fill_h2c_cmd(adapter,
+                               H2C_AOAC_GLOBAL_INFO,
+                               H2C_AOAC_GLOBAL_INFO_LEN,
+                               u1H2CAOACGlobalInfoParm);
+       } else {
+               DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
+               ret = _FAIL;
+       }
+
+       return ret;
+}
+
+#ifdef CONFIG_PNO_SUPPORT
+static u8 rtw_hal_set_scan_offload_info_cmd(_adapter* adapter,
+               PRSVDPAGE_LOC rsvdpageloc, u8 enable)
+{
+       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
+       struct hal_ops *pHalFunc = &adapter->HalFunc;
+
+       u8 u1H2CScanOffloadInfoParm[H2C_SCAN_OFFLOAD_CTRL_LEN]={0};
+       u8 res = 0, count = 0, ret = _FAIL;
+
+       DBG_871X("%s: loc_probe_packet:%d, loc_scan_info: %d loc_ssid_info:%d\n",
+               __func__, rsvdpageloc->LocProbePacket,
+               rsvdpageloc->LocScanInfo, rsvdpageloc->LocSSIDInfo);
+
+       SET_H2CCMD_AOAC_NLO_FUN_EN(u1H2CScanOffloadInfoParm, enable);
+       SET_H2CCMD_AOAC_RSVDPAGE_LOC_SCAN_INFO(u1H2CScanOffloadInfoParm,
+                       rsvdpageloc->LocScanInfo);
+       SET_H2CCMD_AOAC_RSVDPAGE_LOC_PROBE_PACKET(u1H2CScanOffloadInfoParm,
+                       rsvdpageloc->LocProbePacket);
+       SET_H2CCMD_AOAC_RSVDPAGE_LOC_SSID_INFO(u1H2CScanOffloadInfoParm,
+                       rsvdpageloc->LocSSIDInfo);
+
+       if (pHalFunc->fill_h2c_cmd != NULL) {
+               ret = pHalFunc->fill_h2c_cmd(adapter,
+                               H2C_D0_SCAN_OFFLOAD_INFO,
+                               H2C_SCAN_OFFLOAD_CTRL_LEN,
+                               u1H2CScanOffloadInfoParm);
+       } else {
+               DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
+               ret = _FAIL;
+       }
+       return ret;
+}
+#endif //CONFIG_PNO_SUPPORT
+
+void rtw_hal_set_fw_wow_related_cmd(_adapter* padapter, u8 enable)
+{
+       struct security_priv *psecpriv = &padapter->securitypriv;
+       struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(padapter);
+       struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
+       struct sta_info *psta = NULL;
+       u16 media_status_rpt;
+       u8      pkt_type = 0;
+       u8 ret = _SUCCESS;
+
+       DBG_871X_LEVEL(_drv_always_, "+%s()+: enable=%d\n", __func__, enable);
+_func_enter_;
+
+       rtw_hal_set_wowlan_ctrl_cmd(padapter, enable);
+
+       if (enable) {
+               rtw_hal_set_global_info_cmd(padapter,
+                               psecpriv->dot118021XGrpPrivacy,
+                               psecpriv->dot11PrivacyAlgrthm);
+
+               if (!(ppwrpriv->wowlan_pno_enable)) {
+                       rtw_hal_set_disconnect_decision_cmd(padapter, enable);
+#ifdef CONFIG_ARP_KEEP_ALIVE
+                       if ((psecpriv->dot11PrivacyAlgrthm == _WEP40_) ||
+                               (psecpriv->dot11PrivacyAlgrthm == _WEP104_))
+                               pkt_type = 0;
+                       else
+                               pkt_type = 1;
+#else
+                       pkt_type = 0;
+#endif //CONFIG_ARP_KEEP_ALIVE
+                       rtw_hal_set_keep_alive_cmd(padapter, enable, pkt_type);
+               }
+               rtw_hal_set_remote_wake_ctrl_cmd(padapter, enable);
+#ifdef CONFIG_PNO_SUPPORT
+               rtw_hal_check_pno_enabled(padapter);
+#endif //CONFIG_PNO_SUPPORT
+       } else {
+#if 0
+               {
+                       u32 PageSize = 0;
+                       rtw_hal_get_def_var(adapter, HAL_DEF_TX_PAGE_SIZE, (u8 *)&PageSize);
+                       dump_TX_FIFO(padapter, 4, PageSize);
+               }
+#endif
+
+               rtw_hal_set_remote_wake_ctrl_cmd(padapter, enable);
+               rtw_hal_set_wowlan_ctrl_cmd(padapter, enable);
+       }
+_func_exit_;
+       DBG_871X_LEVEL(_drv_always_, "-%s()-\n", __func__);
+}
+#endif //CONFIG_WOWLAN
+
+#ifdef CONFIG_P2P_WOWLAN
+static int update_hidden_ssid(u8 *ies, u32 ies_len, u8 hidden_ssid_mode)
+{
+       u8 *ssid_ie;
+       sint ssid_len_ori;
+       int len_diff = 0;
+       
+       ssid_ie = rtw_get_ie(ies,  WLAN_EID_SSID, &ssid_len_ori, ies_len);
+
+       //DBG_871X("%s hidden_ssid_mode:%u, ssid_ie:%p, ssid_len_ori:%d\n", __FUNCTION__, hidden_ssid_mode, ssid_ie, ssid_len_ori);
+       
+       if(ssid_ie && ssid_len_ori>0)
+       {
+               switch(hidden_ssid_mode)
+               {
+                       case 1:
+                       {
+                               u8 *next_ie = ssid_ie + 2 + ssid_len_ori;
+                               u32 remain_len = 0;
+                               
+                               remain_len = ies_len -(next_ie-ies);
+                               
+                               ssid_ie[1] = 0;                         
+                               _rtw_memcpy(ssid_ie+2, next_ie, remain_len);
+                               len_diff -= ssid_len_ori;
+                               
+                               break;
+                       }               
+                       case 2:
+                               _rtw_memset(&ssid_ie[2], 0, ssid_len_ori);
+                               break;
+                       default:
+                               break;
+               }
+       }
+
+       return len_diff;
+}
+
+static void rtw_hal_construct_P2PBeacon(_adapter *padapter, u8 *pframe, u32 *pLength)
+{
+       //struct xmit_frame     *pmgntframe;
+       //struct pkt_attrib     *pattrib;
+       //unsigned char *pframe;
+       struct rtw_ieee80211_hdr *pwlanhdr;
+       unsigned short *fctrl;
+       unsigned int    rate_len;
+       struct xmit_priv        *pxmitpriv = &(padapter->xmitpriv);
+       u32     pktlen;
+//#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
+//     _irqL irqL;
+//     struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
+//#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
+       struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       WLAN_BSSID_EX           *cur_network = &(pmlmeinfo->network);
+       u8      bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+#ifdef CONFIG_P2P
+       struct wifidirect_info  *pwdinfo = &(padapter->wdinfo);
+#endif //CONFIG_P2P
+
+       //for debug
+       u8 *dbgbuf = pframe;
+       u8 dbgbufLen = 0, index = 0;
+
+       DBG_871X("%s\n", __FUNCTION__);
+//#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
+//     _enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL);
+//#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
+               
+       pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;  
+       
+       
+       fctrl = &(pwlanhdr->frame_ctl);
+       *(fctrl) = 0;
+       
+       _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
+       _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
+       _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN);
+
+       SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/);
+       //pmlmeext->mgnt_seq++;
+       SetFrameSubType(pframe, WIFI_BEACON);
+       
+       pframe += sizeof(struct rtw_ieee80211_hdr_3addr);       
+       pktlen = sizeof (struct rtw_ieee80211_hdr_3addr);
+       
+       if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
+       {
+               //DBG_871X("ie len=%d\n", cur_network->IELength);
+#ifdef CONFIG_P2P
+               // for P2P : Primary Device Type & Device Name
+               u32 wpsielen=0, insert_len=0;
+               u8 *wpsie=NULL;         
+               wpsie = rtw_get_wps_ie(cur_network->IEs+_FIXED_IE_LENGTH_, cur_network->IELength-_FIXED_IE_LENGTH_, NULL, &wpsielen);
+               
+               if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && wpsie && wpsielen>0)
+               {
+                       uint wps_offset, remainder_ielen;
+                       u8 *premainder_ie, *pframe_wscie;
+       
+                       wps_offset = (uint)(wpsie - cur_network->IEs);
+
+                       premainder_ie = wpsie + wpsielen;
+
+                       remainder_ielen = cur_network->IELength - wps_offset - wpsielen;
+
+#ifdef CONFIG_IOCTL_CFG80211
+                       if(pwdinfo->driver_interface == DRIVER_CFG80211 )
+                       {
+                               if(pmlmepriv->wps_beacon_ie && pmlmepriv->wps_beacon_ie_len>0)
+                               {
+                                       _rtw_memcpy(pframe, cur_network->IEs, wps_offset);
+                                       pframe += wps_offset;
+                                       pktlen += wps_offset;
+
+                                       _rtw_memcpy(pframe, pmlmepriv->wps_beacon_ie, pmlmepriv->wps_beacon_ie_len);
+                                       pframe += pmlmepriv->wps_beacon_ie_len;
+                                       pktlen += pmlmepriv->wps_beacon_ie_len;
+
+                                       //copy remainder_ie to pframe
+                                       _rtw_memcpy(pframe, premainder_ie, remainder_ielen);
+                                       pframe += remainder_ielen;              
+                                       pktlen += remainder_ielen;
+                               }
+                               else
+                               {
+                                       _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength);
+                                       pframe += cur_network->IELength;
+                                       pktlen += cur_network->IELength;
+                               }
+                       }
+                       else
+#endif //CONFIG_IOCTL_CFG80211
+                       {
+                               pframe_wscie = pframe + wps_offset;
+                               _rtw_memcpy(pframe, cur_network->IEs, wps_offset+wpsielen);                     
+                               pframe += (wps_offset + wpsielen);              
+                               pktlen += (wps_offset + wpsielen);
+
+                               //now pframe is end of wsc ie, insert Primary Device Type & Device Name
+                               //      Primary Device Type
+                               //      Type:
+                               *(u16*) ( pframe + insert_len) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE );
+                               insert_len += 2;
+                               
+                               //      Length:
+                               *(u16*) ( pframe + insert_len ) = cpu_to_be16( 0x0008 );
+                               insert_len += 2;
+                               
+                               //      Value:
+                               //      Category ID
+                               *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );
+                               insert_len += 2;
+
+                               //      OUI
+                               *(u32*) ( pframe + insert_len ) = cpu_to_be32( WPSOUI );
+                               insert_len += 4;
+
+                               //      Sub Category ID
+                               *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );
+                               insert_len += 2;
+
+
+                               //      Device Name
+                               //      Type:
+                               *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );
+                               insert_len += 2;
+
+                               //      Length:
+                               *(u16*) ( pframe + insert_len ) = cpu_to_be16( pwdinfo->device_name_len );
+                               insert_len += 2;
+
+                               //      Value:
+                               _rtw_memcpy( pframe + insert_len, pwdinfo->device_name, pwdinfo->device_name_len );
+                               insert_len += pwdinfo->device_name_len;
+
+
+                               //update wsc ie length
+                               *(pframe_wscie+1) = (wpsielen -2) + insert_len;
+
+                               //pframe move to end
+                               pframe+=insert_len;
+                               pktlen += insert_len;
+
+                               //copy remainder_ie to pframe
+                               _rtw_memcpy(pframe, premainder_ie, remainder_ielen);
+                               pframe += remainder_ielen;              
+                               pktlen += remainder_ielen;
+                       }
+               }
+               else
+#endif //CONFIG_P2P
+               {
+                       int len_diff;
+                       _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength);
+                       len_diff = update_hidden_ssid(
+                               pframe+_BEACON_IE_OFFSET_
+                               , cur_network->IELength-_BEACON_IE_OFFSET_
+                               , pmlmeinfo->hidden_ssid_mode
+                       );
+                       pframe += (cur_network->IELength+len_diff);
+                       pktlen += (cur_network->IELength+len_diff);
+               }
+#if 0
+               {
+                       u8 *wps_ie;
+                       uint wps_ielen;
+                       u8 sr = 0;
+                       wps_ie = rtw_get_wps_ie(pmgntframe->buf_addr+TXDESC_OFFSET+sizeof (struct rtw_ieee80211_hdr_3addr)+_BEACON_IE_OFFSET_,
+                               pattrib->pktlen-sizeof (struct rtw_ieee80211_hdr_3addr)-_BEACON_IE_OFFSET_, NULL, &wps_ielen);
+                       if (wps_ie && wps_ielen>0) {
+                               rtw_get_wps_attr_content(wps_ie,  wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8*)(&sr), NULL);
+                       }
+                       if (sr != 0)
+                               set_fwstate(pmlmepriv, WIFI_UNDER_WPS);
+                       else
+                               _clr_fwstate_(pmlmepriv, WIFI_UNDER_WPS);
+               }
+#endif 
+#ifdef CONFIG_P2P
+               if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
+               {
+                       u32 len;
+#ifdef CONFIG_IOCTL_CFG80211
+                       if(pwdinfo->driver_interface == DRIVER_CFG80211 )
+                       {
+                               len = pmlmepriv->p2p_beacon_ie_len;
+                               if(pmlmepriv->p2p_beacon_ie && len>0)                           
+                                       _rtw_memcpy(pframe, pmlmepriv->p2p_beacon_ie, len);
+                       }
+                       else
+#endif //CONFIG_IOCTL_CFG80211
+                       {
+                               len = build_beacon_p2p_ie(pwdinfo, pframe);
+                       }
+
+                       pframe += len;
+                       pktlen += len;
+#ifdef CONFIG_WFD
+#ifdef CONFIG_IOCTL_CFG80211
+                       if(_TRUE == pwdinfo->wfd_info->wfd_enable)
+#endif //CONFIG_IOCTL_CFG80211
+                       {
+                       len = build_beacon_wfd_ie( pwdinfo, pframe );
+                       }
+#ifdef CONFIG_IOCTL_CFG80211
+                       else
+                       {       
+                               len = 0;
+                               if(pmlmepriv->wfd_beacon_ie && pmlmepriv->wfd_beacon_ie_len>0)
+                               {
+                                       len = pmlmepriv->wfd_beacon_ie_len;
+                                       _rtw_memcpy(pframe, pmlmepriv->wfd_beacon_ie, len);     
+                               }
+                       }               
+#endif //CONFIG_IOCTL_CFG80211
+                       pframe += len;
+                       pktlen += len;
+#endif //CONFIG_WFD
+               }
+#endif //CONFIG_P2P
+
+               goto _issue_bcn;
+
+       }
+
+       //below for ad-hoc mode
+
+       //timestamp will be inserted by hardware
+       pframe += 8;
+       pktlen += 8;
+
+       // beacon interval: 2 bytes
+
+       _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); 
+
+       pframe += 2;
+       pktlen += 2;
+
+       // capability info: 2 bytes
+
+       _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2);
+
+       pframe += 2;
+       pktlen += 2;
+
+       // SSID
+       pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen);
+
+       // supported rates...
+       rate_len = rtw_get_rateset_len(cur_network->SupportedRates);
+       pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pktlen);
+
+       // DS parameter set
+       pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pktlen);
+
+       //if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)
+       {
+               u8 erpinfo=0;
+               u32 ATIMWindow;
+               // IBSS Parameter Set...
+               //ATIMWindow = cur->Configuration.ATIMWindow;
+               ATIMWindow = 0;
+               pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen);
+
+               //ERP IE
+               pframe = rtw_set_ie(pframe, _ERPINFO_IE_, 1, &erpinfo, &pktlen);
+       }       
+
+
+       // EXTERNDED SUPPORTED RATE
+       if (rate_len > 8)
+       {
+               pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen);
+       }
+
+
+       //todo:HT for adhoc
+
+_issue_bcn:
+
+//#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
+//     pmlmepriv->update_bcn = _FALSE;
+//     
+//     _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL);  
+//#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
+
+       *pLength = pktlen;
+#if 0
+       // printf dbg msg
+       dbgbufLen = pktlen;
+       DBG_871X("======> DBG MSG FOR CONSTRAUCT P2P BEACON\n");
+
+       for(index=0;index<dbgbufLen;index++)
+               printk("%x ",*(dbgbuf+index));
+
+       printk("\n");
+       DBG_871X("<====== DBG MSG FOR CONSTRAUCT P2P BEACON\n");
+       
+#endif
+}
+
+static int get_reg_classes_full_count(struct p2p_channels channel_list) {
+       int cnt = 0;
+       int i;
+
+       for (i = 0; i < channel_list.reg_classes; i++) {
+               cnt += channel_list.reg_class[i].channels;
+       }
+
+       return cnt;
+}
+
+static void rtw_hal_construct_P2PProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength)
+{
+       //struct xmit_frame                     *pmgntframe;
+       //struct pkt_attrib                     *pattrib;
+       //unsigned char                                 *pframe;
+       struct rtw_ieee80211_hdr        *pwlanhdr;
+       unsigned short                          *fctrl; 
+       unsigned char                                   *mac;
+       struct xmit_priv        *pxmitpriv = &(padapter->xmitpriv);
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
+       //WLAN_BSSID_EX                 *cur_network = &(pmlmeinfo->network);
+       u16                                     beacon_interval = 100;
+       u16                                     capInfo = 0;
+       struct wifidirect_info  *pwdinfo = &(padapter->wdinfo);
+       u8                                      wpsie[255] = { 0x00 };
+       u32                                     wpsielen = 0, p2pielen = 0;
+       u32                                     pktlen;
+#ifdef CONFIG_WFD
+       u32                                     wfdielen = 0;
+#endif //CONFIG_WFD
+#ifdef CONFIG_INTEL_WIDI
+       u8 zero_array_check[L2SDTA_SERVICE_VE_LEN] = { 0x00 };
+#endif //CONFIG_INTEL_WIDI
+
+       //for debug
+       u8 *dbgbuf = pframe;
+       u8 dbgbufLen = 0, index = 0;
+
+       DBG_871X("%s\n", __FUNCTION__);
+       pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;  
+       
+       mac = myid(&(padapter->eeprompriv));
+       
+       fctrl = &(pwlanhdr->frame_ctl);
+       *(fctrl) = 0;
+
+       //DA filled by FW
+       _rtw_memset(pwlanhdr->addr1, 0, ETH_ALEN);
+       _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);
+       
+       //      Use the device address for BSSID field. 
+       _rtw_memcpy(pwlanhdr->addr3, mac, ETH_ALEN);
+
+       SetSeqNum(pwlanhdr, 0);
+       SetFrameSubType(fctrl, WIFI_PROBERSP);
+
+       pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
+       pframe += pktlen;
+
+
+       //timestamp will be inserted by hardware
+       pframe += 8;
+       pktlen += 8;
+
+       // beacon interval: 2 bytes
+       _rtw_memcpy(pframe, (unsigned char *) &beacon_interval, 2); 
+       pframe += 2;
+       pktlen += 2;
+
+       //      capability info: 2 bytes
+       //      ESS and IBSS bits must be 0 (defined in the 3.1.2.1.1 of WiFi Direct Spec)
+       capInfo |= cap_ShortPremble;
+       capInfo |= cap_ShortSlot;
+       
+       _rtw_memcpy(pframe, (unsigned char *) &capInfo, 2);
+       pframe += 2;
+       pktlen += 2;
+
+
+       // SSID
+       pframe = rtw_set_ie(pframe, _SSID_IE_, 7, pwdinfo->p2p_wildcard_ssid, &pktlen);
+
+       // supported rates...
+       //      Use the OFDM rate in the P2P probe response frame. ( 6(B), 9(B), 12, 18, 24, 36, 48, 54 )
+       pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pktlen);
+
+       // DS parameter set
+       pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&pwdinfo->listen_channel, &pktlen);
+
+#ifdef CONFIG_IOCTL_CFG80211
+       if(pwdinfo->driver_interface == DRIVER_CFG80211 )
+       {
+               if( pmlmepriv->wps_probe_resp_ie != NULL && pmlmepriv->p2p_probe_resp_ie != NULL )
+               {
+                       //WPS IE
+                       _rtw_memcpy(pframe, pmlmepriv->wps_probe_resp_ie, pmlmepriv->wps_probe_resp_ie_len);
+                       pktlen += pmlmepriv->wps_probe_resp_ie_len;
+                       pframe += pmlmepriv->wps_probe_resp_ie_len;
+
+                       //P2P IE
+                       _rtw_memcpy(pframe, pmlmepriv->p2p_probe_resp_ie, pmlmepriv->p2p_probe_resp_ie_len);
+                       pktlen += pmlmepriv->p2p_probe_resp_ie_len;
+                       pframe += pmlmepriv->p2p_probe_resp_ie_len;
+               }
+       }
+       else
+#endif //CONFIG_IOCTL_CFG80211         
+       {
+
+               //      Todo: WPS IE
+               //      Noted by Albert 20100907
+               //      According to the WPS specification, all the WPS attribute is presented by Big Endian.
+
+               wpsielen = 0;
+               //      WPS OUI
+               *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );
+               wpsielen += 4;
+
+               //      WPS version
+               //      Type:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );
+               wpsielen += 2;
+
+               //      Length:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
+               wpsielen += 2;
+
+               //      Value:
+               wpsie[wpsielen++] = WPS_VERSION_1;      //      Version 1.0
+
+#ifdef CONFIG_INTEL_WIDI
+               //      Commented by Kurt
+               //      Appended WiDi info. only if we did issued_probereq_widi(), and then we saved ven. ext. in pmlmepriv->sa_ext.
+               if(  _rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE 
+                       || pmlmepriv->num_p2p_sdt != 0 )
+               {
+                       //Sec dev type
+                       *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SEC_DEV_TYPE_LIST );
+                       wpsielen += 2;
+
+                       //      Length:
+                       *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 );
+                       wpsielen += 2;
+
+                       //      Value:
+                       //      Category ID
+                       *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_DISPLAYS );
+                       wpsielen += 2;
+
+                       //      OUI
+                       *(u32*) ( wpsie + wpsielen ) = cpu_to_be32( INTEL_DEV_TYPE_OUI );
+                       wpsielen += 4;
+
+                       *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_WIDI_CONSUMER_SINK );
+                       wpsielen += 2;
+
+                       if(  _rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE )
+                       {
+                               //      Vendor Extension
+                               _rtw_memcpy( wpsie + wpsielen, pmlmepriv->sa_ext, L2SDTA_SERVICE_VE_LEN );
+                               wpsielen += L2SDTA_SERVICE_VE_LEN;
+                       }
+               }
+#endif //CONFIG_INTEL_WIDI
+
+               //      WiFi Simple Config State
+               //      Type:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SIMPLE_CONF_STATE );
+               wpsielen += 2;
+
+               //      Length:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
+               wpsielen += 2;
+
+               //      Value:
+               wpsie[wpsielen++] = WPS_WSC_STATE_NOT_CONFIG;   //      Not Configured.
+
+               //      Response Type
+               //      Type:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_RESP_TYPE );
+               wpsielen += 2;
+
+               //      Length:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
+               wpsielen += 2;
+
+               //      Value:
+               wpsie[wpsielen++] = WPS_RESPONSE_TYPE_8021X;
+
+               //      UUID-E
+               //      Type:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_UUID_E );
+               wpsielen += 2;
+
+               //      Length:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0010 );
+               wpsielen += 2;
+
+               //      Value:
+               if (pwdinfo->external_uuid == 0) {
+                       _rtw_memset( wpsie + wpsielen, 0x0, 16 );
+                       _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN );
+               } else {
+                       _rtw_memcpy( wpsie + wpsielen, pwdinfo->uuid, 0x10 );
+               }
+               wpsielen += 0x10;
+
+               //      Manufacturer
+               //      Type:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MANUFACTURER );
+               wpsielen += 2;
+
+               //      Length:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0007 );
+               wpsielen += 2;
+
+               //      Value:
+               _rtw_memcpy( wpsie + wpsielen, "Realtek", 7 );
+               wpsielen += 7;
+
+               //      Model Name
+               //      Type:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NAME );
+               wpsielen += 2;
+
+               //      Length:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0006 );
+               wpsielen += 2;  
+
+               //      Value:
+               _rtw_memcpy( wpsie + wpsielen, "8192CU", 6 );
+               wpsielen += 6;
+
+               //      Model Number
+               //      Type:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NUMBER );
+               wpsielen += 2;
+
+               //      Length:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
+               wpsielen += 2;
+
+               //      Value:
+               wpsie[ wpsielen++ ] = 0x31;             //      character 1
+
+               //      Serial Number
+               //      Type:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SERIAL_NUMBER );
+               wpsielen += 2;
+
+               //      Length:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( ETH_ALEN );
+               wpsielen += 2;
+
+               //      Value:
+               _rtw_memcpy( wpsie + wpsielen, "123456" , ETH_ALEN );
+               wpsielen += ETH_ALEN;
+
+               //      Primary Device Type
+               //      Type:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE );
+               wpsielen += 2;
+
+               //      Length:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 );
+               wpsielen += 2;
+
+               //      Value:
+               //      Category ID
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );
+               wpsielen += 2;
+
+               //      OUI
+               *(u32*) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI );
+               wpsielen += 4;
+
+               //      Sub Category ID
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );
+               wpsielen += 2;
+
+               //      Device Name
+               //      Type:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );
+               wpsielen += 2;
+
+               //      Length:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len );
+               wpsielen += 2;
+
+               //      Value:
+               _rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len );
+               wpsielen += pwdinfo->device_name_len;
+
+               //      Config Method
+               //      Type:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD );
+               wpsielen += 2;
+
+               //      Length:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );
+               wpsielen += 2;
+
+               //      Value:
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->supported_wps_cm );
+               wpsielen += 2;
+               
+
+               pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pktlen );
+               
+
+               p2pielen = build_probe_resp_p2p_ie(pwdinfo, pframe);
+               pframe += p2pielen;
+               pktlen += p2pielen;
+       }
+
+#ifdef CONFIG_WFD
+#ifdef CONFIG_IOCTL_CFG80211
+       if ( _TRUE == pwdinfo->wfd_info->wfd_enable )
+#endif //CONFIG_IOCTL_CFG80211
+       {
+               wfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 0);
+               pframe += wfdielen;
+               pktlen += wfdielen;
+       }
+#ifdef CONFIG_IOCTL_CFG80211
+       else if (pmlmepriv->wfd_probe_resp_ie != NULL && pmlmepriv->wfd_probe_resp_ie_len>0)
+       {
+               //WFD IE
+               _rtw_memcpy(pframe, pmlmepriv->wfd_probe_resp_ie, pmlmepriv->wfd_probe_resp_ie_len);
+               pktlen += pmlmepriv->wfd_probe_resp_ie_len;
+               pframe += pmlmepriv->wfd_probe_resp_ie_len;             
+       }
+#endif //CONFIG_IOCTL_CFG80211
+#endif //CONFIG_WFD    
+
+       *pLength = pktlen;
+
+#if 0
+       // printf dbg msg
+       dbgbufLen = pktlen;
+       DBG_871X("======> DBG MSG FOR CONSTRAUCT P2P Probe Rsp\n");
+
+       for(index=0;index<dbgbufLen;index++)
+               printk("%x ",*(dbgbuf+index));
+
+       printk("\n");
+       DBG_871X("<====== DBG MSG FOR CONSTRAUCT P2P Probe Rsp\n");
+#endif
+}
+static void rtw_hal_construct_P2PNegoRsp(_adapter *padapter, u8 *pframe, u32 *pLength)
+{
+       unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
+       u8                      action = P2P_PUB_ACTION_ACTION;
+       u32                     p2poui = cpu_to_be32(P2POUI);
+       u8                      oui_subtype = P2P_GO_NEGO_RESP;
+       u8                      wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 };
+       u8                      p2pielen = 0, i;
+       uint                    wpsielen = 0;
+       u16                     wps_devicepassword_id = 0x0000;
+       uint                    wps_devicepassword_id_len = 0;
+       u8                      channel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh;
+       u16                     len_channellist_attr = 0;
+       u32                     pktlen;
+       u8                      dialogToken = 0;
+       
+       //struct xmit_frame                     *pmgntframe;
+       //struct pkt_attrib                     *pattrib;
+       //unsigned char                                 *pframe;
+       struct rtw_ieee80211_hdr        *pwlanhdr;
+       unsigned short                          *fctrl;
+       struct xmit_priv                        *pxmitpriv = &(padapter->xmitpriv);
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       struct wifidirect_info  *pwdinfo = &( padapter->wdinfo);
+       //WLAN_BSSID_EX                 *cur_network = &(pmlmeinfo->network);
+
+#ifdef CONFIG_WFD
+       u32                                     wfdielen = 0;
+#endif //CONFIG_WFD
+
+       //for debug
+       u8 *dbgbuf = pframe;
+       u8 dbgbufLen = 0, index = 0;
+
+       DBG_871X( "%s\n", __FUNCTION__);
+       pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
+
+       fctrl = &(pwlanhdr->frame_ctl);
+       *(fctrl) = 0;
+
+       //RA, filled by FW
+       _rtw_memset(pwlanhdr->addr1, 0, ETH_ALEN);
+       _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
+       _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN);
+
+       SetSeqNum(pwlanhdr, 0);
+       SetFrameSubType(pframe, WIFI_ACTION);
+
+       pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
+       pframe += pktlen;
+
+       pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pktlen));
+       pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pktlen));
+       pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pktlen));
+       pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pktlen));        
+       
+       //dialog token, filled by FW
+       pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pktlen));
+
+       _rtw_memset( wpsie, 0x00, 255 );
+       wpsielen = 0;
+
+       //      WPS Section
+       wpsielen = 0;
+       //      WPS OUI
+       *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );
+       wpsielen += 4;
+
+       //      WPS version
+       //      Type:
+       *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );
+       wpsielen += 2;
+
+       //      Length:
+       *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
+       wpsielen += 2;
+
+       //      Value:
+       wpsie[wpsielen++] = WPS_VERSION_1;      //      Version 1.0
+
+       //      Device Password ID
+       //      Type:
+       *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID );
+       wpsielen += 2;
+
+       //      Length:
+       *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );
+       wpsielen += 2;
+
+       //      Value:
+       if ( wps_devicepassword_id == WPS_DPID_USER_SPEC )
+       {
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC );
+       }
+       else if ( wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC )
+       {
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_USER_SPEC );
+       }
+       else
+       {
+               *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_PBC );
+       }
+       wpsielen += 2;
+
+       pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pktlen );
+
+
+       //      P2P IE Section.
+
+       //      P2P OUI
+       p2pielen = 0;
+       p2pie[ p2pielen++ ] = 0x50;
+       p2pie[ p2pielen++ ] = 0x6F;
+       p2pie[ p2pielen++ ] = 0x9A;
+       p2pie[ p2pielen++ ] = 0x09;     //      WFA P2P v1.0
+
+       //      Commented by Albert 20100908
+       //      According to the P2P Specification, the group negoitation response frame should contain 9 P2P attributes
+       //      1. Status
+       //      2. P2P Capability
+       //      3. Group Owner Intent
+       //      4. Configuration Timeout
+       //      5. Operating Channel
+       //      6. Intended P2P Interface Address
+       //      7. Channel List
+       //      8. Device Info
+       //      9. Group ID     ( Only GO )
+
+
+       //      ToDo:
+
+       //      P2P Status
+       //      Type:
+       p2pie[ p2pielen++ ] = P2P_ATTR_STATUS;
+
+       //      Length:
+       *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );
+       p2pielen += 2;
+
+       //      Value, filled by FW
+       p2pie[ p2pielen++ ] = 1;
+       
+       //      P2P Capability
+       //      Type:
+       p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;
+
+       //      Length:
+       *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
+       p2pielen += 2;
+
+       //      Value:
+       //      Device Capability Bitmap, 1 byte
+
+       if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) )
+       {
+               //      Commented by Albert 2011/03/08
+               //      According to the P2P specification
+               //      if the sending device will be client, the P2P Capability should be reserved of group negotation response frame
+               p2pie[ p2pielen++ ] = 0;
+       }
+       else
+       {
+               //      Be group owner or meet the error case
+               p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;
+       }
+       
+       //      Group Capability Bitmap, 1 byte
+       if ( pwdinfo->persistent_supported )
+       {
+               p2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP;
+       }
+       else
+       {
+               p2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN;
+       }
+
+       //      Group Owner Intent
+       //      Type:
+       p2pie[ p2pielen++ ] = P2P_ATTR_GO_INTENT;
+
+       //      Length:
+       *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );
+       p2pielen += 2;
+
+       //      Value:
+       if ( pwdinfo->peer_intent & 0x01 )
+       {
+               //      Peer's tie breaker bit is 1, our tie breaker bit should be 0
+               p2pie[ p2pielen++ ] = ( pwdinfo->intent << 1 );
+       }
+       else
+       {
+               //      Peer's tie breaker bit is 0, our tie breaker bit should be 1
+               p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) | BIT(0) );
+       }
+
+
+       //      Configuration Timeout
+       //      Type:
+       p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT;
+
+       //      Length:
+       *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
+       p2pielen += 2;
+
+       //      Value:
+       p2pie[ p2pielen++ ] = 200;      //      2 seconds needed to be the P2P GO
+       p2pie[ p2pielen++ ] = 200;      //      2 seconds needed to be the P2P Client
+
+       //      Operating Channel
+       //      Type:
+       p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;
+
+       //      Length:
+       *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );
+       p2pielen += 2;
+
+       //      Value:
+       //      Country String
+       p2pie[ p2pielen++ ] = 'X';
+       p2pie[ p2pielen++ ] = 'X';
+       
+       //      The third byte should be set to 0x04.
+       //      Described in the "Operating Channel Attribute" section.
+       p2pie[ p2pielen++ ] = 0x04;
+
+       //      Operating Class
+       if ( pwdinfo->operating_channel <= 14 )
+       {
+               //      Operating Class
+               p2pie[ p2pielen++ ] = 0x51;
+       }
+       else if ( ( pwdinfo->operating_channel >= 36 ) && ( pwdinfo->operating_channel <= 48 ) )
+       {
+               //      Operating Class
+               p2pie[ p2pielen++ ] = 0x73;
+       }
+       else
+       {
+               //      Operating Class
+               p2pie[ p2pielen++ ] = 0x7c;
+       }
+       
+       //      Channel Number
+       p2pie[ p2pielen++ ] = pwdinfo->operating_channel;       //      operating channel number
+
+       //      Intended P2P Interface Address  
+       //      Type:
+       p2pie[ p2pielen++ ] = P2P_ATTR_INTENTED_IF_ADDR;
+
+       //      Length:
+       *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN );
+       p2pielen += 2;
+
+       //      Value:
+       _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN );
+       p2pielen += ETH_ALEN;
+
+       //      Channel List
+       //      Type:
+       p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST;
+
+       // Country String(3)
+       // + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?)
+       // + number of channels in all classes
+       len_channellist_attr = 3
+          + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes
+          + get_reg_classes_full_count(pmlmeext->channel_list);
+
+#ifdef CONFIG_CONCURRENT_MODE
+       if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
+       {
+               *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 );
+       }
+       else
+       {
+               *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );
+       }
+#else
+
+       *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );
+
+ #endif
+       p2pielen += 2;
+
+       //      Value:
+       //      Country String
+       p2pie[ p2pielen++ ] = 'X';
+       p2pie[ p2pielen++ ] = 'X';
+       
+       //      The third byte should be set to 0x04.
+       //      Described in the "Operating Channel Attribute" section.
+       p2pie[ p2pielen++ ] = 0x04;
+
+       //      Channel Entry List
+
+#ifdef CONFIG_CONCURRENT_MODE
+       if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
+       {
+               _adapter *pbuddy_adapter = padapter->pbuddy_adapter;    
+               struct mlme_ext_priv    *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
+
+               //      Operating Class
+               if ( pbuddy_mlmeext->cur_channel > 14 )
+               {
+                       if ( pbuddy_mlmeext->cur_channel >= 149 )
+                       {
+                               p2pie[ p2pielen++ ] = 0x7c;
+                       }
+                       else
+                       {
+                               p2pie[ p2pielen++ ] = 0x73;
+                       }
+               }
+               else
+               {
+                       p2pie[ p2pielen++ ] = 0x51;
+               }
+
+               //      Number of Channels
+               //      Just support 1 channel and this channel is AP's channel
+               p2pie[ p2pielen++ ] = 1;
+
+               //      Channel List
+               p2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel;
+       }
+       else
+       {
+               int i, j;
+               for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
+                       //      Operating Class
+                       p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
+
+                       //      Number of Channels
+                       p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
+
+                       //      Channel List
+                       for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
+                               p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
+                       }
+               }
+       }
+#else // CONFIG_CONCURRENT_MODE
+       {
+               int i, j;
+               for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
+                       //      Operating Class
+                       p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
+
+                       //      Number of Channels
+                       p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
+
+                       //      Channel List
+                       for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
+                               p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
+                       }
+               }
+       }
+#endif // CONFIG_CONCURRENT_MODE
+
+       
+       //      Device Info
+       //      Type:
+       p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;
+
+       //      Length:
+       //      21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) 
+       //      + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes)
+       *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len );
+       p2pielen += 2;
+
+       //      Value:
+       //      P2P Device Address
+       _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN );
+       p2pielen += ETH_ALEN;
+
+       //      Config Method
+       //      This field should be big endian. Noted by P2P specification.
+
+       *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm );
+
+       p2pielen += 2;
+
+       //      Primary Device Type
+       //      Category ID
+       *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );
+       p2pielen += 2;
+
+       //      OUI
+       *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI );
+       p2pielen += 4;
+
+       //      Sub Category ID
+       *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );
+       p2pielen += 2;
+
+       //      Number of Secondary Device Types
+       p2pie[ p2pielen++ ] = 0x00;     //      No Secondary Device Type List
+
+       //      Device Name
+       //      Type:
+       *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );
+       p2pielen += 2;
+
+       //      Length:
+       *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len );
+       p2pielen += 2;
+
+       //      Value:
+       _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len );
+       p2pielen += pwdinfo->device_name_len;   
+       
+       if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) )
+       {
+               //      Group ID Attribute
+               //      Type:
+               p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID;
+
+               //      Length:
+               *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + pwdinfo->nego_ssidlen );
+               p2pielen += 2;
+
+               //      Value:
+               //      p2P Device Address
+               _rtw_memcpy( p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN );
+               p2pielen += ETH_ALEN;
+
+               //      SSID
+               _rtw_memcpy( p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen );
+               p2pielen += pwdinfo->nego_ssidlen;
+               
+       }
+       
+       pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pktlen ); 
+       
+#ifdef CONFIG_WFD
+       wfdielen = build_nego_resp_wfd_ie(pwdinfo, pframe);
+       pframe += wfdielen;
+       pktlen += wfdielen;
+#endif //CONFIG_WFD
+       
+       *pLength = pktlen;
+#if 0
+       // printf dbg msg
+       dbgbufLen = pktlen;
+       DBG_871X("======> DBG MSG FOR CONSTRAUCT Nego Rsp\n");
+
+       for(index=0;index<dbgbufLen;index++)
+               printk("%x ",*(dbgbuf+index));
+       
+       printk("\n");
+       DBG_871X("<====== DBG MSG FOR CONSTRAUCT Nego Rsp\n");
+#endif
+}
+
+static void rtw_hal_construct_P2PInviteRsp(_adapter * padapter, u8 * pframe, u32 * pLength)
+{
+       unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
+       u8                      action = P2P_PUB_ACTION_ACTION;
+       u32                     p2poui = cpu_to_be32(P2POUI);
+       u8                      oui_subtype = P2P_INVIT_RESP;
+       u8                      p2pie[ 255 ] = { 0x00 };
+       u8                      p2pielen = 0, i;
+       u8                      channel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh = 0;
+       u16                     len_channellist_attr = 0;
+       u32                     pktlen;
+       u8                      dialogToken = 0;
+#ifdef CONFIG_CONCURRENT_MODE
+       _adapter                                *pbuddy_adapter = padapter->pbuddy_adapter;
+       struct wifidirect_info  *pbuddy_wdinfo = &pbuddy_adapter->wdinfo;
+       struct mlme_priv                *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;
+       struct mlme_ext_priv    *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
+#endif 
+#ifdef CONFIG_WFD
+       u32                                     wfdielen = 0;
+#endif //CONFIG_WFD
+       
+       //struct xmit_frame                     *pmgntframe;
+       //struct pkt_attrib                     *pattrib;
+       //unsigned char                                 *pframe;
+       struct rtw_ieee80211_hdr        *pwlanhdr;
+       unsigned short                          *fctrl;
+       struct xmit_priv                        *pxmitpriv = &(padapter->xmitpriv);
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       struct wifidirect_info  *pwdinfo = &( padapter->wdinfo);
+
+       //for debug
+       u8 *dbgbuf = pframe;
+       u8 dbgbufLen = 0, index = 0;
+
+
+       DBG_871X( "%s\n", __FUNCTION__);
+       pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
+
+       fctrl = &(pwlanhdr->frame_ctl);
+       *(fctrl) = 0;
+
+       //RA fill by FW
+       _rtw_memset(pwlanhdr->addr1, 0, ETH_ALEN);
+       _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
+
+       //BSSID fill by FW
+       _rtw_memset(pwlanhdr->addr3, 0, ETH_ALEN);
+
+       SetSeqNum(pwlanhdr, 0);
+       SetFrameSubType(pframe, WIFI_ACTION);
+
+       pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
+       pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
+
+       pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pktlen));
+       pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pktlen));
+       pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pktlen));
+       pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pktlen));        
+
+       //dialog token, filled by FW
+       pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pktlen));
+
+       //      P2P IE Section.
+
+       //      P2P OUI
+       p2pielen = 0;
+       p2pie[ p2pielen++ ] = 0x50;
+       p2pie[ p2pielen++ ] = 0x6F;
+       p2pie[ p2pielen++ ] = 0x9A;
+       p2pie[ p2pielen++ ] = 0x09;     //      WFA P2P v1.0
+
+       //      Commented by Albert 20101005
+       //      According to the P2P Specification, the P2P Invitation response frame should contain 5 P2P attributes
+       //      1. Status
+       //      2. Configuration Timeout
+       //      3. Operating Channel    ( Only GO )
+       //      4. P2P Group BSSID      ( Only GO )
+       //      5. Channel List
+
+       //      P2P Status
+       //      Type:
+       p2pie[ p2pielen++ ] = P2P_ATTR_STATUS;
+
+       //      Length:
+       *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );
+       p2pielen += 2;
+
+       //      Value: filled by FW, defult value is FAIL INFO UNAVAILABLE
+       p2pie[ p2pielen++ ] = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
+       
+       //      Configuration Timeout
+       //      Type:
+       p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT;
+
+       //      Length:
+       *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );
+       p2pielen += 2;
+
+       //      Value:
+       p2pie[ p2pielen++ ] = 200;      //      2 seconds needed to be the P2P GO
+       p2pie[ p2pielen++ ] = 200;      //      2 seconds needed to be the P2P Client
+
+       // due to defult value is FAIL INFO UNAVAILABLE, so the following IE is not needed
+#if 0 
+       if( status_code == P2P_STATUS_SUCCESS )
+       {
+               if( rtw_p2p_chk_role( pwdinfo, P2P_ROLE_GO ) )
+               {
+                       //      The P2P Invitation request frame asks this Wi-Fi device to be the P2P GO
+                       //      In this case, the P2P Invitation response frame should carry the two more P2P attributes.
+                       //      First one is operating channel attribute.
+                       //      Second one is P2P Group BSSID attribute.
+
+                       //      Operating Channel
+                       //      Type:
+                       p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;
+
+                       //      Length:
+                       *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );
+                       p2pielen += 2;
+
+                       //      Value:
+                       //      Country String
+                       p2pie[ p2pielen++ ] = 'X';
+                       p2pie[ p2pielen++ ] = 'X';
+               
+                       //      The third byte should be set to 0x04.
+                       //      Described in the "Operating Channel Attribute" section.
+                       p2pie[ p2pielen++ ] = 0x04;
+
+                       //      Operating Class
+                       p2pie[ p2pielen++ ] = 0x51;     //      Copy from SD7
+               
+                       //      Channel Number
+                       p2pie[ p2pielen++ ] = pwdinfo->operating_channel;       //      operating channel number
+                       
+
+                       //      P2P Group BSSID
+                       //      Type:
+                       p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_BSSID;
+
+                       //      Length:
+                       *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN );
+                       p2pielen += 2;
+
+                       //      Value:
+                       //      P2P Device Address for GO
+                       _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN );
+                       p2pielen += ETH_ALEN;
+
+               }
+
+               //      Channel List
+               //      Type:
+               p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST;
+
+               //      Length:
+               // Country String(3)
+               // + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?)
+               // + number of channels in all classes
+               len_channellist_attr = 3
+                       + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes
+                       + get_reg_classes_full_count(pmlmeext->channel_list);
+
+#ifdef CONFIG_CONCURRENT_MODE
+               if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
+               {
+                       *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 );
+               }
+               else
+               {
+                       *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );
+               }
+#else
+
+               *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );
+
+#endif
+               p2pielen += 2;
+
+               //      Value:
+               //      Country String
+               p2pie[ p2pielen++ ] = 'X';
+               p2pie[ p2pielen++ ] = 'X';
+
+               //      The third byte should be set to 0x04.
+               //      Described in the "Operating Channel Attribute" section.
+               p2pie[ p2pielen++ ] = 0x04;
+
+               //      Channel Entry List
+#ifdef CONFIG_CONCURRENT_MODE
+               if ( check_buddy_fwstate(padapter, _FW_LINKED ) )
+               {
+                       _adapter *pbuddy_adapter = padapter->pbuddy_adapter;    
+                       struct mlme_ext_priv    *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
+
+                       //      Operating Class
+                       if ( pbuddy_mlmeext->cur_channel > 14 )
+                       {
+                               if ( pbuddy_mlmeext->cur_channel >= 149 )
+                               {
+                                       p2pie[ p2pielen++ ] = 0x7c;
+                               }
+                               else
+                               {
+                                       p2pie[ p2pielen++ ] = 0x73;
+                               }
+                       }
+                       else
+                       {
+                               p2pie[ p2pielen++ ] = 0x51;
+                       }
+
+                       //      Number of Channels
+                       //      Just support 1 channel and this channel is AP's channel
+                       p2pie[ p2pielen++ ] = 1;
+
+                       //      Channel List
+                       p2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel;
+               }
+               else
+               {
+                       int i, j;
+                       for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
+                               //      Operating Class
+                               p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
+
+                               //      Number of Channels
+                               p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
+
+                               //      Channel List
+                               for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
+                                       p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
+                               }
+                       }
+               }
+#else // CONFIG_CONCURRENT_MODE
+               {
+                       int i, j;
+                       for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
+                               //      Operating Class
+                               p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
+
+                               //      Number of Channels
+                               p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
+
+                               //      Channel List
+                               for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
+                                       p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
+                               }
+                       }
+               }
+#endif // CONFIG_CONCURRENT_MODE
+       }
+#endif
+
+       pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pktlen ); 
+       
+#ifdef CONFIG_WFD
+       wfdielen = build_invitation_resp_wfd_ie(pwdinfo, pframe);
+       pframe += wfdielen;
+       pktlen += wfdielen;
+#endif //CONFIG_WFD
+
+       *pLength = pktlen;
+
+#if 0
+       // printf dbg msg
+       dbgbufLen = pktlen;
+       DBG_871X("======> DBG MSG FOR CONSTRAUCT Invite Rsp\n");
+
+       for(index=0;index<dbgbufLen;index++)
+               printk("%x ",*(dbgbuf+index));
+       
+       printk("\n");
+       DBG_871X("<====== DBG MSG FOR CONSTRAUCT Invite Rsp\n");
+#endif
+}
+
+
+static void rtw_hal_construct_P2PProvisionDisRsp(_adapter * padapter, u8 * pframe, u32 * pLength)
+{
+       unsigned char category = RTW_WLAN_CATEGORY_PUBLIC;
+       u8                      action = P2P_PUB_ACTION_ACTION;
+       u8                      dialogToken = 0;        
+       u32                     p2poui = cpu_to_be32(P2POUI);
+       u8                      oui_subtype = P2P_PROVISION_DISC_RESP;
+       u8                      wpsie[ 100 ] = { 0x00 };
+       u8                      wpsielen = 0;
+       u32                     pktlen;
+#ifdef CONFIG_WFD
+       u32                                     wfdielen = 0;
+#endif //CONFIG_WFD            
+       
+       //struct xmit_frame                     *pmgntframe;
+       //struct pkt_attrib                     *pattrib;
+       //unsigned char                                 *pframe;
+       struct rtw_ieee80211_hdr        *pwlanhdr;
+       unsigned short                          *fctrl;
+       struct xmit_priv                        *pxmitpriv = &(padapter->xmitpriv);
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       struct wifidirect_info  *pwdinfo = &( padapter->wdinfo);
+
+       //for debug
+       u8 *dbgbuf = pframe;
+       u8 dbgbufLen = 0, index = 0;
+
+       DBG_871X( "%s\n", __FUNCTION__);
+
+       pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
+
+       fctrl = &(pwlanhdr->frame_ctl);
+       *(fctrl) = 0;
+
+       //RA filled by FW
+       _rtw_memset(pwlanhdr->addr1, 0, ETH_ALEN);
+       _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
+       _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN);
+
+       SetSeqNum(pwlanhdr,0);
+       SetFrameSubType(pframe, WIFI_ACTION);
+
+       pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
+       pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
+
+       pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pktlen));
+       pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pktlen));
+       pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pktlen));
+       pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pktlen));        
+       //dialog token, filled by FW
+       pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pktlen));                
+
+       wpsielen = 0;
+       //      WPS OUI
+       //*(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );
+       RTW_PUT_BE32(wpsie, WPSOUI);
+       wpsielen += 4;
+
+#if 0
+       //      WPS version
+       //      Type:
+       *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );
+       wpsielen += 2;
+
+       //      Length:
+       *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );
+       wpsielen += 2;
+
+       //      Value:
+       wpsie[wpsielen++] = WPS_VERSION_1;      //      Version 1.0
+#endif
+
+       //      Config Method
+       //      Type:
+       //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD );
+       RTW_PUT_BE16(wpsie + wpsielen, WPS_ATTR_CONF_METHOD);
+       wpsielen += 2;
+
+       //      Length:
+       //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );
+       RTW_PUT_BE16(wpsie + wpsielen, 0x0002);
+       wpsielen += 2;
+
+       //      Value: filled by FW, default value is PBC
+       //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( config_method );
+       RTW_PUT_BE16(wpsie + wpsielen, WPS_CM_PUSH_BUTTON);
+       wpsielen += 2;
+
+       pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pktlen ); 
+
+#ifdef CONFIG_WFD
+       wfdielen = build_provdisc_resp_wfd_ie(pwdinfo, pframe);
+       pframe += wfdielen;
+       pktlen += wfdielen;
+#endif //CONFIG_WFD
+
+       *pLength = pktlen;
+
+       // printf dbg msg
+#if 0
+       dbgbufLen = pktlen;
+       DBG_871X("======> DBG MSG FOR CONSTRAUCT  ProvisionDis Rsp\n");
+
+       for(index=0;index<dbgbufLen;index++)
+               printk("%x ",*(dbgbuf+index));
+
+       printk("\n");
+       DBG_871X("<====== DBG MSG FOR CONSTRAUCT ProvisionDis Rsp\n");
+#endif
+}
+
+u8 rtw_hal_set_FwP2PRsvdPage_cmd(_adapter* adapter, PRSVDPAGE_LOC rsvdpageloc)
+{
+       u8 u1H2CP2PRsvdPageParm[H2C_P2PRSVDPAGE_LOC_LEN]={0};
+       struct hal_ops *pHalFunc = &adapter->HalFunc;
+       u8 ret = _FAIL;
+
+       DBG_871X("P2PRsvdPageLoc: P2PBeacon=%d P2PProbeRsp=%d NegoRsp=%d InviteRsp=%d PDRsp=%d\n",  
+               rsvdpageloc->LocP2PBeacon, rsvdpageloc->LocP2PProbeRsp,
+               rsvdpageloc->LocNegoRsp, rsvdpageloc->LocInviteRsp,
+               rsvdpageloc->LocPDRsp);
+
+       SET_H2CCMD_RSVDPAGE_LOC_P2P_BCN(u1H2CP2PRsvdPageParm, rsvdpageloc->LocProbeRsp);
+       SET_H2CCMD_RSVDPAGE_LOC_P2P_PROBE_RSP(u1H2CP2PRsvdPageParm, rsvdpageloc->LocPsPoll);
+       SET_H2CCMD_RSVDPAGE_LOC_P2P_NEGO_RSP(u1H2CP2PRsvdPageParm, rsvdpageloc->LocNullData);
+       SET_H2CCMD_RSVDPAGE_LOC_P2P_INVITE_RSP(u1H2CP2PRsvdPageParm, rsvdpageloc->LocQosNull);
+       SET_H2CCMD_RSVDPAGE_LOC_P2P_PD_RSP(u1H2CP2PRsvdPageParm, rsvdpageloc->LocBTQosNull);
+       
+       //FillH2CCmd8723B(padapter, H2C_8723B_P2P_OFFLOAD_RSVD_PAGE, H2C_P2PRSVDPAGE_LOC_LEN, u1H2CP2PRsvdPageParm);
+       if (pHalFunc->fill_h2c_cmd != NULL) {
+               ret = pHalFunc->fill_h2c_cmd(adapter,
+                               H2C_P2P_OFFLOAD_RSVD_PAGE,
+                               H2C_P2PRSVDPAGE_LOC_LEN,
+                               u1H2CP2PRsvdPageParm);
+       } else {
+               DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
+               ret = _FAIL;
+       }
+
+       return ret;
+}
+
+u8 rtw_hal_set_p2p_wowlan_offload_cmd(_adapter* adapter)
+{
+
+       u8 offload_cmd[H2C_P2P_OFFLOAD_LEN] = {0};
+       struct wifidirect_info  *pwdinfo = &(adapter->wdinfo);
+       struct P2P_WoWlan_Offload_t *p2p_wowlan_offload = (struct P2P_WoWlan_Offload_t *)offload_cmd;
+       struct hal_ops *pHalFunc = &adapter->HalFunc;
+       u8 ret = _FAIL;
+
+       _rtw_memset(p2p_wowlan_offload,0 ,sizeof(struct P2P_WoWlan_Offload_t)); 
+       DBG_871X("%s\n",__func__);      
+       switch(pwdinfo->role)
+       {
+               case P2P_ROLE_DEVICE:
+                       DBG_871X("P2P_ROLE_DEVICE\n");
+                       p2p_wowlan_offload->role = 0;
+                       break;
+               case P2P_ROLE_CLIENT:
+                       DBG_871X("P2P_ROLE_CLIENT\n");
+                       p2p_wowlan_offload->role = 1;
+                       break;
+               case P2P_ROLE_GO:
+                       DBG_871X("P2P_ROLE_GO\n");
+                       p2p_wowlan_offload->role = 2;
+                       break;
+               default: 
+                       DBG_871X("P2P_ROLE_DISABLE\n");
+                       break;
+               }
+       p2p_wowlan_offload->Wps_Config[0] = pwdinfo->supported_wps_cm>>8;
+       p2p_wowlan_offload->Wps_Config[1] = pwdinfo->supported_wps_cm;
+       offload_cmd = (u8*)p2p_wowlan_offload;
+       DBG_871X("p2p_wowlan_offload: %x:%x:%x\n",offload_cmd[0],offload_cmd[1],offload_cmd[2]);        
+
+       if (pHalFunc->fill_h2c_cmd != NULL) {
+               ret = pHalFunc->fill_h2c_cmd(adapter,
+                               H2C_P2P_OFFLOAD,
+                               H2C_P2P_OFFLOAD_LEN,
+                               offload_cmd);
+       } else {
+               DBG_871X("%s: Please hook fill_h2c_cmd first!\n", __func__);
+               ret = _FAIL;
+       }
+
+       return ret;
+
+       //FillH2CCmd8723B(adapter, H2C_8723B_P2P_OFFLOAD, sizeof(struct P2P_WoWlan_Offload_t), (u8 *)p2p_wowlan_offload);
+}
+#endif //CONFIG_P2P_WOWLAN
+
+static void rtw_hal_construct_beacon(_adapter *padapter,
+               u8 *pframe, u32 *pLength)
+{
+       struct rtw_ieee80211_hdr        *pwlanhdr;
+       u16                                     *fctrl;
+       u32                                     rate_len, pktlen;
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       WLAN_BSSID_EX           *cur_network = &(pmlmeinfo->network);
+       u8      bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+
+
+       //DBG_871X("%s\n", __FUNCTION__);
+
+       pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
+
+       fctrl = &(pwlanhdr->frame_ctl);
+       *(fctrl) = 0;
+
+       _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
+       _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
+       _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN);
+
+       SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/);
+       //pmlmeext->mgnt_seq++;
+       SetFrameSubType(pframe, WIFI_BEACON);
+
+       pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
+       pktlen = sizeof (struct rtw_ieee80211_hdr_3addr);
+
+       //timestamp will be inserted by hardware
+       pframe += 8;
+       pktlen += 8;
+
+       // beacon interval: 2 bytes
+       _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2);
+
+       pframe += 2;
+       pktlen += 2;
+
+       // capability info: 2 bytes
+       _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2);
+
+       pframe += 2;
+       pktlen += 2;
+
+       if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
+       {
+               //DBG_871X("ie len=%d\n", cur_network->IELength);
+               pktlen += cur_network->IELength - sizeof(NDIS_802_11_FIXED_IEs);
+               _rtw_memcpy(pframe, cur_network->IEs+sizeof(NDIS_802_11_FIXED_IEs), pktlen);
+
+               goto _ConstructBeacon;
+       }
+
+       //below for ad-hoc mode
+
+       // SSID
+       pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen);
+
+       // supported rates...
+       rate_len = rtw_get_rateset_len(cur_network->SupportedRates);
+       pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pktlen);
+
+       // DS parameter set
+       pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pktlen);
+
+       if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)
+       {
+               u32 ATIMWindow;
+               // IBSS Parameter Set...
+               //ATIMWindow = cur->Configuration.ATIMWindow;
+               ATIMWindow = 0;
+               pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen);
+       }
+
+
+       //todo: ERP IE
+
+
+       // EXTERNDED SUPPORTED RATE
+       if (rate_len > 8)
+       {
+               pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen);
+       }
+
+
+       //todo:HT for adhoc
+
+_ConstructBeacon:
+
+       if ((pktlen + TXDESC_SIZE) > 512)
+       {
+               DBG_871X("beacon frame too large\n");
+               return;
+       }
+
+       *pLength = pktlen;
+
+       //DBG_871X("%s bcn_sz=%d\n", __FUNCTION__, pktlen);
+
+}
+
+static void rtw_hal_construct_PSPoll(_adapter *padapter,
+               u8 *pframe, u32 *pLength)
+{
+       struct rtw_ieee80211_hdr        *pwlanhdr;
+       u16                                     *fctrl;
+       u32                                     pktlen;
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+
+       //DBG_871X("%s\n", __FUNCTION__);
+
+       pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
+
+       // Frame control.
+       fctrl = &(pwlanhdr->frame_ctl);
+       *(fctrl) = 0;
+       SetPwrMgt(fctrl);
+       SetFrameSubType(pframe, WIFI_PSPOLL);
+
+       // AID.
+       SetDuration(pframe, (pmlmeinfo->aid | 0xc000));
+
+       // BSSID.
+       _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
+
+       // TA.
+       _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
+
+       *pLength = 16;
+}
+
+static void rtw_hal_construct_NullFunctionData(
+       PADAPTER padapter,
+       u8              *pframe,
+       u32             *pLength,
+       u8              *StaAddr,
+       u8              bQoS,
+       u8              AC,
+       u8              bEosp,
+       u8              bForcePowerSave)
+{
+       struct rtw_ieee80211_hdr        *pwlanhdr;
+       u16                                             *fctrl;
+       u32                                             pktlen;
+       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
+       struct wlan_network             *cur_network = &pmlmepriv->cur_network;
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+
+
+       //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave);
+
+       pwlanhdr = (struct rtw_ieee80211_hdr*)pframe;
+
+       fctrl = &pwlanhdr->frame_ctl;
+       *(fctrl) = 0;
+       if (bForcePowerSave)
+       {
+               SetPwrMgt(fctrl);
+       }
+
+       switch(cur_network->network.InfrastructureMode)
+       {
+               case Ndis802_11Infrastructure:
+                       SetToDs(fctrl);
+                       _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
+                       _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
+                       _rtw_memcpy(pwlanhdr->addr3, StaAddr, ETH_ALEN);
+                       break;
+               case Ndis802_11APMode:
+                       SetFrDs(fctrl);
+                       _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);
+                       _rtw_memcpy(pwlanhdr->addr2, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
+                       _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN);
+                       break;
+               case Ndis802_11IBSS:
+               default:
+                       _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);
+                       _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
+                       _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
+                       break;
+       }
+
+       SetSeqNum(pwlanhdr, 0);
+
+       if (bQoS == _TRUE) {
+               struct rtw_ieee80211_hdr_3addr_qos *pwlanqoshdr;
+
+               SetFrameSubType(pframe, WIFI_QOS_DATA_NULL);
+
+               pwlanqoshdr = (struct rtw_ieee80211_hdr_3addr_qos*)pframe;
+               SetPriority(&pwlanqoshdr->qc, AC);
+               SetEOSP(&pwlanqoshdr->qc, bEosp);
+
+               pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos);
+       } else {
+               SetFrameSubType(pframe, WIFI_DATA_NULL);
+
+               pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
+       }
+
+       *pLength = pktlen;
+}
+
+#ifdef CONFIG_WOWLAN   
+//
+// Description:
+//     Construct the ARP response packet to support ARP offload.
+//
+static void rtw_hal_construct_ARPRsp(
+       PADAPTER padapter,
+       u8                      *pframe,
+       u32                     *pLength,
+       u8                      *pIPAddress
+       )
+{
+       struct rtw_ieee80211_hdr        *pwlanhdr;
+       u16     *fctrl;
+       u32     pktlen;
+       struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
+       struct wlan_network     *cur_network = &pmlmepriv->cur_network;
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       struct security_priv    *psecuritypriv = &padapter->securitypriv;
+       static u8       ARPLLCHeader[8] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x08, 0x06};
+       u8      *pARPRspPkt = pframe;
+       //for TKIP Cal MIC
+       u8      *payload = pframe;
+       u8      EncryptionHeadOverhead = 0;
+       //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave);
+
+       pwlanhdr = (struct rtw_ieee80211_hdr*)pframe;
+
+       fctrl = &pwlanhdr->frame_ctl;
+       *(fctrl) = 0;
+
+       //-------------------------------------------------------------------------
+       // MAC Header.
+       //-------------------------------------------------------------------------
+       SetFrameType(fctrl, WIFI_DATA);
+       //SetFrameSubType(fctrl, 0);
+       SetToDs(fctrl);
+       _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
+       _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
+       _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
+
+       SetSeqNum(pwlanhdr, 0);
+       SetDuration(pwlanhdr, 0);
+       //SET_80211_HDR_FRAME_CONTROL(pARPRspPkt, 0);
+       //SET_80211_HDR_TYPE_AND_SUBTYPE(pARPRspPkt, Type_Data);
+       //SET_80211_HDR_TO_DS(pARPRspPkt, 1);
+       //SET_80211_HDR_ADDRESS1(pARPRspPkt, pMgntInfo->Bssid);
+       //SET_80211_HDR_ADDRESS2(pARPRspPkt, Adapter->CurrentAddress);
+       //SET_80211_HDR_ADDRESS3(pARPRspPkt, pMgntInfo->Bssid);
+
+       //SET_80211_HDR_DURATION(pARPRspPkt, 0);
+       //SET_80211_HDR_FRAGMENT_SEQUENCE(pARPRspPkt, 0);
+#ifdef CONFIG_WAPI_SUPPORT
+       *pLength = sMacHdrLng;
+#else
+       *pLength = 24;
+#endif
+       switch (psecuritypriv->dot11PrivacyAlgrthm) {
+               case _WEP40_:
+               case _WEP104_:
+                       EncryptionHeadOverhead = 4;
+                       break;
+               case _TKIP_:
+                       EncryptionHeadOverhead = 8;
+                       break;
+               case _AES_:
+                       EncryptionHeadOverhead = 8;
+                       break;
+#ifdef CONFIG_WAPI_SUPPORT
+               case _SMS4_:
+                       EncryptionHeadOverhead = 18;
+                       break;
+#endif
+               default:
+                       EncryptionHeadOverhead = 0;
+       }
+
+       if(EncryptionHeadOverhead > 0) {
+               _rtw_memset(&(pframe[*pLength]), 0,EncryptionHeadOverhead);
+               *pLength += EncryptionHeadOverhead;
+               //SET_80211_HDR_WEP(pARPRspPkt, 1);  //Suggested by CCW.
+               SetPrivacy(fctrl);
+       }
+
+       //-------------------------------------------------------------------------
+       // Frame Body.
+       //-------------------------------------------------------------------------
+       pARPRspPkt =  (u8*)(pframe+ *pLength);
+       payload = pARPRspPkt; //Get Payload pointer
+       // LLC header
+       _rtw_memcpy(pARPRspPkt, ARPLLCHeader, 8);
+       *pLength += 8;
+
+       // ARP element
+       pARPRspPkt += 8;
+       SET_ARP_PKT_HW(pARPRspPkt, 0x0100);
+       SET_ARP_PKT_PROTOCOL(pARPRspPkt, 0x0008);       // IP protocol
+       SET_ARP_PKT_HW_ADDR_LEN(pARPRspPkt, 6);
+       SET_ARP_PKT_PROTOCOL_ADDR_LEN(pARPRspPkt, 4);
+       SET_ARP_PKT_OPERATION(pARPRspPkt, 0x0200);      // ARP response
+       SET_ARP_PKT_SENDER_MAC_ADDR(pARPRspPkt, myid(&(padapter->eeprompriv)));
+       SET_ARP_PKT_SENDER_IP_ADDR(pARPRspPkt, pIPAddress);
+#ifdef CONFIG_ARP_KEEP_ALIVE
+       if (rtw_gw_addr_query(padapter)==0) {
+               SET_ARP_PKT_TARGET_MAC_ADDR(pARPRspPkt, pmlmepriv->gw_mac_addr);
+               SET_ARP_PKT_TARGET_IP_ADDR(pARPRspPkt, pmlmepriv->gw_ip);
+       }
+       else
+#endif
+       {
+               SET_ARP_PKT_TARGET_MAC_ADDR(pARPRspPkt,
+                               get_my_bssid(&(pmlmeinfo->network)));
+               SET_ARP_PKT_TARGET_IP_ADDR(pARPRspPkt,
+                               pIPAddress);
+               DBG_871X("%s Target Mac Addr:" MAC_FMT "\n", __FUNCTION__,
+                               MAC_ARG(get_my_bssid(&(pmlmeinfo->network))));
+               DBG_871X("%s Target IP Addr" IP_FMT "\n", __FUNCTION__,
+                               IP_ARG(pIPAddress));
+       }
+
+       *pLength += 28;
+
+       if (psecuritypriv->dot11PrivacyAlgrthm == _TKIP_) {
+               u8      mic[8];
+               struct mic_data micdata;
+               struct sta_info *psta = NULL;
+               u8      priority[4]={0x0,0x0,0x0,0x0};
+               u8      null_key[16]={0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
+
+               DBG_871X("%s(): Add MIC\n",__FUNCTION__);
+
+               psta = rtw_get_stainfo(&padapter->stapriv,
+                               get_my_bssid(&(pmlmeinfo->network)));
+               if (psta != NULL) {
+                       if(_rtw_memcmp(&psta->dot11tkiptxmickey.skey[0],
+                                               null_key, 16)==_TRUE) {
+                               DBG_871X("%s(): STA dot11tkiptxmickey==0\n",
+                                               __func__);
+                       }
+                       //start to calculate the mic code
+                       rtw_secmicsetkey(&micdata,
+                                       &psta->dot11tkiptxmickey.skey[0]);
+               }
+
+               rtw_secmicappend(&micdata, pwlanhdr->addr3, 6);  //DA
+
+               rtw_secmicappend(&micdata, pwlanhdr->addr2, 6); //SA
+
+               priority[0]=0;
+
+               rtw_secmicappend(&micdata, &priority[0], 4);
+
+               rtw_secmicappend(&micdata, payload, 36); //payload length = 8 + 28
+
+               rtw_secgetmic(&micdata,&(mic[0]));
+
+               pARPRspPkt += 28;
+               _rtw_memcpy(pARPRspPkt, &(mic[0]),8);
+
+               *pLength += 8;
+       }
+}
+
+#ifdef CONFIG_PNO_SUPPORT
+static void rtw_hal_construct_ProbeReq(_adapter *padapter, u8 *pframe,
+               u32 *pLength, pno_ssid_t *ssid)
+{
+       struct rtw_ieee80211_hdr        *pwlanhdr;
+       u16                             *fctrl;
+       u32                             pktlen;
+       unsigned char                   *mac;
+       unsigned char                   bssrate[NumRates];
+       struct xmit_priv                *pxmitpriv = &(padapter->xmitpriv);
+       struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       int     bssrate_len = 0;
+       u8      bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+
+       pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
+       mac = myid(&(padapter->eeprompriv));
+
+       fctrl = &(pwlanhdr->frame_ctl);
+       *(fctrl) = 0;
+
+       _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
+       _rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN);
+
+       _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);
+
+       SetSeqNum(pwlanhdr, 0);
+       SetFrameSubType(pframe, WIFI_PROBEREQ);
+
+       pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
+       pframe += pktlen;
+
+       if (ssid == NULL) {
+               pframe = rtw_set_ie(pframe, _SSID_IE_, 0, NULL, &pktlen);
+       } else {
+               //DBG_871X("%s len:%d\n", ssid->SSID, ssid->SSID_len);
+               pframe = rtw_set_ie(pframe, _SSID_IE_, ssid->SSID_len, ssid->SSID, &pktlen);
+       }
+
+       get_rate_set(padapter, bssrate, &bssrate_len);
+
+       if (bssrate_len > 8)
+       {
+               pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &pktlen);
+               pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &pktlen);
+       }
+       else
+       {
+               pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &pktlen);
+       }
+
+       *pLength = pktlen;
+}
+
+static void rtw_hal_construct_PNO_info(_adapter *padapter,
+               u8 *pframe, u32*pLength)
+{
+       struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
+
+       u8      *pPnoInfoPkt = pframe;
+       pPnoInfoPkt =  (u8*)(pframe+ *pLength);
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_num, 1);
+
+       *pLength+=1;
+       pPnoInfoPkt += 1;
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->hidden_ssid_num, 1);
+
+       *pLength+=3;
+       pPnoInfoPkt += 3;
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->fast_scan_period, 1);
+
+       *pLength+=4;
+       pPnoInfoPkt += 4;
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->fast_scan_iterations, 4);
+
+       *pLength+=4;
+       pPnoInfoPkt += 4;
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->slow_scan_period, 4);
+
+       *pLength+=4;
+       pPnoInfoPkt += 4;
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_length,
+                       MAX_PNO_LIST_COUNT);
+
+       *pLength+=MAX_PNO_LIST_COUNT;
+       pPnoInfoPkt += MAX_PNO_LIST_COUNT;
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_cipher_info,
+                       MAX_PNO_LIST_COUNT);
+
+       *pLength+=MAX_PNO_LIST_COUNT;
+       pPnoInfoPkt += MAX_PNO_LIST_COUNT;
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_channel_info,
+                       MAX_PNO_LIST_COUNT);
+
+       *pLength+=MAX_PNO_LIST_COUNT;
+       pPnoInfoPkt += MAX_PNO_LIST_COUNT;
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->loc_probe_req,
+                       MAX_HIDDEN_AP);
+
+       *pLength+=MAX_HIDDEN_AP;
+       pPnoInfoPkt += MAX_HIDDEN_AP;
+}
+
+static void rtw_hal_construct_ssid_list(_adapter *padapter,
+       u8 *pframe, u32 *pLength)
+{
+       struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
+       u8 *pSSIDListPkt = pframe;
+       int i;
+
+       pSSIDListPkt =  (u8*)(pframe+ *pLength);
+
+       for(i = 0; i < pwrctl->pnlo_info->ssid_num ; i++) {
+               _rtw_memcpy(pSSIDListPkt, &pwrctl->pno_ssid_list->node[i].SSID,
+                       pwrctl->pnlo_info->ssid_length[i]);
+
+               *pLength += WLAN_SSID_MAXLEN;
+               pSSIDListPkt += WLAN_SSID_MAXLEN;
+       }
+}
+
+static void rtw_hal_construct_scan_info(_adapter *padapter,
+       u8 *pframe, u32 *pLength)
+{
+       struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
+       u8 *pScanInfoPkt = pframe;
+       int i;
+
+       pScanInfoPkt =  (u8*)(pframe+ *pLength);
+
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->channel_num, 1);
+
+       *pLength+=1;
+       pScanInfoPkt += 1;
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_ch, 1);
+
+
+       *pLength+=1;
+       pScanInfoPkt += 1;
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_bw, 1);
+
+
+       *pLength+=1;
+       pScanInfoPkt += 1;
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_40_offset, 1);
+
+       *pLength+=1;
+       pScanInfoPkt += 1;
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_80_offset, 1);
+
+       *pLength+=1;
+       pScanInfoPkt += 1;
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->periodScan, 1);
+
+       *pLength+=1;
+       pScanInfoPkt += 1;
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->period_scan_time, 1);
+
+       *pLength+=1;
+       pScanInfoPkt += 1;
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->enableRFE, 1);
+
+       *pLength+=1;
+       pScanInfoPkt += 1;
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->rfe_type, 8);
+
+       *pLength+=8;
+       pScanInfoPkt += 8;
+
+       for(i = 0 ; i < MAX_SCAN_LIST_COUNT ; i ++) {
+               _rtw_memcpy(pScanInfoPkt,
+                       &pwrctl->pscan_info->ssid_channel_info[i], 4);
+               *pLength+=4;
+               pScanInfoPkt += 4;
+       }
+}
+#endif //CONFIG_PNO_SUPPORT
+
+#ifdef CONFIG_GTK_OL
+static void rtw_hal_construct_GTKRsp(
+       PADAPTER        padapter,
+       u8              *pframe,
+       u32             *pLength
+       )
+{
+       struct rtw_ieee80211_hdr        *pwlanhdr;
+       u16     *fctrl;
+       u32     pktlen;
+       struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
+       struct wlan_network     *cur_network = &pmlmepriv->cur_network;
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       struct security_priv    *psecuritypriv = &padapter->securitypriv;
+       static u8       LLCHeader[8] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8E};
+       static u8       GTKbody_a[11] ={0x01, 0x03, 0x00, 0x5F, 0x02, 0x03, 0x12, 0x00, 0x10, 0x42, 0x0B};
+       u8      *pGTKRspPkt = pframe;
+       u8      EncryptionHeadOverhead = 0;
+       //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave);
+
+       pwlanhdr = (struct rtw_ieee80211_hdr*)pframe;
+
+       fctrl = &pwlanhdr->frame_ctl;
+       *(fctrl) = 0;
+
+       //-------------------------------------------------------------------------
+       // MAC Header.
+       //-------------------------------------------------------------------------
+       SetFrameType(fctrl, WIFI_DATA);
+       //SetFrameSubType(fctrl, 0);
+       SetToDs(fctrl);
+
+       _rtw_memcpy(pwlanhdr->addr1,
+                       get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
+
+       _rtw_memcpy(pwlanhdr->addr2,
+                       myid(&(padapter->eeprompriv)), ETH_ALEN);
+
+       _rtw_memcpy(pwlanhdr->addr3,
+                       get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
+
+       SetSeqNum(pwlanhdr, 0);
+       SetDuration(pwlanhdr, 0);
+
+#ifdef CONFIG_WAPI_SUPPORT
+       *pLength = sMacHdrLng;
+#else
+       *pLength = 24;
+#endif //CONFIG_WAPI_SUPPORT
+
+       //-------------------------------------------------------------------------
+       // Security Header: leave space for it if necessary.
+       //-------------------------------------------------------------------------
+       switch (psecuritypriv->dot11PrivacyAlgrthm) {
+               case _WEP40_:
+               case _WEP104_:
+                       EncryptionHeadOverhead = 4;
+                       break;
+               case _TKIP_:
+                       EncryptionHeadOverhead = 8;
+                       break;
+               case _AES_:
+                       EncryptionHeadOverhead = 8;
+                       break;
+#ifdef CONFIG_WAPI_SUPPORT
+               case _SMS4_:
+                       EncryptionHeadOverhead = 18;
+                       break;
+#endif //CONFIG_WAPI_SUPPORT
+               default:
+                       EncryptionHeadOverhead = 0;
+       }
+
+       if (EncryptionHeadOverhead > 0) {
+               _rtw_memset(&(pframe[*pLength]), 0,EncryptionHeadOverhead);
+               *pLength += EncryptionHeadOverhead;
+               //SET_80211_HDR_WEP(pGTKRspPkt, 1);  //Suggested by CCW.
+               //GTK's privacy bit is done by FW
+               //SetPrivacy(fctrl);
+       }
+       //-------------------------------------------------------------------------
+       // Frame Body.
+       //-------------------------------------------------------------------------
+       pGTKRspPkt =  (u8*)(pframe+ *pLength);
+       // LLC header
+       _rtw_memcpy(pGTKRspPkt, LLCHeader, 8);
+       *pLength += 8;
+
+       // GTK element
+       pGTKRspPkt += 8;
+
+       //GTK frame body after LLC, part 1
+       _rtw_memcpy(pGTKRspPkt, GTKbody_a, 11);
+       *pLength += 11;
+       pGTKRspPkt += 11;
+       //GTK frame body after LLC, part 2
+       _rtw_memset(&(pframe[*pLength]), 0, 88);
+       *pLength += 88;
+       pGTKRspPkt += 88;
+
+}
+#endif //CONFIG_GTK_OL
+
+
+//
+// Description: Fill the reserved packets that FW will use to RSVD page.
+//                     Now we just send 4 types packet to rsvd page.
+//                     (1)Beacon, (2)Ps-poll, (3)Null data, (4)ProbeRsp.
+// Input:
+// finished - FALSE:At the first time we will send all the packets as a large packet to Hw,
+//                 so we need to set the packet length to total lengh.
+//           TRUE: At the second time, we should send the first packet (default:beacon)
+//                 to Hw again and set the lengh in descriptor to the real beacon lengh.
+// 2009.10.15 by tynli.
+//
+//Page Size = 128: 8188e, 8723a/b, 8192c/d,  
+//Page Size = 256: 8192e, 8821a
+//Page Size = 512: 8812a
+void rtw_hal_set_fw_rsvd_page(_adapter* adapter, bool finished)
+{
+       PHAL_DATA_TYPE pHalData;
+       struct xmit_frame       *pcmdframe;
+       struct pkt_attrib       *pattrib;
+       struct xmit_priv        *pxmitpriv;
+       struct mlme_ext_priv    *pmlmeext;
+       struct mlme_ext_info    *pmlmeinfo;
+       struct pwrctrl_priv *pwrctl;
+       struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
+       struct hal_ops *pHalFunc = &adapter->HalFunc;
+       u32     BeaconLength = 0, ProbeRspLength = 0, PSPollLength = 0;
+       u32     NullDataLength = 0, QosNullLength = 0, BTQosNullLength = 0;
+       u32     ProbeReqLength = 0, NullFunctionDataLength = 0;
+       u8      TxDescLen = TXDESC_SIZE, TxDescOffset = TXDESC_OFFSET;
+       u8      TotalPageNum=0, CurtPktPageNum=0, RsvdPageNum=0;
+       u8      *ReservedPagePacket;
+       u16     BufIndex = 0;
+       u32     TotalPacketLen = 0, MaxRsvdPageBufSize = 0, PageSize = 0;
+       RSVDPAGE_LOC    RsvdPageLoc;
+#ifdef CONFIG_WOWLAN   
+       u32     ARPLegnth = 0, GTKLegnth = 0, PNOLength = 0, ScanInfoLength = 0;
+       u32     SSIDLegnth = 0;
+       struct security_priv *psecuritypriv = &adapter->securitypriv; //added by xx
+       u8 currentip[4];
+       u8 cur_dot11txpn[8];
+#ifdef CONFIG_GTK_OL
+       struct sta_priv *pstapriv = &adapter->stapriv;
+       struct sta_info * psta;
+       u8 kek[RTW_KEK_LEN];
+       u8 kck[RTW_KCK_LEN];
+#endif //CONFIG_GTK_OL
+#ifdef CONFIG_PNO_SUPPORT 
+       int index;
+       u8 ssid_num;
+#endif //CONFIG_PNO_SUPPORT
+#endif
+#ifdef DBG_CONFIG_ERROR_DETECT
+       struct sreset_priv *psrtpriv;
+#endif // DBG_CONFIG_ERROR_DETECT
+
+#ifdef CONFIG_P2P_WOWLAN
+       u32 P2PNegoRspLength = 0, P2PInviteRspLength = 0, P2PPDRspLength = 0, P2PProbeRspLength = 0, P2PBCNLength = 0;
+#endif
+
+       pHalData = GET_HAL_DATA(adapter);
+#ifdef DBG_CONFIG_ERROR_DETECT
+       psrtpriv = &pHalData->srestpriv;
+#endif
+       pxmitpriv = &adapter->xmitpriv;
+       pmlmeext = &adapter->mlmeextpriv;
+       pmlmeinfo = &pmlmeext->mlmext_info;
+       pwrctl = adapter_to_pwrctl(adapter);
+
+       rtw_hal_get_def_var(adapter, HAL_DEF_TX_PAGE_SIZE, (u8 *)&PageSize);
+       DBG_871X("%s PAGE_SIZE: %d\n", __func__, PageSize);
+       if (pHalFunc->hal_get_tx_buff_rsvd_page_num != NULL) {
+               RsvdPageNum =
+                       pHalFunc->hal_get_tx_buff_rsvd_page_num(adapter, _TRUE);
+               DBG_871X("%s RsvdPageNUm: %d\n", __func__, RsvdPageNum);
+       } else {
+               DBG_871X("[Error]: %s, missing tx_buff_rsvd_page_num func!!\n",
+                               __func__);
+       }
+
+       MaxRsvdPageBufSize = RsvdPageNum*PageSize;
+
+       pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv);
+       if (pcmdframe == NULL) {
+               DBG_871X("%s: alloc ReservedPagePacket fail!\n", __FUNCTION__);
+               return;
+       }
+
+       ReservedPagePacket = pcmdframe->buf_addr;
+       _rtw_memset(&RsvdPageLoc, 0, sizeof(RSVDPAGE_LOC));
+
+       //beacon * 2 pages
+       BufIndex = TxDescOffset;
+       rtw_hal_construct_beacon(adapter,
+                       &ReservedPagePacket[BufIndex], &BeaconLength);
+
+       // When we count the first page size, we need to reserve description size for the RSVD
+       // packet, it will be filled in front of the packet in TXPKTBUF.
+       CurtPktPageNum = (u8)PageNum_128(TxDescLen + BeaconLength);
+       //If we don't add 1 more page, the WOWLAN function has a problem. Baron thinks it's a bug of firmware
+       if (CurtPktPageNum == 1)
+               CurtPktPageNum += 1;
+
+       TotalPageNum += CurtPktPageNum;
+
+       BufIndex += (CurtPktPageNum*PageSize);
+
+       //ps-poll * 1 page
+       RsvdPageLoc.LocPsPoll = TotalPageNum;
+       DBG_871X("LocPsPoll: %d\n", RsvdPageLoc.LocPsPoll);
+       rtw_hal_construct_PSPoll(adapter,
+                       &ReservedPagePacket[BufIndex], &PSPollLength);
+       rtw_hal_fill_fake_txdesc(adapter,
+                       &ReservedPagePacket[BufIndex-TxDescLen],
+                       PSPollLength, _TRUE, _FALSE, _FALSE);
+
+       CurtPktPageNum = (u8)PageNum((TxDescLen + PSPollLength), PageSize);
+
+       TotalPageNum += CurtPktPageNum;
+
+       BufIndex += (CurtPktPageNum*PageSize);
+
+#ifdef CONFIG_BT_COEXIST
+       //BT Qos null data * 1 page
+       RsvdPageLoc.LocBTQosNull = TotalPageNum;
+       DBG_871X("LocBTQosNull: %d\n", RsvdPageLoc.LocBTQosNull);
+       rtw_hal_construct_NullFunctionData(
+                       adapter,
+                       &ReservedPagePacket[BufIndex],
+                       &BTQosNullLength,
+                       get_my_bssid(&pmlmeinfo->network),
+                       _TRUE, 0, 0, _FALSE);
+       rtw_hal_fill_fake_txdesc(adapter,
+                       &ReservedPagePacket[BufIndex-TxDescLen],
+                       BTQosNullLength, _FALSE, _TRUE, _FALSE);
+
+       CurtPktPageNum = (u8)PageNum(TxDescLen + BTQosNullLength, PageSize);
+
+       TotalPageNum += CurtPktPageNum;
+
+       BufIndex += (CurtPktPageNum*PageSize);
+#endif //CONFIG_BT_COEXIT
+
+       //null data * 1 page
+       RsvdPageLoc.LocNullData = TotalPageNum;
+       DBG_871X("LocNullData: %d\n", RsvdPageLoc.LocNullData);
+       rtw_hal_construct_NullFunctionData(
+                       adapter,
+                       &ReservedPagePacket[BufIndex],
+                       &NullDataLength,
+                       get_my_bssid(&pmlmeinfo->network),
+                       _FALSE, 0, 0, _FALSE);
+       rtw_hal_fill_fake_txdesc(adapter,
+                       &ReservedPagePacket[BufIndex-TxDescLen],
+                       NullDataLength, _FALSE, _FALSE, _FALSE);
+
+       CurtPktPageNum = (u8)PageNum(TxDescLen + NullDataLength, PageSize);
+
+       TotalPageNum += CurtPktPageNum;
+
+       BufIndex += (CurtPktPageNum*PageSize);
+
+       //Qos null data * 1 page
+       RsvdPageLoc.LocQosNull = TotalPageNum;
+       DBG_871X("LocQosNull: %d\n", RsvdPageLoc.LocQosNull);
+       rtw_hal_construct_NullFunctionData(
+                       adapter,
+                       &ReservedPagePacket[BufIndex],
+                       &QosNullLength,
+                       get_my_bssid(&pmlmeinfo->network),
+                       _TRUE, 0, 0, _FALSE);
+       rtw_hal_fill_fake_txdesc(adapter,
+                       &ReservedPagePacket[BufIndex-TxDescLen],
+                       QosNullLength, _FALSE, _FALSE, _FALSE);
+
+       CurtPktPageNum = (u8)PageNum(TxDescLen + QosNullLength, PageSize);
+
+       TotalPageNum += CurtPktPageNum;
+
+       BufIndex += (CurtPktPageNum*PageSize);
+
+#ifdef CONFIG_WOWLAN
+       if (pwrctl->wowlan_mode == _TRUE &&
+                       check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
+               //ARP RSP * 1 page
+               rtw_get_current_ip_address(adapter, currentip);
+
+               RsvdPageLoc.LocArpRsp= TotalPageNum;
+
+               rtw_hal_construct_ARPRsp(
+                               adapter,
+                               &ReservedPagePacket[BufIndex],
+                               &ARPLegnth,
+                               currentip);
+
+               rtw_hal_fill_fake_txdesc(adapter,
+                               &ReservedPagePacket[BufIndex-TxDescLen],
+                               ARPLegnth, _FALSE, _FALSE, _TRUE);
+
+               CurtPktPageNum = (u8)PageNum(TxDescLen + ARPLegnth, PageSize);
+
+               TotalPageNum += CurtPktPageNum;
+
+               BufIndex += (CurtPktPageNum*PageSize);
+
+               //3 SEC IV * 1 page
+               rtw_get_sec_iv(adapter, cur_dot11txpn,
+                               get_my_bssid(&pmlmeinfo->network));
+
+               RsvdPageLoc.LocRemoteCtrlInfo = TotalPageNum;
+
+               _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen,
+                               cur_dot11txpn, _AES_IV_LEN_);
+
+               CurtPktPageNum = (u8)PageNum(_AES_IV_LEN_, PageSize);
+
+               TotalPageNum += CurtPktPageNum;
+#ifdef CONFIG_GTK_OL
+               BufIndex += (CurtPktPageNum*PageSize);
+
+               //if the ap staion info. exists, get the kek, kck from staion info.
+               psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
+               if (psta == NULL) {
+                       _rtw_memset(kek, 0, RTW_KEK_LEN);
+                       _rtw_memset(kck, 0, RTW_KCK_LEN);
+                       DBG_8192C("%s, KEK, KCK download rsvd page all zero \n",
+                                       __func__);
+               } else {
+                       _rtw_memcpy(kek, psta->kek, RTW_KEK_LEN);
+                       _rtw_memcpy(kck, psta->kck, RTW_KCK_LEN);
+               }
+
+               //3 KEK, KCK
+               RsvdPageLoc.LocGTKInfo = TotalPageNum;
+               _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen,
+                               kck, RTW_KCK_LEN);
+               _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen+RTW_KCK_LEN,
+                               kek, RTW_KEK_LEN);
+#if 0
+               {
+                       int i;
+                       printk("\ntoFW KCK: ");
+                       for(i=0;i<16; i++)
+                               printk(" %02x ", kck[i]);
+                       printk("\ntoFW KEK: ");
+                       for(i=0;i<16; i++)
+                               printk(" %02x ", kek[i]);
+                       printk("\n");
+               }
+#endif
+
+               //DBG_871X("%s(): HW_VAR_SET_TX_CMD: KEK KCK %p %d\n", 
+               //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen],
+               //      (TxDescLen + RTW_KCK_LEN + RTW_KEK_LEN));
+
+               CurtPktPageNum = (u8)PageNum(TxDescLen + RTW_KCK_LEN + RTW_KEK_LEN, PageSize);
+
+               TotalPageNum += CurtPktPageNum;
+
+               BufIndex += (CurtPktPageNum*PageSize);
+
+               //3 GTK Response
+               RsvdPageLoc.LocGTKRsp= TotalPageNum;
+               rtw_hal_construct_GTKRsp(
+                               adapter,
+                               &ReservedPagePacket[BufIndex],
+                               &GTKLegnth);
+
+               rtw_hal_fill_fake_txdesc(adapter,
+                               &ReservedPagePacket[BufIndex-TxDescLen],
+                               GTKLegnth, _FALSE, _FALSE, _TRUE);
+#if 0
+               {
+                       int gj;
+                       printk("123GTK pkt=> \n");
+                       for(gj=0; gj < GTKLegnth+TxDescLen; gj++) {
+                               printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen+gj]);
+                               if ((gj + 1)%16==0)
+                                       printk("\n");
+                       }
+                       printk(" <=end\n");
+               }
+#endif
+
+               //DBG_871X("%s(): HW_VAR_SET_TX_CMD: GTK RSP %p %d\n", 
+               //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen],
+               //      (TxDescLen + GTKLegnth));
+
+               CurtPktPageNum = (u8)PageNum(TxDescLen + GTKLegnth, PageSize);
+
+               TotalPageNum += CurtPktPageNum;
+
+               BufIndex += (CurtPktPageNum*PageSize);
+
+               //below page is empty for GTK extension memory
+               //3(11) GTK EXT MEM
+               RsvdPageLoc.LocGTKEXTMEM= TotalPageNum;
+
+               CurtPktPageNum = 2;
+
+               TotalPageNum += CurtPktPageNum;
+               //extension memory for FW
+               TotalPacketLen = BufIndex-TxDescLen + (PageSize*CurtPktPageNum);
+#else //CONFIG_GTK_OL
+               TotalPacketLen = BufIndex + _AES_IV_LEN_;
+#endif //CONFIG_GTK_OL
+       } else if (pwrctl->wowlan_pno_enable == _TRUE) {
+#ifdef CONFIG_PNO_SUPPORT
+               if (pwrctl->pno_in_resume == _FALSE &&
+                               pwrctl->pno_inited == _TRUE) {
+
+                       //Broadcast Probe Request
+                       RsvdPageLoc.LocProbePacket = TotalPageNum;
+
+                       DBG_871X("loc_probe_req: %d\n",
+                                       RsvdPageLoc.LocProbePacket);
+
+                       rtw_hal_construct_ProbeReq(
+                               adapter,
+                               &ReservedPagePacket[BufIndex],
+                               &ProbeReqLength,
+                               NULL);
+
+                       rtw_hal_fill_fake_txdesc(adapter,
+                               &ReservedPagePacket[BufIndex-TxDescLen],
+                               ProbeReqLength, _FALSE, _FALSE, _FALSE);
+
+#ifdef CONFIG_PNO_SET_DEBUG
+                       {
+                               int gj;
+                               printk("probe req pkt=> \n");
+                               for(gj=0; gj < ProbeReqLength + TxDescLen; gj++) {
+                                       printk(" %02x ",ReservedPagePacket[BufIndex- TxDescLen + gj]);
+                                       if ((gj + 1)%8==0)
+                                               printk("\n");
+                               }
+                               printk(" <=end\n");
+                       }
+#endif
+                       CurtPktPageNum =
+                               (u8)PageNum(TxDescLen + ProbeReqLength, PageSize);
+
+                       TotalPageNum += CurtPktPageNum;
+
+                       BufIndex += (CurtPktPageNum*PageSize);
+
+                       //Hidden SSID Probe Request
+                       ssid_num = pwrctl->pnlo_info->hidden_ssid_num;
+
+                       for (index = 0 ; index < ssid_num ; index++) {
+                               pwrctl->pnlo_info->loc_probe_req[index] =
+                                       TotalPageNum;
+
+                               rtw_hal_construct_ProbeReq(
+                                       adapter,
+                                       &ReservedPagePacket[BufIndex],
+                                       &ProbeReqLength,
+                                       &pwrctl->pno_ssid_list->node[index]);
+
+                               rtw_hal_fill_fake_txdesc(adapter,
+                                       &ReservedPagePacket[BufIndex-TxDescLen],
+                                       ProbeReqLength, _FALSE, _FALSE, _FALSE);
+
+#ifdef CONFIG_PNO_SET_DEBUG
+                               {
+                                       int gj;
+                                       printk("probe req pkt=> \n");
+                                       for(gj=0; gj < ProbeReqLength + TxDescLen; gj++) {
+                                               printk(" %02x ", ReservedPagePacket[BufIndex- TxDescLen + gj]);
+                                               if ((gj + 1)%8==0)
+                                                       printk("\n");
+                                       }
+                                       printk(" <=end\n");
+                               }
+#endif
+                               CurtPktPageNum =
+                                       (u8)PageNum(TxDescLen + ProbeReqLength, PageSize);
+
+                               TotalPageNum += CurtPktPageNum;
+
+                               BufIndex += (CurtPktPageNum*PageSize);
+                       }
+
+                       //PNO INFO Page
+                       RsvdPageLoc.LocPNOInfo = TotalPageNum;
+                       rtw_hal_construct_PNO_info(adapter,
+                                       &ReservedPagePacket[BufIndex -TxDescLen],
+                                       &PNOLength);
+#ifdef CONFIG_PNO_SET_DEBUG
+       {
+                       int gj;
+                       printk("PNO pkt=> \n");
+                       for(gj=0; gj < PNOLength; gj++) {
+                               printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen +gj]);
+                               if ((gj + 1)%8==0)
+                                       printk("\n");
+                       }
+                       printk(" <=end\n");
+       }
+#endif
+
+                       CurtPktPageNum = (u8)PageNum_128(PNOLength);
+                       TotalPageNum += CurtPktPageNum;
+                       BufIndex += (CurtPktPageNum*PageSize);
+
+                       //SSID List Page
+                       RsvdPageLoc.LocSSIDInfo = TotalPageNum;
+                       rtw_hal_construct_ssid_list(adapter,
+                                       &ReservedPagePacket[BufIndex-TxDescLen],
+                                       &SSIDLegnth);
+#ifdef CONFIG_PNO_SET_DEBUG
+       {
+                       int gj;
+                       printk("SSID list pkt=> \n");
+                       for(gj=0; gj < SSIDLegnth; gj++) {
+                               printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen+gj]);
+                               if ((gj + 1)%8==0)
+                                       printk("\n");
+                       }
+                       printk(" <=end\n");
+       }
+#endif
+                       CurtPktPageNum = (u8)PageNum_128(SSIDLegnth);
+                       TotalPageNum += CurtPktPageNum;
+                       BufIndex += (CurtPktPageNum*PageSize);
+
+                       //Scan Info Page
+                       RsvdPageLoc.LocScanInfo = TotalPageNum;
+                       rtw_hal_construct_scan_info(adapter,
+                                       &ReservedPagePacket[BufIndex-TxDescLen],
+                                       &ScanInfoLength);
+#ifdef CONFIG_PNO_SET_DEBUG
+       {
+                       int gj;
+                       printk("Scan info pkt=> \n");
+                       for(gj=0; gj < ScanInfoLength; gj++) {
+                               printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen+gj]);
+                               if ((gj + 1)%8==0)
+                                       printk("\n");
+                       }
+                       printk(" <=end\n");
+       }
+#endif
+                       CurtPktPageNum = (u8)PageNum(ScanInfoLength, PageSize);
+                       TotalPageNum += CurtPktPageNum;
+                       BufIndex += (CurtPktPageNum*PageSize);
+                       TotalPacketLen = BufIndex + ScanInfoLength;
+               } else {
+                       TotalPacketLen = BufIndex + QosNullLength;
+               }
+#endif //CONFIG_PNO_SUPPORT
+       } else {
+               TotalPacketLen = BufIndex + QosNullLength;
+       }
+#else //CONFIG_WOWLAN
+       TotalPacketLen = BufIndex + QosNullLength;
+#endif //CONFIG_WOWLAN
+
+#ifdef CONFIG_P2P_WOWLAN
+       if(_TRUE == pwrctl->wowlan_p2p_mode)
+       {
+
+               // P2P Beacon
+               RsvdPageLoc.LocP2PBeacon= TotalPageNum;
+               rtw_hal_construct_P2PBeacon(
+                       adapter,
+                       &ReservedPagePacket[BufIndex],
+                       &P2PBCNLength);
+               rtw_hal_fill_fake_txdesc(adapter, 
+                       &ReservedPagePacket[BufIndex-TxDescLen], 
+                       P2PBCNLength, _FALSE, _FALSE, _FALSE);
+
+               //DBG_871X("%s(): HW_VAR_SET_TX_CMD: PROBE RSP %p %d\n", 
+               //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (P2PBCNLength+TxDescLen));
+
+               CurtPktPageNum = (u8)PageNum(TxDescLen + P2PBCNLength, PageSize);
+
+               TotalPageNum += CurtPktPageNum;
+
+               BufIndex += (CurtPktPageNum*PageSize);
+
+               // P2P Probe rsp
+               RsvdPageLoc.LocP2PProbeRsp = TotalPageNum;
+               rtw_hal_construct_P2PProbeRsp(
+                       adapter,
+                       &ReservedPagePacket[BufIndex],
+                       &P2PProbeRspLength);
+               rtw_hal_fill_fake_txdesc(adapter, 
+                       &ReservedPagePacket[BufIndex-TxDescLen], 
+                       P2PProbeRspLength, _FALSE, _FALSE, _FALSE);
+
+               //DBG_871X("%s(): HW_VAR_SET_TX_CMD: PROBE RSP %p %d\n", 
+               //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (P2PProbeRspLength+TxDescLen));
+
+               CurtPktPageNum = (u8)PageNum(TxDescLen + P2PProbeRspLength, PageSize);
+
+               TotalPageNum += CurtPktPageNum;
+
+               BufIndex += (CurtPktPageNum*PageSize);
+
+               //P2P nego rsp
+               RsvdPageLoc.LocNegoRsp = TotalPageNum;
+               rtw_hal_construct_P2PNegoRsp(
+                       adapter,
+                       &ReservedPagePacket[BufIndex],
+                       &P2PNegoRspLength);
+               rtw_hal_fill_fake_txdesc(adapter, 
+                       &ReservedPagePacket[BufIndex-TxDescLen], 
+                       P2PNegoRspLength, _FALSE, _FALSE, _FALSE);
+
+               //DBG_871X("%s(): HW_VAR_SET_TX_CMD: QOS NULL DATA %p %d\n", 
+               //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (NegoRspLength+TxDescLen));
+
+               CurtPktPageNum = (u8)PageNum(TxDescLen + P2PNegoRspLength, PageSize);
+
+               TotalPageNum += CurtPktPageNum;
+
+               BufIndex += (CurtPktPageNum*PageSize);
+               
+               //P2P invite rsp
+               RsvdPageLoc.LocInviteRsp = TotalPageNum;
+               rtw_hal_construct_P2PInviteRsp(
+                       adapter,
+                       &ReservedPagePacket[BufIndex],
+                       &P2PInviteRspLength);
+               rtw_hal_fill_fake_txdesc(adapter, 
+                       &ReservedPagePacket[BufIndex-TxDescLen], 
+                       P2PInviteRspLength, _FALSE, _FALSE, _FALSE);
+
+               //DBG_871X("%s(): HW_VAR_SET_TX_CMD: QOS NULL DATA %p %d\n", 
+               //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (InviteRspLength+TxDescLen));
+
+               CurtPktPageNum = (u8)PageNum(TxDescLen + P2PInviteRspLength, PageSize);
+
+               TotalPageNum += CurtPktPageNum;
 
-       if (adapter->iface_type == IFACE_PORT0) {
-               adapter->iface_type = IFACE_PORT1;
-               adapter->pbuddy_adapter->iface_type = IFACE_PORT0;
-               DBG_871X_LEVEL(_drv_always_, "port switch - port0("ADPT_FMT"), port1("ADPT_FMT")\n",
-                       ADPT_ARG(adapter->pbuddy_adapter), ADPT_ARG(adapter));
-       } else {
-               adapter->iface_type = IFACE_PORT0;
-               adapter->pbuddy_adapter->iface_type = IFACE_PORT1;
-               DBG_871X_LEVEL(_drv_always_, "port switch - port0("ADPT_FMT"), port1("ADPT_FMT")\n",
-                       ADPT_ARG(adapter), ADPT_ARG(adapter->pbuddy_adapter));
-       }
+               BufIndex += (CurtPktPageNum*PageSize);
+       
+               //P2P provision discovery rsp
+               RsvdPageLoc.LocPDRsp = TotalPageNum;
+               rtw_hal_construct_P2PProvisionDisRsp(
+                       adapter,
+                       &ReservedPagePacket[BufIndex],
+                       &P2PPDRspLength);
+               rtw_hal_fill_fake_txdesc(adapter, 
+                       &ReservedPagePacket[BufIndex-TxDescLen], 
+                       P2PPDRspLength, _FALSE, _FALSE, _FALSE);
 
-#ifdef DBG_RUNTIME_PORT_SWITCH
-       msr = rtw_read8(adapter, MSR);
-       bcn_ctrl = rtw_read8(adapter, REG_BCN_CTRL);
-       bcn_ctrl_1 = rtw_read8(adapter, REG_BCN_CTRL_1);
+               //DBG_871X("%s(): HW_VAR_SET_TX_CMD: QOS NULL DATA %p %d\n", 
+               //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (PDRspLength+TxDescLen));
 
-       for (i=0; i<2; i++)
-               atimwnd[i] = rtw_read8(adapter, REG_ATIMWND+i);
-       for (i=0; i<2; i++)
-               atimwnd_1[i] = rtw_read8(adapter, REG_ATIMWND_1+i);
+               CurtPktPageNum = (u8)PageNum(TxDescLen + P2PPDRspLength, PageSize);
 
-       for (i=0; i<8; i++)
-               tsftr[i] = rtw_read8(adapter, REG_TSFTR+i);
-       for (i=0; i<8; i++)
-               tsftr_1[i] = rtw_read8(adapter, REG_TSFTR1+i);
+               TotalPageNum += CurtPktPageNum;
 
-       for (i=0; i<6; i++)
-               macid[i] = rtw_read8(adapter, REG_MACID+i);
+               BufIndex += (CurtPktPageNum*PageSize);
 
-       for (i=0; i<6; i++)
-               bssid[i] = rtw_read8(adapter, REG_BSSID+i);
+               TotalPacketLen = BufIndex + P2PPDRspLength;
+       }
+#endif //CONFIG_P2P_WOWLAN
 
-       for (i=0; i<6; i++)
-               macid_1[i] = rtw_read8(adapter, REG_MACID1+i);
+       if(TotalPacketLen > MaxRsvdPageBufSize) {
+               DBG_871X("%s(ERROR): rsvd page size is not enough!!TotalPacketLen %d, MaxRsvdPageBufSize %d\n",
+                               __FUNCTION__, TotalPacketLen,MaxRsvdPageBufSize);
+               goto error;
+       } else {
+               // update attribute
+               pattrib = &pcmdframe->attrib;
+               update_mgntframe_attrib(adapter, pattrib);
+               pattrib->qsel = 0x10;
+               pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset;
+#ifdef CONFIG_PCI_HCI
+               dump_mgntframe(adapter, pcmdframe);
+#else
+               dump_mgntframe_and_wait(adapter, pcmdframe, 100);
+#endif
+       }
 
-       for (i=0; i<6; i++)
-               bssid_1[i] = rtw_read8(adapter, REG_BSSID1+i);
+       DBG_871X("%s: Set RSVD page location to Fw ,TotalPacketLen(%d), TotalPageNum(%d)\n",
+                       __func__,TotalPacketLen,TotalPageNum);
+
+       if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
+               rtw_hal_set_FwRsvdPage_cmd(adapter, &RsvdPageLoc);
+               if (pwrctl->wowlan_mode == _TRUE)
+                       rtw_hal_set_FwAoacRsvdPage_cmd(adapter, &RsvdPageLoc);
+       } else if (pwrctl->wowlan_pno_enable) {
+#ifdef CONFIG_PNO_SUPPORT
+               rtw_hal_set_FwAoacRsvdPage_cmd(adapter, &RsvdPageLoc);
+               if(pwrctl->pno_in_resume)
+                       rtw_hal_set_scan_offload_info_cmd(adapter,
+                                       &RsvdPageLoc, 0);
+               else
+                       rtw_hal_set_scan_offload_info_cmd(adapter,
+                                       &RsvdPageLoc, 1);
+#endif //CONFIG_PNO_SUPPORT
+       }
+#ifdef CONFIG_P2P_WOWLAN
+       if(_TRUE == pwrctl->wowlan_p2p_mode)
+               rtw_hal_set_FwP2PRsvdPage_cmd(adapter, &RsvdPageLoc);
+       
+#endif //CONFIG_P2P_WOWLAN
+       return;
+error:
+       rtw_free_xmitframe(pxmitpriv, pcmdframe);
+}
 
-       DBG_871X(FUNC_ADPT_FMT" after switch\n"
-               "msr:0x%02x\n"
-               "bcn_ctrl:0x%02x\n"
-               "bcn_ctrl_1:0x%02x\n"
-               "atimwnd:%u\n"
-               "atimwnd_1:%u\n"
-               "tsftr:%llu\n"
-               "tsftr1:%llu\n"
-               "macid:"MAC_FMT"\n"
-               "bssid:"MAC_FMT"\n"
-               "macid_1:"MAC_FMT"\n"
-               "bssid_1:"MAC_FMT"\n"
-               , FUNC_ADPT_ARG(adapter)
-               , msr
-               , bcn_ctrl
-               , bcn_ctrl_1
-               , *((u16*)atimwnd)
-               , *((u16*)atimwnd_1)
-               , *((u64*)tsftr)
-               , *((u64*)tsftr_1)
-               , MAC_ARG(macid)
-               , MAC_ARG(bssid)
-               , MAC_ARG(macid_1)
-               , MAC_ARG(bssid_1)
-       );
-#endif /* DBG_RUNTIME_PORT_SWITCH */
+static void rtw_hal_download_rsvd_page(_adapter* adapter, u8 mstatus)
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(adapter);
+       struct mlme_ext_priv    *pmlmeext = &(adapter->mlmeextpriv);
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
+       BOOLEAN         bcn_valid = _FALSE;
+       u8      DLBcnCount=0;
+       u32 poll = 0;
+       u8 val8;
 
-#endif /* CONFIG_RUNTIME_PORT_SWITCH */
-#endif /* CONFIG_CONCURRENT_MODE */
+_func_enter_;
+
+       DBG_8192C("+" FUNC_ADPT_FMT ": iface_type=%d mstatus(%x)\n",
+               FUNC_ADPT_ARG(adapter), get_iface_type(adapter), mstatus);
+
+       if(mstatus == RT_MEDIA_CONNECT) {
+               BOOLEAN bRecover = _FALSE;
+               u8 v8;
+
+               // We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C.
+               // Suggested by filen. Added by tynli.
+               rtw_write16(adapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid));
+
+               // set REG_CR bit 8
+               v8 = rtw_read8(adapter, REG_CR+1);
+               v8 |= BIT(0); // ENSWBCN
+               rtw_write8(adapter,  REG_CR+1, v8);
+
+               // Disable Hw protection for a time which revserd for Hw sending beacon.
+               // Fix download reserved page packet fail that access collision with the protection time.
+               // 2010.05.11. Added by tynli.
+               val8 = rtw_read8(adapter, REG_BCN_CTRL);
+               val8 &= ~EN_BCN_FUNCTION;
+               val8 |= DIS_TSF_UDT;
+               rtw_write8(adapter, REG_BCN_CTRL, val8);
+
+               // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame.
+               if (pHalData->RegFwHwTxQCtrl & BIT(6))
+                       bRecover = _TRUE;
+
+               // To tell Hw the packet is not a real beacon frame.
+               rtw_write8(adapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl & ~BIT(6));
+               pHalData->RegFwHwTxQCtrl &= ~BIT(6);
+
+               // Clear beacon valid check bit.
+               rtw_hal_set_hwreg(adapter, HW_VAR_BCN_VALID, NULL);
+               rtw_hal_set_hwreg(adapter, HW_VAR_DL_BCN_SEL, NULL);
+
+               DLBcnCount = 0;
+               poll = 0;
+               do {
+                       // download rsvd page.
+                       rtw_hal_set_fw_rsvd_page(adapter, 0);
+
+                       DLBcnCount++;
+                       do {
+                               rtw_yield_os();
+                               //rtw_mdelay_os(10);
+                               // check rsvd page download OK.
+                               rtw_hal_get_hwreg(adapter, HW_VAR_BCN_VALID, (u8*)(&bcn_valid));
+                               poll++;
+                       } while(!bcn_valid && (poll%10)!=0 && !adapter->bSurpriseRemoved && !adapter->bDriverStopped);
+               }while(!bcn_valid && DLBcnCount<=100 && !adapter->bSurpriseRemoved && !adapter->bDriverStopped);
+
+               if(adapter->bSurpriseRemoved || adapter->bDriverStopped) {
+                       DBG_871X(ADPT_FMT": 0 bSurpriseRemoved:%d, bDriverStopped:%d\n",
+                               ADPT_ARG(adapter) ,adapter->bSurpriseRemoved,
+                               adapter->bDriverStopped);
+               } else if(!bcn_valid) {
+                       DBG_871X(ADPT_FMT": 1 DL RSVD page failed! DLBcnCount:%u, poll:%u\n",
+                               ADPT_ARG(adapter) ,DLBcnCount, poll);
+               } else {
+                       struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);
+                       pwrctl->fw_psmode_iface_id = adapter->iface_id;
+                       DBG_871X(ADPT_FMT": 1 DL RSVD page success! DLBcnCount:%u, poll:%u\n",
+                               ADPT_ARG(adapter), DLBcnCount, poll);
+               }
+
+               // 2010.05.11. Added by tynli.
+               val8 = rtw_read8(adapter, REG_BCN_CTRL);
+               val8 |= EN_BCN_FUNCTION;
+               val8 &= ~DIS_TSF_UDT;
+               rtw_write8(adapter, REG_BCN_CTRL, val8);
+
+               // To make sure that if there exists an adapter which would like to send beacon.
+               // If exists, the origianl value of 0x422[6] will be 1, we should check this to
+               // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause
+               // the beacon cannot be sent by HW.
+               // 2010.06.23. Added by tynli.
+               if(bRecover) {
+                       rtw_write8(adapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl | BIT(6));
+                       pHalData->RegFwHwTxQCtrl |= BIT(6);
+               }
+
+               // Clear CR[8] or beacon packet will not be send to TxBuf anymore.
+               v8 = rtw_read8(adapter, REG_CR+1);
+               v8 &= ~BIT(0); // ~ENSWBCN
+               rtw_write8(adapter, REG_CR+1, v8);
+       }
+
+_func_exit_;
 }
+#endif //CONFIG_WOWLAN
 
 void SetHwReg(_adapter *adapter, u8 variable, u8 *val)
 {
@@ -1047,94 +5031,288 @@ void SetHwReg(_adapter *adapter, u8 variable, u8 *val)
 _func_enter_;
 
        switch (variable) {
-       case HW_VAR_PORT_SWITCH:
-               hw_var_port_switch(adapter);
-               break;
-       case HW_VAR_INIT_RTS_RATE:
-       {
-               u16 brate_cfg = *((u16*)val);
-               u8 rate_index = 0;
-               HAL_VERSION *hal_ver = &hal_data->VersionID;
+               case HW_VAR_INITIAL_GAIN:
+                       {                               
+                               u32 rx_gain = ((u32 *)(val))[0];
+               
+                               if(rx_gain == 0xff){//restore rx gain                                   
+                                       //ODM_Write_DIG(podmpriv,pDigTable->BackupIGValue);
+                                       odm_PauseDIG(odm, ODM_RESUME_DIG,rx_gain);
+                               }
+                               else{
+                                       //pDigTable->BackupIGValue = pDigTable->CurIGValue;
+                                       //ODM_Write_DIG(podmpriv,rx_gain);
+                                       odm_PauseDIG(odm, ODM_PAUSE_DIG,rx_gain);
+                               }
+                       }
+                       break;          
+               case HW_VAR_PORT_SWITCH:
+                       hw_var_port_switch(adapter);
+                       break;
+               case HW_VAR_INIT_RTS_RATE:
+               {
+                       u16 brate_cfg = *((u16*)val);
+                       u8 rate_index = 0;
+                       HAL_VERSION *hal_ver = &hal_data->VersionID;
 
-               if (IS_81XXC(*hal_ver) ||IS_92D(*hal_ver) || IS_8723_SERIES(*hal_ver) || IS_8188E(*hal_ver)) {
+                       if (IS_81XXC(*hal_ver) ||IS_92D(*hal_ver) || IS_8723_SERIES(*hal_ver) || IS_8188E(*hal_ver)) {
 
-                       while (brate_cfg > 0x1) {
-                               brate_cfg = (brate_cfg >> 1);
-                               rate_index++;
+                               while (brate_cfg > 0x1) {
+                                       brate_cfg = (brate_cfg >> 1);
+                                       rate_index++;
+                               }
+                               rtw_write8(adapter, REG_INIRTS_RATE_SEL, rate_index);
+                       } else {
+                               rtw_warn_on(1);
                        }
-                       rtw_write8(adapter, REG_INIRTS_RATE_SEL, rate_index);
-               } else {
-                       rtw_warn_on(1);
                }
-       }
-               break;
-       case HW_VAR_SEC_CFG:
-       {
-               #if defined(CONFIG_CONCURRENT_MODE) && !defined(DYNAMIC_CAMID_ALLOC)
-               // enable tx enc and rx dec engine, and no key search for MC/BC
-               rtw_write8(adapter, REG_SECCFG, SCR_NoSKMC|SCR_RxDecEnable|SCR_TxEncEnable);
-               #elif defined(DYNAMIC_CAMID_ALLOC)
-               u16 reg_scr;
-
-               reg_scr = rtw_read16(adapter, REG_SECCFG);
-               rtw_write16(adapter, REG_SECCFG, reg_scr|SCR_CHK_KEYID|SCR_RxDecEnable|SCR_TxEncEnable);
-               #else
-               rtw_write8(adapter, REG_SECCFG, *((u8*)val));
-               #endif
-       }
-               break;
-       case HW_VAR_SEC_DK_CFG:
-       {
-               struct security_priv *sec = &adapter->securitypriv;
-               u8 reg_scr = rtw_read8(adapter, REG_SECCFG);
-
-               if (val) /* Enable default key related setting */
+                       break;
+               case HW_VAR_SEC_CFG:
                {
-                       reg_scr |= SCR_TXBCUSEDK;
-                       if (sec->dot11AuthAlgrthm != dot11AuthAlgrthm_8021X)
-                               reg_scr |= (SCR_RxUseDK|SCR_TxUseDK);
+                       #if defined(CONFIG_CONCURRENT_MODE) && !defined(DYNAMIC_CAMID_ALLOC)
+                       // enable tx enc and rx dec engine, and no key search for MC/BC
+                       rtw_write8(adapter, REG_SECCFG, SCR_NoSKMC|SCR_RxDecEnable|SCR_TxEncEnable);
+                       #elif defined(DYNAMIC_CAMID_ALLOC)
+                       u16 reg_scr;
+
+                       reg_scr = rtw_read16(adapter, REG_SECCFG);
+                       rtw_write16(adapter, REG_SECCFG, reg_scr|SCR_CHK_KEYID|SCR_RxDecEnable|SCR_TxEncEnable);
+                       #else
+                       rtw_write8(adapter, REG_SECCFG, *((u8*)val));
+                       #endif
                }
-               else /* Disable default key related setting */
+                       break;
+               case HW_VAR_SEC_DK_CFG:
                {
-                       reg_scr &= ~(SCR_RXBCUSEDK|SCR_TXBCUSEDK|SCR_RxUseDK|SCR_TxUseDK);
-               }
+                       struct security_priv *sec = &adapter->securitypriv;
+                       u8 reg_scr = rtw_read8(adapter, REG_SECCFG);
 
-               rtw_write8(adapter, REG_SECCFG, reg_scr);
-       }
-               break;
-       case HW_VAR_DM_FLAG:
-               odm->SupportAbility = *((u32*)val);
-               break;
-       case HW_VAR_DM_FUNC_OP:
-               if (*((u8*)val) == _TRUE) {
-                       /* save dm flag */
-                       odm->BK_SupportAbility = odm->SupportAbility;                           
-               } else {
-                       /* restore dm flag */
-                       odm->SupportAbility = odm->BK_SupportAbility;
+                       if (val) /* Enable default key related setting */
+                       {
+                               reg_scr |= SCR_TXBCUSEDK;
+                               if (sec->dot11AuthAlgrthm != dot11AuthAlgrthm_8021X)
+                                       reg_scr |= (SCR_RxUseDK|SCR_TxUseDK);
+                       }
+                       else /* Disable default key related setting */
+                       {
+                               reg_scr &= ~(SCR_RXBCUSEDK|SCR_TXBCUSEDK|SCR_RxUseDK|SCR_TxUseDK);
+                       }
+
+                       rtw_write8(adapter, REG_SECCFG, reg_scr);
                }
-               break;
-       case HW_VAR_DM_FUNC_SET:
-               if(*((u32*)val) == DYNAMIC_ALL_FUNC_ENABLE){
-                       struct dm_priv  *dm = &hal_data->dmpriv;
-                       dm->DMFlag = dm->InitDMFlag;
-                       odm->SupportAbility = dm->InitODMFlag;
-               } else {
-                       odm->SupportAbility |= *((u32 *)val);
+                       break;
+               case HW_VAR_DM_FLAG:
+                       odm->SupportAbility = *((u32*)val);
+                       break;
+               case HW_VAR_DM_FUNC_OP:
+                       if (*((u8*)val) == _TRUE) {
+                               /* save dm flag */
+                               odm->BK_SupportAbility = odm->SupportAbility;                           
+                       } else {
+                               /* restore dm flag */
+                               odm->SupportAbility = odm->BK_SupportAbility;
+                       }
+                       break;
+               case HW_VAR_DM_FUNC_SET:
+                       if(*((u32*)val) == DYNAMIC_ALL_FUNC_ENABLE){
+                               struct dm_priv  *dm = &hal_data->dmpriv;
+                               dm->DMFlag = dm->InitDMFlag;
+                               odm->SupportAbility = dm->InitODMFlag;
+                       } else {
+                               odm->SupportAbility |= *((u32 *)val);
+                       }
+                       break;
+               case HW_VAR_DM_FUNC_CLR:
+                       /*
+                       * input is already a mask to clear function
+                       * don't invert it again! George,Lucas@20130513
+                       */
+                       odm->SupportAbility &= *((u32 *)val);
+                       break;
+               case HW_VAR_ASIX_IOT:
+                       // enable  ASIX IOT function
+                       if (*((u8*)val) == _TRUE) {
+                               // 0xa2e[0]=0 (disable rake receiver)
+                               rtw_write8(adapter, rCCK0_FalseAlarmReport+2, 
+                                               rtw_read8(adapter, rCCK0_FalseAlarmReport+2) & ~(BIT0));
+                               //  0xa1c=0xa0 (reset channel estimation if signal quality is bad)
+                               rtw_write8(adapter, rCCK0_DSPParameter2, 0xa0);
+                       } else {
+                       // restore reg:0xa2e,   reg:0xa1c
+                               rtw_write8(adapter, rCCK0_FalseAlarmReport+2, 
+                                               rtw_read8(adapter, rCCK0_FalseAlarmReport+2)|(BIT0));
+                               rtw_write8(adapter, rCCK0_DSPParameter2, 0x00);
+                       }
+                       break;
+#ifdef CONFIG_WOWLAN
+       case HW_VAR_WOWLAN:
+       {
+               struct wowlan_ioctl_param *poidparam;
+               struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);
+               struct security_priv *psecuritypriv = &adapter->securitypriv;
+               struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
+               struct hal_ops *pHalFunc = &adapter->HalFunc;
+               struct sta_info *psta = NULL;
+               int res;
+               u16 media_status_rpt;
+               u8 val8;
+
+               poidparam = (struct wowlan_ioctl_param *)val;
+               switch (poidparam->subcode) {
+                       case WOWLAN_ENABLE:
+                               DBG_871X_LEVEL(_drv_always_, "WOWLAN_ENABLE\n");
+
+#ifdef CONFIG_GTK_OL
+                               if (psecuritypriv->dot11PrivacyAlgrthm == _AES_)
+                                       rtw_hal_fw_sync_cam_id(adapter);
+#endif
+                               if (IS_HARDWARE_TYPE_8723B(adapter))
+                                       rtw_hal_backup_rate(adapter);
+
+                               if (pHalFunc->hal_set_wowlan_fw != NULL)
+                                       pHalFunc->hal_set_wowlan_fw(adapter, _TRUE);
+                               else
+                                       DBG_871X("hal_set_wowlan_fw is null\n");
+
+                               rtw_hal_download_rsvd_page(adapter, RT_MEDIA_CONNECT);
+
+                               if (!pwrctl->wowlan_pno_enable) {
+                                       psta = rtw_get_stainfo(&adapter->stapriv,
+                                                       get_bssid(pmlmepriv));
+                                       media_status_rpt =
+                                               (u16)((psta->mac_id<<8)|RT_MEDIA_CONNECT);
+                                       if (psta != NULL) {
+                                               rtw_hal_set_hwreg(adapter,
+                                                               HW_VAR_H2C_MEDIA_STATUS_RPT,
+                                                               (u8 *)&media_status_rpt);
+                                       }
+                               }
+
+                               rtw_msleep_os(2);
+
+                               if (IS_HARDWARE_TYPE_8188E(adapter))
+                                       rtw_hal_disable_tx_report(adapter);
+
+                               //RX DMA stop
+                               res = rtw_hal_pause_rx_dma(adapter);
+                               if (res == _FAIL)
+                                       DBG_871X_LEVEL(_drv_always_, "[WARNING] pause RX DMA fail\n");
+
+#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
+                               //Enable CPWM2 only.
+                               res = rtw_hal_enable_cpwm2(adapter);
+                               if (res == _FAIL)
+                                       DBG_871X_LEVEL(_drv_always_, "[WARNING] enable cpwm2 fail\n");
+#endif
+
+                               //Set WOWLAN H2C command.
+                               DBG_871X_LEVEL(_drv_always_, "Set WOWLan cmd\n");
+                               rtw_hal_set_fw_wow_related_cmd(adapter, 1);
+
+                               res = rtw_hal_check_wow_ctrl(adapter, _TRUE);
+                               if (res == _FALSE)
+                                       DBG_871X("[Error]%s: set wowlan CMD fail!!\n", __func__);
+
+                               pwrctl->wowlan_wake_reason =
+                                       rtw_read8(adapter, REG_WOWLAN_WAKE_REASON);
+
+                               DBG_871X_LEVEL(_drv_always_,
+                                               "wowlan_wake_reason: 0x%02x\n",
+                                               pwrctl->wowlan_wake_reason);
+#ifdef CONFIG_GTK_OL_DBG
+                               dump_cam_table(adapter);
+#endif
+#ifdef CONFIG_USB_HCI
+                               if (adapter->intf_stop)
+                                       adapter->intf_stop(adapter);
+
+                               /* Invoid SE0 reset signal during suspending*/
+                               rtw_write8(adapter, REG_RSV_CTRL, 0x20);
+                               rtw_write8(adapter, REG_RSV_CTRL, 0x60);
+#endif //CONFIG_USB_HCI
+                               break;
+                       case WOWLAN_DISABLE:
+                               DBG_871X_LEVEL(_drv_always_, "WOWLAN_DISABLE\n");
+
+                               if (!pwrctl->wowlan_pno_enable) {
+                                       psta = rtw_get_stainfo(&adapter->stapriv,
+                                                               get_bssid(pmlmepriv));
+
+                                       if (psta != NULL) {
+                                               media_status_rpt =
+                                                       (u16)((psta->mac_id<<8)|RT_MEDIA_DISCONNECT);
+                                               rtw_hal_set_hwreg(adapter,
+                                                               HW_VAR_H2C_MEDIA_STATUS_RPT,
+                                                               (u8 *)&media_status_rpt);
+                                       } else {
+                                               DBG_871X("%s: psta is null\n", __func__);
+                                       }
+                               }
+
+                               if (0) {
+                                       DBG_871X("0x630:0x%02x\n",
+                                                       rtw_read8(adapter, 0x630));
+                                       DBG_871X("0x631:0x%02x\n",
+                                                       rtw_read8(adapter, 0x631));
+                               }
+
+                               pwrctl->wowlan_wake_reason = rtw_read8(adapter,
+                                               REG_WOWLAN_WAKE_REASON);
+
+                               DBG_871X_LEVEL(_drv_always_, "wakeup_reason: 0x%02x\n",
+                                               pwrctl->wowlan_wake_reason);
+
+                               rtw_hal_set_fw_wow_related_cmd(adapter, 0);
+
+                               res = rtw_hal_check_wow_ctrl(adapter, _FALSE);
+                               if (res == _FALSE) {
+                                       DBG_871X("[Error]%s: disable WOW cmd fail\n!!", __func__);
+                                       rtw_hal_force_enable_rxdma(adapter);
+                               }
+
+                               if (IS_HARDWARE_TYPE_8188E(adapter))
+                                       rtw_hal_enable_tx_report(adapter);
+
+                               rtw_hal_update_tx_iv(adapter);
+
+#ifdef CONFIG_GTK_OL
+                               if (psecuritypriv->dot11PrivacyAlgrthm == _AES_)
+                                       rtw_hal_update_gtk_offload_info(adapter);
+#endif //CONFIG_GTK_OL
+
+                               if (pHalFunc->hal_set_wowlan_fw != NULL)
+                                       pHalFunc->hal_set_wowlan_fw(adapter, _FALSE);
+                               else
+                                       DBG_871X("hal_set_wowlan_fw is null\n");
+#ifdef CONFIG_GPIO_WAKEUP
+                               rtw_clear_hostwakeupgpio(adapter);
+#endif
+                               if((pwrctl->wowlan_wake_reason != FWDecisionDisconnect) &&
+                                       (pwrctl->wowlan_wake_reason != Rx_Pairwisekey) &&
+                                       (pwrctl->wowlan_wake_reason != Rx_DisAssoc) &&
+                                       (pwrctl->wowlan_wake_reason != Rx_DeAuth)) {
+
+                                       rtw_hal_download_rsvd_page(adapter, RT_MEDIA_CONNECT);
+                                       if (psta != NULL) {
+                                               media_status_rpt =
+                                                       (u16)((psta->mac_id<<8)|RT_MEDIA_CONNECT);
+                                               rtw_hal_set_hwreg(adapter,
+                                                               HW_VAR_H2C_MEDIA_STATUS_RPT,
+                                                               (u8 *)&media_status_rpt);
+                                       }
+                               }
+                               break;
+                       default:
+                               break;
+                       }
                }
                break;
-       case HW_VAR_DM_FUNC_CLR:
-               /*
-               * input is already a mask to clear function
-               * don't invert it again! George,Lucas@20130513
-               */
-               odm->SupportAbility &= *((u32 *)val);
-               break;
-       default:
-               if (0)
-               DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" variable(%d) not defined!\n",
-                       FUNC_ADPT_ARG(adapter), variable);
-               break;
+#endif //CONFIG_WOWLAN
+               default:
+                       if (0)
+                       DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" variable(%d) not defined!\n",
+                               FUNC_ADPT_ARG(adapter), variable);
+                       break;
        }
 
 _func_exit_;
@@ -1187,7 +5365,7 @@ SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)
                break;
        case HAL_DEF_DBG_RX_INFO_DUMP:
                {
-                       PFALSE_ALARM_STATISTICS FalseAlmCnt = &(odm->FalseAlmCnt);
+                       PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( odm , PHYDM_FALSEALMCNT);
                        pDIG_T  pDM_DigTable = &odm->DM_DigTable;
 
                        DBG_871X("============ Rx Info dump ===================\n");
@@ -1218,11 +5396,15 @@ SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)
                struct dm_priv *dm = &hal_data->dmpriv;
 
                if(dm_func == 0){ //disable all dynamic func
+                       pDIG_T  pDM_DigTable = &odm->DM_DigTable;
                        odm->SupportAbility = DYNAMIC_FUNC_DISABLE;
+                       pDM_DigTable->bStopDIG = _TRUE;
                        DBG_8192C("==> Disable all dynamic function...\n");
                }
                else if(dm_func == 1){//disable DIG
+                       pDIG_T  pDM_DigTable = &odm->DM_DigTable;
                        odm->SupportAbility  &= (~DYNAMIC_BB_DIG);
+                       pDM_DigTable->bStopDIG = _TRUE;         
                        DBG_8192C("==> Disable DIG...\n");
                }
                else if(dm_func == 2){//disable High power
@@ -1242,9 +5424,11 @@ SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)
                        if(!(odm->SupportAbility  & DYNAMIC_BB_DIG)) {
                                DIG_T   *pDigTable = &odm->DM_DigTable;
                                pDigTable->CurIGValue= rtw_read8(adapter, 0xc50);
+                               pDigTable->bStopDIG = _FALSE;
                        }
                        dm->DMFlag |= DYNAMIC_FUNC_BT;
                        odm->SupportAbility = DYNAMIC_ALL_FUNC_ENABLE;
+
                        DBG_8192C("==> Turn on all dynamic function...\n");
                }
        }
@@ -1258,6 +5442,9 @@ SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)
        case HAL_DEF_ANT_DETECT:
                hal_data->AntDetection = *((u8 *)value);
                break;
+       case HAL_DEF_DBG_DIS_PWT:
+               hal_data->bDisableTXPowerTraining = *((u8*)value);
+               break;  
        default:
                DBG_871X_LEVEL(_drv_always_, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __FUNCTION__, variable);
                bResult = _FAIL;
@@ -1314,6 +5501,9 @@ GetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)
                case HAL_DEF_TX_PAGE_SIZE:
                        *(( u32*)value) = PAGE_SIZE_128;
                        break;
+               case HAL_DEF_DBG_DIS_PWT:
+                       *(u8*)value = hal_data->bDisableTXPowerTraining;
+                       break;
                default:
                        DBG_871X_LEVEL(_drv_always_, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __FUNCTION__, variable);
                        bResult = _FAIL;
@@ -1382,6 +5572,10 @@ void SetHalODMVar(
                case HAL_ODM_WIFI_DISPLAY_STATE:
                                ODM_CmnInfoUpdate(podmpriv,ODM_CMNINFO_WIFI_DISPLAY,bSet);
                        break;
+               case HAL_ODM_REGULATION:
+                               ODM_CmnInfoInit(podmpriv, ODM_CMNINFO_DOMAIN_CODE_2G, pHalData->Regulation2_4G);
+                               ODM_CmnInfoInit(podmpriv, ODM_CMNINFO_DOMAIN_CODE_5G, pHalData->Regulation5G);
+                       break;
                #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)              
                case HAL_ODM_NOISE_MONITOR:
                        {
@@ -1682,18 +5876,17 @@ void rtw_hal_check_rxfifo_full(_adapter *adapter)
        //switch counter to RX fifo
        if(IS_81XXC(pHalData->VersionID) || IS_92D(pHalData->VersionID) 
                || IS_8188E(pHalData->VersionID) || IS_8723_SERIES(pHalData->VersionID)
-               || IS_8812_SERIES(pHalData->VersionID) || IS_8821_SERIES(pHalData->VersionID))
+               || IS_8812_SERIES(pHalData->VersionID) || IS_8821_SERIES(pHalData->VersionID)
+               || IS_8723B_SERIES(pHalData->VersionID) || IS_8192E(pHalData->VersionID))
        {
                rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xa0);
                save_cnt = _TRUE;
        }
-       else if(IS_8723B_SERIES(pHalData->VersionID) || IS_8192E(pHalData->VersionID))
+       else 
        {
-               //printk("8723b or 8192e , MAC_667 set 0xf0\n");
-               rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xf0);
-               save_cnt = _TRUE;
+               //todo: other chips 
        }
-       //todo: other chips 
+       
                
        if(save_cnt)
        {
@@ -1730,7 +5923,7 @@ void linked_info_dump(_adapter *padapter,u8 benable)
                #endif // CONFIG_IPS
 
                #ifdef CONFIG_LPS       
-               rtw_pm_set_lps(padapter, pwrctrlpriv->ips_org_mode);
+               rtw_pm_set_lps(padapter, pwrctrlpriv->org_power_mgnt );
                #endif // CONFIG_LPS
        }
        padapter->bLinkInfoDump = benable ;     
@@ -2135,19 +6328,23 @@ void rtw_bb_rf_gain_offset(_adapter *padapter)
        if (value & BIT4) {
                DBG_871X("Offset RF Gain.\n");
                DBG_871X("Offset RF Gain.  padapter->eeprompriv.EEPROMRFGainVal=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal);
-
+               
                if(padapter->eeprompriv.EEPROMRFGainVal != 0xff){
-                       if (pHalData->ant_path == ODM_RF_PATH_A)
+
+                       if(pHalData->ant_path == ODM_RF_PATH_A) {
                                GainValue=(padapter->eeprompriv.EEPROMRFGainVal & 0x0f);
-                       else
+                               
+                       } else {
                                GainValue=(padapter->eeprompriv.EEPROMRFGainVal & 0xf0)>>4;
+                       }
                        DBG_871X("Ant PATH_%d GainValue Offset = 0x%x\n",(pHalData->ant_path == ODM_RF_PATH_A) ? (ODM_RF_PATH_A) : (ODM_RF_PATH_B),GainValue);
-
+                       
                        for (i = 0; i < ArrayLen; i += 2 )
                        {
+                               //DBG_871X("ArrayLen in =%d ,Array 1 =0x%x ,Array2 =0x%x \n",i,Array[i],Array[i]+1);
                                v1 = Array[i];
                                v2 = Array[i+1];
-                               if ( v1 == GainValue ) {
+                                if ( v1 == GainValue ) {
                                                DBG_871X("Offset RF Gain. got v1 =0x%x ,v2 =0x%x \n",v1,v2);
                                                target=v2;
                                                break;
@@ -2162,7 +6359,7 @@ void rtw_bb_rf_gain_offset(_adapter *padapter)
 
                        DBG_871X("Offset RF Gain. After reg 0x7f=0x%08x\n",res);
                        
-               } else {
+               }else {
 
                        DBG_871X("Offset RF Gain.  padapter->eeprompriv.EEPROMRFGainVal=0x%x    != 0xff, didn't run Kfree\n",padapter->eeprompriv.EEPROMRFGainVal);
                }
@@ -2224,7 +6421,7 @@ void dm_DynamicUsbTxAgg(_adapter *padapter, u8 from_timer)
                if((pHalData->UsbRxAggMode == USB_RX_AGG_USB) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE))
                {
                        if(pdvobjpriv->traffic_stat.cur_tx_tp > 2 && pdvobjpriv->traffic_stat.cur_rx_tp < 30)
-                               rtw_write16(padapter, REG_RXDMA_AGG_PG_TH,0x1010);
+                               rtw_write16(padapter, REG_RXDMA_AGG_PG_TH,0x1003);
                        else
                                rtw_write16(padapter, REG_RXDMA_AGG_PG_TH,0x2005); //dmc agg th 20K
                        
@@ -2234,3 +6431,167 @@ void dm_DynamicUsbTxAgg(_adapter *padapter, u8 from_timer)
 #endif
 }
 
+//bus-agg check for SoftAP mode
+inline u8 rtw_hal_busagg_qsel_check(_adapter *padapter,u8 pre_qsel,u8 next_qsel)
+{
+       struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
+       u8 chk_rst = _SUCCESS;
+       
+       if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)
+               return chk_rst;
+
+       //if((pre_qsel == 0xFF)||(next_qsel== 0xFF)) 
+       //      return chk_rst;
+       
+       if(     ((pre_qsel == QSLT_HIGH)||((next_qsel== QSLT_HIGH))) 
+                       && (pre_qsel != next_qsel )){
+                       //DBG_871X("### bus-agg break cause of qsel misatch, pre_qsel=0x%02x,next_qsel=0x%02x ###\n",
+                       //      pre_qsel,next_qsel);
+                       chk_rst = _FAIL;
+               }
+       return chk_rst;
+}
+
+/*
+ * Description:
+ * dump_TX_FIFO: This is only used to dump TX_FIFO for debug WoW mode offload
+ * contant.
+ *
+ * Input:
+ * adapter: adapter pointer.
+ * page_num: The max. page number that user want to dump. 
+ * page_size: page size of each page. eg. 128 bytes, 256 bytes.
+ */
+void dump_TX_FIFO(_adapter* padapter, u8 page_num, u16 page_size){
+
+       int i;
+       u8 val = 0;
+       u8 base = 0;
+       u32 addr = 0;
+       u32 count = (page_size / 8);
+
+       if (page_num <= 0) {
+               DBG_871X("!!%s: incorrect input page_num paramter!\n", __func__);
+               return;
+       }
+
+       if (page_size < 128 || page_size > 256) {
+               DBG_871X("!!%s: incorrect input page_size paramter!\n", __func__);
+               return;
+       }
+
+       DBG_871X("+%s+\n", __func__);
+       val = rtw_read8(padapter, 0x106);
+       rtw_write8(padapter, 0x106, 0x69);
+       DBG_871X("0x106: 0x%02x\n", val);
+       base = rtw_read8(padapter, 0x209);
+       DBG_871X("0x209: 0x%02x\n", base);
+
+       addr = ((base) * page_size)/8;
+       for (i = 0 ; i < page_num * count ; i+=2) {
+               rtw_write32(padapter, 0x140, addr + i);
+               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+               rtw_write32(padapter, 0x140, addr + i + 1);
+               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+       }
+}
+
+#ifdef CONFIG_GPIO_API
+u8 rtw_hal_get_gpio(_adapter* adapter, u8 gpio_num)
+{
+       u8 value;
+       u8 direction;   
+       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
+
+       rtw_ps_deny(adapter, PS_DENY_IOCTL);
+
+       DBG_871X("rf_pwrstate=0x%02x\n", pwrpriv->rf_pwrstate);
+       LeaveAllPowerSaveModeDirect(adapter);
+
+       /* Read GPIO Direction */
+       direction = (rtw_read8(adapter,REG_GPIO_PIN_CTRL + 2) & BIT(gpio_num)) >> gpio_num;
+
+       /* According the direction to read register value */
+       if( direction )
+               value =  (rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1)& BIT(gpio_num)) >> gpio_num;
+       else
+               value =  (rtw_read8(adapter, REG_GPIO_PIN_CTRL)& BIT(gpio_num)) >> gpio_num;
+
+       rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
+       DBG_871X("%s direction=%d value=%d\n",__FUNCTION__,direction,value);
+
+       return value;
+}
+
+int  rtw_hal_set_gpio_output_value(_adapter* adapter, u8 gpio_num, BOOLEAN isHigh)
+{
+       u8 direction = 0;
+       u8 res = -1;
+       if (IS_HARDWARE_TYPE_8188E(adapter)){
+               /* Check GPIO is 4~7 */
+               if( gpio_num > 7 || gpio_num < 4)
+               {
+                       DBG_871X("%s The gpio number does not included 4~7.\n",__FUNCTION__);
+                       return -1;
+               }
+       }       
+       
+       rtw_ps_deny(adapter, PS_DENY_IOCTL);
+
+       LeaveAllPowerSaveModeDirect(adapter);
+
+       /* Read GPIO direction */
+       direction = (rtw_read8(adapter,REG_GPIO_PIN_CTRL + 2) & BIT(gpio_num)) >> gpio_num;
+
+       /* If GPIO is output direction, setting value. */
+       if( direction )
+       {
+               if(isHigh)
+                       rtw_write8(adapter, REG_GPIO_PIN_CTRL + 1, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1) | BIT(gpio_num));
+               else
+                       rtw_write8(adapter, REG_GPIO_PIN_CTRL + 1, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1) & ~BIT(gpio_num));
+
+               DBG_871X("%s Set gpio %x[%d]=%d\n",__FUNCTION__,REG_GPIO_PIN_CTRL+1,gpio_num,isHigh );
+               res = 0;
+       }
+       else
+       {
+               DBG_871X("%s The gpio is input,not be set!\n",__FUNCTION__);
+               res = -1;
+       }
+
+       rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
+       return res;
+}
+
+int rtw_hal_config_gpio(_adapter* adapter, u8 gpio_num, BOOLEAN isOutput)
+{
+       if (IS_HARDWARE_TYPE_8188E(adapter)){
+               if( gpio_num > 7 || gpio_num < 4)
+               {
+                       DBG_871X("%s The gpio number does not included 4~7.\n",__FUNCTION__);
+                       return -1;
+               }
+       }       
+
+       DBG_871X("%s gpio_num =%d direction=%d\n",__FUNCTION__,gpio_num,isOutput);
+
+       rtw_ps_deny(adapter, PS_DENY_IOCTL);
+
+       LeaveAllPowerSaveModeDirect(adapter);
+
+       if( isOutput )
+       {
+               rtw_write8(adapter, REG_GPIO_PIN_CTRL + 2, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 2) | BIT(gpio_num));
+       }
+       else
+       {
+               rtw_write8(adapter, REG_GPIO_PIN_CTRL + 2, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 2) & ~BIT(gpio_num));
+       }
+
+       rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
+
+       return 0;
+}
+
+#endif
index e2ddca765370786496423fac0d87ed32d35db404..4866324cc7ecce2befb8bb5669002af69c72be0a 100755 (executable)
@@ -2573,17 +2573,12 @@ Hal_ChannelPlanToRegulation(
                        break;
        }
 
-       ODM_CmnInfoInit(odm, ODM_CMNINFO_DOMAIN_CODE_2G, pHalData->Regulation2_4G);
-       ODM_CmnInfoInit(odm, ODM_CMNINFO_DOMAIN_CODE_5G, pHalData->Regulation5G);
+       DBG_871X("%s ChannelPlan:0x%02x,Regulation(2_4G/5G):0x%02x,0x%02x\n",
+               __FUNCTION__,ChannelPlan,pHalData->Regulation2_4G,pHalData->Regulation5G);
+
 }
 
 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
-
-extern char *rtw_phy_file_path;
-char   file_path[PATH_LENGTH_MAX];
-
-#define GetLineFromBuffer(buffer)       strsep(&buffer, "\n")
-
 int
 phy_ConfigMACWithParaFile(
        IN      PADAPTER        Adapter,
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_dm.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_dm.c
new file mode 100755 (executable)
index 0000000..46dab54
--- /dev/null
@@ -0,0 +1,196 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2014 Realtek Corporation. All rights reserved.\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+#include <drv_types.h>\r
+#include <hal_data.h>\r
+\r
+// A mapping from HalData to ODM.\r
+ODM_BOARD_TYPE_E boardType(u8 InterfaceSel)\r
+{\r
+    ODM_BOARD_TYPE_E        board      = ODM_BOARD_DEFAULT;\r
+\r
+#ifdef CONFIG_PCI_HCI\r
+       INTERFACE_SELECT_PCIE   pcie    = (INTERFACE_SELECT_PCIE)InterfaceSel;\r
+       switch (pcie) \r
+       {\r
+        case INTF_SEL0_SOLO_MINICARD:       \r
+            board |= ODM_BOARD_MINICARD;\r
+            break;\r
+        case INTF_SEL1_BT_COMBO_MINICARD:   \r
+            board |= ODM_BOARD_BT;\r
+                       board |= ODM_BOARD_MINICARD;\r
+            break;\r
+        default:\r
+            board = ODM_BOARD_DEFAULT;\r
+            break;\r
+       }                                \r
+\r
+#elif defined(CONFIG_USB_HCI)\r
+       INTERFACE_SELECT_USB    usb     = (INTERFACE_SELECT_USB)InterfaceSel;\r
+       switch (usb) \r
+       {\r
+           case INTF_SEL1_USB_High_Power:      \r
+               board |= ODM_BOARD_EXT_LNA;\r
+               board |= ODM_BOARD_EXT_PA;                      \r
+               break;\r
+           case INTF_SEL2_MINICARD:            \r
+               board |= ODM_BOARD_MINICARD;\r
+               break;\r
+           case INTF_SEL4_USB_Combo:           \r
+               board |= ODM_BOARD_BT;\r
+               break;\r
+           case INTF_SEL5_USB_Combo_MF:        \r
+               board |= ODM_BOARD_BT;\r
+               break;\r
+           case INTF_SEL0_USB:                         \r
+           case INTF_SEL3_USB_Solo:                                    \r
+           default:\r
+               board = ODM_BOARD_DEFAULT;\r
+               break;\r
+       }\r
+       \r
+#endif \r
+       //DBG_871X("===> boardType(): (pHalData->InterfaceSel, pDM_Odm->BoardType) = (%d, %d)\n", InterfaceSel, board);\r
+\r
+       return board;\r
+}\r
+\r
+void Init_ODM_ComInfo(_adapter *adapter)\r
+{\r
+       struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\r
+       PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(adapter);\r
+       EEPROM_EFUSE_PRIV       *pEEPROM = GET_EEPROM_EFUSE_PRIV(adapter);\r
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
+       PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);\r
+       struct mlme_ext_priv    *pmlmeext = &adapter->mlmeextpriv;\r
+       struct mlme_priv        *pmlmepriv = &adapter->mlmepriv;\r
+       struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);\r
+       int i;\r
+\r
+       _rtw_memset(pDM_Odm,0,sizeof(*pDM_Odm));\r
+\r
+       pDM_Odm->Adapter = adapter;\r
+\r
+       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PLATFORM, ODM_CE);\r
+\r
+       if (adapter->interface_type == RTW_GSPI)\r
+               ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_INTERFACE, ODM_ITRF_SDIO);\r
+       else\r
+               ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_INTERFACE, adapter->interface_type);\r
+\r
+       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_MP_TEST_CHIP, IS_NORMAL_CHIP(pHalData->VersionID));\r
+\r
+       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PATCH_ID, pEEPROM->CustomerID);\r
+\r
+       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_BWIFI_TEST, adapter->registrypriv.wifi_spec);\r
+\r
+       if (pHalData->rf_type == RF_1T1R) {\r
+               ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T1R);\r
+       }\r
+       else if (pHalData->rf_type == RF_2T2R){\r
+               ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T2R);\r
+       }\r
+       else if (pHalData->rf_type == RF_1T2R){\r
+               ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T2R);\r
+       }\r
+\r
+{\r
+       //1 ======= BoardType: ODM_CMNINFO_BOARD_TYPE =======\r
+       u8 odm_board_type = ODM_BOARD_DEFAULT;\r
+\r
+       if (!IS_HARDWARE_TYPE_OLDER_THAN_8723A(adapter))\r
+       {\r
+               if (pHalData->ExternalLNA_2G != 0) {\r
+                       odm_board_type |= ODM_BOARD_EXT_LNA;\r
+                       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_LNA, 1);\r
+               }\r
+               if (pHalData->ExternalLNA_5G != 0) {\r
+                       odm_board_type |= ODM_BOARD_EXT_LNA_5G;\r
+                       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_5G_EXT_LNA, 1);\r
+               }\r
+               if (pHalData->ExternalPA_2G != 0) {\r
+                       odm_board_type |= ODM_BOARD_EXT_PA;\r
+                       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_PA, 1);\r
+               }\r
+               if (pHalData->ExternalPA_5G != 0) {\r
+                       odm_board_type |= ODM_BOARD_EXT_PA_5G;\r
+                       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_5G_EXT_PA, 1);\r
+               }\r
+               if (pHalData->EEPROMBluetoothCoexist)\r
+                       odm_board_type |= ODM_BOARD_BT;\r
+\r
+       } else {\r
+               #ifdef CONFIG_USB_HCI\r
+               if (pHalData->InterfaceSel == INTF_SEL1_USB_High_Power\r
+                       || pHalData->BoardType == BOARD_USB_High_PA     /* This is legacy code for hal_data.BoardType */\r
+               ) {\r
+                       ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_EXT_LNA, 1);\r
+                       ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_EXT_PA, 1);\r
+               } else\r
+               #endif\r
+               {\r
+                       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_PA, pHalData->ExternalPA_2G);\r
+                       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_LNA, pHalData->ExternalLNA_2G);\r
+               }\r
+\r
+               odm_board_type = boardType(pHalData->InterfaceSel);\r
+       }\r
+\r
+       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_BOARD_TYPE, odm_board_type);\r
+       //1 ============== End of BoardType ==============\r
+}\r
+\r
+       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_DOMAIN_CODE_2G, pHalData->Regulation2_4G);\r
+       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_DOMAIN_CODE_5G, pHalData->Regulation5G);\r
+\r
+       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_GPA, pHalData->TypeGPA);\r
+       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_APA, pHalData->TypeAPA);\r
+       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_GLNA, pHalData->TypeGLNA);\r
+       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_ALNA, pHalData->TypeALNA);\r
+\r
+       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RFE_TYPE, pHalData->RFEType);\r
+\r
+       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_TRSW, 0);\r
+\r
+       /* Pointer reference */\r
+       ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_TX_UNI, &(dvobj->traffic_stat.tx_bytes));\r
+       ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_RX_UNI, &(dvobj->traffic_stat.rx_bytes));\r
+       ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_WM_MODE, &(pmlmeext->cur_wireless_mode));\r
+       ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BAND, &(pHalData->CurrentBandType));\r
+       ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_RATE, &(pHalData->ForcedDataRate));\r
+\r
+       ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_CHNL_OFFSET, &(pHalData->nCur40MhzPrimeSC));\r
+       ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_MODE, &(adapter->securitypriv.dot11PrivacyAlgrthm));\r
+       ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BW, &(pHalData->CurrentChannelBW));\r
+       ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_CHNL, &( pHalData->CurrentChannel));\r
+       ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_NET_CLOSED, &(adapter->net_closed));\r
+       ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_IGI_LB, &(pHalData->u1ForcedIgiLb));\r
+\r
+       ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SCAN, &(pmlmepriv->bScanInProcess));\r
+       ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_POWER_SAVING, &(pwrctl->bpower_saving));\r
+\r
+       for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\r
+               ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS, i, NULL);\r
+\r
+       /* TODO */\r
+       //ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BT_OPERATION, _FALSE);\r
+       //ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BT_DISABLE_EDCA, _FALSE);\r
+}\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_dm.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/hal/hal_dm.h
new file mode 100755 (executable)
index 0000000..2dd95f0
--- /dev/null
@@ -0,0 +1,26 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+#ifndef __HAL_DM_H__\r
+#define __HAL_DM_H__\r
+\r
+void Init_ODM_ComInfo(_adapter *adapter);\r
+\r
+#endif /* __HAL_DM_H__ */\r
+\r
index 9689b1ff95e999ad32e085f1a31186398481158d..0ea23519956e824bb705978e46b883f24b4c3b28 100755 (executable)
 #include <hal_data.h>
 
 
+#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ
+int usb_write_async(struct usb_device *udev, u32 addr, void *pdata, u16 len)
+{
+       u8 request;
+       u8 requesttype;
+       u16 wvalue;
+       u16 index;
+       int ret;
+
+       requesttype = VENDOR_WRITE;//write_out
+       request = REALTEK_USB_VENQT_CMD_REQ;
+       index = REALTEK_USB_VENQT_CMD_IDX;//n/a
+
+       wvalue = (u16)(addr&0x0000ffff);
+
+       ret = _usbctrl_vendorreq_async_write(udev, request, wvalue, index, pdata, len, requesttype);
+
+       return ret;
+}
+
+int usb_async_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val)
+{
+       u8 data;
+       int ret;
+       struct dvobj_priv  *pdvobjpriv = (struct dvobj_priv  *)pintfhdl->pintf_dev;
+       struct usb_device *udev=pdvobjpriv->pusbdev;
+
+       _func_enter_;
+       data = val;
+       ret = usb_write_async(udev, addr, &data, 1);
+       _func_exit_;
+
+       return ret;
+}
+
+int usb_async_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val)
+{
+       u16 data;
+       int ret;
+       struct dvobj_priv  *pdvobjpriv = (struct dvobj_priv  *)pintfhdl->pintf_dev;
+       struct usb_device *udev=pdvobjpriv->pusbdev;
+
+       _func_enter_;
+       data = val;
+       ret = usb_write_async(udev, addr, &data, 2);
+       _func_exit_;
+
+       return ret;
+}
+
+int usb_async_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val)
+{
+       u32 data;
+       int ret;
+       struct dvobj_priv  *pdvobjpriv = (struct dvobj_priv  *)pintfhdl->pintf_dev;
+       struct usb_device *udev=pdvobjpriv->pusbdev;
+
+       _func_enter_;
+       data = val;
+       ret = usb_write_async(udev, addr, &data, 4);
+       _func_exit_;
+       
+       return ret;
+}
+#endif /* CONFIG_USB_SUPPORT_ASYNC_VDN_REQ */
+
+
+
+#ifdef CONFIG_RTL8192D
+/*     This function only works in 92DU chip.          */
+void usb_read_reg_rf_byfw(struct intf_hdl *pintfhdl, 
+                               u16 byteCount, 
+                               u32 registerIndex, 
+                               PVOID buffer)
+{
+       u16     wPage = 0x0000, offset;
+       u32     BufferLengthRead;
+       PADAPTER        Adapter = pintfhdl->padapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       u8      RFPath=0,nPHY=0;
+
+       RFPath =(u8) ((registerIndex&0xff0000)>>16);
+       
+       if (pHalData->interfaceIndex!=0)
+       { 
+               nPHY = 1; //MAC1
+               if(registerIndex&MAC1_ACCESS_PHY0)// MAC1 need to access PHY0
+                       nPHY = 0;
+       }
+       else
+       {
+               if(registerIndex&MAC0_ACCESS_PHY1)
+                       nPHY = 1;
+       }
+       registerIndex &= 0xFF;
+       wPage = ((nPHY<<7)|(RFPath<<5)|8)<<8;
+       offset = (u16)registerIndex;
+       
+       //
+       // IN a vendor request to read back MAC register.
+       //
+       usbctrl_vendorreq(pintfhdl, 0x05, offset, wPage, buffer, byteCount, 0x01);
+
+}
+#endif
+
+/*
+       92DU chip needs to remask "value" parameter,  this function only works in 92DU chip.
+*/
+static inline void usb_value_remask(struct intf_hdl *pintfhdl, u16 *value)
+{
+#ifdef CONFIG_RTL8192D
+       _adapter        *padapter = pintfhdl->padapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
+
+       if ((IS_HARDWARE_TYPE_8192DU(padapter)) && (pHalData->interfaceIndex!=0))
+       {
+               if(*value<0x1000)
+                       *value|=0x4000;
+               else if ((*value&MAC1_ACCESS_PHY0) && !(*value&0x8000))   // MAC1 need to access PHY0
+                       *value &= 0xFFF;
+       }
+#endif
+}
+
+u8 usb_read8(struct intf_hdl *pintfhdl, u32 addr)
+{
+       u8 request;
+       u8 requesttype;
+       u16 wvalue;
+       u16 index;
+       u16 len;
+       u8 data=0;
+       
+       _func_enter_;
+
+       request = 0x05;
+       requesttype = 0x01;//read_in
+       index = 0;//n/a
+
+       wvalue = (u16)(addr&0x0000ffff);
+       len = 1;        
+       usb_value_remask(pintfhdl, &wvalue);
+       usbctrl_vendorreq(pintfhdl, request, wvalue, index,
+                                       &data, len, requesttype);
+
+       _func_exit_;
+
+       return data;    
+}
+
+u16 usb_read16(struct intf_hdl *pintfhdl, u32 addr)
+{       
+       u8 request;
+       u8 requesttype;
+       u16 wvalue;
+       u16 index;
+       u16 len;
+       u16 data=0;
+       
+       _func_enter_;
+
+       request = 0x05;
+       requesttype = 0x01;//read_in
+       index = 0;//n/a
+
+       wvalue = (u16)(addr&0x0000ffff);
+       len = 2;        
+       usb_value_remask(pintfhdl, &wvalue);
+       usbctrl_vendorreq(pintfhdl, request, wvalue, index,
+                                       &data, len, requesttype);
+
+       _func_exit_;
+
+       return data;
+       
+}
+
+u32 usb_read32(struct intf_hdl *pintfhdl, u32 addr)
+{
+       u8 request;
+       u8 requesttype;
+       u16 wvalue;
+       u16 index;
+       u16 len;
+       u32 data=0;
+       
+       _func_enter_;
+
+       request = 0x05;
+       requesttype = 0x01;//read_in
+       index = 0;//n/a
+
+       wvalue = (u16)(addr&0x0000ffff);
+       len = 4;
+#ifdef CONFIG_RTL8192D
+       if ((IS_HARDWARE_TYPE_8192DU(pintfhdl->padapter)) && ((addr&0xff000000)>>24 == 0x66)) {
+               usb_read_reg_rf_byfw(pintfhdl, len, addr, &data);
+       } else 
+#endif
+       {
+               usb_value_remask(pintfhdl, &wvalue);
+               usbctrl_vendorreq(pintfhdl, request, wvalue, index,
+                                               &data, len, requesttype);
+       }
+
+       _func_exit_;
+
+       return data;
+}
+
+int usb_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val)
+{
+       u8 request;
+       u8 requesttype;
+       u16 wvalue;
+       u16 index;
+       u16 len;
+       u8 data;
+       int ret;
+       
+       _func_enter_;
+
+       request = 0x05;
+       requesttype = 0x00;//write_out
+       index = 0;//n/a
+
+       wvalue = (u16)(addr&0x0000ffff);
+       len = 1;
+       
+       data = val;     
+       usb_value_remask(pintfhdl, &wvalue);
+       ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index,
+                                               &data, len, requesttype);
+       
+       _func_exit_;
+       
+       return ret;
+}
+
+int usb_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val)
+{      
+       u8 request;
+       u8 requesttype;
+       u16 wvalue;
+       u16 index;
+       u16 len;
+       u16 data;
+       int ret;
+       
+       _func_enter_;
+
+       request = 0x05;
+       requesttype = 0x00;//write_out
+       index = 0;//n/a
+
+       wvalue = (u16)(addr&0x0000ffff);
+       len = 2;
+       
+       data = val;
+       usb_value_remask(pintfhdl, &wvalue);
+       ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index,
+                                               &data, len, requesttype);
+       
+       _func_exit_;
+       
+       return ret;
+       
+}
+
+int usb_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val)
+{
+       u8 request;
+       u8 requesttype;
+       u16 wvalue;
+       u16 index;
+       u16 len;
+       u32 data;
+       int ret;
+       
+       _func_enter_;
+
+       request = 0x05;
+       requesttype = 0x00;//write_out
+       index = 0;//n/a
+
+       wvalue = (u16)(addr&0x0000ffff);
+       len = 4;
+       data =val;              
+       usb_value_remask(pintfhdl, &wvalue);
+       ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index,
+                                               &data, len, requesttype);
+
+       _func_exit_;
+       
+       return ret;
+       
+}
+
+int usb_writeN(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata)
+{
+       u8 request;
+       u8 requesttype;
+       u16 wvalue;
+       u16 index;
+       u16 len;
+       u8 buf[VENDOR_CMD_MAX_DATA_LEN]={0};
+       int ret;
+       
+       _func_enter_;
+
+       request = 0x05;
+       requesttype = 0x00;//write_out
+       index = 0;//n/a
+
+       wvalue = (u16)(addr&0x0000ffff);
+       len = length;
+        _rtw_memcpy(buf, pdata, len );
+       usb_value_remask(pintfhdl, &wvalue);
+       ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index,
+                                               buf, len, requesttype);
+       
+       _func_exit_;
+       
+       return ret;
+       
+}
index 9bbacbec539d57e4b7fce1687c1fa3818f8fdf38..811cc3dabcb3bbed96aeb36385c15516cd42c642 100755 (executable)
@@ -43,9 +43,20 @@ void rtw_hal_read_chip_version(_adapter *padapter)
 
 void rtw_hal_def_value_init(_adapter *padapter)
 {
-       if (is_primary_adapter(padapter))
+       if (is_primary_adapter(padapter)) {
                if(padapter->HalFunc.init_default_value)
                        padapter->HalFunc.init_default_value(padapter);
+
+               rtw_init_hal_com_default_value(padapter);
+
+               {
+                       struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
+                       HAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter);
+
+                       /* hal_data..macid_num is ready here */
+                       dvobj->macid_ctl.num = rtw_min(hal_data->macid_num, MACID_NUM_SW_LIMIT);
+               }
+       }
 }
 void   rtw_hal_free_data(_adapter *padapter)
 {
@@ -56,18 +67,29 @@ void        rtw_hal_free_data(_adapter *padapter)
                if(padapter->HalFunc.free_hal_data)
                        padapter->HalFunc.free_hal_data(padapter);
 }
-void   rtw_hal_dm_init(_adapter *padapter)
+void rtw_hal_dm_init(_adapter *padapter)
 {
-       if (is_primary_adapter(padapter))
+       if (is_primary_adapter(padapter)) {
+               PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
+               struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+
                if(padapter->HalFunc.dm_init)
                        padapter->HalFunc.dm_init(padapter);
+
+               _rtw_spinlock_init(&pdmpriv->IQKSpinLock);
+       }
 }
 void rtw_hal_dm_deinit(_adapter *padapter)
 {
-       // cancel dm  timer
-       if (is_primary_adapter(padapter))
+       if (is_primary_adapter(padapter)) {
+               PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
+               struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+
                if(padapter->HalFunc.dm_deinit)
                        padapter->HalFunc.dm_deinit(padapter);
+
+               _rtw_spinlock_free(&pdmpriv->IQKSpinLock);
+       }
 }
 void   rtw_hal_sw_led_init(_adapter *padapter)
 {
@@ -154,8 +176,6 @@ uint         rtw_hal_init(_adapter *padapter)
 
        if(status == _SUCCESS){
 
-               rtw_hal_init_opmode(padapter);
-
                for (i = 0; i<dvobj->iface_nums; i++)
                        dvobj->padapters[i]->hw_init_completed = _TRUE;
                        
@@ -170,6 +190,8 @@ uint         rtw_hal_init(_adapter *padapter)
                rtw_led_control(padapter, LED_CTL_POWER_ON);
 
                init_hw_mlme_ext(padapter);
+
+                rtw_hal_init_opmode(padapter);
                
 #ifdef CONFIG_RF_GAIN_OFFSET
                rtw_bb_rf_gain_offset(padapter);
@@ -486,20 +508,47 @@ s32       rtw_hal_interrupt_handler(_adapter *padapter)
 
 void   rtw_hal_set_bwmode(_adapter *padapter, CHANNEL_WIDTH Bandwidth, u8 Offset)
 {
+       PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
+       PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);
+       
        if(padapter->HalFunc.set_bwmode_handler)
+       {
+               ODM_AcquireSpinLock( pDM_Odm, RT_IQK_SPINLOCK);
+               if(pDM_Odm->RFCalibrateInfo.bIQKInProgress == _TRUE)
+                       DBG_871X_LEVEL(_drv_err_, "%s, %d, IQK may race condition\n", __func__,__LINE__);
+               ODM_ReleaseSpinLock( pDM_Odm, RT_IQK_SPINLOCK);
                padapter->HalFunc.set_bwmode_handler(padapter, Bandwidth, Offset);
+       }
 }
 
 void   rtw_hal_set_chan(_adapter *padapter, u8 channel)
 {
+       PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
+       PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);
+       
        if(padapter->HalFunc.set_channel_handler)
+       {
+               ODM_AcquireSpinLock( pDM_Odm, RT_IQK_SPINLOCK);
+               if(pDM_Odm->RFCalibrateInfo.bIQKInProgress == _TRUE)
+                       DBG_871X_LEVEL(_drv_err_, "%s, %d, IQK may race condition\n", __func__,__LINE__);
+               ODM_ReleaseSpinLock( pDM_Odm, RT_IQK_SPINLOCK);
                padapter->HalFunc.set_channel_handler(padapter, channel);
+       }
 }
 
 void   rtw_hal_set_chnl_bw(_adapter *padapter, u8 channel, CHANNEL_WIDTH Bandwidth, u8 Offset40, u8 Offset80)
 {
+       PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
+       PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);
+       
        if(padapter->HalFunc.set_chnl_bw_handler)
+       {
+               ODM_AcquireSpinLock( pDM_Odm, RT_IQK_SPINLOCK);
+               if(pDM_Odm->RFCalibrateInfo.bIQKInProgress == _TRUE)
+                       DBG_871X_LEVEL(_drv_err_, "%s, %d, IQK may race condition\n", __func__,__LINE__);
+               ODM_ReleaseSpinLock( pDM_Odm, RT_IQK_SPINLOCK);
                padapter->HalFunc.set_chnl_bw_handler(padapter, channel, Bandwidth, Offset40, Offset80);
+       }
 }
 
 void   rtw_hal_set_tx_power_level(_adapter *padapter, u8 channel)
@@ -710,37 +759,50 @@ s32 rtw_hal_is_disable_sw_channel_plan(PADAPTER padapter)
        return GET_HAL_DATA(padapter)->bDisableSWChannelPlan;
 }
 
-s32 rtw_hal_macid_sleep(PADAPTER padapter, u32 macid)
+s32 rtw_hal_macid_sleep(PADAPTER padapter, u8 macid)
 {
+       struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
+       struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
        u8 support;
 
-
        support = _FALSE;
        rtw_hal_get_def_var(padapter, HAL_DEF_MACID_SLEEP, &support);
        if (_FALSE == support)
                return _FAIL;
 
-       rtw_hal_set_hwreg(padapter, HW_VAR_MACID_SLEEP, (u8*)&macid);
+       if (macid >= macid_ctl->num) {
+               DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT": Invalid macid(%u)\n",
+                       FUNC_ADPT_ARG(padapter), macid);
+               return _FAIL;
+       }
+
+       rtw_hal_set_hwreg(padapter, HW_VAR_MACID_SLEEP, &macid);
 
        return _SUCCESS;
 }
 
-s32 rtw_hal_macid_wakeup(PADAPTER padapter, u32 macid)
+s32 rtw_hal_macid_wakeup(PADAPTER padapter, u8 macid)
 {
+       struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
+       struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
        u8 support;
 
-
        support = _FALSE;
        rtw_hal_get_def_var(padapter, HAL_DEF_MACID_SLEEP, &support);
        if (_FALSE == support)
                return _FAIL;
 
-       rtw_hal_set_hwreg(padapter, HW_VAR_MACID_WAKEUP, (u8*)&macid);
+       if (macid >= macid_ctl->num) {
+               DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT": Invalid macid(%u)\n",
+                       FUNC_ADPT_ARG(padapter), macid);
+               return _FAIL;
+       }
+
+       rtw_hal_set_hwreg(padapter, HW_VAR_MACID_WAKEUP, &macid);
 
        return _SUCCESS;
 }
 
-#ifdef CONFIG_BT_COEXIST
 s32 rtw_hal_fill_h2c_cmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer)
 {
        s32 ret = _FAIL;
@@ -750,10 +812,9 @@ s32 rtw_hal_fill_h2c_cmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBu
        else
        {
                DBG_871X("%s:  func[fill_h2c_cmd] not defined!\n", __FUNCTION__);
+               rtw_warn_on(1);
        }
 
        return ret;
 }
-#endif // CONFIG_BT_COEXIST
-
 
index 7f172212b82e2f7eaba0412c0ad3f97f779c9a01..6706e0101c86b65882916baae84bb585c94184b3 100755 (executable)
@@ -1237,6 +1237,7 @@ SwLedBlink9(
                SwLedOff(Adapter, pLed);\r
                RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes));\r
        }       \r
+       //DBG_871X("%s, pLed->CurrLedState=%d, pLed->BlinkingLedState=%d \n", __FUNCTION__, pLed->CurrLedState, pLed->BlinkingLedState);\r
 \r
 \r
        switch(pLed->CurrLedState)\r
@@ -1260,8 +1261,8 @@ SwLedBlink9(
                case LED_BLINK_StartToBlink:\r
                        if( pLed->bLedOn )\r
                        {\r
-                               pLed->BlinkingLedState = RTW_LED_OFF; \r
-                               _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);                             \r
+                               pLed->BlinkingLedState = RTW_LED_OFF;\r
+                               _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);             \r
                        }\r
                        else\r
                        {\r
@@ -1286,7 +1287,7 @@ SwLedBlink9(
                                else if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)\r
                                {\r
                                        pLed->bLedLinkBlinkInProgress = _TRUE;\r
-                                       pLed->CurrLedState = LED_BLINK_ALWAYS_ON;\r
+                                       pLed->CurrLedState = LED_BLINK_SLOWLY;\r
                                        \r
                                        _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);\r
                                        RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState));                                  \r
@@ -1336,8 +1337,7 @@ SwLedBlink9(
                                }\r
                                else \r
                                {\r
-                                       pLed->bLedNoLinkBlinkInProgress = _TRUE;\r
-                                       pLed->CurrLedState = LED_BLINK_ALWAYS_ON;\r
+                                       pLed->CurrLedState = LED_BLINK_SLOWLY;\r
                                        if( pLed->bLedOn )\r
                                                pLed->BlinkingLedState = RTW_LED_OFF; \r
                                        else\r
@@ -3879,7 +3879,7 @@ SwLedControlMode9(
        PLED_USB        pLed1 = &(ledpriv->SwLed1);\r
        PLED_USB        pLed2 = &(ledpriv->SwLed2);\r
        BOOLEAN  bWPSOverLap = _FALSE;\r
-       \r
+       //DBG_871X("LedAction=%d \n", LedAction);\r
        switch(LedAction)\r
        {               \r
                case LED_CTL_START_TO_LINK:     \r
@@ -3980,7 +3980,7 @@ SwLedControlMode9(
                                        if(LedAction == LED_CTL_LINK)\r
                                        {\r
                                                pLed->BlinkingLedState = RTW_LED_ON; \r
-                                               pLed->CurrLedState = LED_BLINK_ALWAYS_ON;\r
+                                               pLed->CurrLedState = LED_BLINK_SLOWLY;\r
                                        }\r
                                        else\r
                                        {\r
@@ -4068,7 +4068,7 @@ SwLedControlMode9(
                        pLed2->CurrLedState = LED_BLINK_LINK_IN_PROCESS;\r
                        pLed2->bLedWPSBlinkInProgress = _TRUE;\r
 \r
-                       _set_timer(&(pLed2->BlinkTimer), 0);\r
+                       _set_timer(&(pLed2->BlinkTimer), 500);\r
                         \r
                        break;\r
                \r
index 635a41985c2e206531680a513c4b248971319b1b..7714e38b448eef303da8d923c085e2c2974f2c96 100755 (executable)
@@ -546,11 +546,15 @@ static void ConstructPnoInfo(
 
        u8      *pPnoInfoPkt = pframe;
        pPnoInfoPkt =  (u8*)(pframe+ *pLength);
-       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_num, 4);
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_num, 1);
 
-       *pLength+=4;
-       pPnoInfoPkt += 4;
-       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->fast_scan_period, 4);
+       *pLength+=1;
+       pPnoInfoPkt += 1;
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->hidden_ssid_num, 1);
+
+       *pLength+=3;
+       pPnoInfoPkt += 3;
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->fast_scan_period, 1);
 
        *pLength+=4;
        pPnoInfoPkt += 4;
@@ -577,6 +581,11 @@ static void ConstructPnoInfo(
 
        *pLength+=MAX_PNO_LIST_COUNT;
        pPnoInfoPkt += MAX_PNO_LIST_COUNT;
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->loc_probe_req,
+                       MAX_HIDDEN_AP);
+
+       *pLength+=MAX_HIDDEN_AP;
+       pPnoInfoPkt += MAX_HIDDEN_AP;
 }
 
 static void ConstructSSIDList(
@@ -776,7 +785,8 @@ static void ConstructGTKResponse(
 #endif //CONFIG_GTK_OL
 
 #ifdef CONFIG_PNO_SUPPORT
-static void ConstructProbeReq(_adapter *padapter, u8 *pframe, u32 *pLength)
+static void ConstructProbeReq(_adapter *padapter, u8 *pframe, u32 *pLength,
+               pno_ssid_t *ssid)
 {
        struct rtw_ieee80211_hdr        *pwlanhdr;
        u16                             *fctrl;
@@ -796,7 +806,6 @@ static void ConstructProbeReq(_adapter *padapter, u8 *pframe, u32 *pLength)
        fctrl = &(pwlanhdr->frame_ctl);
        *(fctrl) = 0;
 
-       //broadcast probe request frame
        _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
        _rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN);
 
@@ -808,7 +817,11 @@ static void ConstructProbeReq(_adapter *padapter, u8 *pframe, u32 *pLength)
        pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
        pframe += pktlen;
 
-       pframe = rtw_set_ie(pframe, _SSID_IE_, 0, NULL, &pktlen);
+       if (ssid == NULL) {
+               pframe = rtw_set_ie(pframe, _SSID_IE_, 0, NULL, &pktlen);
+       } else {
+               pframe = rtw_set_ie(pframe, _SSID_IE_, ssid->SSID_len, ssid->SSID, &pktlen);
+       }
 
        get_rate_set(padapter, bssrate, &bssrate_len);
 
@@ -1013,6 +1026,25 @@ CheckFwRsvdPageContent(
        }
 }
 
+//
+// Description: Get the reserved page number in Tx packet buffer.
+// Retrun value: the page number.
+// 2012.08.09, by tynli.
+//
+u8 GetTxBufferRsvdPageNum8723B(_adapter *padapter, bool wowlan)
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
+       u8      RsvdPageNum=0;
+       // default reseved 1 page for the IC type which is undefined.
+       u8      TxPageBndy= LAST_ENTRY_OF_TX_PKT_BUFFER_8723B;
+
+       rtw_hal_get_def_var(padapter, HAL_DEF_TX_PAGE_BOUNDARY, (u8 *)&TxPageBndy);
+
+       RsvdPageNum = LAST_ENTRY_OF_TX_PKT_BUFFER_8723B -TxPageBndy + 1;
+
+       return RsvdPageNum;
+}
+
 static void rtl8723b_set_FwRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc)
 {
        u8 u1H2CRsvdPageParm[H2C_RSVDPAGE_LOC_LEN]={0};
@@ -1128,7 +1160,12 @@ void rtl8723b_set_FwMediaStatusRpt_cmd(PADAPTER  padapter, u8 mstatus, u8 macid)
 static void rtl8723b_set_FwKeepAlive_cmd(PADAPTER padapter, u8 benable, u8 pkt_type)
 {
        u8 u1H2CKeepAliveParm[H2C_KEEP_ALIVE_CTRL_LEN]={0};
-       u8 adopt = 1, check_period = 5;
+       u8 adopt = 1;
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+        u8 check_period = 10;
+#else
+        u8 check_period = 5;
+#endif 
 
        DBG_871X("%s(): benable = %d\n", __func__, benable);
        SET_8723B_H2CCMD_KEEPALIVE_PARM_ENABLE(u1H2CKeepAliveParm, benable);
@@ -1159,6 +1196,7 @@ static void rtl8723b_set_FwDisconDecision_cmd(PADAPTER padapter, u8 benable)
 
 void rtl8723b_set_FwMacIdConfig_cmd(_adapter* padapter, u8 mac_id, u8 raid, u8 bw, u8 sgi, u32 mask)
 {
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
        u8 u1H2CMacIdConfigParm[H2C_MACID_CFG_LEN]={0};
 
        DBG_871X("%s(): mac_id=%d raid=0x%x bw=%d mask=0x%x\n", __func__, mac_id, raid, bw, mask);
@@ -1169,6 +1207,21 @@ _func_enter_;
        SET_8723B_H2CCMD_MACID_CFG_RAID(u1H2CMacIdConfigParm, raid);
        SET_8723B_H2CCMD_MACID_CFG_SGI_EN(u1H2CMacIdConfigParm, (sgi)? 1:0);
        SET_8723B_H2CCMD_MACID_CFG_BW(u1H2CMacIdConfigParm, bw);
+
+       //DisableTXPowerTraining
+       if(pHalData->bDisableTXPowerTraining){
+               SET_8723B_H2CCMD_MACID_CFG_DISPT(u1H2CMacIdConfigParm,1);
+               DBG_871X("%s,Disable PWT by driver\n",__FUNCTION__);
+       }
+       else{
+               PDM_ODM_T       pDM_OutSrc = &pHalData->odmpriv;
+
+               if(pDM_OutSrc->bDisablePowerTraining){
+                       SET_8723B_H2CCMD_MACID_CFG_DISPT(u1H2CMacIdConfigParm,1);
+                       DBG_871X("%s,Disable PWT by DM\n",__FUNCTION__);        
+               }
+       }       
+               
        SET_8723B_H2CCMD_MACID_CFG_RATE_MASK0(u1H2CMacIdConfigParm, (u8)(mask & 0x000000ff));
        SET_8723B_H2CCMD_MACID_CFG_RATE_MASK1(u1H2CMacIdConfigParm, (u8)((mask & 0x0000ff00) >>8));
        SET_8723B_H2CCMD_MACID_CFG_RATE_MASK2(u1H2CMacIdConfigParm, (u8)((mask & 0x00ff0000) >> 16));
@@ -1218,54 +1271,69 @@ void rtl8723b_set_FwAPReqRPT_cmd(PADAPTER padapter, u32 need_ack)
 void rtl8723b_set_FwPwrMode_cmd(PADAPTER padapter, u8 psmode)
 {
        int i;
+       u8 smart_ps = 0;
        struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
        u8 u1H2CPwrModeParm[H2C_PWRMODE_LEN]={0};
        u8 PowerState=0, awake_intvl = 1, byte5 = 0, rlbm = 0;
+#ifdef CONFIG_P2P
        struct wifidirect_info *wdinfo = &(padapter->wdinfo);
+#endif // CONFIG_P2P
 
 _func_enter_;
 
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+        if(psmode == PS_MODE_DTIM)
+                psmode = PS_MODE_MAX;
+#endif //CONFIG_PLATFORM_INTEL_BYT
+
+
        if(pwrpriv->dtim > 0)
                DBG_871X("%s(): FW LPS mode = %d, SmartPS=%d, dtim=%d\n", __func__, psmode, pwrpriv->smart_ps, pwrpriv->dtim);
        else
                DBG_871X("%s(): FW LPS mode = %d, SmartPS=%d\n", __func__, psmode, pwrpriv->smart_ps);
 
-#ifdef CONFIG_WOWLAN
-       if(psmode == PS_MODE_DTIM)  //For WOWLAN LPS, DTIM = (awake_intvl - 1)
+       if(psmode == PS_MODE_MIN)
        {
-#ifdef CONFIG_PLATFORM_ARM_SUN8I
-               awake_intvl = 4;//DTIM=3
-#else
-               awake_intvl = 3;//DTIM=2
-#endif
-               rlbm = 2;
+               rlbm = 0;
+               awake_intvl = 2;
+               smart_ps = pwrpriv->smart_ps;
        }
-       else
-#endif //CONFIG_WOWLAN
+       else if(psmode == PS_MODE_MAX)
+       {
+               rlbm = 1;
+               awake_intvl = 2;
+               smart_ps = pwrpriv->smart_ps;
+       }
+       else if(psmode == PS_MODE_DTIM) //For WOWLAN LPS, DTIM = (awake_intvl - 1)
        {
                if(pwrpriv->dtim > 0 && pwrpriv->dtim < 16)
                        awake_intvl = pwrpriv->dtim+1;//DTIM = (awake_intvl - 1)
                else
-#ifdef CONFIG_PLATFORM_ARM_SUN8I
                        awake_intvl = 4;//DTIM=3
-#else
-                       awake_intvl = 3;//DTIM=2
-#endif
+
 
                rlbm = 2;
+               smart_ps = pwrpriv->smart_ps;
+       }
+       else
+       {
+               rlbm = 2;
+               awake_intvl = 4;
+               smart_ps = pwrpriv->smart_ps;
        }       
 
-
+#ifdef CONFIG_P2P
        if (!rtw_p2p_chk_state(wdinfo, P2P_STATE_NONE)) {
                awake_intvl = 2;
-               rlbm = 2;
+               rlbm = 1;
        }
+#endif // CONFIG_P2P
 
        if(padapter->registrypriv.wifi_spec==1)
        {
                awake_intvl = 2;
-               rlbm = 2;
+               rlbm = 1;
        }
 
        if (psmode > 0)
@@ -1298,7 +1366,7 @@ _func_enter_;
        }
 
        SET_8723B_H2CCMD_PWRMODE_PARM_MODE(u1H2CPwrModeParm, (psmode>0)?1:0);
-       SET_8723B_H2CCMD_PWRMODE_PARM_SMART_PS(u1H2CPwrModeParm, pwrpriv->smart_ps);
+       SET_8723B_H2CCMD_PWRMODE_PARM_SMART_PS(u1H2CPwrModeParm, smart_ps);
        SET_8723B_H2CCMD_PWRMODE_PARM_RLBM(u1H2CPwrModeParm, rlbm);
        SET_8723B_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1H2CPwrModeParm, awake_intvl);
        SET_8723B_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1H2CPwrModeParm, padapter->registrypriv.uapsd_enable);
@@ -1319,14 +1387,14 @@ _func_enter_;
                        pmlmeext->DrvBcnEarly = 0xff;
                        pmlmeext->DrvBcnTimeOut = 0xff;
 
-                       DBG_871X("%s(): bcn_cnt = %d\n", __func__, pmlmeext->bcn_cnt);
+                       //DBG_871X("%s(): bcn_cnt = %d\n", __func__, pmlmeext->bcn_cnt);
 
                        for(i=0; i<9; i++)
                        {
                                pmlmeext->bcn_delay_ratio[i] = (pmlmeext->bcn_delay_cnt[i] * 100) /pmlmeext->bcn_cnt;
 
-                               DBG_871X("%s(): bcn_delay_cnt[%d]=%d, bcn_delay_ratio[%d] = %d\n", __func__, i, pmlmeext->bcn_delay_cnt[i]
-                                       ,i ,pmlmeext->bcn_delay_ratio[i]);
+                               //DBG_871X("%s(): bcn_delay_cnt[%d]=%d, bcn_delay_ratio[%d] = %d\n", __func__, i, pmlmeext->bcn_delay_cnt[i]
+                               //      ,i ,pmlmeext->bcn_delay_ratio[i]);
        
                                ratio_20_delay += pmlmeext->bcn_delay_ratio[i];
                                ratio_80_delay += pmlmeext->bcn_delay_ratio[i];
@@ -1334,13 +1402,13 @@ _func_enter_;
                                if(ratio_20_delay > 20 && pmlmeext->DrvBcnEarly == 0xff)
                                {
                                        pmlmeext->DrvBcnEarly = i;
-                                       DBG_871X("%s(): DrvBcnEarly = %d\n", __func__, pmlmeext->DrvBcnEarly);
+                                       //DBG_871X("%s(): DrvBcnEarly = %d\n", __func__, pmlmeext->DrvBcnEarly);
                                }       
 
                                if(ratio_80_delay > 80 && pmlmeext->DrvBcnTimeOut == 0xff)
                                {
                                        pmlmeext->DrvBcnTimeOut = i;
-                                       DBG_871X("%s(): DrvBcnTimeOut = %d\n", __func__, pmlmeext->DrvBcnTimeOut);
+                                       //DBG_871X("%s(): DrvBcnTimeOut = %d\n", __func__, pmlmeext->DrvBcnTimeOut);
                                }
 
                                //reset adaptive_early_32k cnt
@@ -1355,8 +1423,8 @@ _func_enter_;
                }
                else
                {
-                       DBG_871X("%s(): DrvBcnEarly = %d\n", __func__, pmlmeext->DrvBcnEarly);
-                       DBG_871X("%s(): DrvBcnTimeOut = %d\n", __func__, pmlmeext->DrvBcnTimeOut);
+                       //DBG_871X("%s(): DrvBcnEarly = %d\n", __func__, pmlmeext->DrvBcnEarly);
+                       //DBG_871X("%s(): DrvBcnTimeOut = %d\n", __func__, pmlmeext->DrvBcnTimeOut);
                }
 
 /* offload to FW if fw version > v15.10
@@ -1438,50 +1506,6 @@ void rtl8723b_set_FwPwrModeInIPS_cmd(PADAPTER padapter, u8 cmd_param)
 }
 
 #ifdef CONFIG_WOWLAN
-static void rtl8723b_set_FwWoWlanCtrl_Cmd(PADAPTER padapter, u8 bFuncEn)
-{
-       struct security_priv *psecpriv = &padapter->securitypriv;
-       struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(padapter);
-       u8 u1H2CWoWlanCtrlParm[H2C_WOWLAN_LEN]={0};
-       u8 discont_wake = 1, gpionum = 0, gpio_dur = 0, hw_unicast = 0, gpio_pulse_cnt=100;
-       u8 sdio_wakeup_enable = 1;
-       u8 gpio_high_active = 0; //0: low active, 1: high active
-       u8 magic_pkt = 0;
-       
-#ifdef CONFIG_GPIO_WAKEUP
-       gpionum = WAKEUP_GPIO_IDX;
-       sdio_wakeup_enable = 0;
-#endif
-
-#ifdef CONFIG_PNO_SUPPORT
-       if (!ppwrpriv->wowlan_pno_enable) {
-               magic_pkt = 1;
-       }
-#endif
-
-       if (psecpriv->dot11PrivacyAlgrthm == _WEP40_ || psecpriv->dot11PrivacyAlgrthm == _WEP104_)
-               hw_unicast = 1;
-
-       DBG_871X("%s(): bFuncEn=%d\n", __func__, bFuncEn);
-
-       SET_H2CCMD_WOWLAN_FUNC_ENABLE(u1H2CWoWlanCtrlParm, bFuncEn);
-       SET_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(u1H2CWoWlanCtrlParm, 0);
-       SET_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(u1H2CWoWlanCtrlParm, magic_pkt);
-       SET_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(u1H2CWoWlanCtrlParm, hw_unicast);
-       SET_H2CCMD_WOWLAN_ALL_PKT_DROP(u1H2CWoWlanCtrlParm, 0);
-       SET_H2CCMD_WOWLAN_GPIO_ACTIVE(u1H2CWoWlanCtrlParm, gpio_high_active);
-       SET_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(u1H2CWoWlanCtrlParm, discont_wake); 
-       SET_H2CCMD_WOWLAN_GPIONUM(u1H2CWoWlanCtrlParm, gpionum);
-       SET_H2CCMD_WOWLAN_DATAPIN_WAKE_UP(u1H2CWoWlanCtrlParm, sdio_wakeup_enable);
-       SET_H2CCMD_WOWLAN_GPIO_DURATION(u1H2CWoWlanCtrlParm, gpio_dur);
-       //SET_H2CCMD_WOWLAN_GPIO_PULSE_EN(u1H2CWoWlanCtrlParm, 1);
-       SET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(u1H2CWoWlanCtrlParm, 0x09);
-       
-       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CWoWlanCtrlParm:", u1H2CWoWlanCtrlParm, H2C_WOWLAN_LEN);
-
-       FillH2CCmd8723B(padapter, H2C_8723B_WOWLAN, H2C_WOWLAN_LEN, u1H2CWoWlanCtrlParm);
-}
-
 static void rtl8723b_set_FwRemoteWakeCtrl_Cmd(PADAPTER padapter, u8 benable)
 {
        u8 u1H2CRemoteWakeCtrlParm[H2C_REMOTE_WAKE_CTRL_LEN]={0};
@@ -1575,98 +1599,6 @@ static void rtl8723b_set_FwScanOffloadInfo_cmd(PADAPTER padapter, PRSVDPAGE_LOC
 }
 #endif //CONFIG_PNO_SUPPORT
 
-#if 0
-void dump_TX_FIFO(_adapter* padapter){
-       int i;
-       u8 val = 0 ;
-       u8 base = 0;
-       u32 addr = 0;
-
-       DBG_871X("+%s+\n", __func__);
-       val = rtw_read8(padapter, 0x106);
-       rtw_write8(padapter, 0x106, 0x69);
-       DBG_871X("0x106: 0x%02x\n", val);
-       base = rtw_read8(padapter, 0x209);
-       DBG_871X("0x209: 0x%02x\n", base);
-
-       DBG_871X("beacon:\n");
-       addr = ((base)*128)/8;
-       for (i = 0 ; i < 32 ; i+=2) {
-               rtw_write32(padapter, 0x140, addr + i);
-               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-               rtw_write32(padapter, 0x140, addr + i + 1);
-               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-       }
-
-       DBG_871X("probe_response:\n");
-       addr = ((base + 2)*128)/8;
-       for (i = 0 ; i < 48 ; i+=2) {
-               rtw_write32(padapter, 0x140, addr + i);
-               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-               rtw_write32(padapter, 0x140, addr + i + 1);
-               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-       }
-#if 0
-       DBG_871X("GTK Info:\n");
-       addr = ((base + 8)*128)/8;
-       for (i = 0 ; i < 4 ; i+=2) {
-               rtw_write32(padapter, 0x140, addr + i);
-               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-               rtw_write32(padapter, 0x140, addr + i + 1);
-               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-       }
-
-       DBG_871X("GTK Rsp:\n");
-       addr = ((base + 9)*128)/8;
-       for (i = 0 ; i < 32 ; i+=2) {
-               rtw_write32(padapter, 0x140, addr + i);
-               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-               rtw_write32(padapter, 0x140, addr + i + 1);
-               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-       }
-#endif
-#if 0
-       DBG_871X("probe request:\n");
-       addr = ((base + 6)*128)/8;
-       for (i = 0 ; i < 16 ; i+=2) {
-               rtw_write32(padapter, 0x140, addr + i);
-               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-               rtw_write32(padapter, 0x140, addr + i + 1);
-               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-       }
-
-       DBG_871X("PNO_INFO:\n");
-       addr = ((base + 7)*128)/8;
-       for (i = 0 ; i < 16 ; i+=2) {
-               rtw_write32(padapter, 0x140, addr + i);
-               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-               rtw_write32(padapter, 0x140, addr + i + 1);
-               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-       }
-
-       DBG_871X("SSID_INFO:\n");
-       addr = ((base + 8)*128)/8;
-       for (i = 0 ; i < 16 ; i+=2) {
-               rtw_write32(padapter, 0x140, addr + i);
-               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-               rtw_write32(padapter, 0x140, addr + i + 1);
-               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-       }
-
-       DBG_871X("SCAN_INFO:\n");
-       addr = ((base + 9)*128)/8;
-       for (i = 0 ; i < 16 ; i+=2) {
-               rtw_write32(padapter, 0x140, addr + i);
-               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-               rtw_write32(padapter, 0x140, addr + i + 1);
-               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
-       }
-#endif
-       rtw_write8(padapter, 0x106, val);
-       DBG_871X("-%s-\n", __func__);
-}
-#endif
-
 static void rtl8723b_set_FwWoWlanRelated_cmd(_adapter* padapter, u8 enable)
 {
        struct security_priv *psecpriv = &padapter->securitypriv;
@@ -1704,7 +1636,7 @@ _func_enter_;
                rtw_msleep_os(2);
                }
 
-               rtl8723b_set_FwWoWlanCtrl_Cmd(padapter, enable);
+               rtw_hal_set_wowlan_ctrl_cmd(padapter, enable);
                rtw_msleep_os(2);
 
                rtl8723b_set_FwRemoteWakeCtrl_Cmd(padapter, enable);
@@ -1712,11 +1644,15 @@ _func_enter_;
        else
        {
 #if 0
-               dump_TX_FIFO(padapter, 11, 128);
+               {
+                       u32 PageSize = 0;
+                       rtw_hal_get_def_var(adapter, HAL_DEF_TX_PAGE_SIZE, (u8 *)&PageSize);
+                       dump_TX_FIFO(padapter, 4, PageSize);
+               }
 #endif
                rtl8723b_set_FwRemoteWakeCtrl_Cmd(padapter, enable);
-               rtw_msleep_os(2);                       
-               rtl8723b_set_FwWoWlanCtrl_Cmd(padapter, enable);
+               rtw_msleep_os(2);
+               rtw_hal_set_wowlan_ctrl_cmd(padapter, enable);
        }
        
 _func_exit_;
@@ -1868,6 +1804,10 @@ static void rtl8723b_set_FwRsvdPagePkt(PADAPTER padapter, BOOLEAN bDLFinished)
        u8 kek[RTW_KEK_LEN];
        u8 kck[RTW_KCK_LEN];
 #endif
+#ifdef CONFIG_PNO_SUPPORT 
+       int index;
+       u8 ssid_num;
+#endif //CONFIG_PNO_SUPPORT
 #endif
 #ifdef DBG_CONFIG_ERROR_DETECT
        struct sreset_priv *psrtpriv;
@@ -2141,27 +2081,31 @@ static void rtl8723b_set_FwRsvdPagePkt(PADAPTER padapter, BOOLEAN bDLFinished)
        {
 #ifdef CONFIG_PNO_SUPPORT
                if (pwrctl->pno_in_resume == _FALSE && pwrctl->pno_inited == _TRUE) {
-                       //Probe Request
+
+                       //Broadcast Probe Request
                        RsvdPageLoc.LocProbePacket = TotalPageNum;
+
                        ConstructProbeReq(
                                padapter,
                                &ReservedPagePacket[BufIndex],
-                               &ProbeReqLength);
+                               &ProbeReqLength,
+                               NULL);
 
                        rtl8723b_fill_fake_txdesc(padapter,
                                &ReservedPagePacket[BufIndex-TxDescLen],
                                ProbeReqLength, _FALSE, _FALSE, _FALSE);
+
 #ifdef CONFIG_PNO_SET_DEBUG
-       {
-                       int gj;
-                       printk("probe req pkt=> \n");
-                       for(gj=0; gj < ProbeReqLength + TxDescLen; gj++) {
-                               printk(" %02x ",ReservedPagePacket[BufIndex- TxDescLen + gj]);
-                               if ((gj + 1)%8==0)
-                                       printk("\n");
+                       {
+                               int gj;
+                               printk("probe req pkt=> \n");
+                               for(gj=0; gj < ProbeReqLength + TxDescLen; gj++) {
+                                       printk(" %02x ",ReservedPagePacket[BufIndex- TxDescLen + gj]);
+                                       if ((gj + 1)%8==0)
+                                               printk("\n");
+                               }
+                               printk(" <=end\n");
                        }
-                       printk(" <=end\n");
-       }
 #endif
                        CurtPktPageNum =
                                (u8)PageNum_128(TxDescLen + ProbeReqLength);
@@ -2170,6 +2114,42 @@ static void rtl8723b_set_FwRsvdPagePkt(PADAPTER padapter, BOOLEAN bDLFinished)
 
                        BufIndex += (CurtPktPageNum*PageSize);
 
+                       //Hidden SSID Probe Request
+                       ssid_num = pwrctl->pnlo_info->hidden_ssid_num;
+
+                       for (index = 0 ; index < ssid_num ; index++) {
+                               pwrctl->pnlo_info->loc_probe_req[index] = TotalPageNum;
+
+                               ConstructProbeReq(
+                                       padapter,
+                                       &ReservedPagePacket[BufIndex],
+                                       &ProbeReqLength,
+                                       &pwrctl->pno_ssid_list->node[index]);
+
+                               rtl8723b_fill_fake_txdesc(padapter,
+                                       &ReservedPagePacket[BufIndex-TxDescLen],
+                                       ProbeReqLength, _FALSE, _FALSE, _FALSE);
+
+#ifdef CONFIG_PNO_SET_DEBUG
+                               {
+                                       int gj;
+                                       printk("probe req pkt=> \n");
+                                       for(gj=0; gj < ProbeReqLength + TxDescLen; gj++) {
+                                               printk(" %02x ", ReservedPagePacket[BufIndex- TxDescLen + gj]);
+                                               if ((gj + 1)%8==0)
+                                                       printk("\n");
+                                       }
+                                       printk(" <=end\n");
+                               }
+#endif
+                               CurtPktPageNum =
+                                       (u8)PageNum_128(TxDescLen + ProbeReqLength);
+
+                               TotalPageNum += CurtPktPageNum;
+
+                               BufIndex += (CurtPktPageNum*PageSize);
+                       }
+
                        //PNO INFO Page
                        RsvdPageLoc.LocPNOInfo = TotalPageNum;
                        ConstructPnoInfo(padapter, &ReservedPagePacket[BufIndex -TxDescLen], &PNOLength);
@@ -2248,7 +2228,7 @@ static void rtl8723b_set_FwRsvdPagePkt(PADAPTER padapter, BOOLEAN bDLFinished)
                // update attribute
                pattrib = &pcmdframe->attrib;
                update_mgntframe_attrib(padapter, pattrib);
-               pattrib->qsel = 0x10;
+               pattrib->qsel = QSLT_BEACON;
                pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset;
 #ifdef CONFIG_PCI_HCI
                dump_mgntframe(padapter, pcmdframe);
@@ -2393,7 +2373,7 @@ static void rtl8723b_set_AP_FwRsvdPagePkt(PADAPTER padapter,
                // update attribute
                pattrib = &pcmdframe->attrib;
                update_mgntframe_attrib(padapter, pattrib);
-               pattrib->qsel = 0x10;
+               pattrib->qsel = QSLT_BEACON;
                pattrib->pktlen = TotalPacketLen - TxDescOffset;
                pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset;
 #ifdef CONFIG_PCI_HCI
@@ -2518,9 +2498,11 @@ _func_enter_;
                }
 
                // Clear CR[8] or beacon packet will not be send to TxBuf anymore.
+#ifndef CONFIG_PCI_HCI
                v8 = rtw_read8(padapter, REG_CR+1);
                v8 &= ~BIT(0); // ~ENSWBCN
                rtw_write8(padapter, REG_CR+1, v8);
+#endif
        }
 
 _func_exit_;
@@ -2734,7 +2716,7 @@ static void SetFwRsvdPagePkt_BTCoex(PADAPTER padapter)
        // update attribute
        pattrib = &pcmdframe->attrib;
        update_mgntframe_attrib(padapter, pattrib);
-       pattrib->qsel = 0x10;
+       pattrib->qsel = QSLT_BEACON;
        pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset;
 #ifdef CONFIG_PCI_HCI
        dump_mgntframe(padapter, pcmdframe);
@@ -2858,9 +2840,11 @@ void rtl8723b_download_BTCoex_AP_mode_rsvd_page(PADAPTER padapter)
        }
 
        // Clear CR[8] or beacon packet will not be send to TxBuf anymore.
+#ifndef CONFIG_PCI_HCI
        val8 = rtw_read8(padapter, REG_CR+1);
        val8 &= ~BIT(0); // ~ENSWBCN
        rtw_write8(padapter, REG_CR+1, val8);
+#endif
 }
 #endif // CONFIG_BT_COEXIST
 
index d209d768702d05ff3b11df3707aadbbbab661bba..2224afb83615a43550d933677fa29c3a99919baa 100755 (executable)
@@ -244,20 +244,13 @@ dm_InitGPIOSetting(
 //============================================================\r
 static void Init_ODM_ComInfo_8723b(PADAPTER    Adapter)\r
 {\r
-\r
        PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
        PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);\r
        struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
        u8      cut_ver,fab_ver;\r
 \r
-       //\r
-       // Init Value\r
-       //\r
-       _rtw_memset(pDM_Odm,0,sizeof(*pDM_Odm));\r
+       Init_ODM_ComInfo(Adapter);\r
 \r
-       pDM_Odm->Adapter = Adapter;\r
-       ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_PLATFORM,ODM_CE);\r
-       ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_INTERFACE,Adapter->interface_type);//RTL871X_HCI_TYPE\r
        ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PACKAGE_TYPE, pHalData->PackageType);\r
        ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_IC_TYPE, ODM_RTL8723B);\r
 \r
@@ -267,30 +260,6 @@ static void Init_ODM_ComInfo_8723b(PADAPTER        Adapter)
        DBG_871X("%s(): fab_ver=%d cut_ver=%d\n", __func__, fab_ver, cut_ver);\r
        ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_FAB_VER,fab_ver);\r
        ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_CUT_VER,cut_ver);\r
-       ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_MP_TEST_CHIP,IS_NORMAL_CHIP(pHalData->VersionID));\r
-\r
-#ifdef CONFIG_USB_HCI\r
-       ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_BOARD_TYPE,pHalData->BoardType);\r
-\r
-       if(pHalData->BoardType == BOARD_USB_High_PA){\r
-               ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_EXT_LNA,_TRUE);\r
-               ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_EXT_PA,_TRUE);\r
-       }\r
-#endif\r
-       ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_PATCH_ID,pHalData->CustomerID);\r
-       //      ODM_CMNINFO_BINHCT_TEST only for MP Team\r
-       ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_BWIFI_TEST,Adapter->registrypriv.wifi_spec);\r
-\r
-\r
-       if(pHalData->rf_type == RF_1T1R){\r
-               ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T1R);\r
-       }\r
-       else if(pHalData->rf_type == RF_2T2R){\r
-               ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_2T2R);\r
-       }\r
-       else if(pHalData->rf_type == RF_1T2R){\r
-               ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T2R);\r
-       }\r
 \r
        #ifdef CONFIG_DISABLE_ODM\r
        pdmpriv->InitODMFlag = 0;\r
@@ -307,13 +276,9 @@ static void Init_ODM_ComInfo_8723b(PADAPTER        Adapter)
 \r
 static void Update_ODM_ComInfo_8723b(PADAPTER  Adapter)\r
 {\r
-       struct mlme_ext_priv    *pmlmeext = &Adapter->mlmeextpriv;\r
-       struct mlme_priv                *pmlmepriv = &Adapter->mlmepriv;\r
-       struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter);\r
        PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
        PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);\r
        struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
-       int i;\r
 \r
        pdmpriv->InitODMFlag = 0\r
                | ODM_BB_DIG\r
@@ -327,6 +292,8 @@ static void Update_ODM_ComInfo_8723b(PADAPTER       Adapter)
                | ODM_MAC_EDCA_TURBO\r
                | ODM_RF_TX_PWR_TRACK\r
                | ODM_RF_CALIBRATION\r
+               | ODM_BB_NHM_CNT\r
+//             | ODM_BB_PWR_TRAIN\r
                ;\r
 \r
        if (rtw_odm_adaptivity_needed(Adapter) == _TRUE)\r
@@ -350,48 +317,7 @@ static void Update_ODM_ComInfo_8723b(PADAPTER      Adapter)
        pdmpriv->InitODMFlag = 0;\r
 #endif//CONFIG_DISABLE_ODM\r
 \r
-       //\r
-       // Pointer reference\r
-       //\r
-       //ODM_CMNINFO_MAC_PHY_MODE pHalData->MacPhyMode92D\r
-       //      ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_MAC_PHY_MODE,&(pDM_Odm->u1Byte_temp));\r
-\r
        ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag);\r
-\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_TX_UNI,&(Adapter->xmitpriv.tx_bytes));\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_RX_UNI,&(Adapter->recvpriv.rx_bytes));\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_WM_MODE,&(pmlmeext->cur_wireless_mode));\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SEC_CHNL_OFFSET,&(pHalData->nCur40MhzPrimeSC));\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SEC_MODE,&(Adapter->securitypriv.dot11PrivacyAlgrthm));\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BW,&(pHalData->CurrentChannelBW ));\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_CHNL,&( pHalData->CurrentChannel));\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_NET_CLOSED,&( Adapter->net_closed));\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_MP_MODE,&(Adapter->registrypriv.mp_mode));\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BAND,&(pHalData->CurrentBandType));\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_FORCED_IGI_LB,&(pHalData->u1ForcedIgiLb));\r
-       //================= only for 8192D   =================\r
-       /*\r
-       //pHalData->CurrentBandType92D\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BAND,&(pDM_Odm->u1Byte_temp));\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_DMSP_GET_VALUE,&(pDM_Odm->u1Byte_temp));\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BUDDY_ADAPTOR,&(pDM_Odm->PADAPTER_temp));\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_DMSP_IS_MASTER,&(pDM_Odm->u1Byte_temp));\r
-       //================= only for 8192D   =================\r
-       // driver havn't those variable now\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BT_OPERATION,&(pDM_Odm->u1Byte_temp));\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BT_DISABLE_EDCA,&(pDM_Odm->u1Byte_temp));\r
-       */\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_FORCED_RATE,&(pHalData->ForcedDataRate));\r
-       \r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SCAN,&(pmlmepriv->bScanInProcess));\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_POWER_SAVING,&(pwrctrlpriv->bpower_saving));\r
-\r
-\r
-       for(i=0; i< NUM_STA; i++)\r
-       {\r
-               //pDM_Odm->pODM_StaInfo[i] = NULL;\r
-               ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS,i,NULL);\r
-       }\r
 }\r
 \r
 void\r
@@ -723,11 +649,7 @@ void rtl8723b_init_dm_priv(IN PADAPTER Adapter)
        PDM_ODM_T               podmpriv = &pHalData->odmpriv;\r
        _rtw_memset(pdmpriv, 0, sizeof(struct dm_priv));\r
        Init_ODM_ComInfo_8723b(Adapter);\r
-#ifdef CONFIG_SW_ANTENNA_DIVERSITY\r
-       //_init_timer(&(pdmpriv->SwAntennaSwitchTimer),  Adapter->pnetdev , odm_SW_AntennaSwitchCallback, Adapter);\r
        ODM_InitAllTimers(podmpriv );\r
-#endif\r
-\r
 }\r
 \r
 void rtl8723b_deinit_dm_priv(IN PADAPTER Adapter)\r
@@ -735,9 +657,7 @@ void rtl8723b_deinit_dm_priv(IN PADAPTER Adapter)
        PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
        struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
        PDM_ODM_T               podmpriv = &pHalData->odmpriv;\r
-#ifdef CONFIG_SW_ANTENNA_DIVERSITY\r
-       //_cancel_timer_ex(&pdmpriv->SwAntennaSwitchTimer);\r
        ODM_CancelAllTimers(podmpriv);\r
-#endif\r
+\r
 }\r
 \r
index 09ff86cadbfd3b312aac83e903f7a830f68bee32..37cb5cc5fb662fff7479d2717c5b1cc1834f262f 100755 (executable)
@@ -270,7 +270,8 @@ void _8051Reset8723(PADAPTER padapter)
        u8 cpu_rst;
        u8 io_rst;
 
-
+       io_rst = rtw_read8(padapter, REG_RSV_CTRL);
+       rtw_write8(padapter, REG_RSV_CTRL, io_rst&(~BIT1));
        // Reset 8051(WLMCU) IO wrapper
        // 0x1c[8] = 0
        // Suggested by Isaac@SD1 and Gimmy@SD1, coding by Lucas@20130624
@@ -282,6 +283,8 @@ void _8051Reset8723(PADAPTER padapter)
        cpu_rst &= ~BIT(2);
        rtw_write8(padapter, REG_SYS_FUNC_EN+1, cpu_rst);
 
+       io_rst = rtw_read8(padapter, REG_RSV_CTRL);
+       rtw_write8(padapter, REG_RSV_CTRL, io_rst&(~BIT1));
        // Enable 8051 IO wrapper       
        // 0x1c[8] = 1
        io_rst = rtw_read8(padapter, REG_RSV_CTRL+1);
@@ -295,7 +298,6 @@ void _8051Reset8723(PADAPTER padapter)
        DBG_8192C("%s: Finish\n", __FUNCTION__);
 }
 
-extern u8 g_fwdl_chksum_fail;
 static s32 polling_fwdl_chksum(_adapter *adapter, u32 min_cnt, u32 timeout_ms)
 {
        s32 ret = _FAIL;
@@ -316,11 +318,8 @@ static s32 polling_fwdl_chksum(_adapter *adapter, u32 min_cnt, u32 timeout_ms)
                goto exit;
        }
 
-       if (g_fwdl_chksum_fail) {
-               DBG_871X("%s: fwdl test case: fwdl_chksum_fail\n", __FUNCTION__);
-               g_fwdl_chksum_fail--;
+       if (rtw_fwdl_test_trigger_chksum_fail())
                goto exit;
-       }
 
        ret = _SUCCESS;
 
@@ -331,7 +330,6 @@ exit:
        return ret;
 }
 
-extern u8 g_fwdl_wintint_rdy_fail;
 static s32 _FWFreeToGo(_adapter *adapter, u32 min_cnt, u32 timeout_ms)
 {
        s32 ret = _FAIL;
@@ -359,11 +357,8 @@ static s32 _FWFreeToGo(_adapter *adapter, u32 min_cnt, u32 timeout_ms)
                goto exit;
        }
 
-       if (g_fwdl_wintint_rdy_fail) {
-               DBG_871X("%s: fwdl test case: wintint_rdy_fail\n", __FUNCTION__);
-               g_fwdl_wintint_rdy_fail--;
+       if (rtw_fwdl_test_trigger_wintint_rdy_fail())
                goto exit;
-       }
 
        ret = _SUCCESS;
 
@@ -450,6 +445,9 @@ int _WriteBTFWtoTxPktBuf8723B(
        struct pkt_attrib       *pattrib;
        u8                      txdesc_offset = TXDESC_OFFSET;
        u8                      val8;
+#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)
+       u8                      u1bTmp;
+#endif
 
 #if 1//(DEV_BUS_TYPE == RT_PCI_INTERFACE)
        TotalPktLen = FwBufLen;
@@ -483,7 +481,7 @@ int _WriteBTFWtoTxPktBuf8723B(
        // 1. Pause BCN
        //---------------------------------------------------------
        //Set REG_CR bit 8. DMA beacon by SW.
-#if 0//(DEV_BUS_TYPE == RT_PCI_INTERFACE)
+#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)
        u1bTmp = PlatformEFIORead1Byte(Adapter, REG_CR+1);
        PlatformEFIOWrite1Byte(Adapter,  REG_CR+1, (u1bTmp|BIT0));
 #else
@@ -909,11 +907,11 @@ s32 FirmwareDownloadBT(PADAPTER padapter, PRT_MP_FIRMWARE pFirmware)
 
                pBTFirmwareBuf = (u8*)Rtl8723BFwBTImgArray;
                BTFirmwareLen = Rtl8723BFwBTImgArrayLength;
+               pFirmware->szFwBuffer = pBTFirmwareBuf;
+               pFirmware->ulFwLength = BTFirmwareLen;
 #endif // CONFIG_EMBEDDED_FWIMG
        }
 
-       pFirmware->szFwBuffer = pBTFirmwareBuf;
-       pFirmware->ulFwLength = BTFirmwareLen;
        DBG_8192C("%s: MP BT Firmware size=%d\n", __FUNCTION__, BTFirmwareLen);
 
        // for h2c cam here should be set to  true
@@ -1015,6 +1013,9 @@ s32 rtl8723b_FirmwareDownload(PADAPTER padapter, BOOLEAN  bUsedWoWLANFw)
                                pdbgpriv->dbg_downloadfw_pwr_state_cnt++;
                        }
        }
+
+       rtw_btcoex_PreLoadFirmware(padapter);
+       
 #ifdef CONFIG_FILE_FWIMG
 #ifdef CONFIG_WOWLAN
        if (bUsedWoWLANFw)
@@ -3238,6 +3239,30 @@ void UpdateHalRAMask8723B(PADAPTER padapter, u32 mac_id, u8 rssi_level)
        DBG_871X("%s(): mac_id=%d raid=0x%x bw=%d mask=0x%x init_rate=0x%x\n", __func__, mac_id, psta->raid, psta->bw_mode, mask, psta->init_rate);
 }
 
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
+void rtl8723b_cal_txdesc_chksum(struct tx_desc *ptxdesc)
+{
+       u16     *usPtr = (u16*)ptxdesc;
+       u32 count;
+       u32 index;
+       u16 checksum = 0;
+
+
+       // Clear first
+       ptxdesc->txdw7 &= cpu_to_le32(0xffff0000);
+
+       // checksume is always calculated by first 32 bytes,
+       // and it doesn't depend on TX DESC length.
+       // Thomas,Lucas@SD4,20130515
+       count = 16;
+
+       for (index = 0; index < count; index++) {
+               checksum ^= le16_to_cpu(*(usPtr + index));
+       }
+
+       ptxdesc->txdw7 |= cpu_to_le32(checksum & 0x0000ffff);
+}
+#endif
 
 void rtl8723b_set_hal_ops(struct hal_ops *pHalFunc)
 {
@@ -3259,8 +3284,11 @@ void rtl8723b_set_hal_ops(struct hal_ops *pHalFunc)
 
        pHalFunc->hal_dm_watchdog = &rtl8723b_HalDmWatchDog;
        pHalFunc->hal_dm_watchdog_in_lps = &rtl8723b_HalDmWatchDog_in_LPS;
-       
 
+#ifdef CONFIG_C2H_PACKET_EN
+       pHalFunc->SetHwRegHandlerWithBuf = &SetHwRegWithBuf8723B;
+#endif // CONFIG_C2H_PACKET_EN
+       
        pHalFunc->SetBeaconRelatedRegistersHandler = &rtl8723b_SetBeaconRelatedRegisters;
 
        pHalFunc->Add_RateATid = &rtl8723b_Add_RateATid;
@@ -3304,9 +3332,14 @@ void rtl8723b_set_hal_ops(struct hal_ops *pHalFunc)
        pHalFunc->c2h_handler = c2h_handler_8723b;
        pHalFunc->c2h_id_filter_ccx = c2h_id_filter_ccx_8723b;
 
-#ifdef CONFIG_BT_COEXIST
        pHalFunc->fill_h2c_cmd = &FillH2CCmd8723B;
-#endif // CONFIG_BT_COEXIST
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
+       pHalFunc->hal_cal_txdesc_chksum = &rtl8723b_cal_txdesc_chksum;
+#endif
+#ifdef CONFIG_WOWLAN
+       pHalFunc->hal_set_wowlan_fw = &SetFwRelatedForWoWLAN8723b;
+#endif
+       pHalFunc->hal_get_tx_buff_rsvd_page_num = &GetTxBufferRsvdPageNum8723B;
 }
 
 void rtl8723b_InitAntenna_Selection(PADAPTER padapter)
@@ -3370,7 +3403,9 @@ void rtl8723b_init_default_value(PADAPTER padapter)
        if (!adapter_to_pwrctl(padapter)->bkeepfwalive)
                pHalData->LastHMEBoxNum = 0;
 
-       pHalData->bIQKInitialized = _FALSE;
+       /* hal capability values */
+       pHalData->macid_num = MACID_NUM_8723B;
+       pHalData->cam_entry_num = CAM_ENTRY_NUM_8723B;
 
        // init dm default value
        pdmpriv->TM_Trigger = 0;//for IQK
@@ -4258,6 +4293,10 @@ Hal_EfuseParseBTCoexistInfo_8723B(
                #endif
        }
 
+#ifdef CONFIG_FOR_RTL8723BS_VQ0
+       pHalData->ant_path = ODM_RF_PATH_B;//s0
+#endif
+
 #ifdef CONFIG_BT_COEXIST
        if (padapter->registrypriv.ant_num > 0) {
                DBG_8192C("%s: Apply driver defined antenna number(%d) to replace origin(%d)\n",
@@ -4418,7 +4457,7 @@ Hal_EfuseParseAntennaDiversity_8723B(
        )
 {
 #ifdef CONFIG_ANTENNA_DIVERSITY
-       HAL_DATA_TYPE           pHalData = GET_HAL_DATA(pAdapter);
+       PHAL_DATA_TYPE          pHalData = GET_HAL_DATA(pAdapter);
        struct registry_priv    *registry_par = &pAdapter->registrypriv;
 
        if (pHalData->EEPROMBluetoothAntNum == Ant_x1){
@@ -4426,49 +4465,31 @@ Hal_EfuseParseAntennaDiversity_8723B(
        }
        else{
                if(registry_par->antdiv_cfg == 2)// 0:OFF , 1:ON, 2:By EFUSE
-                       pHalData->AntDivCfg = 0;  
+                       pHalData->AntDivCfg = 1;
                else
                        pHalData->AntDivCfg = registry_par->antdiv_cfg;
        }
 
-       //if (REGISTRY(pAdapter,bEfusePriorityAuto) == TRUE)
-       if(registry_par->antdiv_type == 0)// If TRxAntDivType is AUTO in advanced setting, use EFUSE value instead.
-       {
+       // If TRxAntDivType is AUTO in advanced setting, use EFUSE value instead.
+       if(registry_par->antdiv_type == 0) {
                pHalData->TRxAntDivType = hwinfo[EEPROM_RFE_OPTION_8723B];
                if (pHalData->TRxAntDivType == 0xFF)
                        pHalData->TRxAntDivType = S0S1_SW_ANTDIV;//GetRegAntDivType(pAdapter);
                else if (pHalData->TRxAntDivType == 0x10)
                        pHalData->TRxAntDivType = S0S1_SW_ANTDIV; //intrnal switch S0S1
-               else if (pHalData->TRxAntDivType == 0x11)               
+               else if (pHalData->TRxAntDivType == 0x11)
                        pHalData->TRxAntDivType = S0S1_SW_ANTDIV; //intrnal switch S0S1
-                       //pHalData->TRxAntDivType = CG_TRX_HW_ANTDIV; //DPDT
-               
+               else
+                       DBG_8192C("%s: efuse[0x%x]=0x%02x is unknown type\n",
+                               __FUNCTION__, EEPROM_RFE_OPTION_8723B, pHalData->TRxAntDivType);
        }
        else{
                pHalData->TRxAntDivType = registry_par->antdiv_type ;//GetRegAntDivType(pAdapter);
        }
-               
-               
-/*
-       if(!AutoLoadFail)
-       {
-               // Antenna Diversity setting.
-               pHalData->AntDivCfg = (hwinfo[RF_OPTION1_8723A]&0x18)>>3;
-
-               if(BT_1Ant(pAdapter))
-                       pHalData->AntDivCfg = 0;
-               pHalData->ReverseDPDT = (hwinfo[RF_OPTION1_8723A]&BIT5) >> 5;
-       }
-       else
-       {
-               pHalData->AntDivCfg = 0;
-               pHalData->ReverseDPDT = 1;
-       }
 
-       RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("EEPROM SWAS: bHwAntDiv = %x, TRxAntDivType = %x\n", 
-                                                pHalData->AntDivCfg, pHalData->TRxAntDivType));
-*/
-#endif 
+       DBG_8192C("%s: AntDivCfg=%d, AntDivType=%d\n",
+               __FUNCTION__, pHalData->AntDivCfg, pHalData->TRxAntDivType);
+#endif
 }
 
 VOID
@@ -4652,30 +4673,6 @@ u8       SCMapping_8723B(PADAPTER Adapter, struct pkt_attrib *pattrib)
        return SCSettingOfDesc;
 }
 
-#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
-void rtl8723b_cal_txdesc_chksum(struct tx_desc *ptxdesc)
-{
-       u16     *usPtr = (u16*)ptxdesc;
-       u32 count;
-       u32 index;
-       u16 checksum = 0;
-
-
-       // Clear first
-       ptxdesc->txdw7 &= cpu_to_le32(0xffff0000);
-
-       // checksume is always calculated by first 32 bytes,
-       // and it doesn't depend on TX DESC length.
-       // Thomas,Lucas@SD4,20130515
-       count = 16;
-
-       for (index = 0; index < count; index++) {
-               checksum ^= le16_to_cpu(*(usPtr + index));
-       }
-
-       ptxdesc->txdw7 |= cpu_to_le32(checksum & 0x0000ffff);
-}
-#endif
 
 static u8 fill_txdesc_sectype(struct pkt_attrib *pattrib)
 {
@@ -4807,7 +4804,8 @@ static void rtl8723b_fill_default_txdesc(
                                SET_TX_DESC_AGG_ENABLE_8723B(pbuf, 1);
                                SET_TX_DESC_MAX_AGG_NUM_8723B(pbuf, 0x1F);
                                SET_TX_DESC_AMPDU_DENSITY_8723B(pbuf, pattrib->ampdu_spacing);
-                       } else {
+                       }
+                       else {
                                SET_TX_DESC_AGG_BREAK_8723B(pbuf, 1);
                        }
 
@@ -4832,7 +4830,9 @@ static void rtl8723b_fill_default_txdesc(
                                        SET_TX_DESC_DATA_SHORT_8723B(pbuf, 1);
                                }
                                SET_TX_DESC_TX_RATE_8723B(pbuf, padapter->fix_rate & 0x7F);
-                               SET_TX_DESC_DISABLE_FB_8723B(pbuf, 1);
+                               if (!padapter->data_fb) {
+                                       SET_TX_DESC_DISABLE_FB_8723B(pbuf, 1);
+                               }
                        }
 
                        if (pattrib->ldpc) {
@@ -4942,10 +4942,7 @@ static void rtl8723b_fill_default_txdesc(
 #ifdef CONFIG_USB_HCI
                pkt_offset = pxmitframe->pkt_offset;
                offset += (pxmitframe->pkt_offset >> 3);
-               SET_TX_DESC_OFFSET_8723B(pbuf, TXDESC_SIZE + (pxmitframe->pkt_offset >> 3));
-#else // CONFIG_SDIO_HCI & CONFIG_GSPI_HCI
-               offset += OFFSET_SZ;
-#endif // !CONFIG_USB_HCI
+#endif // CONFIG_USB_HCI
 
 #ifdef CONFIG_TX_EARLY_MODE
                if (pxmitframe->frame_tag == DATA_FRAMETAG) {
@@ -4986,6 +4983,10 @@ void rtl8723b_update_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf)
 {
        rtl8723b_fill_default_txdesc(pxmitframe, pbuf);
 
+#ifdef CONFIG_ANTENNA_DIVERSITY
+       ODM_SetTxAntByTxInfo(&GET_HAL_DATA(padapter)->odmpriv, pbuf, pxmitframe->attrib.mac_id);
+#endif // CONFIG_ANTENNA_DIVERSITY
+
 #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
        rtl8723b_cal_txdesc_chksum((struct tx_desc*)pbuf);
 #endif
@@ -5878,24 +5879,66 @@ void CCX_FwC2HTxRpt_8723b(PADAPTER padapter, u8 *pdata, u8 len)
 }
 
 #ifdef CONFIG_FW_C2H_DEBUG
+/*
+ * C2H RX package original is 128.
+ * If enable CONFIG_FW_C2H_DEBUG, it should increase to 256. 
+ * C2H FW debug message:
+ * without aggregate:
+ * {C2H CmdID, Seq, SubID, Len, Content[0~n]}
+ * Content[0~n] = { 'a' , 'b' , 'c' ,..., 'z' , '\n'}
+ *
+ * with aggregate:
+ * {C2H CmdID, Seq, SubID, Len, Content[0~n]}
+ * Content[0~n] = { 'a' , 'b' , 'c' ,..., 'z', '\n' , Extend C2H pkt 2...}
+ * Extend C2H pkt 2 = {C2H CmdID, Seq, SubID, Len, Content = { 'a' , 'b' , 'c' ,..., 'z' , '\n'}}
+ *
+ * Author: Isaac
+ */
 void Debug_FwC2H_8723b(PADAPTER padapter, u8 *pdata, u8 len)
 {
-       u8 data_len = *(pdata + 1);
-       u8 seq_no = *(pdata + 2);
        int i = 0;
-       int cnt = 0;
+       int cnt = 0, total_length = 0;
        u8 buf[128]={0};
+       u8 more_data = _FALSE;
+       u8 *nextdata = NULL;
+       u8 test = 0;
 
-       //DBG_871X("%s: SubID: %02x, data_len: %02x, Content: %02x\n",
-       //              __func__, *pdata, *(pdata+1), *(pdata+2));
+       u8 data_len;
+       u8 seq_no;
+
+       nextdata = pdata;
+#if 0
+       for (i = 0 ; i < len ; i++) {
+               printk("%02x ", pdata[i]);
+               if ((i + 1)%8 == 0)
+                       printk("\n");
+       }
+       printk("\n");
+#endif
+       do {
+               data_len = *(nextdata + 1);
+               seq_no = *(nextdata + 2);
 
-       for (i = 0 ; i < data_len ; i++)
-               cnt += sprintf((buf+cnt), "%c", pdata[3 + i]);
+               for (i = 0 ; i < data_len - 2 ; i++) {
+                       cnt += sprintf((buf+cnt), "%c", nextdata[3 + i]);
+
+                       if (nextdata[3 + i] == 0x0a && nextdata[4 + i] == 0xff) {
+                               more_data = _TRUE;
+                       } else if (nextdata[3 + i] == 0x0a && nextdata[4 + i] != 0xff) {
+                               more_data = _FALSE;
+                       }
+               }
 
-       if (seq_no == 0)
-               DBG_871X("[RTKFW, SEQ=%d]: %s\n", seq_no, buf);
-       else
                DBG_871X("[RTKFW, SEQ=%d]: %s", seq_no, buf);
+               data_len += 3;
+               total_length += data_len;
+
+               if (more_data == _TRUE) {
+                       _rtw_memset(buf, '\0', 128);
+                       cnt = 0;
+                       nextdata = (pdata + total_length);
+               }
+       } while (more_data == _TRUE);
 }
 #endif //CONFIG_FW_C2H_DEBUG
 
@@ -6053,7 +6096,7 @@ static void process_c2h_event(PADAPTER padapter, PC2H_EVT_HDR pC2hEvent, u8 *c2h
                        break;
 
                case C2H_CCX_TX_RPT:
-//                     CCX_FwC2HTxRpt(padapter, QueueID, tmpBuf);
+                       CCX_FwC2HTxRpt_8723b(padapter, c2hBuf, pC2hEvent->CmdLen);
                        break;
 
 #ifdef CONFIG_BT_COEXIST
@@ -6088,6 +6131,13 @@ static void process_c2h_event(PADAPTER padapter, PC2H_EVT_HDR pC2hEvent, u8 *c2h
                        MPTBT_FwC2hBtMpCtrl(padapter, c2hBuf, pC2hEvent->CmdLen);
                        break;
 #endif
+
+#ifdef CONFIG_FW_C2H_DEBUG
+               case C2H_8723B_FW_DEBUG:
+                       Debug_FwC2H_8723b(padapter, c2hBuf, pC2hEvent->CmdLen);
+                       break;
+#endif // CONFIG_FW_C2H_DEBUG
+
                default:
                        break;
        }
@@ -6102,7 +6152,7 @@ static void process_c2h_event(PADAPTER padapter, PC2H_EVT_HDR pC2hEvent, u8 *c2h
 
 #ifdef CONFIG_C2H_PACKET_EN
 
-void C2HPacketHandler_8723B(PADAPTER padapter, u8 *pbuffer, u16 length)
+static void C2HPacketHandler_8723B(PADAPTER padapter, u8 *pbuffer, u16 length)
 {
        C2H_EVT_HDR     C2hEvent;
        u8 *tmpBuf=NULL;
@@ -6117,18 +6167,55 @@ void C2HPacketHandler_8723B(PADAPTER padapter, u8 *pbuffer, u16 length)
 #endif
        C2hEvent.CmdID = pbuffer[0];
        C2hEvent.CmdSeq = pbuffer[1];
-       C2hEvent.CmdLen = length -2;
-       tmpBuf = pbuffer+2;
+       C2hEvent.CmdLen = length - 2;
+       tmpBuf = pbuffer + 2;
 
        //DBG_871X("%s C2hEvent.CmdID:%x C2hEvent.CmdLen:%x C2hEvent.CmdSeq:%x\n",
        //              __func__, C2hEvent.CmdID, C2hEvent.CmdLen, C2hEvent.CmdSeq);
        RT_PRINT_DATA(_module_hal_init_c_, _drv_notice_, "C2HPacketHandler_8723B(): Command Content:\n", tmpBuf, C2hEvent.CmdLen);
        
-       process_c2h_event(padapter,&C2hEvent, tmpBuf);
+       process_c2h_event(padapter, &C2hEvent, tmpBuf);
        //c2h_handler_8723b(padapter,&C2hEvent);
        return;
 }
-#else
+
+void rtl8723b_c2h_packet_handler(PADAPTER padapter, u8 *pbuf, u16 length)
+{
+       C2H_EVT_HDR C2hEvent;
+       u8 *pdata;
+
+
+       if (length == 0)
+               return;
+
+       C2hEvent.CmdID = pbuf[0];
+       C2hEvent.CmdSeq = pbuf[1];
+       C2hEvent.CmdLen = length - 2;
+       pdata = pbuf + 2;
+
+       DBG_8192C("%s: C2H, ID=%d seq=%d len=%d\n",
+               __FUNCTION__, C2hEvent.CmdID, C2hEvent.CmdSeq, C2hEvent.CmdLen);
+
+       switch (C2hEvent.CmdID) {
+       case C2H_CCX_TX_RPT:
+#ifdef CONFIG_FW_C2H_DEBUG
+       case C2H_8723B_FW_DEBUG:
+#endif // CONFIG_FW_C2H_DEBUG
+               process_c2h_event(padapter, &C2hEvent, pdata);
+               break;
+
+       default:
+               pdata = rtw_zmalloc(length);
+               if (pdata == NULL)
+                       break;
+               _rtw_memcpy(pdata, pbuf, length);
+               if (rtw_c2h_packet_wk_cmd(padapter, pdata, length) == _FAIL)
+                       rtw_mfree(pdata, length);
+               break;
+       }
+}
+
+#else // !CONFIG_C2H_PACKET_EN
 //
 //C2H event format:
 // Field        TRIGGER                CONTENT    CMD_SEQ      CMD_LEN          CMD_ID
@@ -6191,7 +6278,7 @@ static void C2HCommandHandler(PADAPTER padapter)
        c2h_handler_8723b(padapter,&C2hEvent);
        if (tmpBuf)
                rtw_mfree(tmpBuf, C2hEvent.CmdLen);
-#endif
+#endif // CONFIG_SDIO_HCI || CONFIG_GSPI_HCI
 
 #ifdef CONFIG_USB_HCI
        HAL_DATA_TYPE   *pHalData=GET_HAL_DATA(padapter);
@@ -6202,7 +6289,8 @@ static void C2HCommandHandler(PADAPTER padapter)
        C2hEvent.CmdSeq =pHalData->C2hArray[USB_C2H_SEQ_OFFSET];
        c2h_handler_8723b(padapter,(u8 *)&C2hEvent);
        //process_c2h_event(padapter,&C2hEvent,&pHalData->C2hArray[USB_C2H_EVENT_OFFSET]);
-#endif
+#endif // CONFIG_USB_HCI
+
        //REG_C2HEVT_CLEAR have done in process_c2h_event
        return;
 exit:
@@ -6210,7 +6298,7 @@ exit:
        return;
 }
 
-#endif
+#endif // !CONFIG_C2H_PACKET_EN
 
 void SetHwReg8723B(PADAPTER padapter, u8 variable, u8 *val)
 {
@@ -6567,20 +6655,6 @@ _func_enter_;
                        rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|(RCR_CBSSID_DATA));
                        break;
 #endif //CONFIG_TDLS
-               case HW_VAR_INITIAL_GAIN:
-                       {
-                               DIG_T *pDigTable = &pHalData->odmpriv.DM_DigTable;
-                               u32 rx_gain = *(u32*)val;
-
-                               if (rx_gain == 0xff) {//restore rx gain
-                                       ODM_Write_DIG(&pHalData->odmpriv, pDigTable->BackupIGValue);
-                               } else {
-                                       pDigTable->BackupIGValue = pDigTable->CurIGValue;
-                                       ODM_Write_DIG(&pHalData->odmpriv, rx_gain);
-                               }
-                       }
-                       break;
-
 #ifdef CONFIG_SW_ANTENNA_DIVERSITY
                case HW_VAR_ANTENNA_DIVERSITY_LINK:
                        //SwAntDivRestAfterLink8192C(padapter);
@@ -6720,16 +6794,13 @@ _func_enter_;
                                rtw_write8(padapter, REG_NAV_UPPER, (u8)usNavUpper);
                        }
                        break;
-                       
+
 #ifndef CONFIG_C2H_PACKET_EN
                case HW_VAR_C2H_HANDLE:
-                                       C2HCommandHandler(padapter);
-                               break;
+                       C2HCommandHandler(padapter);
+                       break;
 #endif
 
-//             case HW_VAR_C2H_HANDLE:
-//                     C2HCommandHandler(padapter);
-//                     break;
                case HW_VAR_H2C_MEDIA_STATUS_RPT:
                        {
                                u16     mstatus_rpt = (*(u16 *)val);
@@ -6795,41 +6866,73 @@ _func_enter_;
                        break;
 
                case HW_VAR_MACID_SLEEP:
-                       // Input is MACID
-                       val32 = *(u32*)val;
-                       if (val32 > 31) {
-                               DBG_8192C(FUNC_ADPT_FMT ": [HW_VAR_MACID_SLEEP] Invalid macid(%d)\n",
-                                       FUNC_ADPT_ARG(padapter), val32);
+               {
+                       u32 reg_macid_sleep;
+                       u8 bit_shift;
+                       u8 id = *(u8*)val;
+
+                       if (id < 32) {
+                               reg_macid_sleep = REG_MACID_SLEEP;
+                               bit_shift = id;
+                       } else if (id < 64) {
+                               reg_macid_sleep = REG_MACID_SLEEP_1;
+                               bit_shift = id-32;
+                       } else if (id < 96) {
+                               reg_macid_sleep = REG_MACID_SLEEP_2;
+                               bit_shift = id-64;
+                       } else if (id < 128) {
+                               reg_macid_sleep = REG_MACID_SLEEP_3;
+                               bit_shift = id-96;
+                       } else {
+                               rtw_warn_on(1);
                                break;
                        }
-                       val8 = (u8)val32; // macid is between 0~31
 
-                       val32 = rtw_read32(padapter, REG_MACID_SLEEP);
-                       DBG_8192C(FUNC_ADPT_FMT ": [HW_VAR_MACID_SLEEP] macid=%d, org MACID_SLEEP=0x%08X\n",
-                               FUNC_ADPT_ARG(padapter), val8, val32);
-                       if (val32 & BIT(val8))
+                       val32 = rtw_read32(padapter, reg_macid_sleep);
+                       DBG_8192C(FUNC_ADPT_FMT ": [HW_VAR_MACID_SLEEP] macid=%d, org reg_0x%03x=0x%08X\n",
+                               FUNC_ADPT_ARG(padapter), id, reg_macid_sleep, val32);
+
+                       if (val32 & BIT(bit_shift))
                                break;
-                       val32 |= BIT(val8);
-                       rtw_write32(padapter, REG_MACID_SLEEP, val32);
+
+                       val32 |= BIT(bit_shift);
+                       rtw_write32(padapter, reg_macid_sleep, val32);
+               }
                        break;
 
                case HW_VAR_MACID_WAKEUP:
-                       // Input is MACID
-                       val32 = *(u32*)val;
-                       if (val32 > 31) {
-                               DBG_8192C(FUNC_ADPT_FMT ": [HW_VAR_MACID_WAKEUP] Invalid macid(%d)\n",
-                                       FUNC_ADPT_ARG(padapter), val32);
+               {
+                       u32 reg_macid_sleep;
+                       u8 bit_shift;
+                       u8 id = *(u8*)val;
+
+                       if (id < 32) {
+                               reg_macid_sleep = REG_MACID_SLEEP;
+                               bit_shift = id;
+                       } else if (id < 64) {
+                               reg_macid_sleep = REG_MACID_SLEEP_1;
+                               bit_shift = id-32;
+                       } else if (id < 96) {
+                               reg_macid_sleep = REG_MACID_SLEEP_2;
+                               bit_shift = id-64;
+                       } else if (id < 128) {
+                               reg_macid_sleep = REG_MACID_SLEEP_3;
+                               bit_shift = id-96;
+                       } else {
+                               rtw_warn_on(1);
                                break;
                        }
-                       val8 = (u8)val32; // macid is between 0~31
 
-                       val32 = rtw_read32(padapter, REG_MACID_SLEEP);
-                       DBG_8192C(FUNC_ADPT_FMT ": [HW_VAR_MACID_WAKEUP] macid=%d, org MACID_SLEEP=0x%08X\n",
-                               FUNC_ADPT_ARG(padapter), val8, val32);
-                       if (!(val32 & BIT(val8)))
+                       val32 = rtw_read32(padapter, reg_macid_sleep);
+                       DBG_8192C(FUNC_ADPT_FMT ": [HW_VAR_MACID_WAKEUP] macid=%d, org reg_0x%03x=0x%08X\n",
+                               FUNC_ADPT_ARG(padapter), id, reg_macid_sleep, val32);
+
+                       if (!(val32 & BIT(bit_shift)))
                                break;
-                       val32 &= ~BIT(val8);
-                       rtw_write32(padapter, REG_MACID_SLEEP, val32);
+
+                       val32 &= ~BIT(bit_shift);
+                       rtw_write32(padapter, reg_macid_sleep, val32);
+               }
                        break;
 
                default:
@@ -6840,6 +6943,74 @@ _func_enter_;
 _func_exit_;
 }
 
+struct qinfo_8723b {
+       u32 head:8;
+       u32 pkt_num:7;
+       u32 tail:8;
+       u32 ac:2;
+       u32 macid:7;
+};
+
+struct bcn_qinfo_8723b {
+       u16 head:8;
+       u16 pkt_num:8;
+};
+
+void dump_qinfo_8723b(void *sel, struct qinfo_8723b *info, const char *tag)
+{
+       //if (info->pkt_num)
+       DBG_871X_SEL_NL(sel, "%shead:0x%02x, tail:0x%02x, pkt_num:%u, macid:%u, ac:%u\n"
+               , tag ? tag : "", info->head, info->tail, info->pkt_num, info->macid, info->ac
+       );
+}
+
+void dump_bcn_qinfo_8723b(void *sel, struct bcn_qinfo_8723b *info, const char *tag)
+{
+       //if (info->pkt_num)
+       DBG_871X_SEL_NL(sel, "%shead:0x%02x, pkt_num:%u\n"
+               , tag ? tag : "", info->head, info->pkt_num
+       );
+}
+
+void dump_mac_qinfo_8723b(void *sel, _adapter *adapter)
+{
+       u32 q0_info;
+       u32 q1_info;
+       u32 q2_info;
+       u32 q3_info;
+       u32 q4_info;
+       u32 q5_info;
+       u32 q6_info;
+       u32 q7_info;
+       u32 mg_q_info;
+       u32 hi_q_info;
+       u16 bcn_q_info;
+
+       q0_info = rtw_read32(adapter, REG_Q0_INFO);
+       q1_info = rtw_read32(adapter, REG_Q1_INFO);
+       q2_info = rtw_read32(adapter, REG_Q2_INFO);
+       q3_info = rtw_read32(adapter, REG_Q3_INFO);
+       q4_info = rtw_read32(adapter, REG_Q4_INFO);
+       q5_info = rtw_read32(adapter, REG_Q5_INFO);
+       q6_info = rtw_read32(adapter, REG_Q6_INFO);
+       q7_info = rtw_read32(adapter, REG_Q7_INFO);
+       mg_q_info = rtw_read32(adapter, REG_MGQ_INFO);
+       hi_q_info = rtw_read32(adapter, REG_HGQ_INFO);
+       bcn_q_info = rtw_read16(adapter, REG_BCNQ_INFO);
+
+       dump_qinfo_8723b(sel, (struct qinfo_8723b *)&q0_info, "Q0 ");
+       dump_qinfo_8723b(sel, (struct qinfo_8723b *)&q1_info, "Q1 ");
+       dump_qinfo_8723b(sel, (struct qinfo_8723b *)&q2_info, "Q2 ");
+       dump_qinfo_8723b(sel, (struct qinfo_8723b *)&q3_info, "Q3 ");
+       dump_qinfo_8723b(sel, (struct qinfo_8723b *)&q4_info, "Q4 ");
+       dump_qinfo_8723b(sel, (struct qinfo_8723b *)&q5_info, "Q5 ");
+       dump_qinfo_8723b(sel, (struct qinfo_8723b *)&q6_info, "Q6 ");
+       dump_qinfo_8723b(sel, (struct qinfo_8723b *)&q7_info, "Q7 ");
+       dump_qinfo_8723b(sel, (struct qinfo_8723b *)&mg_q_info, "MG ");
+       dump_qinfo_8723b(sel, (struct qinfo_8723b *)&hi_q_info, "HI ");
+       dump_bcn_qinfo_8723b(sel, (struct bcn_qinfo_8723b *)&bcn_q_info, "BCN ");
+}
+
 void GetHwReg8723B(PADAPTER padapter, u8 variable, u8 *val)
 {
        PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
@@ -6942,6 +7113,9 @@ void GetHwReg8723B(PADAPTER padapter, u8 variable, u8 *val)
                        *val = rtw_read8(padapter, REG_SYS_CLKR);
                        break;
 #endif
+               case HW_VAR_DUMP_MAC_QUEUE_INFO:
+                       dump_mac_qinfo_8723b(val, padapter);
+                       break;
                default:
                        GetHwReg(padapter, variable, val);
                        break;
@@ -6971,6 +7145,27 @@ u8 SetHalDefVar8723B(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval)
        return bResult;
 }
 
+#ifdef CONFIG_C2H_PACKET_EN
+void SetHwRegWithBuf8723B(PADAPTER padapter, u8 variable, u8 *pbuf, int len)
+{
+       PHAL_DATA_TYPE pHalData;
+
+_func_enter_;
+
+       pHalData = GET_HAL_DATA(padapter);
+
+       switch (variable) {
+       case HW_VAR_C2H_HANDLE:
+               C2HPacketHandler_8723B(padapter, pbuf, len);
+               break;
+
+       default:
+               break;
+       }
+_func_exit_;
+}
+#endif // CONFIG_C2H_PACKET_EN
+
 /*
  *     Description: 
  *             Query setting of specified variable.
@@ -7080,7 +7275,9 @@ u8 GetHalDefVar8723B(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval)
                case HAL_DEF_MACID_SLEEP:
                        *(u8*)pval = _TRUE; // support macid sleep
                        break;
-
+               case HAL_DEF_TX_PAGE_SIZE:
+                        *(( u32*)pval) = PAGE_SIZE_128;
+                       break;
                default:
                        bResult = GetHalDefVar(padapter, variable, pval);
                        break;
index a36620583a5dc23568322e846843a95e3374c2b1..137270e00dad357586cc921d669312f19e4123de 100755 (executable)
@@ -498,6 +498,10 @@ s32 PHY_MACConfig8723B(PADAPTER Adapter)
 #endif//CONFIG_EMBEDDED_FWIMG\r
        }\r
 \r
+#ifdef CONFIG_GPIO_WAKEUP\r
+       rtw_clear_hostwakeupgpio(Adapter);\r
+#endif // CONFIG_GPIO_WAKEUP\r
+\r
        return rtStatus;\r
 }\r
 \r
@@ -794,10 +798,14 @@ PHY_BBConfig8723B(
        RegVal = rtw_read16(Adapter, REG_SYS_FUNC_EN);\r
        rtw_write16(Adapter, REG_SYS_FUNC_EN, (u16)(RegVal|BIT13|BIT0|BIT1));\r
 \r
+       // switch ant to BT\r
 #ifdef CONFIG_USB_HCI\r
        rtw_write32(Adapter, 0x948, 0x0);       // USB use Antenna S0\r
 #else\r
-       rtw_write32(Adapter, 0x948, 0x280);     // Others use Antenna S1\r
+       if (pHalData->ant_path == ODM_RF_PATH_A)\r
+               rtw_write32(Adapter, 0x948, 0x280);\r
+       else\r
+               rtw_write32(Adapter, 0x948, 0x0);\r
 #endif\r
 \r
        rtw_write8(Adapter, REG_RF_CTRL, RF_EN|RF_RSTB|RF_SDMRSTB);\r
index 6962cb6b265d6aa4cd90b160b894ef947c221a5a..eedc8c20b4f940d038dfc25988442d087ed346f8 100755 (executable)
@@ -138,8 +138,7 @@ static void process_link_qual(_adapter *padapter,union recv_frame *prframe)
 
 }// Process_UiLinkQuality8192S
 
-
-void rtl8723b_process_phy_info(_adapter *padapter, void *prframe)
+static void process_phy_info(_adapter *padapter, void *prframe)
 {
        union recv_frame *precvframe = (union recv_frame *)prframe;
        //
@@ -162,44 +161,121 @@ void rtl8723b_process_phy_info(_adapter *padapter, void *prframe)
 
 }
 
-void rtl8723b_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc)
+/*
+ * Notice:
+ *     Before calling this function,
+ *     precvframe->u.hdr.rx_data should be ready!
+ */
+void rtl8723b_query_rx_phy_status(union recv_frame *precvframe, struct phy_stat *pphy_status)
 {
-       struct rx_pkt_attrib    *pattrib = &precvframe->u.hdr.attrib;
+       PADAPTER padapter = precvframe->u.hdr.adapter;
+       struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib;
+       PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
+       PODM_PHY_INFO_T pPHYInfo  = (PODM_PHY_INFO_T)(&pattrib->phy_info);
 
-       _rtw_memset(pattrib, 0, sizeof(struct rx_pkt_attrib));
+       u8 *wlanhdr;
+       ODM_PACKET_INFO_T pkt_info;
+       u8 *sa = NULL;
+       //_irqL         irqL;
+       struct sta_priv *pstapriv;
+       struct sta_info *psta;
 
-       //Offset 0
-       pattrib->pkt_len = (u16)GET_RX_STATUS_DESC_PKT_LEN_8723B(pdesc);//(le32_to_cpu(pdesc->rxdw0)&0x00003fff)
-       pattrib->crc_err = (u8)GET_RX_STATUS_DESC_CRC32_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 14) & 0x1);
-       pattrib->icv_err = (u8)GET_RX_STATUS_DESC_ICV_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 15) & 0x1);
-       pattrib->drvinfo_sz = (u8)GET_RX_STATUS_DESC_DRVINFO_SIZE_8723B(pdesc) * 8;//((le32_to_cpu(pdesc->rxdw0) >> 16) & 0xf) * 8;//uint 2^3 = 8 bytes
-       pattrib->encrypt = (u8)GET_RX_STATUS_DESC_SECURITY_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 20) & 0x7);
-       pattrib->qos = (u8)GET_RX_STATUS_DESC_QOS_8723B(pdesc);//(( le32_to_cpu( pdesc->rxdw0 ) >> 23) & 0x1);// Qos data, wireless lan header length is 26
-       pattrib->shift_sz = (u8)GET_RX_STATUS_DESC_SHIFT_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 24) & 0x3);
-       pattrib->physt = (u8)GET_RX_STATUS_DESC_PHY_STATUS_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 26) & 0x1);
-       pattrib->bdecrypted = !GET_RX_STATUS_DESC_SWDEC_8723B(pdesc);//(le32_to_cpu(pdesc->rxdw0) & BIT(27))? 0:1;
-
-       //Offset 4
-       pattrib->priority = (u8)GET_RX_STATUS_DESC_TID_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw1) >> 8) & 0xf);
-       pattrib->mdata = (u8)GET_RX_STATUS_DESC_MORE_DATA_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw1) >> 26) & 0x1);
-       pattrib->mfrag = (u8)GET_RX_STATUS_DESC_MORE_FRAG_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw1) >> 27) & 0x1);//more fragment bit
-
-       //Offset 8
-       pattrib->seq_num = (u16)GET_RX_STATUS_DESC_SEQ_8723B(pdesc);//(le32_to_cpu(pdesc->rxdw2) & 0x00000fff);
-       pattrib->frag_num = (u8)GET_RX_STATUS_DESC_FRAG_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw2) >> 12) & 0xf);//fragmentation number
-
-       if (GET_RX_STATUS_DESC_RPT_SEL_8723B(pdesc))
-               pattrib->pkt_rpt_type = C2H_PACKET;
-       else
-               pattrib->pkt_rpt_type = NORMAL_RX;
 
-       //Offset 12
-       pattrib->data_rate=(u8)GET_RX_STATUS_DESC_RX_RATE_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw3))&0x7f);
+       pkt_info.bPacketMatchBSSID =_FALSE;
+       pkt_info.bPacketToSelf = _FALSE;
+       pkt_info.bPacketBeacon = _FALSE;
+
+       wlanhdr = get_recvframe_data(precvframe);
+
+       pkt_info.bPacketMatchBSSID = ((!IsFrameTypeCtrl(wlanhdr)) &&
+               !pattrib->icv_err && !pattrib->crc_err &&
+               _rtw_memcmp(get_hdr_bssid(wlanhdr), get_bssid(&padapter->mlmepriv), ETH_ALEN));
 
-       //Offset 16
-       //Offset 20
+       pkt_info.bToSelf = ((!pattrib->icv_err) && (!pattrib->crc_err)) && (_rtw_memcmp(get_ra(wlanhdr), myid(&padapter->eeprompriv), ETH_ALEN));
 
+       pkt_info.bPacketToSelf = pkt_info.bPacketMatchBSSID && (_rtw_memcmp(get_ra(wlanhdr), myid(&padapter->eeprompriv), ETH_ALEN));
+
+       pkt_info.bPacketBeacon = pkt_info.bPacketMatchBSSID && (GetFrameSubType(wlanhdr) == WIFI_BEACON);
+/*
+       if(pkt_info.bPacketBeacon){
+               if(check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _TRUE){
+                       sa = padapter->mlmepriv.cur_network.network.MacAddress;
+               #if 0
+                       {
+                               DBG_871X("==> rx beacon from AP[%02x:%02x:%02x:%02x:%02x:%02x]\n",
+                                       sa[0],sa[1],sa[2],sa[3],sa[4],sa[5]);
+                       }
+               #endif
+               }
+               //to do Ad-hoc
+       }
+       else{
+               sa = get_sa(wlanhdr);
+       }
+*/
+       sa = get_ta(wlanhdr);
+
+       pkt_info.StationID = 0xFF;
+
+       pstapriv = &padapter->stapriv;
+       psta = rtw_get_stainfo(pstapriv, sa);
+       if (psta)
+               pkt_info.StationID = psta->mac_id;
+       pkt_info.DataRate = pattrib->data_rate;
+
+       ODM_PhyStatusQuery(&pHalData->odmpriv, pPHYInfo, (u8*)pphy_status, &pkt_info);
+       if(psta)
+               psta->rssi = pattrib->phy_info.RecvSignalPower;
+
+       precvframe->u.hdr.psta = NULL;
+       if (pkt_info.bPacketMatchBSSID &&
+               (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE)) {
+               if (psta) {
+                       precvframe->u.hdr.psta = psta;
+                       process_phy_info(padapter, precvframe);
+               }
+       } else if (pkt_info.bPacketToSelf || pkt_info.bPacketBeacon) {
+               if (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)
+                       if (psta)
+                               precvframe->u.hdr.psta = psta;
+               process_phy_info(padapter, precvframe);
+       }
 }
 
+void rtl8723b_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc)
+{
+       struct rx_pkt_attrib *pattrib;
+
+
+       pattrib = &precvframe->u.hdr.attrib;
+       _rtw_memset(pattrib, 0, sizeof(struct rx_pkt_attrib));
 
+       pattrib->pkt_len = (u16)GET_RX_STATUS_DESC_PKT_LEN_8723B(pdesc);
+       pattrib->pkt_rpt_type = GET_RX_STATUS_DESC_RPT_SEL_8723B(pdesc) ? C2H_PACKET : NORMAL_RX;
+
+       if (pattrib->pkt_rpt_type == NORMAL_RX) {
+               // Offset 0
+               pattrib->crc_err = (u8)GET_RX_STATUS_DESC_CRC32_8723B(pdesc);
+               pattrib->icv_err = (u8)GET_RX_STATUS_DESC_ICV_8723B(pdesc);
+               pattrib->drvinfo_sz = (u8)GET_RX_STATUS_DESC_DRVINFO_SIZE_8723B(pdesc) << 3;
+               pattrib->encrypt = (u8)GET_RX_STATUS_DESC_SECURITY_8723B(pdesc);
+               pattrib->qos = (u8)GET_RX_STATUS_DESC_QOS_8723B(pdesc);
+               pattrib->shift_sz = (u8)GET_RX_STATUS_DESC_SHIFT_8723B(pdesc);
+               pattrib->physt = (u8)GET_RX_STATUS_DESC_PHY_STATUS_8723B(pdesc);
+               pattrib->bdecrypted = (u8)GET_RX_STATUS_DESC_SWDEC_8723B(pdesc) ? 0 : 1;
+
+               // Offset 4
+               pattrib->priority = (u8)GET_RX_STATUS_DESC_TID_8723B(pdesc);
+               pattrib->amsdu = (u8)GET_RX_STATUS_DESC_AMSDU_8723B(pdesc);
+               pattrib->mdata = (u8)GET_RX_STATUS_DESC_MORE_DATA_8723B(pdesc);
+               pattrib->mfrag = (u8)GET_RX_STATUS_DESC_MORE_FRAG_8723B(pdesc);
+
+               // Offset 8
+               pattrib->seq_num = (u16)GET_RX_STATUS_DESC_SEQ_8723B(pdesc);
+               pattrib->frag_num = (u8)GET_RX_STATUS_DESC_FRAG_8723B(pdesc);
+
+               // Offset 12
+               pattrib->data_rate = (u8)GET_RX_STATUS_DESC_RX_RATE_8723B(pdesc);
+       }
+}
 
index 4c960638c45feb6bb02f6f67002fffa718bce08a..c0e893db6792b8ce8bbb739da76f56ea87d68475 100755 (executable)
 
 #include <rtl8723b_hal.h>
 
-
-void rtl8723bu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf)
-{
-
-       precvbuf->transfer_len = 0;
-
-       precvbuf->len = 0;
-
-       precvbuf->ref_cnt = 0;
-
-       if(precvbuf->pbuf)
-       {
-               precvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pbuf;
-               precvbuf->pend = precvbuf->pdata + MAX_RECVBUF_SZ;
-       }
-
-}
-
 int    rtl8723bu_init_recv_priv(_adapter *padapter)
 {
        struct recv_priv        *precvpriv = &padapter->recvpriv;
@@ -52,7 +34,7 @@ int   rtl8723bu_init_recv_priv(_adapter *padapter)
 
 #ifdef PLATFORM_LINUX
        tasklet_init(&precvpriv->recv_tasklet,
-            (void(*)(unsigned long))rtl8723bu_recv_tasklet,
+            (void(*)(unsigned long))usb_recv_tasklet,
             (unsigned long)padapter);
 #endif
 
@@ -226,142 +208,5 @@ void rtl8723bu_free_recv_priv (_adapter *padapter)
 #endif
 
 #endif
-
-}
-
-
-void update_recvframe_attrib(
-       PADAPTER padapter,
-       union recv_frame *precvframe,
-       u8 *prxstat)
-{
-       struct rx_pkt_attrib    *pattrib;
-
-
-       pattrib = &precvframe->u.hdr.attrib;
-       _rtw_memset(pattrib, 0, sizeof(struct rx_pkt_attrib));
-
-       // update rx report to recv_frame attribute
-       pattrib->pkt_len = (u16)GET_RX_STATUS_DESC_PKT_LEN_8723B(prxstat);
-       pattrib->pkt_rpt_type = GET_RX_STATUS_DESC_RPT_SEL_8723B(prxstat) ? C2H_PACKET : NORMAL_RX;
-
-       if (pattrib->pkt_rpt_type == NORMAL_RX) {
-               // Normal rx packet
-               pattrib->drvinfo_sz = (u8)GET_RX_STATUS_DESC_DRVINFO_SIZE_8723B(prxstat) << 3;
-               pattrib->shift_sz = (u8)GET_RX_STATUS_DESC_SHIFT_8723B(prxstat);
-               pattrib->physt = (u8)GET_RX_STATUS_DESC_PHY_STATUS_8723B(prxstat);
-
-               pattrib->crc_err = (u8)GET_RX_STATUS_DESC_CRC32_8723B(prxstat);
-               pattrib->icv_err = (u8)GET_RX_STATUS_DESC_ICV_8723B(prxstat);
-
-               pattrib->bdecrypted = (u8)GET_RX_STATUS_DESC_SWDEC_8723B(prxstat) ? 0 : 1;
-               pattrib->encrypt = (u8)GET_RX_STATUS_DESC_SECURITY_8723B(prxstat);
-
-               pattrib->qos = (u8)GET_RX_STATUS_DESC_QOS_8723B(prxstat);
-               pattrib->priority = (u8)GET_RX_STATUS_DESC_TID_8723B(prxstat);
-
-               pattrib->amsdu = (u8)GET_RX_STATUS_DESC_AMSDU_8723B(prxstat);
-
-               pattrib->seq_num = (u16)GET_RX_STATUS_DESC_SEQ_8723B(prxstat);
-               pattrib->frag_num = (u8)GET_RX_STATUS_DESC_FRAG_8723B(prxstat);
-               pattrib->mfrag = (u8)GET_RX_STATUS_DESC_MORE_FRAG_8723B(prxstat);
-               pattrib->mdata = (u8)GET_RX_STATUS_DESC_MORE_DATA_8723B(prxstat);
-
-               pattrib->data_rate = (u8)GET_RX_STATUS_DESC_RX_RATE_8723B(prxstat);
-       }
-}
-
-/*
- * Notice:
- *     Before calling this function,
- *     precvframe->u.hdr.rx_data should be ready!
- */
-void update_recvframe_phyinfo(
-       union recv_frame        *precvframe,
-       struct phy_stat *pphy_status)
-{
-       PADAPTER                        padapter = precvframe->u.hdr.adapter;
-       struct rx_pkt_attrib    *pattrib = &precvframe->u.hdr.attrib;
-       HAL_DATA_TYPE           *pHalData= GET_HAL_DATA(padapter);      
-       PODM_PHY_INFO_T         pPHYInfo  = (PODM_PHY_INFO_T)(&pattrib->phy_info); 
-
-       u8                                      *wlanhdr;
-       ODM_PACKET_INFO_T       pkt_info;
-       u8 *sa = NULL;
-       //_irqL         irqL;
-       struct sta_priv *pstapriv;
-       struct sta_info *psta;
-       
-       pkt_info.bPacketMatchBSSID =_FALSE;
-       pkt_info.bPacketToSelf = _FALSE;
-       pkt_info.bPacketBeacon = _FALSE;
-
-
-       wlanhdr = get_recvframe_data(precvframe);
-
-       pkt_info.bPacketMatchBSSID = ((!IsFrameTypeCtrl(wlanhdr)) &&
-               !pattrib->icv_err && !pattrib->crc_err &&
-               _rtw_memcmp(get_hdr_bssid(wlanhdr), get_bssid(&padapter->mlmepriv), ETH_ALEN));
-
-       pkt_info.bPacketToSelf = pkt_info.bPacketMatchBSSID && (_rtw_memcmp(get_ra(wlanhdr), myid(&padapter->eeprompriv), ETH_ALEN));
-
-       pkt_info.bPacketBeacon = pkt_info.bPacketMatchBSSID && (GetFrameSubType(wlanhdr) == WIFI_BEACON);
-/*
-       if(pkt_info.bPacketBeacon){
-               if(check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _TRUE){                            
-                       sa = padapter->mlmepriv.cur_network.network.MacAddress;
-                       #if 0
-                       {                                       
-                               DBG_871X("==> rx beacon from AP[%02x:%02x:%02x:%02x:%02x:%02x]\n",
-                                       sa[0],sa[1],sa[2],sa[3],sa[4],sa[5]);                                   
-                       }
-                       #endif
-               }
-               //to do Ad-hoc
-       }
-       else{
-               sa = get_sa(wlanhdr);
-       }               
-*/             
-       sa = get_ta(wlanhdr);
-
-       pkt_info.StationID = 0xFF;
-
-       pstapriv = &padapter->stapriv;
-       psta = rtw_get_stainfo(pstapriv, sa);
-       if (psta)
-       {
-             pkt_info.StationID = psta->mac_id;
-               //DBG_871X("%s ==> StationID(%d)\n",__FUNCTION__,pkt_info.StationID);
-       }
-       pkt_info.DataRate = pattrib->data_rate;
-
-       //rtl8723b_query_rx_phy_status(precvframe, pphy_status);
-       //_enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL);
-        ODM_PhyStatusQuery(&pHalData->odmpriv,pPHYInfo,(u8 *)pphy_status,&(pkt_info)); 
-       if(psta) psta->rssi = pattrib->phy_info.RecvSignalPower;
-       //_exit_critical_bh(&pHalData->odm_stainfo_lock, &irqL);
-       precvframe->u.hdr.psta = NULL;
-       if (pkt_info.bPacketMatchBSSID &&
-               (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE))
-       {                       
-               if (psta)
-               {                  
-                       precvframe->u.hdr.psta = psta;
-                       rtl8723b_process_phy_info(padapter, precvframe);                       
-                }
-       }
-       else if (pkt_info.bPacketToSelf || pkt_info.bPacketBeacon)
-       {
-               if (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)
-               {                       
-                       if (psta)
-                       {
-                               precvframe->u.hdr.psta = psta;
-                       }
-               }
-               rtl8723b_process_phy_info(padapter, precvframe);             
-       }
 }
 
-
index 176e8809e15cf5211bae5cd6e6a6c53772507156..0540a38f010962d5650015816cbfa6ccb1f2c35c 100755 (executable)
@@ -524,6 +524,9 @@ s32 rtl8723bu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv
                pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
                xmitframe_plist = get_next(xmitframe_plist);
 
+               if(_FAIL == rtw_hal_busagg_qsel_check(padapter,pfirstframe->attrib.qsel,pxmitframe->attrib.qsel))
+                       break;
+               
                len = xmitframe_need_length(pxmitframe) + TXDESC_SIZE; // no offset
                if (pbuf + len > MAX_XMITBUF_SZ) break;
 
@@ -745,7 +748,6 @@ static s32 pre_xmitframe(_adapter *padapter, struct xmit_frame *pxmitframe)
        //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
 #endif
 
-
        _enter_critical_bh(&pxmitpriv->lock, &irqL);
 
        if (rtw_txframes_sta_ac_pending(padapter, pattrib) > 0)
index f6a0d8a7746aa430091ff185b0ff97b576875f10..a837014d5b00b5deabbb724500bd1f5eeb212bb2 100755 (executable)
@@ -21,6 +21,9 @@
  #define _USB_HALINIT_C_
 
 #include <rtl8723b_hal.h>
+#ifdef CONFIG_WOWLAN
+#include "hal_com_h2c.h"
+#endif
 
 
 
@@ -180,6 +183,10 @@ static u8 _InitPowerOn_8723BU(PADAPTER padapter)
        //DBG_8192C("%s: REG_PAD_CTRL1(0x%x)=0x%02X\n", __FUNCTION__, REG_PAD_CTRL1_8723B, rtw_read8(padapter, REG_PAD_CTRL1_8723B));
 #endif // CONFIG_BT_COEXIST
 
+#ifdef CONFIG_GPIO_WAKEUP
+       rtw_clear_hostwakeupgpio(padapter);
+#endif // CONFIG_GPIO_WAKEUP
+
        return status;
 }
 
@@ -253,38 +260,6 @@ static u8 _LLTRead(
 //     MAC init functions
 //
 //---------------------------------------------------------------
-static VOID
-_SetMacID(
-       IN  PADAPTER Adapter, u8* MacID
-       )
-{
-       u32 i;
-       for(i=0 ; i< MAC_ADDR_LEN ; i++){
-#ifdef  CONFIG_CONCURRENT_MODE         
-               if(Adapter->iface_type == IFACE_PORT1)
-                       rtw_write32(Adapter, REG_MACID1+i, MacID[i]);
-               else
-#endif                 
-               rtw_write32(Adapter, REG_MACID+i, MacID[i]);
-       }
-}
-
-static VOID
-_SetBSSID(
-       IN  PADAPTER Adapter, u8* BSSID
-       )
-{
-       u32 i;
-       for(i=0 ; i< MAC_ADDR_LEN ; i++){
-#ifdef  CONFIG_CONCURRENT_MODE         
-               if(Adapter->iface_type == IFACE_PORT1)
-                       rtw_write32(Adapter, REG_BSSID1+i, BSSID[i]);
-               else
-#endif                 
-               rtw_write32(Adapter, REG_BSSID+i, BSSID[i]);
-       }
-}
-
 
 // Shall USB interface init this?
 static VOID
@@ -794,15 +769,8 @@ usb_AggSettingTxUpdate(
  *
  * Output/Return:      NONE
  *
- * Revised History:
- *     When            Who             Remark
- *     12/10/2010      MHC             Seperate to smaller function.
- *
  *---------------------------------------------------------------------------*/
-static VOID
-usb_AggSettingRxUpdate(
-       IN      PADAPTER                        Adapter
-       )
+static void usb_AggSettingRxUpdate(PADAPTER padapter)
 {
        PHAL_DATA_TYPE pHalData;
        u8 aggctrl;
@@ -810,12 +778,12 @@ usb_AggSettingRxUpdate(
        u32 agg_size;
 
 
-       pHalData = GET_HAL_DATA(Adapter);
+       pHalData = GET_HAL_DATA(padapter);
 
-       aggctrl = rtw_read8(Adapter, REG_TRXDMA_CTRL);
+       aggctrl = rtw_read8(padapter, REG_TRXDMA_CTRL);
        aggctrl &= ~RXDMA_AGG_EN;
 
-       aggrx = rtw_read32(Adapter, REG_RXDMA_AGG_PG_TH);
+       aggrx = rtw_read32(padapter, REG_RXDMA_AGG_PG_TH);
        aggrx &= ~BIT_USB_RXDMA_AGG_EN;
        aggrx &= ~0xFF0F; // reset agg size and timeout
 
@@ -863,8 +831,8 @@ usb_AggSettingRxUpdate(
        }
 #endif // CONFIG_USB_RX_AGGREGATION
 
-       rtw_write8(Adapter, REG_TRXDMA_CTRL, aggctrl);
-       rtw_write32(Adapter, REG_RXDMA_AGG_PG_TH, aggrx);
+       rtw_write8(padapter, REG_TRXDMA_CTRL, aggctrl);
+       rtw_write32(padapter, REG_RXDMA_AGG_PG_TH, aggrx);
 }
 
 static VOID
@@ -2720,7 +2688,7 @@ static int _ReadAdapterInfo8723BU(PADAPTER        Adapter)
 {
        //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
        u32 start=rtw_get_current_time();
-       
+
        MSG_8192C("====> _ReadAdapterInfo8723BU\n");
 
        //Efuse_InitSomeVar(Adapter);
@@ -2826,26 +2794,7 @@ _func_enter_;
 
 _func_exit_;
 }
-#ifdef CONFIG_C2H_PACKET_EN
-void SetHwRegWithBuf8723B(PADAPTER padapter, u8 variable, u8 *pbuf, int len)
-{
-       PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);
-
-_func_enter_;
-
-       switch (variable)
-       {
-               case HW_VAR_C2H_HANDLE:
-                       DBG_8192C("%s len=%d \n",__func__,len);
-                       C2HPacketHandler_8723B(padapter, pbuf, len);
-                       break;
 
-               default:
-                       break;
-       }
-_func_exit_;
-}
-#endif
 //
 //     Description: 
 //             Query setting of specified variable.
@@ -2966,6 +2915,8 @@ void rtl8723bu_set_hal_ops(_adapter * padapter)
 
 _func_enter_;
 
+       rtl8723b_set_hal_ops(pHalFunc);
+
        pHalFunc->hal_init = &rtl8723bu_hal_init;
        pHalFunc->hal_deinit = &rtl8723bu_hal_deinit;
 
@@ -2997,9 +2948,7 @@ _func_enter_;
        pHalFunc->hal_xmit = &rtl8723bu_hal_xmit;
        pHalFunc->mgnt_xmit = &rtl8723bu_mgnt_xmit;
        pHalFunc->hal_xmitframe_enqueue = &rtl8723bu_hal_xmitframe_enqueue;
-#ifdef CONFIG_C2H_PACKET_EN
-       pHalFunc->SetHwRegHandlerWithBuf = &SetHwRegWithBuf8723B;
-#endif
+
 #ifdef CONFIG_HOSTAPD_MLME
        pHalFunc->hostap_mgnt_xmit_entry = &rtl8723bu_hostap_mgnt_xmit_entry;
 #endif
@@ -3008,9 +2957,7 @@ _func_enter_;
 #ifdef CONFIG_XMIT_THREAD_MODE
        pHalFunc->xmit_thread_handler = &rtl8723bu_xmit_buf_handler;
 #endif
-       rtl8723b_set_hal_ops(pHalFunc);
 
 _func_exit_;
-
 }
 
index 70948f1347b82d6f30c4f14079e2a673ef2bd187..c5dc2682116ffbd7d66049c917fb686479e999ac 100755 (executable)
 
 #include <rtl8723b_hal.h>
 
-static u8 usb_read8(struct intf_hdl *pintfhdl, u32 addr)
-{
-       u8 request;
-       u8 requesttype;
-       u16 wvalue;
-       u16 index;
-       u16 len;
-       u8 data=0;
-       
-       _func_enter_;
-
-       request = 0x05;
-       requesttype = 0x01;//read_in
-       index = 0;//n/a
-
-       wvalue = (u16)(addr&0x0000ffff);
-       len = 1;        
-       
-       usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);
-
-       _func_exit_;
-
-       return data;
-               
-}
-
-static u16 usb_read16(struct intf_hdl *pintfhdl, u32 addr)
-{       
-       u8 request;
-       u8 requesttype;
-       u16 wvalue;
-       u16 index;
-       u16 len;
-       u16 data=0;
-       
-       _func_enter_;
-
-       request = 0x05;
-       requesttype = 0x01;//read_in
-       index = 0;//n/a
-
-       wvalue = (u16)(addr&0x0000ffff);
-       len = 2;        
-       
-       usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);
-
-       _func_exit_;
-
-       return data;
-       
-}
-
-static u32 usb_read32(struct intf_hdl *pintfhdl, u32 addr)
-{
-       u8 request;
-       u8 requesttype;
-       u16 wvalue;
-       u16 index;
-       u16 len;
-       u32 data=0;
-       
-       _func_enter_;
-
-       request = 0x05;
-       requesttype = 0x01;//read_in
-       index = 0;//n/a
-
-       wvalue = (u16)(addr&0x0000ffff);
-       len = 4;        
-       
-       usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);
-
-       _func_exit_;
-
-       return data;
-       
-}
-
-static int usb_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val)
-{
-       u8 request;
-       u8 requesttype;
-       u16 wvalue;
-       u16 index;
-       u16 len;
-       u8 data;
-       int ret;
-       
-       _func_enter_;
-
-       request = 0x05;
-       requesttype = 0x00;//write_out
-       index = 0;//n/a
-
-       wvalue = (u16)(addr&0x0000ffff);
-       len = 1;
-       
-       data = val;     
-       
-        ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);
-       
-       _func_exit_;
-       
-       return ret;
-       
-}
-
-static int usb_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val)
-{      
-       u8 request;
-       u8 requesttype;
-       u16 wvalue;
-       u16 index;
-       u16 len;
-       u16 data;
-       int ret;
-       
-       _func_enter_;
-
-       request = 0x05;
-       requesttype = 0x00;//write_out
-       index = 0;//n/a
-
-       wvalue = (u16)(addr&0x0000ffff);
-       len = 2;
-       
-       data = val;
-               
-       ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);
-       
-       _func_exit_;
-       
-       return ret;
-       
-}
-
-static int usb_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val)
-{
-       u8 request;
-       u8 requesttype;
-       u16 wvalue;
-       u16 index;
-       u16 len;
-       u32 data;
-       int ret;
-       
-       _func_enter_;
-
-       request = 0x05;
-       requesttype = 0x00;//write_out
-       index = 0;//n/a
-
-       wvalue = (u16)(addr&0x0000ffff);
-       len = 4;
-       data = val;     
-       
-
-       ret =usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);
-       
-       _func_exit_;
-       
-       return ret;
-       
-}
-
-static int usb_writeN(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata)
-{
-       u8 request;
-       u8 requesttype;
-       u16 wvalue;
-       u16 index;
-       u16 len;
-       u8 buf[VENDOR_CMD_MAX_DATA_LEN]={0};
-       int ret;
-       
-       _func_enter_;
-
-       request = 0x05;
-       requesttype = 0x00;//write_out
-       index = 0;//n/a
-
-       wvalue = (u16)(addr&0x0000ffff);
-       len = length;
-        _rtw_memcpy(buf, pdata, len );
-       
-       ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index, buf, len, requesttype);
-       
-       _func_exit_;
-       
-       return ret;
-       
-}
-
-
 #ifdef CONFIG_SUPPORT_USB_INT
 void interrupt_handler_8723bu(_adapter *padapter,u16 pkt_len,u8 *pbuf)
 {
@@ -507,7 +313,7 @@ static s32 pre_recv_entry(union recv_frame *precvframe, struct phy_stat *pphy_st
                        recvframe_pull_tail(precvframe_if2, IEEE80211_FCS_LEN);
 
                if (pattrib->physt)
-                       update_recvframe_phyinfo(precvframe_if2, pphy_status);
+                       rtl8723b_query_rx_phy_status(precvframe_if2, pphy_status);
 
                if(rtw_recv_entry(precvframe_if2) != _SUCCESS)
                {
@@ -517,7 +323,7 @@ static s32 pre_recv_entry(union recv_frame *precvframe, struct phy_stat *pphy_st
        }
 
        //if (precvframe->u.hdr.attrib.physt)
-       //      update_recvframe_phyinfo(precvframe, pphy_status);
+       //      rtl8723b_query_rx_phy_status(precvframe, pphy_status);
 
        //ret = rtw_recv_entry(precvframe);
 #endif
@@ -686,166 +492,117 @@ static s32 pre_recv_entry(union recv_frame *precvframe, u8 *pphy_status)
 
 }
 #endif
-#ifdef CONFIG_C2H_PACKET_EN
-static void rtl8723bu_c2h_packet_handler(PADAPTER padapter, u8 *pbuf, u16 length)
-{
-       u8 *tmpBuf=NULL;
-
-       if(length == 0)
-               return;
-       
-       DBG_871X("+%s() length=%d\n", __func__, length);
-
-       tmpBuf = rtw_zmalloc(length);
-       if (tmpBuf == NULL)
-               return;
-
-       _rtw_memcpy(tmpBuf, pbuf, length);
-
-       rtw_c2h_packet_wk_cmd(padapter, tmpBuf, length);
-
-       DBG_871X("-%s()\n", __func__);
-
-       return;
-}
-#endif
-
 
-static int recvbuf2recvframe(_adapter *padapter, 
-#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
-struct recv_buf *precvbuf
-#else
-_pkt *pskb
-#endif
-)
+int recvbuf2recvframe(PADAPTER padapter, void *ptr)
 {
-       u8      *pbuf;
-       u8      pkt_cnt = 0;
-       u32     pkt_offset;
-       s32     transfer_len;
-       u8                              *pphy_status = NULL;    
-       union recv_frame        *precvframe = NULL;
-       struct rx_pkt_attrib    *pattrib = NULL;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
-       struct recv_priv        *precvpriv = &padapter->recvpriv;
-       _queue                  *pfree_recv_queue = &precvpriv->free_recv_queue;
+       u8 *pbuf;
+       u8 pkt_cnt = 0;
+       u32 pkt_offset;
+       s32 transfer_len;
+       u8 *pdata, *pphy_status;
+       union recv_frame *precvframe = NULL;
+       struct rx_pkt_attrib *pattrib = NULL;
+       PHAL_DATA_TYPE pHalData;
+       struct recv_priv *precvpriv;
+       _queue *pfree_recv_queue;
+       _pkt *pskb;
+
+
+       pHalData = GET_HAL_DATA(padapter);
+       precvpriv = &padapter->recvpriv;
+       pfree_recv_queue = &precvpriv->free_recv_queue;
 
 #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
-       transfer_len = (s32)precvbuf->transfer_len;     
-       pbuf = precvbuf->pbuf;
-#else
-       transfer_len = (s32)pskb->len;  
+       pskb = NULL;
+       transfer_len = (s32)((struct recv_buf*)ptr)->transfer_len;
+       pbuf = ((struct recv_buf*)ptr)->pbuf;
+#else // !CONFIG_USE_USB_BUFFER_ALLOC_RX
+       pskb = (_pkt*)ptr;
+       transfer_len = (s32)pskb->len;
        pbuf = pskb->data;
-#endif//CONFIG_USE_USB_BUFFER_ALLOC_RX
+#endif // !CONFIG_USE_USB_BUFFER_ALLOC_RX
 
 #ifdef CONFIG_USB_RX_AGGREGATION
        pkt_cnt = GET_RX_STATUS_DESC_USB_AGG_PKTNUM_8723B(pbuf);
 #endif
 
-       do{             
+       do {
                precvframe = rtw_alloc_recvframe(pfree_recv_queue);
-               if(precvframe==NULL)
-               {
-                       RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: precvframe==NULL\n"));
-                       DBG_8192C("%s()-%d: rtw_alloc_recvframe() failed! RX Drop!\n", __FUNCTION__, __LINE__); 
+               if (precvframe == NULL) {
+                       DBG_8192C("%s: rtw_alloc_recvframe() failed! RX Drop!\n", __FUNCTION__);
                        goto _exit_recvbuf2recvframe;
                }
-               if(transfer_len >1500)
-               _rtw_init_listhead(&precvframe->u.hdr.list);    
+
+               if (transfer_len >1500)
+                       _rtw_init_listhead(&precvframe->u.hdr.list);
                precvframe->u.hdr.precvbuf = NULL;      //can't access the precvbuf for new arch.
-               precvframe->u.hdr.len=0;
+               precvframe->u.hdr.len = 0;
 
-               update_recvframe_attrib(padapter,precvframe, pbuf);
+               rtl8723b_query_rx_desc_status(precvframe, pbuf);
 
                pattrib = &precvframe->u.hdr.attrib;
-               
-               if ( (padapter->registrypriv.mp_mode == 0) && ((pattrib->crc_err) || (pattrib->icv_err)))
-               {
-                       DBG_8192C("%s: RX Warning! crc_err=%d icv_err=%d, skip!\n", __FUNCTION__, pattrib->crc_err, pattrib->icv_err);
+
+               if ((padapter->registrypriv.mp_mode == 0)
+                  && ((pattrib->crc_err) || (pattrib->icv_err))) {
+                       DBG_8192C("%s: RX Warning! crc_err=%d icv_err=%d, skip!\n",
+                               __FUNCTION__, pattrib->crc_err, pattrib->icv_err);
 
                        rtw_free_recvframe(precvframe, pfree_recv_queue);
                        goto _exit_recvbuf2recvframe;
-               }                       
+               }
 
                pkt_offset = RXDESC_SIZE + pattrib->drvinfo_sz + pattrib->shift_sz + pattrib->pkt_len;
-
-               if((pattrib->pkt_len<=0) || (pkt_offset>transfer_len))
-               {       
-                       DBG_871X("%s()-%d: RX Warning! pkt_len=%d pkt_offset=%d transfer_len=%d\n",
-                               __FUNCTION__, __LINE__,
-                               pattrib->pkt_len, pkt_offset, transfer_len);
+               if ((pattrib->pkt_len <= 0) || (pkt_offset > transfer_len)) {
+                       DBG_8192C("%s: RX Error! pkt_len=%d pkt_offset=%d transfer_len=%d\n",
+                               __FUNCTION__, pattrib->pkt_len, pkt_offset, transfer_len);
 
                        rtw_free_recvframe(precvframe, pfree_recv_queue);
                        goto _exit_recvbuf2recvframe;
                }
 
-               if(rtw_os_alloc_recvframe(padapter, precvframe, 
-                       (pbuf+pattrib->shift_sz + pattrib->drvinfo_sz + RXDESC_SIZE), 
-#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
-                       NULL
-#else
-                       pskb
-#endif
-                       ) == _FAIL)
-               {
-                       rtw_free_recvframe(precvframe, pfree_recv_queue);
+               pdata = pbuf + RXDESC_SIZE + pattrib->drvinfo_sz + pattrib->shift_sz;
+               if (rtw_os_alloc_recvframe(padapter, precvframe, pdata, pskb) == _FAIL) {
+                       DBG_8192C("%s: RX Error! rtw_os_alloc_recvframe FAIL!\n", __FUNCTION__);
 
+                       rtw_free_recvframe(precvframe, pfree_recv_queue);
                        goto _exit_recvbuf2recvframe;
-               }       
+               }
 
                recvframe_put(precvframe, pattrib->pkt_len);
-               //recvframe_pull(precvframe, drvinfo_sz + RXDESC_SIZE); 
 
-               if(pattrib->pkt_rpt_type == NORMAL_RX)//Normal rx packet
-               {
-                       if(pattrib->physt)
-                                       pphy_status = (pbuf + RXDESC_OFFSET);
+               if (pattrib->pkt_rpt_type == NORMAL_RX) {
+                       if (pattrib->physt)
+                               pphy_status = pbuf + RXDESC_OFFSET;
+                       else
+                               pphy_status = NULL;
+
 #ifdef CONFIG_CONCURRENT_MODE
-                       if(rtw_buddy_adapter_up(padapter))
-                       {
-                               if(pre_recv_entry(precvframe, (struct phy_stat*)pphy_status) != _SUCCESS)
-                               {
-                                       RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,
-                                               ("recvbuf2recvframe: recv_entry(precvframe) != _SUCCESS\n"));
+                       if (rtw_buddy_adapter_up(padapter)) {
+                               if (pre_recv_entry(precvframe, (struct phy_stat*)pphy_status) != _SUCCESS) {
+                                       // Return fail except data frame
+                                       //DBG_8192C("%s: RX Error! (concurrent)pre_recv_entry FAIL!\n", __FUNCTION__);
                                }
                        }
-#endif //CONFIG_CONCURRENT_MODE
+#endif // CONFIG_CONCURRENT_MODE
 
-                       if (pattrib->physt && pphy_status)
-                               update_recvframe_phyinfo(precvframe, (struct phy_stat*)pphy_status);
+                       if (pphy_status)
+                               rtl8723b_query_rx_phy_status(precvframe, (struct phy_stat*)pphy_status);
 
-                       if(rtw_recv_entry(precvframe) != _SUCCESS) {
-                               RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,
-                                       ("recvbuf2recvframe: rtw_recv_entry(precvframe) != _SUCCESS\n"));
+                       if (rtw_recv_entry(precvframe) != _SUCCESS) {
+                               // Return fail except data frame
+                               //DBG_8192C("%s: RX Error! rtw_recv_entry FAIL!\n", __FUNCTION__);
                        }
                }
-               else{ // pkt_rpt_type == TX_REPORT1-CCX, TX_REPORT2-TX RTP,HIS_REPORT-USB HISR RTP
-                       if (pattrib->pkt_rpt_type == C2H_PACKET) {
-                               C2H_EVT_HDR     C2hEvent;
-
-                               u16 len_c2h = pattrib->pkt_len;
-                               u8 *pbuf_c2h = precvframe->u.hdr.rx_data;
-                               u8 *pdata_c2h;
-
-                               C2hEvent.CmdID = pbuf_c2h[0];
-                               C2hEvent.CmdSeq = pbuf_c2h[1];
-                               C2hEvent.CmdLen = (len_c2h -2);
-                               pdata_c2h = pbuf_c2h+2;
-
-                               DBG_8192C("rx C2H_PACKET, ID=%d, seq=%d, len=%d\n",
-                                       C2hEvent.CmdID, C2hEvent.CmdSeq, C2hEvent.CmdLen);
-
-                               if(C2hEvent.CmdID == C2H_CCX_TX_RPT)
-                               {
-                                       CCX_FwC2HTxRpt_8723b(padapter, pdata_c2h, C2hEvent.CmdLen);
-                               }
-                               else
-                               {
+               else {
 #ifdef CONFIG_C2H_PACKET_EN
-                                       rtl8723bu_c2h_packet_handler(padapter, precvframe->u.hdr.rx_data, pattrib->pkt_len);
-#endif
-                               }
+                       if (pattrib->pkt_rpt_type == C2H_PACKET) {
+                               rtl8723b_c2h_packet_handler(padapter, precvframe->u.hdr.rx_data, pattrib->pkt_len);
+                       }
+                       else {
+                               DBG_8192C("%s: [WARNNING] RX type(%d) not be handled!\n",
+                                       __FUNCTION__, pattrib->pkt_rpt_type);
                        }
+#endif // CONFIG_C2H_PACKET_EN
                        rtw_free_recvframe(precvframe, pfree_recv_queue);
                }
 
@@ -853,12 +610,11 @@ _pkt *pskb
                // jaguar 8-byte alignment
                pkt_offset = (u16)_RND8(pkt_offset);
                pkt_cnt--;
-               pbuf += pkt_offset;     
+               pbuf += pkt_offset;
 #endif
                transfer_len -= pkt_offset;
                precvframe = NULL;
-
-       }while(transfer_len>0);
+       } while (transfer_len > 0);
 
 _exit_recvbuf2recvframe:
 
@@ -866,440 +622,6 @@ _exit_recvbuf2recvframe:
 }
 
 
-#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
-void rtl8723bu_recv_tasklet(void *priv)
-{      
-       struct recv_buf *precvbuf = NULL;
-       _adapter        *padapter = (_adapter*)priv;
-       struct recv_priv        *precvpriv = &padapter->recvpriv;
-
-       while (NULL != (precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue)))
-       {
-               if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE))
-               {
-                       DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved \n");
-                       
-                       break;
-               }
-               
-
-               recvbuf2recvframe(padapter, precvbuf);
-
-               rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
-       }       
-       
-}
-
-static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs)
-{      
-       struct recv_buf *precvbuf = (struct recv_buf *)purb->context;   
-       _adapter                        *padapter =(_adapter *)precvbuf->adapter;
-       struct recv_priv        *precvpriv = &padapter->recvpriv;
-
-       RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n"));
-       
-       precvpriv->rx_pending_cnt --;
-               
-       if (RTW_CANNOT_RX(padapter))
-       {
-               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", padapter->bDriverStopped, padapter->bSurpriseRemoved));                
-
-               goto exit;
-       }
-
-       if(purb->status==0)//SUCCESS
-       {
-               if ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE))
-               {
-                       RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: (purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)\n"));
-
-                       rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
-               }
-               else 
-               {                       
-                       rtw_reset_continual_io_error(adapter_to_dvobj(padapter));
-                       
-                       precvbuf->transfer_len = purb->actual_length;   
-
-                       //rtw_enqueue_rx_transfer_buffer(precvpriv, rx_transfer_buf);                   
-                       rtw_enqueue_recvbuf(precvbuf, &precvpriv->recv_buf_pending_queue);
-
-                       tasklet_schedule(&precvpriv->recv_tasklet);                     
-               }               
-       }
-       else
-       {
-               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete : purb->status(%d) != 0 \n", purb->status));
-       
-               DBG_8192C("###=> usb_read_port_complete => urb status(%d)\n", purb->status);
-
-               if(rtw_inc_and_chk_continual_io_error(adapter_to_dvobj(padapter)) == _TRUE ){
-                       padapter->bSurpriseRemoved = _TRUE;
-               }
-
-               switch(purb->status) {
-                       case -EINVAL:
-                       case -EPIPE:                    
-                       case -ENODEV:
-                       case -ESHUTDOWN:
-                               //padapter->bSurpriseRemoved=_TRUE;
-                               //RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n"));
-                       case -ENOENT:
-                               padapter->bDriverStopped=_TRUE;                 
-                               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n"));
-                               break;
-                       case -EPROTO:
-                       case -EILSEQ:
-                       case -ETIME:
-                       case -ECOMM:
-                       case -EOVERFLOW:
-                               #ifdef DBG_CONFIG_ERROR_DETECT  
-                               {       
-                                       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
-                                       pHalData->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL;                     
-                               }
-                               #endif
-                               rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);                    
-                               break;
-                       case -EINPROGRESS:
-                               DBG_8192C("ERROR: URB IS IN PROGRESS!/n");
-                               break;
-                       default:
-                               break;                          
-               }
-               
-       }       
-
-exit:  
-       
-_func_exit_;
-       
-}
-
-static u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)
-{              
-       int err;
-       unsigned int pipe;
-       u32 ret = _SUCCESS;
-       PURB purb = NULL;       
-       struct recv_buf *precvbuf = (struct recv_buf *)rmem;
-       _adapter                *adapter = pintfhdl->padapter;
-       struct dvobj_priv       *pdvobj = adapter_to_dvobj(adapter);
-       struct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobj);
-       struct recv_priv        *precvpriv = &adapter->recvpriv;
-       struct usb_device       *pusbd = pdvobj->pusbdev;
-
-_func_enter_;
-       
-       if (RTW_CANNOT_RX(adapter) || (precvbuf == NULL))
-       {
-               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( RTW_CANNOT_RX ) || precvbuf == NULL!!!\n"));
-               return _FAIL;
-       }
-
-       rtl8723bu_init_recvbuf(adapter, precvbuf);
-
-       if(precvbuf->pbuf)
-       {                       
-               precvpriv->rx_pending_cnt++;
-       
-               purb = precvbuf->purb;          
-
-               //translate DMA FIFO addr to pipehandle
-               pipe = ffaddr2pipehdl(pdvobj, addr);    
-
-               usb_fill_bulk_urb(purb, pusbd, pipe, 
-                                       precvbuf->pbuf,
-                                       MAX_RECVBUF_SZ,
-                                       usb_read_port_complete,
-                                       precvbuf);//context is precvbuf
-
-               purb->transfer_dma = precvbuf->dma_transfer_addr;
-               purb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;                                                                
-
-               err = usb_submit_urb(purb, GFP_ATOMIC); 
-               if((err) && (err != (-EPERM)))
-               {
-                       RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x", err, purb->status));
-                       DBG_8192C("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n",err,purb->status);
-                       ret = _FAIL;
-               }
-               
-       }
-
-_func_exit_;
-
-       return ret;
-}
-#else  // CONFIG_USE_USB_BUFFER_ALLOC_RX
-
-
-void rtl8723bu_recv_tasklet(void *priv)
-{
-       _pkt                    *pskb;
-       _adapter                *padapter = (_adapter*)priv;
-       struct recv_priv        *precvpriv = &padapter->recvpriv;
-       struct recv_buf         *precvbuf = NULL;       
-
-       while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue)))
-       {
-               if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE))
-               {
-                       DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved \n");
-#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER
-                       if(rtw_free_skb_premem(pskb)!=0)
-#endif //CONFIG_PREALLOC_RX_SKB_BUFFER
-
-                       rtw_skb_free(pskb);
-                       break;
-               }
-       
-               recvbuf2recvframe(padapter, pskb);
-
-#ifdef CONFIG_PREALLOC_RECV_SKB
-
-               skb_reset_tail_pointer(pskb);
-
-               pskb->len = 0;
-               
-               skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb);
-               
-#else
-               rtw_skb_free(pskb);
-#endif
-                               
-       }
-       while (NULL != (precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue)))
-       {
-               DBG_871X("dequeue_recvbuf %p\n", precvbuf);
-               precvbuf->pskb = NULL;
-               precvbuf->reuse = _FALSE;
-               rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
-       }       
-       
-}
-
-
-static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs)
-{
-       _irqL irqL;
-       uint isevt, *pbuf;
-       struct recv_buf *precvbuf = (struct recv_buf *)purb->context;   
-       _adapter                        *padapter =(_adapter *)precvbuf->adapter;
-       struct recv_priv        *precvpriv = &padapter->recvpriv;       
-       
-       RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n"));
-       
-       //_enter_critical(&precvpriv->lock, &irqL);
-       //precvbuf->irp_pending=_FALSE;
-       //precvpriv->rx_pending_cnt --;
-       //_exit_critical(&precvpriv->lock, &irqL);
-               
-       precvpriv->rx_pending_cnt --;
-               
-       //if(precvpriv->rx_pending_cnt== 0)
-       //{             
-       //      RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: rx_pending_cnt== 0, set allrxreturnevt!\n"));
-       //      _rtw_up_sema(&precvpriv->allrxreturnevt);       
-       //}
-
-       if(RTW_CANNOT_RX(padapter))
-       {
-               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", padapter->bDriverStopped, padapter->bSurpriseRemoved));                
-               
-       #ifdef CONFIG_PREALLOC_RECV_SKB
-               precvbuf->reuse = _TRUE;
-       #else
-               if(precvbuf->pskb){
-                       DBG_8192C("==> free skb(%p)\n",precvbuf->pskb);
-                       rtw_skb_free(precvbuf->pskb);
-               }       
-       #endif
-               DBG_871X("%s()-%d: RX Warning! bDriverStopped(%d) OR bSurpriseRemoved(%d) \n", 
-               __FUNCTION__, __LINE__,padapter->bDriverStopped, padapter->bSurpriseRemoved);
-               goto exit;
-       }
-
-       if(purb->status==0)//SUCCESS
-       {
-               if ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE))
-               {
-                       RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: (purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)\n"));
-                       precvbuf->reuse = _TRUE;
-                       rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
-                       DBG_8192C("%s()-%d: RX Warning!\n", __FUNCTION__, __LINE__);    
-               }
-               else 
-               {       
-                       rtw_reset_continual_io_error(adapter_to_dvobj(padapter));
-                       
-                       precvbuf->transfer_len = purb->actual_length;                   
-                       skb_put(precvbuf->pskb, purb->actual_length);   
-                       skb_queue_tail(&precvpriv->rx_skb_queue, precvbuf->pskb);
-
-                       if (skb_queue_len(&precvpriv->rx_skb_queue)<=1)
-                               tasklet_schedule(&precvpriv->recv_tasklet);
-
-                       precvbuf->pskb = NULL;
-                       precvbuf->reuse = _FALSE;
-                       rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);                    
-               }               
-       }
-       else
-       {
-               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete : purb->status(%d) != 0 \n", purb->status));
-       
-               DBG_8192C("###=> usb_read_port_complete => urb status(%d)\n", purb->status);
-
-               if(rtw_inc_and_chk_continual_io_error(adapter_to_dvobj(padapter)) == _TRUE ){
-                       padapter->bSurpriseRemoved = _TRUE;
-               }
-
-               switch(purb->status) {
-                       case -EINVAL:
-                       case -EPIPE:                    
-                       case -ENODEV:
-                       case -ESHUTDOWN:
-                               //padapter->bSurpriseRemoved=_TRUE;
-                               //RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n"));
-                       case -ENOENT:
-                               padapter->bDriverStopped=_TRUE;                 
-                               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n"));
-                               break;
-                       case -EPROTO:
-                       case -EILSEQ:
-                       case -ETIME:
-                       case -ECOMM:
-                       case -EOVERFLOW:
-                               #ifdef DBG_CONFIG_ERROR_DETECT  
-                               {       
-                                       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
-                                       pHalData->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL;                     
-                               }
-                               #endif
-                               precvbuf->reuse = _TRUE;
-                               rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);                    
-                               break;
-                       case -EINPROGRESS:
-                               DBG_8192C("ERROR: URB IS IN PROGRESS!/n");
-                               break;
-                       default:
-                               break;                          
-               }
-               
-       }       
-
-exit:  
-       
-_func_exit_;
-       
-}
-
-static u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)
-{      
-       _irqL irqL;
-       int err;
-       unsigned int pipe;
-       SIZE_PTR tmpaddr=0;
-       SIZE_PTR alignment=0;
-       u32 ret = _SUCCESS;
-       PURB purb = NULL;
-       struct recv_buf *precvbuf = (struct recv_buf *)rmem;
-       _adapter                *adapter = pintfhdl->padapter;
-       struct dvobj_priv       *pdvobj = adapter_to_dvobj(adapter);
-       struct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobj);
-       struct recv_priv        *precvpriv = &adapter->recvpriv;
-       struct usb_device       *pusbd = pdvobj->pusbdev;
-       
-
-_func_enter_;
-
-       if (RTW_CANNOT_RX(adapter) || (precvbuf == NULL))
-       {
-               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( RTW_CANNOT_RX ) || precvbuf == NULL!!!\n"));
-               return _FAIL;
-       }
-
-#ifdef CONFIG_PREALLOC_RECV_SKB
-       if((precvbuf->reuse == _FALSE) || (precvbuf->pskb == NULL))
-       {
-               if (NULL != (precvbuf->pskb = skb_dequeue(&precvpriv->free_recv_skb_queue)))
-               {
-                       precvbuf->reuse = _TRUE;
-               }
-       }
-#endif
-
-       rtl8723bu_init_recvbuf(adapter, precvbuf);              
-
-       //re-assign for linux based on skb
-       if((precvbuf->reuse == _FALSE) || (precvbuf->pskb == NULL))
-       {
-               precvbuf->pskb = rtw_skb_alloc(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ);
-
-               if(precvbuf->pskb == NULL)              
-               {
-                       RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("init_recvbuf(): alloc_skb fail!\n"));
-                       DBG_8192C("#### usb_read_port() alloc_skb fail!  precvbuf=%p #####\n", precvbuf);
-                       //enqueue precvbuf and wait for free skb
-                       rtw_enqueue_recvbuf(precvbuf, &precvpriv->recv_buf_pending_queue);
-                       return _FAIL;
-               }
-
-               tmpaddr = (SIZE_PTR)precvbuf->pskb->data;
-               alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);
-               skb_reserve(precvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment));
-
-               precvbuf->phead = precvbuf->pskb->head;
-               precvbuf->pdata = precvbuf->pskb->data;
-               precvbuf->ptail = skb_tail_pointer(precvbuf->pskb);
-               precvbuf->pend = skb_end_pointer(precvbuf->pskb);
-               precvbuf->pbuf = precvbuf->pskb->data;
-       }       
-       else//reuse skb
-       {
-               precvbuf->phead = precvbuf->pskb->head;
-               precvbuf->pdata = precvbuf->pskb->data;
-               precvbuf->ptail = skb_tail_pointer(precvbuf->pskb);
-               precvbuf->pend = skb_end_pointer(precvbuf->pskb);
-               precvbuf->pbuf = precvbuf->pskb->data;
-
-               precvbuf->reuse = _FALSE;
-       }
-
-       //_enter_critical(&precvpriv->lock, &irqL);
-       //precvpriv->rx_pending_cnt++;
-       //precvbuf->irp_pending = _TRUE;
-       //_exit_critical(&precvpriv->lock, &irqL);
-
-       precvpriv->rx_pending_cnt++;
-
-       purb = precvbuf->purb;
-
-       //translate DMA FIFO addr to pipehandle
-       pipe = ffaddr2pipehdl(pdvobj, addr);
-
-       usb_fill_bulk_urb(purb, pusbd, pipe, 
-                                       precvbuf->pbuf,
-                                       MAX_RECVBUF_SZ,
-                                       usb_read_port_complete,
-                                       precvbuf);//context is precvbuf
-
-       err = usb_submit_urb(purb, GFP_ATOMIC);
-       if((err) && (err != (-EPERM)))
-       {
-               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x", err, purb->status));
-               DBG_8192C("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n",err,purb->status);
-               ret = _FAIL;
-       }
-
-_func_exit_;
-
-       return ret;
-}
-#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX
-
-
 void rtl8723bu_xmit_tasklet(void *priv)
 {      
        int ret = _FALSE;
index de4a2e25afeb9ba8b63b6af869d6b2eadeb22117..bc11e85c420758aa4a8a58b22db8bd3f55aaabc6 100755 (executable)
@@ -1,7 +1,7 @@
 /******************************************************************************
  *
- * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
- *                                        
+ * Copyright(c) 2007 - 2014 Realtek Corporation. All rights reserved.
+ *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
  * published by the Free Software Foundation.
  *
  *
  ******************************************************************************/
-//***** temporarily flag *******
-#define CONFIG_SINGLE_IMG
-
-//#define CONFIG_DISABLE_ODM
-
-//***** temporarily flag *******
 /*
- * Public  General Config
+ * Public General Config
  */
 #define AUTOCONF_INCLUDED
+
 #define RTL871X_MODULE_NAME "8723BU"
 #define DRV_NAME "rtl8723bu"
 
 #ifndef CONFIG_RTL8723B
 #define CONFIG_RTL8723B
 #endif
-#define BT_30_SUPPORT 1
-#define CONFIG_USB_HCI 1
-
+#define CONFIG_USB_HCI
 
-#define PLATFORM_LINUX 1
+#define PLATFORM_LINUX
 
 
-//#define CONFIG_IOCTL_CFG80211 1
+/*
+ * Wi-Fi Functions Config
+ */
+#define CONFIG_80211N_HT
+#define CONFIG_RECV_REORDERING_CTRL
 
+//#define CONFIG_IOCTL_CFG80211                // Set from Makefile
 #ifdef CONFIG_IOCTL_CFG80211
+       /*
+        * Indecate new sta asoc through cfg80211_new_sta
+        * If kernel version >= 3.2 or
+        * version < 3.2 but already apply cfg80211 patch,
+        * RTW_USE_CFG80211_STA_EVENT must be defiend!
+        */
        //#define RTW_USE_CFG80211_STA_EVENT /* Indecate new sta asoc through cfg80211_new_sta */
        #define CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER
-       //#define CONFIG_DEBUG_CFG80211 
+       //#define CONFIG_DEBUG_CFG80211
        //#define CONFIG_DRV_ISSUE_PROV_REQ // IOT FOR S2
        #define CONFIG_SET_SCAN_DENY_TIMER
 #endif
 
-/*
- * Internal  General Config
- */
-//#define CONFIG_H2CLBK
-
-#define CONFIG_EMBEDDED_FWIMG  1
-//#define CONFIG_FILE_FWIMG
-
-#define CONFIG_XMIT_ACK
-#ifdef CONFIG_XMIT_ACK
-       #define CONFIG_ACTIVE_KEEP_ALIVE_CHECK
-#endif
-#define CONFIG_C2H_PACKET_EN
-#define CONFIG_80211N_HT       1
-
-
-#define CONFIG_RECV_REORDERING_CTRL    1
-
-//#define CONFIG_TCP_CSUM_OFFLOAD_RX   1
-
-//#define CONFIG_DRVEXT_MODULE 1
-
-
- //#define CONFIG_SUPPORT_USB_INT
- #ifdef        CONFIG_SUPPORT_USB_INT
-//#define CONFIG_USB_INTERRUPT_IN_PIPE 1
-#endif
-
-
-#define CONFIG_IPS     1
-#ifdef CONFIG_IPS
-       //#define CONFIG_IPS_LEVEL_2    1 //enable this to set default IPS mode to IPS_LEVEL_2
-#endif
-//#define SUPPORT_HW_RFOFF_DETECTED    1
-
-#define CONFIG_LPS     1
-#if defined(CONFIG_LPS) && defined(CONFIG_SUPPORT_USB_INT)
-       //#define CONFIG_LPS_LCLK       1
-#endif
-
-#ifdef CONFIG_LPS_LCLK
-       #define CONFIG_XMIT_THREAD_MODE
-#endif
-
-//befor link
-//#define CONFIG_ANTENNA_DIVERSITY
-
-//after link
-#ifdef CONFIG_ANTENNA_DIVERSITY         
-       #define CONFIG_HW_ANTENNA_DIVERSITY             
-#endif
-
-
-//#define CONFIG_CONCURRENT_MODE 1
-#ifdef CONFIG_CONCURRENT_MODE
-       //#define CONFIG_HWPORT_SWAP                            //Port0->Sec , Port1 -> Pri
-       #define CONFIG_RUNTIME_PORT_SWITCH
-       //#define DBG_RUNTIME_PORT_SWITCH
-       #define CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
-       //#define CONFIG_TSF_RESET_OFFLOAD 1            // For 2 PORT TSF SYNC.
-
-       //#define CONFIG_MULTI_VIR_IFACES //besides primary&secondary interfaces, extend to support more interfaces
-#endif
-
-//#define CONFIG_IOL
-
-
-#define CONFIG_AP_MODE 1
+#define CONFIG_AP_MODE
 #ifdef CONFIG_AP_MODE
-       //#define CONFIG_INTERRUPT_BASED_TXBCN // Tx Beacon when driver BCN_OK ,BCN_ERR interrupt occurs
-       #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_INTERRUPT_BASED_TXBCN)
-               #undef CONFIG_INTERRUPT_BASED_TXBCN
-       #endif
-       #ifdef CONFIG_INTERRUPT_BASED_TXBCN
-               //#define CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT
-               #define CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR         
-       #endif
-       
        #define CONFIG_NATIVEAP_MLME
        #ifndef CONFIG_NATIVEAP_MLME
-               #define CONFIG_HOSTAPD_MLME     1
-       #endif                  
-       //#define CONFIG_FIND_BEST_CHANNEL      1
-       //#define CONFIG_NO_WIRELESS_HANDLERS   1
-
-       //#define       CONFIG_AUTO_AP_MODE
+               #define CONFIG_HOSTAPD_MLME
+       #endif
+       //#define CONFIG_FIND_BEST_CHANNEL
+       //#define CONFIG_NO_WIRELESS_HANDLERS
+       #define CONFIG_TX_MCAST2UNI     // Support IP multicast->unicast
 
+       //#define CONFIG_AUTO_AP_MODE
 #endif
 
-#define CONFIG_P2P     1
+#define CONFIG_P2P
 #ifdef CONFIG_P2P
+       //Added by Albert 20110812
        //The CONFIG_WFD is for supporting the Wi-Fi display
        #define CONFIG_WFD
-       
+
        #ifndef CONFIG_WIFI_TEST
                #define CONFIG_P2P_REMOVE_GROUP_INFO
        #endif
        //#define CONFIG_DBG_P2P
-
        #define CONFIG_P2P_PS
        //#define CONFIG_P2P_IPS
        #define CONFIG_P2P_OP_CHK_SOCIAL_CH
        #define CONFIG_P2P_INVITE_IOT
 #endif
 
-//     Added by Kurt 20110511
-//#define CONFIG_TDLS  1
+// Added by Kurt 20110511
+//#define CONFIG_TDLS
 #ifdef CONFIG_TDLS
 //     #ifndef CONFIG_WFD
-//             #define CONFIG_WFD      1
+//             #define CONFIG_WFD
 //     #endif
-//     #define CONFIG_TDLS_AUTOSETUP                   1
-//     #define CONFIG_TDLS_AUTOCHECKALIVE              1
+//     #define CONFIG_TDLS_AUTOSETUP
+//     #define CONFIG_TDLS_AUTOCHECKALIVE
 #endif
 
+//#define CONFIG_CONCURRENT_MODE       // Set from Makefile
+#ifdef CONFIG_CONCURRENT_MODE
+       #define CONFIG_TSF_RESET_OFFLOAD                        // For 2 PORT TSF SYNC.
+       //#define CONFIG_HWPORT_SWAP                            // Port0->Sec , Port1 -> Pri
+       #define CONFIG_RUNTIME_PORT_SWITCH
+       //#define DBG_RUNTIME_PORT_SWITCH
+       #define CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
+
+       //#define CONFIG_MULTI_VIR_IFACES //besides primary&secondary interfaces, extend to support more interfaces
+#endif // CONFIG_CONCURRENT_MODE
+
+#define CONFIG_LAYER2_ROAMING
+#define CONFIG_LAYER2_ROAMING_RESUME
+
+#define CONFIG_80211D
+
 
-#define CONFIG_SKB_COPY        1//for amsdu
+/*
+ * Hareware/Firmware Related Config
+ */
+//#define CONFIG_ANTENNA_DIVERSITY     // Set from Makefile
+//#define SUPPORT_HW_RFOFF_DETECTED
 
 #define CONFIG_LED
 #ifdef CONFIG_LED
        #endif
 #endif // CONFIG_LED
 
+#define CONFIG_XMIT_ACK
+#ifdef CONFIG_XMIT_ACK
+       #define CONFIG_ACTIVE_KEEP_ALIVE_CHECK
+#endif
+
+#define CONFIG_C2H_PACKET_EN
+
+#define CONFIG_RF_GAIN_OFFSET
+
+#define DISABLE_BB_RF  0
+
+#define RTW_NOTCH_FILTER 0 /* 0:Disable, 1:Enable, */
+
+//#define CONFIG_IOL
 #ifdef CONFIG_IOL
        #define CONFIG_IOL_READ_EFUSE_MAP
        //#define DBG_IOL_READ_EFUSE_MAP
 #endif
 
 
-#define USB_INTERFERENCE_ISSUE // this should be checked in all usb interface
-#define CONFIG_GLOBAL_UI_PID
-
-#define CONFIG_LAYER2_ROAMING
-#define CONFIG_LAYER2_ROAMING_RESUME
-//#define CONFIG_ADAPTOR_INFO_CACHING_FILE // now just applied on 8192cu only, should make it general...
-#define CONFIG_RESUME_IN_WORKQUEUE
-//#define CONFIG_SET_SCAN_DENY_TIMER
-#define CONFIG_LONG_DELAY_ISSUE
-#define CONFIG_NEW_SIGNAL_STAT_PROCESS
-//#define CONFIG_SIGNAL_DISPLAY_DBM //display RX signal with dbm
-#ifdef CONFIG_SIGNAL_DISPLAY_DBM
-//#define CONFIG_BACKGROUND_NOISE_MONITOR
-#endif
-#define RTW_NOTCH_FILTER 0 /* 0:Disable, 1:Enable, */
-
-#define CONFIG_BR_EXT  1       // Enable NAT2.5 support for STA mode interface with a L2 Bridge
-#ifdef CONFIG_BR_EXT
-#define CONFIG_BR_EXT_BRNAME   "br0"
-#endif // CONFIG_BR_EXT
+/*
+ * Interface Related Config
+ */
+#define CONFIG_USB_TX_AGGREGATION
+//#define CONFIG_USB_RX_AGGREGATION
 
-#define CONFIG_TX_MCAST2UNI    1       // Support IP multicast->unicast
-//#define CONFIG_CHECK_AC_LIFETIME 1   // Check packet lifetime of 4 ACs.
+#define USB_INTERFERENCE_ISSUE // this should be checked in all usb interface
 
-#define CONFIG_RF_GAIN_OFFSET
+#define CONFIG_GLOBAL_UI_PID
 
+#define CONFIG_OUT_EP_WIFI_MODE
 
-/* 
- * Interface  Related Config 
- */
+#define ENABLE_USB_DROP_INCORRECT_OUT
 
-#ifndef CONFIG_MINIMAL_MEMORY_USAGE
-       #define CONFIG_USB_TX_AGGREGATION       1
-//     #define CONFIG_USB_RX_AGGREGATION       1
+//#define CONFIG_SUPPORT_USB_INT
+#ifdef CONFIG_SUPPORT_USB_INT
+//#define CONFIG_USB_INTERRUPT_IN_PIPE
 #endif
 
-#define CONFIG_PREALLOC_RECV_SKB       1
-//#define CONFIG_REDUCE_USB_TX_INT     1       // Trade-off: Improve performance, but may cause TX URBs blocked by USB Host/Bus driver on few platforms.
-//#define CONFIG_EASY_REPLACEMENT      1
+//#define CONFIG_REDUCE_USB_TX_INT     // Trade-off: Improve performance, but may cause TX URBs blocked by USB Host/Bus driver on few platforms.
 
-/* 
+/*
  * CONFIG_USE_USB_BUFFER_ALLOC_XX uses Linux USB Buffer alloc API and is for Linux platform only now!
  */
-//#define CONFIG_USE_USB_BUFFER_ALLOC_TX 1     // Trade-off: For TX path, improve stability on some platforms, but may cause performance degrade on other platforms.
-//#define CONFIG_USE_USB_BUFFER_ALLOC_RX 1     // For RX path
+//#define CONFIG_USE_USB_BUFFER_ALLOC_TX       // Trade-off: For TX path, improve stability on some platforms, but may cause performance degrade on other platforms.
+//#define CONFIG_USE_USB_BUFFER_ALLOC_RX       // For RX path
 
-#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
-#undef CONFIG_PREALLOC_RECV_SKB
-#endif
-
-
-/* 
+/*
  * USB VENDOR REQ BUFFER ALLOCATION METHOD
  * if not set we'll use function local variable (stack memory)
  */
 //#define CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE
 #define CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC
-
 #define CONFIG_USB_VENDOR_REQ_MUTEX
 #define CONFIG_VENDOR_REQ_RETRY
-
-//#define CONFIG_USB_SUPPORT_ASYNC_VDN_REQ 1
+//#define CONFIG_USB_SUPPORT_ASYNC_VDN_REQ
 
 
 /*
- * HAL  Related Config
+ * Others
  */
+#define CONFIG_SKB_COPY        //for amsdu
 
-#define CONFIG_OUT_EP_WIFI_MODE        0
+#define CONFIG_PREALLOC_RECV_SKB
 
-#define ENABLE_USB_DROP_INCORRECT_OUT
+//#define CONFIG_EASY_REPLACEMENT
+
+//#define CONFIG_ADAPTOR_INFO_CACHING_FILE // now just applied on 8192cu only, should make it general...
 
-//#define RTL8192CU_ADHOC_WORKAROUND_SETTING   1
+//#define CONFIG_RESUME_IN_WORKQUEUE
 
-#define DISABLE_BB_RF  0
+//#define CONFIG_SET_SCAN_DENY_TIMER
+
+#define CONFIG_NEW_SIGNAL_STAT_PROCESS
+
+//#define CONFIG_SIGNAL_DISPLAY_DBM //display RX signal with dbm
+#ifdef CONFIG_SIGNAL_DISPLAY_DBM
+//#define CONFIG_BACKGROUND_NOISE_MONITOR
+#endif
+
+//#define CONFIG_CHECK_AC_LIFETIME     // Check packet lifetime of 4 ACs.
+
+#define CONFIG_EMBEDDED_FWIMG
+//#define CONFIG_FILE_FWIMG
+
+#define CONFIG_LONG_DELAY_ISSUE
+#define CONFIG_ATTEMPT_TO_FIX_AP_BEACON_ERROR
+
+// Android L(5.0) support
+#define CONFIG_RADIO_WORK
+
+
+/*
+ * Auto Config Section
+ */
+#ifdef CONFIG_MINIMAL_MEMORY_USAGE
+       #undef CONFIG_USB_TX_AGGREGATION
+       #undef CONFIG_USB_RX_AGGREGATION
+#endif
 
 #ifdef CONFIG_MP_INCLUDED
-       #define MP_DRIVER 1
-       #define CONFIG_MP_IWPRIV_SUPPORT        1
+       #define MP_DRIVER       1
+       #define CONFIG_MP_IWPRIV_SUPPORT
        //#undef CONFIG_USB_TX_AGGREGATION
        //#undef CONFIG_USB_RX_AGGREGATION
+#else // !CONFIG_MP_INCLUDED
+       #define MP_DRIVER       0
+#endif // !CONFIG_MP_INCLUDED
+
+#ifdef CONFIG_POWER_SAVING
+       #define CONFIG_IPS
+       #define CONFIG_LPS
+
+       #ifdef CONFIG_IPS
+       //#define CONFIG_IPS_LEVEL_2    1 //enable this to set default IPS mode to IPS_LEVEL_2
+       #endif
+
+       #if defined(CONFIG_LPS) && defined(CONFIG_SUPPORT_USB_INT)
+               //#define CONFIG_LPS_LCLK
+       #endif
+
+       #ifdef CONFIG_LPS_LCLK
+               #define CONFIG_XMIT_THREAD_MODE
+       #endif
+#endif // CONFIG_POWER_SAVING
+
+#ifdef CONFIG_BT_COEXIST
+       // for ODM and outsrc BT-Coex
+       #define BT_30_SUPPORT 1
+
+       #ifndef CONFIG_LPS
+               #define CONFIG_LPS      // download reserved page to FW
+       #endif
+
+       #ifndef CONFIG_C2H_PACKET_EN
+               #define CONFIG_C2H_PACKET_EN
+       #endif
+#else // !CONFIG_BT_COEXIST
+       #define BT_30_SUPPORT 0
+#endif // !CONFIG_BT_COEXIST
+
+#ifdef CONFIG_WOWLAN
+       //#define CONFIG_GTK_OL
+#endif // CONFIG_WOWLAN
+
+#ifdef CONFIG_GPIO_WAKEUP
+       #ifndef WAKEUP_GPIO_IDX
+               #define WAKEUP_GPIO_IDX 14      // WIFI Chip Side
+       #endif // !WAKEUP_GPIO_IDX
+       #define CONFIG_GPIO_WAKEUP_LOW_ACTIVE   // mark this for HIGH active
+#endif // CONFIG_GPIO_WAKEUP
+
+#ifdef CONFIG_AP_MODE
+       //#define CONFIG_INTERRUPT_BASED_TXBCN // Tx Beacon when driver BCN_OK ,BCN_ERR interrupt occurs
+       #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_INTERRUPT_BASED_TXBCN)
+               #undef CONFIG_INTERRUPT_BASED_TXBCN
+       #endif
+       #ifdef CONFIG_INTERRUPT_BASED_TXBCN
+               //#define CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT
+               #define CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR
+       #endif
+#endif // CONFIG_AP_MODE
+
+#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
+       #undef CONFIG_PREALLOC_RECV_SKB
 #else
-       #define MP_DRIVER 0
+       #ifdef CONFIG_PREALLOC_RECV_SKB
+//             #define CONFIG_FIX_NR_BULKIN_BUFFER     // only use USB prealloc_recv_buffer, no use alloc_skb()
+       #endif
 #endif
 
+#ifdef CONFIG_USB_TX_AGGREGATION
+//#define CONFIG_TX_EARLY_MODE
+#endif
 
-/*
- * Platform  Related Config
- */
-
+#ifdef CONFIG_TX_EARLY_MODE
+#define RTL8723B_EARLY_MODE_PKT_NUM_10 0
+#endif
 
 
 /*
 
 #define TESTCHIP_SUPPORT                               0
 
-#define RTL8192CE_SUPPORT                              0
-#define RTL8192CU_SUPPORT                              0
-#define RTL8192C_SUPPORT                               (RTL8192CE_SUPPORT|RTL8192CU_SUPPORT)   
+#define RTL8192CE_SUPPORT                              0
+#define RTL8192CU_SUPPORT                              0
+#define RTL8192C_SUPPORT                               (RTL8192CE_SUPPORT|RTL8192CU_SUPPORT)
 
-#define RTL8192DE_SUPPORT                              0
-#define RTL8192DU_SUPPORT                              0
-#define RTL8192D_SUPPORT                               (RTL8192DE_SUPPORT|RTL8192DU_SUPPORT)   
+#define RTL8192DE_SUPPORT                              0
+#define RTL8192DU_SUPPORT                              0
+#define RTL8192D_SUPPORT                               (RTL8192DE_SUPPORT|RTL8192DU_SUPPORT)
 
-#define RTL8723AU_SUPPORT                              0
 #define RTL8723AS_SUPPORT                              0
+#define RTL8723AU_SUPPORT                              0
 #define RTL8723AE_SUPPORT                              0
 #define RTL8723A_SUPPORT                               (RTL8723AU_SUPPORT|RTL8723AS_SUPPORT|RTL8723AE_SUPPORT)
 #define RTL8723_FPGA_VERIFICATION              0
 #define RTL8723B_SUPPORT                               1
 #define RTL8192E_SUPPORT                               0
 #define RTL8814A_SUPPORT                               0
+#define        RTL8195A_SUPPORT                                0
 
-#define RATE_ADAPTIVE_SUPPORT                  0
+#define RATE_ADAPTIVE_SUPPORT                  0
 #define POWER_TRAINING_ACTIVE                  0
 
-#ifdef CONFIG_USB_TX_AGGREGATION
-//#define      CONFIG_TX_EARLY_MODE
+#ifdef CONFIG_ANTENNA_DIVERSITY
+#define CONFIG_HW_ANTENNA_DIVERSITY
 #endif
 
-#ifdef CONFIG_TX_EARLY_MODE
-#define        RTL8723B_EARLY_MODE_PKT_NUM_10  0
-#endif
-
-#define CONFIG_80211D
-
-#define CONFIG_ATTEMPT_TO_FIX_AP_BEACON_ERROR
 
 /*
  * Debug Related Config
  */
-//#define CONFIG_DEBUG /* DBG_871X, etc... */
+#define CONFIG_DEBUG /* DBG_871X, etc... */
 
 #ifdef CONFIG_DEBUG
 #define DBG    1       // for ODM & BTCOEX debug
 //#define DBG_RX_DROP_FRAME
 //#define DBG_RX_SEQ
 //#define DBG_RX_SIGNAL_DISPLAY_PROCESSING
-//#define DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED "jeff-ap"
-
+//#define DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED "rtw-ap"
 
 
 //#define DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE
index 490b5ebc2c304f44609b7304dc665ad2844a2c5c..b93d60db9449ffedbdb5d88edecde659a9152f38 100755 (executable)
 
 #define DYNAMIC_CAMID_ALLOC
 
+#define RTW_SCAN_SPARSE_MIRACAST 1
+#define RTW_SCAN_SPARSE_BG 0
+
 #ifndef CONFIG_RTW_HIQ_FILTER
        #define CONFIG_RTW_HIQ_FILTER 1
 #endif
 
 #ifndef CONFIG_RTW_ADAPTIVITY_EN
-       #define CONFIG_RTW_ADAPTIVITY_EN 2
+       #define CONFIG_RTW_ADAPTIVITY_EN 0
 #endif
 
 #ifndef CONFIG_RTW_ADAPTIVITY_MODE
        #define CONFIG_RTW_ADAPTIVITY_MODE 0
 #endif
 
+#ifndef CONFIG_RTW_NHM_EN
+       #define CONFIG_RTW_NHM_EN 0
+#endif
+
+#ifndef CONFIG_RTW_AMPLIFIER_TYPE_2G
+       #define CONFIG_RTW_AMPLIFIER_TYPE_2G 0
+#endif
+
+#ifndef CONFIG_RTW_AMPLIFIER_TYPE_5G
+       #define CONFIG_RTW_AMPLIFIER_TYPE_5G 0
+#endif
+
+#define MACID_NUM_SW_LIMIT 32
+#define CAM_ENTRY_NUM_SW_LIMIT 32
+
 //#include <rtl871x_byteorder.h>
 
 #endif // __DRV_CONF_H__
index 8aaaa4901197886e98ed721365a020f87cdcc8a9..ea6ce92aff08014a17697f6f3ad2663db095be80 100755 (executable)
@@ -94,6 +94,7 @@ typedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER;
 #include <hal_intf.h>
 #include <hal_com.h>
 #include <hal_com_led.h>
+#include "../hal/hal_dm.h"
 #include <rtw_qos.h>
 #include <rtw_pwrctrl.h>
 #include <rtw_mlme.h>
@@ -145,10 +146,6 @@ typedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER;
 #include <rtw_iol.h>
 #endif // CONFIG_IOL
 
-#ifdef CONFIG_IOCTL_CFG80211
-#include "ioctl_cfg80211.h"
-#endif //CONFIG_IOCTL_CFG80211
-
 #include <ip.h>
 #include <if_ether.h>
 #include <ethernet.h>
@@ -329,12 +326,24 @@ struct registry_priv
        u8 hiq_filter;
        u8 adaptivity_en;
        u8 adaptivity_mode;
+       u8 nhm_en;
 };
 
 
 //For registry parameters
 #define RGTRY_OFT(field) ((ULONG)FIELD_OFFSET(struct registry_priv,field))
 #define RGTRY_SZ(field)   sizeof(((struct registry_priv*) 0)->field)
+
+#define GetRegAmplifierType2G(_Adapter)        (_Adapter->registrypriv.AmplifierType_2G)
+#define GetRegAmplifierType5G(_Adapter)        (_Adapter->registrypriv.AmplifierType_5G)
+
+#define GetRegTxBBSwing_2G(_Adapter)   (_Adapter->registrypriv.TxBBSwing_2G)
+#define GetRegTxBBSwing_5G(_Adapter)   (_Adapter->registrypriv.TxBBSwing_5G)
+
+#define GetRegbENRFEType(_Adapter)     (_Adapter->registrypriv.bEn_RFE)
+#define GetRegRFEType(_Adapter)        (_Adapter->registrypriv.RFE_Type)
+
+
 #define BSSID_OFT(field) ((ULONG)FIELD_OFFSET(WLAN_BSSID_EX,field))
 #define BSSID_SZ(field)   sizeof(((PWLAN_BSSID_EX) 0)->field)
 
@@ -361,6 +370,8 @@ struct registry_priv
 #define GET_IFACE_NUMS(padapter) (((_adapter *)padapter)->dvobj->iface_nums)
 #define GET_ADAPTER(padapter, iface_id) (((_adapter *)padapter)->dvobj->padapters[iface_id])
 
+#define GetDefaultAdapter(padapter)    padapter
+
 enum _IFACE_ID {
        IFACE_ID0, //maping to PRIMARY_ADAPTER
        IFACE_ID1, //maping to SECONDARY_ADAPTER
@@ -568,6 +579,28 @@ struct cam_entry_cache {
        ((u8*)(x))[6],((u8*)(x))[7],((u8*)(x))[8],((u8*)(x))[9],((u8*)(x))[10],((u8*)(x))[11], \
        ((u8*)(x))[12],((u8*)(x))[13],((u8*)(x))[14],((u8*)(x))[15]
 
+struct macid_bmp {
+       u32 m0;
+#if (MACID_NUM_SW_LIMIT > 32)
+       u32 m1;
+#endif
+#if (MACID_NUM_SW_LIMIT > 64)
+       u32 m2;
+#endif
+#if (MACID_NUM_SW_LIMIT > 96)
+       u32 m3;
+#endif
+};
+
+struct macid_ctl_t {
+       _lock lock;
+       u8 num;
+       struct macid_bmp used;
+       struct macid_bmp bmc;
+       struct macid_bmp if_g[IFACE_ID_MAX];
+       struct macid_bmp ch_g[2]; /* 2 ch concurrency */
+};
+
 struct dvobj_priv
 {
        /*-------- below is common data --------*/      
@@ -578,11 +611,6 @@ struct dvobj_priv
 
        struct debug_priv drv_dbg;
 
-       //for local/global synchronization
-       //
-       _lock   lock;
-       int macid[NUM_STA];
-
        _mutex hw_init_mutex;
        _mutex h2c_fwcmd_mutex;
        _mutex setch_mutex;
@@ -599,6 +627,8 @@ struct dvobj_priv
        _adapter *padapters[IFACE_ID_MAX];
        u8 iface_nums; // total number of ifaces used runtime
 
+       struct macid_ctl_t macid_ctl;
+
        struct cam_ctl_t cam_ctl;
        struct cam_entry_cache cam_cache[TOTAL_CAM_ENTRY];
 
@@ -727,6 +757,8 @@ struct dvobj_priv
 
 #define dvobj_to_pwrctl(dvobj) (&(dvobj->pwrctl_priv))
 #define pwrctl_to_dvobj(pwrctl) container_of(pwrctl, struct dvobj_priv, pwrctl_priv)
+#define dvobj_to_macidctl(dvobj) (&(dvobj->macid_ctl))
+#define dvobj_to_regsty(dvobj) (&(dvobj->if1->registrypriv))
 
 #ifdef PLATFORM_LINUX
 static struct device *dvobj_to_dev(struct dvobj_priv *dvobj)
@@ -875,7 +907,9 @@ struct _ADAPTER{
        u8      bDriverIsGoingToUnload;
        u8      init_adpt_in_progress;
        u8      bHaltInProgress;
-
+#ifdef CONFIG_GPIO_API 
+       u8      pre_gpio_pin;
+#endif 
        _thread_hdl_ cmdThread;
        _thread_hdl_ evtThread;
        _thread_hdl_ xmitThread;
@@ -1011,12 +1045,13 @@ struct _ADAPTER{
 
        //for debug purpose
        u8 fix_rate;
+       u8 data_fb; /* data rate fallback, valid only when fix_rate is not 0xff */
        u8 driver_vcs_en; //Enable=1, Disable=0 driver control vrtl_carrier_sense for tx
        u8 driver_vcs_type;//force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1.
        u8 driver_ampdu_spacing;//driver control AMPDU Density for peer sta's rx
        u8 driver_rx_ampdu_factor;//0xff: disable drv ctrl, 0:8k, 1:16k, 2:32k, 3:64k;
        u8 fix_ba_rxbuf_bz; /* 0~127, TODO:consider each sta and each TID */
-
+       u8 driver_rx_ampdu_spacing;  //driver control Rx AMPDU Density 
        unsigned char     in_cta_test;
 
 #ifdef CONFIG_DBG_COUNTER      
@@ -1080,12 +1115,6 @@ void rtw_dev_pno_debug(struct net_device *net);
 #endif //CONFIG_PNO_SET_DEBUG
 #endif //CONFIG_PNO_SUPPORT
 
-#ifdef CONFIG_GPIO_API
-int rtw_get_gpio(struct net_device *netdev, int gpio_num);
-int rtw_set_gpio_output_value(struct net_device *netdev, int gpio_num, BOOLEAN isHigh);
-int rtw_config_gpio(struct net_device *netdev, int gpio_num, BOOLEAN isOutput);
-#endif
-
 #ifdef CONFIG_WOWLAN
 int rtw_suspend_wow(_adapter *padapter);
 int rtw_resume_process_wow(_adapter *padapter);
index f12d6554801082f7efc597e206b8a8bd6571b982..84aa63ac49bfa8f3a2c307c55ed26cb7b5783d67 100755 (executable)
@@ -30,6 +30,7 @@ typedef struct _BT_COEXIST
        u8 btTotalAntNum;
        u8 btChipType;
        u8 bInitlized;
+       u8 btAntisolation;
 } BT_COEXIST, *PBT_COEXIST;
 
 void DBG_BT_INFO(u8 *dbgmsg);
@@ -45,6 +46,7 @@ void hal_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath);
 
 u8 hal_btcoex_Initialize(PADAPTER padapter);
 void hal_btcoex_PowerOnSetting(PADAPTER padapter);
+void hal_btcoex_PreLoadFirmware(PADAPTER padapter);
 void hal_btcoex_InitHwConfig(PADAPTER padapter, u8 bWifiOnly);
 
 void hal_btcoex_IpsNotify(PADAPTER padapter, u8 type);
@@ -76,6 +78,10 @@ void hal_btcoex_SetDBG(PADAPTER, u32 *pDbgModule);
 u32 hal_btcoex_GetDBG(PADAPTER, u8 *pStrBuf, u32 bufSize);
 u8 hal_btcoex_IncreaseScanDeviceNum(PADAPTER);
 u8 hal_btcoex_IsBtLinkExist(PADAPTER);
-
+void hal_btcoex_SetAntIsolationType(PADAPTER padapter, u8 anttype);
+#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
+int hal_btcoex_AntIsolationConfig_ParaFile(IN PADAPTER Adapter,IN char* pFileName);
+int hal_btcoex_ParseAntIsolationConfigFile(PADAPTER Adapter, char*     buffer);
+#endif // CONFIG_LOAD_PHY_PARA_FROM_FILE
 #endif // !__HAL_BTCOEX_H__
 
index 939763ad15cbee074944df36a7af2755489d5467..6cb7f717328e9076f840d6ddfa9459ae65f1d5cb 100755 (executable)
@@ -189,6 +189,17 @@ typedef enum _FIRMWARE_SOURCE {
        FW_SOURCE_HEADER_FILE = 1,              //from header file
 } FIRMWARE_SOURCE, *PFIRMWARE_SOURCE;
 
+//
+// Queue Select Value in TxDesc
+//
+#define QSLT_BK                                                        0x2//0x01
+#define QSLT_BE                                                        0x0
+#define QSLT_VI                                                        0x5//0x4
+#define QSLT_VO                                                        0x7//0x6
+#define QSLT_BEACON                                            0x10
+#define QSLT_HIGH                                              0x11
+#define QSLT_MGNT                                              0x12
+#define QSLT_CMD                                               0x13
 
 // BK, BE, VI, VO, HCCA, MANAGEMENT, COMMAND, HIGH, BEACON.
 //#define MAX_TX_QUEUE         9
@@ -340,7 +351,7 @@ void rtw_bb_rf_gain_offset(_adapter *padapter);
 #endif //CONFIG_RF_GAIN_OFFSET
 
 void dm_DynamicUsbTxAgg(_adapter *padapter, u8 from_timer);
-
+u8 rtw_hal_busagg_qsel_check(_adapter *padapter,u8 pre_qsel,u8 next_qsel);
 void GetHalODMVar(     
        PADAPTER                                Adapter,
        HAL_ODM_VARIABLE                eVariable,
@@ -362,5 +373,21 @@ struct noise_info
 };
 #endif
 
+#ifdef CONFIG_GPIO_API
+u8 rtw_hal_get_gpio(_adapter* adapter, u8 gpio_num);
+int rtw_hal_set_gpio_output_value(_adapter* adapter, u8 gpio_num, BOOLEAN isHigh);
+int rtw_hal_config_gpio(_adapter* adapter, u8 gpio_num, BOOLEAN isOutput);
+#endif
+
+#ifdef CONFIG_GPIO_WAKEUP
+void rtw_clear_hostwakeupgpio(PADAPTER padapter);
+#endif
+
+#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
+extern char *rtw_phy_file_path;
+extern char file_path[PATH_LENGTH_MAX];
+#define GetLineFromBuffer(buffer)   strsep(&buffer, "\n")
+#endif
+
 #endif //__HAL_COMMON_H__
 
index 7983e4b1af3378c0232ff0883e7827185503b356..8ad82f63d4826b47d204b170d9f2307aa32a4d42 100755 (executable)
@@ -80,11 +80,14 @@ enum h2c_cmd{
        H2C_D0_SCAN_OFFLOAD_INFO = 0x86,
        H2C_CHNL_SWITCH_OFFLOAD = 0x87,
        H2C_AOAC_RSVDPAGE3 = 0x88,
+       H2C_P2P_OFFLOAD_RSVD_PAGE = 0x8A,
+       H2C_P2P_OFFLOAD = 0x8B,
 
        H2C_RESET_TSF = 0xC0,
        H2C_MAXID,
 };
 
+#define H2C_INACTIVE_PS_LEN            3
 #define H2C_RSVDPAGE_LOC_LEN           5
 #define H2C_MEDIA_STATUS_RPT_LEN               3
 #define H2C_KEEP_ALIVE_CTRL_LEN        2
@@ -96,7 +99,7 @@ enum h2c_cmd{
 #define H2C_PSTUNEPARAM_LEN                    4
 #define H2C_MACID_CFG_LEN              7
 #define H2C_BTMP_OPER_LEN                      4
-#define H2C_WOWLAN_LEN                 4
+#define H2C_WOWLAN_LEN                 5
 #define H2C_REMOTE_WAKE_CTRL_LEN       3
 #define H2C_AOAC_GLOBAL_INFO_LEN       2
 #define H2C_AOAC_RSVDPAGE_LOC_LEN      7
@@ -107,6 +110,8 @@ enum h2c_cmd{
 #define H2C_FORCE_BT_TXPWR_LEN         3
 #define H2C_BCN_RSVDPAGE_LEN           5
 #define H2C_PROBERSP_RSVDPAGE_LEN      5
+#define H2C_P2PRSVDPAGE_LOC_LEN        5
+#define H2C_P2P_OFFLOAD_LEN    3
 
 #ifdef CONFIG_WOWLAN   
 #define eqMacAddr(a,b)                                         ( ((a)[0]==(b)[0] && (a)[1]==(b)[1] && (a)[2]==(b)[2] && (a)[3]==(b)[3] && (a)[4]==(b)[4] && (a)[5]==(b)[5]) ? 1:0 )
@@ -187,7 +192,6 @@ enum h2c_cmd{
 #define SET_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(__pH2CCmd, __Value)        SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)
 #define SET_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)
 
-#ifdef CONFIG_AP_WOWLAN
 //_AP_Offload 0x08
 #define SET_H2CCMD_AP_WOWLAN_EN(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
 //_BCN_RsvdPage        0x09
@@ -207,7 +211,6 @@ enum h2c_cmd{
 #define SET_H2CCMD_AP_WOW_PS_32K_EN(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
 #define SET_H2CCMD_AP_WOW_PS_RF(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
 #define SET_H2CCMD_AP_WOW_PS_DURATION(__pH2CCmd, __Value)      SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
-#endif
 
 // _WoWLAN PARAM_CMD_0x80
 #define SET_H2CCMD_WOWLAN_FUNC_ENABLE(__pH2CCmd, __Value)                      SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
@@ -221,8 +224,9 @@ enum h2c_cmd{
 #define SET_H2CCMD_WOWLAN_GPIONUM(__pH2CCmd, __Value)                          SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 7, __Value)
 #define SET_H2CCMD_WOWLAN_DATAPIN_WAKE_UP(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 7, 1, __Value)
 #define SET_H2CCMD_WOWLAN_GPIO_DURATION(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
-//#define SET_H2CCMD_WOWLAN_GPIO_PULSE_EN(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 1, __Value)
-#define SET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
+#define SET_H2CCMD_WOWLAN_GPIO_PULSE_EN(__pH2CCmd, __Value)            SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 1, __Value)
+#define SET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 1, 7, __Value)
+#define SET_H2CCMD_WOWLAN_LOWPR_RX(__pH2CCmd, __Value)                         SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 1, __Value)
 
 // _REMOTE_WAKEUP_CMD_0x81
 #define SET_H2CCMD_REMOTE_WAKECTRL_ENABLE(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
@@ -231,6 +235,7 @@ enum h2c_cmd{
 #define SET_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
 #define SET_H2CCMD_REMOTE_WAKE_CTRL_NLO_OFFLOAD_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
 #define SET_H2CCMD_REMOTE_WAKE_CTRL_FW_UNICAST_EN(__pH2CCmd, __Value)  SET_BITS_TO_LE_1BYTE(__pH2CCmd, 7, 1, __Value)
+#define SET_H2CCMD_REMOTE_WAKE_CTRL_P2P_OFFLAD_EN(__pH2CCmd, __Value)  SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 1, __Value)
 #define SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 1, __Value)
 
 // AOAC_GLOBAL_INFO_0x82
@@ -258,6 +263,15 @@ enum h2c_cmd{
 #define SET_H2CCMD_AOAC_RSVDPAGE_LOC_SSID_INFO(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
 #endif //CONFIG_PNO_SUPPORT
 
+#ifdef CONFIG_P2P_WOWLAN
+//P2P_RsvdPage_0x8a
+#define SET_H2CCMD_RSVDPAGE_LOC_P2P_BCN(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_P2P_PROBE_RSP(__pH2CCmd, __Value)                              SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_P2P_NEGO_RSP(__pH2CCmd, __Value)                       SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_P2P_INVITE_RSP(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_P2P_PD_RSP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)
+#endif //CONFIG_P2P_WOWLAN
+
 //---------------------------------------------------------------------------------------------------------//
 //-------------------------------------------    Structure    --------------------------------------------------//
 //---------------------------------------------------------------------------------------------------------//
@@ -285,16 +299,35 @@ typedef struct _RSVDPAGE_LOC {
        u8 LocProbePacket;
 #endif //CONFIG_PNO_SUPPORT
 #endif //CONFIG_WOWLAN 
-#ifdef CONFIG_AP_WOWLAN
        u8 LocApOffloadBCN;
-#endif //CONFIG_AP_WOWLAN
+#ifdef CONFIG_P2P_WOWLAN
+       u8 LocP2PBeacon;
+       u8 LocP2PProbeRsp;
+       u8 LocNegoRsp;
+       u8 LocInviteRsp;
+       u8 LocPDRsp;
+#endif //CONFIG_P2P_WOWLAN
 } RSVDPAGE_LOC, *PRSVDPAGE_LOC;
 
 #endif
 void dump_TX_FIFO(PADAPTER padapter, u8 page_num, u16 page_size);
 u8 rtw_check_invalid_mac_address (u8 *mac_addr);
+u8 rtw_hal_set_fw_media_status_cmd(_adapter* adapter, u8 mstatus, u8 macid);
 #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
 void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip);
 void rtw_get_sec_iv(PADAPTER padapter, u8*pcur_dot11txpn, u8 *StaAddr);
 void rtw_set_sec_pn(_adapter *padapter);
+
+void rtw_hal_fill_fake_txdesc(_adapter* padapter, u8* pDesc, u32 BufferLen,
+               u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame);
+
+//WOW command function
+u8 rtw_hal_set_wowlan_ctrl_cmd(_adapter *adapter, u8 enable);
+void rtw_hal_set_fw_wow_related_cmd(_adapter* padapter, u8 enable);
+#ifdef CONFIG_P2P_WOWLAN
+//H2C 0x8A
+u8 rtw_hal_set_FwP2PRsvdPage_cmd(_adapter* adapter, PRSVDPAGE_LOC rsvdpageloc);
+//H2C 0x8B
+u8 rtw_hal_set_p2p_wowlan_offload_cmd(_adapter* adapter);
+#endif //CONFIG_P2P_WOWLAN
 #endif
index 16ff4fe0596530d10e10b99a2829c5a923035379..6a0faf00c4abd54e0ad56c088d7e1340d6143bb0 100755 (executable)
 //     0x0400h ~ 0x047Fh       Protocol Configuration
 //
 //-----------------------------------------------------
-#define REG_VOQ_INFORMATION                    0x0400
-#define REG_VIQ_INFORMATION                    0x0404
-#define REG_BEQ_INFORMATION                    0x0408
-#define REG_BKQ_INFORMATION                    0x040C
-#define REG_MGQ_INFORMATION                    0x0410
-#define REG_HGQ_INFORMATION                    0x0414
-#define REG_BCNQ_INFORMATION                   0x0418
+
+/* 92C, 92D */
+#define REG_VOQ_INFO   0x0400
+#define REG_VIQ_INFO   0x0404
+#define REG_BEQ_INFO   0x0408
+#define REG_BKQ_INFO   0x040C
+
+/* 88E, 8723A, 8812A, 8821A, 92E, 8723B */
+#define REG_Q0_INFO    0x400
+#define REG_Q1_INFO    0x404
+#define REG_Q2_INFO    0x408
+#define REG_Q3_INFO    0x40C
+
+#define REG_MGQ_INFO   0x0410
+#define REG_HGQ_INFO   0x0414
+#define REG_BCNQ_INFO  0x0418
 #define REG_TXPKT_EMPTY                                0x041A
 #define REG_CPU_MGQ_INFORMATION                0x041C
 #define REG_FWHW_TXQ_CTRL                              0x0420
 #define REG_FAST_EDCA_CTRL                             0x0460
 #define REG_RD_RESP_PKT_TH                             0x0463
 
+/* 8723A, 8812A, 8821A, 92E, 8723B */
+#define REG_Q4_INFO    0x468
+#define REG_Q5_INFO    0x46C
+#define REG_Q6_INFO    0x470
+#define REG_Q7_INFO    0x474
+
 #define REG_INIRTS_RATE_SEL                            0x0480
 #define REG_INIDATA_RATE_SEL                   0x0484
 
+/* 8723B, 92E, 8812A, 8821A*/
+#define REG_MACID_SLEEP_3                              0x0484
+#define REG_MACID_SLEEP_1                              0x0488
+
 #define REG_POWER_STAGE1                               0x04B4
 #define REG_POWER_STAGE2                               0x04B8
 #define REG_PKT_VO_VI_LIFE_TIME                0x04C0
 #define REG_RTS_MAX_AGGR_NUM                   0x04CB
 #define REG_BAR_MODE_CTRL                              0x04CC
 #define REG_RA_TRY_RATE_AGG_LMT                0x04CF
-#define REG_EARLY_MODE_CONTROL         0x04D0
-#define REG_MACID_SLEEP                                0x04D4
+
+/* 8723A */
+#define REG_MACID_DROP 0x04D0
+
+/* 88E */
+#define REG_EARLY_MODE_CONTROL 0x04D0
+
+/* 8723B, 92E, 8812A, 8821A */
+#define REG_MACID_SLEEP_2      0x04D0
+
+/* 8723A, 8723B, 92E, 8812A, 8821A */
+#define REG_MACID_SLEEP        0x04D4
+
 #define REG_NQOS_SEQ                                   0x04DC
 #define REG_QOS_SEQ                                    0x04DE
 #define REG_NEED_CPU_HANDLE                    0x04E0
index 5b8164c44608ce56b9bdae255652cbc80efbf248..ac6007e8977e1fd6f6bd674e765784da7bdb1165 100755 (executable)
@@ -22,7 +22,7 @@
 
 #if 1//def  CONFIG_SINGLE_IMG
 
-#include "../hal/OUTSRC/odm_precomp.h"
+#include "../hal/OUTSRC/phydm_precomp.h"
 #ifdef CONFIG_BT_COEXIST
 #include <hal_btcoex.h>
 #endif
@@ -75,6 +75,22 @@ typedef      enum _INTERFACE_SELECT_USB{
        INTF_SEL5_USB_Combo_MF  = 5,            // USB WiFi+BT Multi-Function Combo, i.e., Proprietary layout(AS-VAU) which is the same as SDIO card
 } INTERFACE_SELECT_USB, *PINTERFACE_SELECT_USB;
 
+#ifdef CONFIG_USB_HCI
+//should be sync with INTERFACE_SELECT_USB
+typedef        enum _BOARD_TYPE_8192CUSB{
+       BOARD_USB_DONGLE                        = 0,            // USB dongle
+       BOARD_USB_High_PA               = 1,            // USB dongle with high power PA
+       BOARD_MINICARD                  = 2,            // Minicard
+       BOARD_USB_SOLO                  = 3,            // USB solo-Slim module
+       BOARD_USB_COMBO                 = 4,            // USB Combo-Slim module
+} BOARD_TYPE_8192CUSB, *PBOARD_TYPE_8192CUSB;
+
+#define        SUPPORT_HW_RADIO_DETECT(pHalData) \
+       (pHalData->BoardType == BOARD_MINICARD||\
+       pHalData->BoardType == BOARD_USB_SOLO||\
+       pHalData->BoardType == BOARD_USB_COMBO)
+#endif
+
 typedef enum _RT_AMPDU_BRUST_MODE{
        RT_AMPDU_BRUST_NONE             = 0,
        RT_AMPDU_BRUST_92D              = 1,
@@ -247,6 +263,7 @@ struct dm_priv
 
        // Add for Reading Initial Data Rate SEL Register 0x484 during watchdog. Using for fill tx desc. 2011.3.21 by Thomas
        u8      INIDATA_RATE[32];
+       _lock IQKSpinLock;
 };
 
 
@@ -463,7 +480,6 @@ typedef struct hal_com_data
        u8      RegReg542;
        u8      RegCR_1;
        u8      Reg837;
-       u8      RegRFPathS1;
        u16     RegRRSR;
 
        u8      CurAntenna;
@@ -502,7 +518,7 @@ typedef struct hal_com_data
 
        // Auto FSM to Turn On, include clock, isolation, power control for MAC only
        u8      bMacPwrCtrlOn;
-
+       u8      bDisableTXPowerTraining;
        u8      RegIQKFWOffload;
        struct submit_ctx       iqk_sctx;
 
@@ -687,7 +703,10 @@ typedef struct hal_com_data
 #ifdef CONFIG_BACKGROUND_NOISE_MONITOR
        s16 noise[ODM_MAX_CHANNEL_NUM];
 #endif
-       
+
+       u8 macid_num;
+       u8 cam_entry_num;
+
 } HAL_DATA_COMMON, *PHAL_DATA_COMMON;
 
 
index 37acfcf5809e10f8701c2f8fa3fab9dabedcec0f..9dadd66cfaac5bdecac3a85080b79df884d48ed2 100755 (executable)
@@ -146,6 +146,8 @@ typedef enum _HW_VARIABLES{
        HW_VAR_DL_RSVD_PAGE,
        HW_VAR_MACID_SLEEP,
        HW_VAR_MACID_WAKEUP,
+       HW_VAR_DUMP_MAC_QUEUE_INFO,
+       HW_VAR_ASIX_IOT,
 }HW_VARIABLES;
 
 typedef enum _HAL_DEF_VARIABLE{
@@ -181,6 +183,7 @@ typedef enum _HAL_DEF_VARIABLE{
        HAL_DEF_PCI_ASPM_OSC, // Support for ASPM OSC, added by Roger, 2013.03.27.
        HAL_DEF_MACID_SLEEP, // Support for MACID sleep
        HAL_DEF_DBG_RX_INFO_DUMP,
+       HAL_DEF_DBG_DIS_PWT, //disable Tx power training or not.
 }HAL_DEF_VARIABLE;
 
 typedef enum _HAL_ODM_VARIABLE{
@@ -188,6 +191,7 @@ typedef enum _HAL_ODM_VARIABLE{
        HAL_ODM_P2P_STATE,
        HAL_ODM_WIFI_DISPLAY_STATE,
        HAL_ODM_NOISE_MONITOR,
+       HAL_ODM_REGULATION,
 }HAL_ODM_VARIABLE;
 
 typedef enum _HAL_INTF_PS_FUNC{
@@ -318,10 +322,16 @@ struct hal_ops {
        void (*hal_reset_security_engine)(_adapter * adapter);
        s32 (*c2h_handler)(_adapter *padapter, u8 *c2h_evt);
        c2h_id_filter c2h_id_filter_ccx;
-
-#ifdef CONFIG_BT_COEXIST
        s32 (*fill_h2c_cmd)(PADAPTER, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);
-#endif // CONFIG_BT_COEXIST
+#if defined(CONFIG_RTL8188E) || defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)
+       void (*hal_cal_txdesc_chksum)(struct tx_desc *ptxdesc);
+#else
+       void (*hal_cal_txdesc_chksum)(u8 *ptxdesc);
+#endif
+#ifdef CONFIG_WOWLAN
+       void (*hal_set_wowlan_fw)(_adapter *adapter, u8 sleep);
+#endif //CONFIG_WOWLAN
+       u8 (*hal_get_tx_buff_rsvd_page_num)(_adapter *adapter, bool wowlan);
 };
 
 typedef        enum _RT_EEPROM_TYPE{
@@ -395,6 +405,9 @@ typedef enum _HARDWARE_TYPE{
 #define        IS_HARDWARE_TYPE_8192D(_Adapter)                        \
 (IS_HARDWARE_TYPE_8192DE(_Adapter) || IS_HARDWARE_TYPE_8192DU(_Adapter))
 
+#define IS_HARDWARE_TYPE_OLDER_THAN_8723A(_Adapter)    \
+(IS_HARDWARE_TYPE_8192D(_Adapter) || IS_HARDWARE_TYPE_8192C(_Adapter))
+
 //
 // RTL8723A Series
 //
@@ -629,12 +642,10 @@ c2h_id_filter rtw_hal_c2h_id_filter_ccx(_adapter *adapter);
 
 s32 rtw_hal_is_disable_sw_channel_plan(PADAPTER padapter);
 
-s32 rtw_hal_macid_sleep(PADAPTER padapter, u32 macid);
-s32 rtw_hal_macid_wakeup(PADAPTER padapter, u32 macid);
+s32 rtw_hal_macid_sleep(PADAPTER padapter, u8 macid);
+s32 rtw_hal_macid_wakeup(PADAPTER padapter, u8 macid);
 
-#ifdef CONFIG_BT_COEXIST
 s32 rtw_hal_fill_h2c_cmd(PADAPTER, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);
-#endif // CONFIG_BT_COEXIST
 
 #endif //__HAL_INTF_H__
 
index 2019214416f76f0c492c9ae5321a6d5634e61e9f..9d9911f3cf3b45830dac20a9c4273f25467a90b2 100755 (executable)
 #define EEPROM_MAC_ADDR_88EU                                   0xD7\r
 #define EEPROM_VID_88EU                                                0xD0\r
 #define EEPROM_PID_88EU                                                0xD2\r
-#define EEPROM_USB_OPTIONAL_FUNCTION0          0xD4 //92EU is the same\r
+#define EEPROM_USB_OPTIONAL_FUNCTION0          0xD4 //8192EU, 8812AU is the same\r
 #define EEPROM_USB_OPTIONAL_FUNCTION0_8811AU 0x104\r
 \r
 // RTL88ES\r
index fc293c45759882a1bb87705aee10aa841e0e3c95..5dfc421366cbd6ce16b95a74a8c6b22809688f4e 100755 (executable)
@@ -1671,13 +1671,18 @@ u8 *rtw_get_wps_attr_content(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8
 #define for_each_ie(ie, buf, buf_len) \
        for (ie = (void*)buf; (((u8*)ie) - ((u8*)buf) + 1) < buf_len; ie = (void*)(((u8*)ie) + *(((u8*)ie)+1) + 2))
 
-void dump_ies(u8 *buf, u32 buf_len);
-void dump_wps_ie(u8 *ie, u32 ie_len);
+void dump_ies(void *sel, u8 *buf, u32 buf_len);
+       
+#ifdef CONFIG_80211N_HT
+void dump_ht_cap_ie_content(void *sel, u8 *buf, u32 buf_len);
+#endif
+
+void dump_wps_ie(void *sel, u8 *ie, u32 ie_len);
 
 #ifdef CONFIG_P2P
 u32 rtw_get_p2p_merged_ies_len(u8 *in_ie, u32 in_len);
 int rtw_p2p_merge_ies(u8 *in_ie, u32 in_len, u8 *merge_ie);
-void dump_p2p_ie(u8 *ie, u32 ie_len);
+void dump_p2p_ie(void *sel, u8 *ie, u32 ie_len);
 u8 *rtw_get_p2p_ie(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen);
 u8 *rtw_get_p2p_ie_from_scan_queue(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen, u8 frame_type);
 u8 *rtw_get_p2p_attr(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_attr, u32 *len_attr);
@@ -1687,7 +1692,7 @@ void rtw_WLAN_BSSID_EX_remove_p2p_attr(WLAN_BSSID_EX *bss_ex, u8 attr_id);
 #endif
 
 #ifdef CONFIG_WFD
-void dump_wfd_ie(u8 *ie, u32 ie_len);
+void dump_wfd_ie(void *sel, u8 *ie, u32 ie_len);
 int rtw_get_wfd_ie(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen);
 int rtw_get_wfd_ie_from_scan_queue(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen, u8 frame_type);
 int rtw_get_wfd_attr_content(u8 *wfd_ie, uint wfd_ielen, u8 target_attr_id ,u8 *attr_content, uint *attr_contentlen);
index 955ea8d316e28d549f3158cb9aecb890d7ad0b8d..d79caeb592bc8754d3f36c3041e9bc692d594e4c 100755 (executable)
 #endif
 
 /****************************** TYPES ******************************/
-
+#ifdef CONFIG_COMPAT
+struct compat_iw_point {
+         compat_caddr_t pointer;
+         __u16 length;
+         __u16 flags;
+};
+#endif
 /* --------------------------- SUBTYPES --------------------------- */
 /*
  *     For all data larger than 16 octets, we need to use a
index d67d06c54cf88efbe461814d9e24fd3460b3a10b..805f3b2f5eeb567dc90c4e99684e27487ee8991a 100755 (executable)
@@ -120,6 +120,11 @@ int rtw_ndev_notifier_register(void);
 void rtw_ndev_notifier_unregister(void);
 
 #include "../os_dep/linux/rtw_proc.h"
+
+#ifdef CONFIG_IOCTL_CFG80211
+#include "../os_dep/linux/ioctl_cfg80211.h"
+#endif //CONFIG_IOCTL_CFG80211
+
 #endif //PLATFORM_LINUX
 
 
index 76026b9723efe401901e04f56ae397e950796def..b5901766e262025ef920e113831e3a16d03736d4 100755 (executable)
@@ -118,7 +118,8 @@ enum mstat_f {
        MSTAT_FUNC_RX_IO = 0x03<<8,
        MSTAT_FUNC_TX = 0x04<<8,
        MSTAT_FUNC_RX = 0x05<<8,
-       MSTAT_FUNC_MAX = 0x06<<8,
+       MSTAT_FUNC_CFG_VENDOR = 0x06<<8,
+       MSTAT_FUNC_MAX = 0x07<<8,
 };
 
 #define mstat_tf_idx(flags) ((flags)&0xff)
@@ -252,7 +253,7 @@ void _rtw_usb_buffer_free(struct usb_device *dev, size_t size, void *addr, dma_a
 #endif /* CONFIG_USB_HCI */
 #endif /* DBG_MEM_ALLOC */
 
-extern void*   rtw_malloc2d(int h, int w, int size);
+extern void*   rtw_malloc2d(int h, int w, size_t size);
 extern void    rtw_mfree2d(void *pbuf, int h, int w, int size);
 
 extern void    _rtw_memcpy(void* dec, void* sour, u32 sz);
@@ -474,6 +475,8 @@ __inline static u32 bitshift(u32 bitmask)
        return i;
 }
 
+#define rtw_min(a, b) ((a>b)?b:a)
+
 #ifndef MAC_FMT
 #define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x"
 #endif
index 79a1261fafb2700373f3125bee0e9465c32649e9..9826d0da30ed069fc55240f9ae06b9017f927c30 100755 (executable)
@@ -80,6 +80,8 @@ enum h2c_cmd_8723B{
        H2C_8723B_D0_SCAN_OFFLOAD_CTRL = 0x85,
        H2C_8723B_D0_SCAN_OFFLOAD_INFO = 0x86,
        H2C_8723B_CHNL_SWITCH_OFFLOAD = 0x87,
+       H2C_8723B_P2P_OFFLOAD_RSVD_PAGE = 0x8A, 
+       H2C_8723B_P2P_OFFLOAD = 0x8B,
 
        H2C_8723B_RESET_TSF = 0xC0,
        H2C_8723B_MAXID,
@@ -354,12 +356,16 @@ void rtl8723b_set_ap_wowlan_cmd(_adapter* padapter, u8 enable);
 void SetFwRelatedForWoWLAN8723b(_adapter* padapter, u8 bHostIsGoingtoSleep);
 #endif//CONFIG_WOWLAN
 
+#ifdef CONFIG_P2P_WOWLAN
+void rtl8723b_set_p2p_wowlan_offload_cmd(PADAPTER padapter);
+#endif
+
 void rtl8723b_set_FwPwrModeInIPS_cmd(PADAPTER padapter, u8 cmd_param);
 
 #ifdef CONFIG_TSF_RESET_OFFLOAD
 u8 rtl8723b_reset_tsf(_adapter *padapter, u8 reset_port);
 #endif // CONFIG_TSF_RESET_OFFLOAD
 s32 FillH2CCmd8723B(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);
-
-#define FillH2CCmd FillH2CCmd8723B
+u8 GetTxBufferRsvdPageNum8723B(_adapter *padapter, bool wowlan);
 #endif
+
index ee66b1fcbccdfed5abc48721aeffd0aff2903b7a..11ccd6ef09f5bcfc092ec5c2214c5c1e9f07e5ba 100755 (executable)
@@ -127,7 +127,11 @@ typedef struct _RT_8723B_FIRMWARE_HDR
 #define TX_DMA_SIZE_8723B                      0x8000  // 32K(TX)\r
 #define RX_DMA_SIZE_8723B                      0x4000  // 16K(RX)\r
 \r
+#ifdef CONFIG_FW_C2H_DEBUG \r
+#define RX_DMA_RESERVED_SIZE_8723B     0x100   // 256B, reserved for c2h debug message\r
+#else\r
 #define RX_DMA_RESERVED_SIZE_8723B     0x80    // 128B, reserved for tx report\r
+#endif\r
 #define RX_DMA_BOUNDARY_8723B          (RX_DMA_SIZE_8723B - RX_DMA_RESERVED_SIZE_8723B - 1)\r
 \r
 \r
@@ -157,7 +161,7 @@ typedef struct _RT_8723B_FIRMWARE_HDR
 \r
 #ifdef CONFIG_PNO_SUPPORT\r
 #undef WOWLAN_PAGE_NUM_8723B\r
-#define WOWLAN_PAGE_NUM_8723B  0x0d\r
+#define WOWLAN_PAGE_NUM_8723B  0x15\r
 #endif\r
 \r
 #ifdef CONFIG_AP_WOWLAN\r
@@ -224,6 +228,7 @@ typedef enum _C2H_EVT
        C2H_8723B_BT_INFO = 9,\r
        C2H_HW_INFO_EXCH = 10,\r
        C2H_8723B_BT_MP_INFO = 11,\r
+       C2H_8723B_P2P_RPORT = 0x16,\r
 #ifdef CONFIG_FW_C2H_DEBUG\r
        C2H_8723B_FW_DEBUG = 0xff,\r
 #endif //CONFIG_FW_C2H_DEBUG\r
@@ -280,13 +285,16 @@ VOID Hal_EfuseParsePackageType_8723B(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLo
 VOID Hal_EfuseParseVoltage_8723B(PADAPTER pAdapter,u8* hwinfo,BOOLEAN  AutoLoadFail); \r
 \r
 #ifdef CONFIG_C2H_PACKET_EN\r
-void C2HPacketHandler_8723B(PADAPTER padapter, u8 *pbuffer, u16 length);\r
+void rtl8723b_c2h_packet_handler(PADAPTER padapter, u8 *pbuf, u16 length);\r
 #endif\r
 \r
 \r
 void rtl8723b_set_hal_ops(struct hal_ops *pHalFunc);\r
 void SetHwReg8723B(PADAPTER padapter, u8 variable, u8 *val);\r
 void GetHwReg8723B(PADAPTER padapter, u8 variable, u8 *val);\r
+#ifdef CONFIG_C2H_PACKET_EN\r
+void SetHwRegWithBuf8723B(PADAPTER padapter, u8 variable, u8 *pbuf, int len);\r
+#endif // CONFIG_C2H_PACKET_EN\r
 u8 SetHalDefVar8723B(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval);\r
 u8 GetHalDefVar8723B(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval);\r
 \r
@@ -309,10 +317,6 @@ void rtl8723bs_cancle_checkbthang_workqueue(_adapter * adapter);
 void rtl8723bs_hal_check_bt_hang(_adapter * adapter);\r
 #endif\r
 \r
-#ifdef CONFIG_GPIO_WAKEUP\r
-void HalSetOutPutGPIO(PADAPTER padapter, u8 index, u8 OutPutValue);\r
-#endif\r
-\r
 int FirmwareDownloadBT(IN PADAPTER Adapter, PRT_MP_FIRMWARE pFirmware);\r
 \r
 void CCX_FwC2HTxRpt_8723b(PADAPTER padapter, u8 *pdata, u8 len);\r
index 6fd991042c0c28aa192440daf2775e0908957e31..4218f50999b3e1c3c10c407a26e8b902b0cb0ad7 100755 (executable)
@@ -34,13 +34,8 @@ s32 rtl8723bs_init_recv_priv(PADAPTER padapter);
 void rtl8723bs_free_recv_priv(PADAPTER padapter);\r
 #endif\r
 \r
-void rtl8723b_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat);\r
-void rtl8723b_process_phy_info(PADAPTER padapter, void *prframe);\r
-\r
 #ifdef CONFIG_USB_HCI\r
-void update_recvframe_attrib(PADAPTER padapter, union recv_frame *precvframe, u8 *prxstat);\r
-void update_recvframe_phyinfo(union recv_frame *precvframe, struct phy_stat *pphy_info);\r
-int    rtl8723bu_init_recv_priv(_adapter *padapter);\r
+int rtl8723bu_init_recv_priv(_adapter *padapter);\r
 void rtl8723bu_free_recv_priv (_adapter *padapter);\r
 void rtl8723bu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf);\r
 #endif\r
@@ -50,7 +45,8 @@ s32 rtl8723be_init_recv_priv(PADAPTER padapter);
 void rtl8723be_free_recv_priv(PADAPTER padapter);\r
 #endif\r
 \r
-void   rtl8723b_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc);\r
+void rtl8723b_query_rx_phy_status(union recv_frame *precvframe, struct phy_stat *pphy_status);\r
+void rtl8723b_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc);\r
 \r
 #endif\r
 \r
index b1fba0f1b502d174d59feae41c41c5daa4dd6221..aa4bc2cf35527fbfb7ec605ea16b685117bcf6b8 100755 (executable)
 #define RT_AC_INT_MASKS        (IMR_VIDOK_8723B | IMR_VODOK_8723B | IMR_BEDOK_8723B|IMR_BKDOK_8723B)\r
 #endif\r
 \r
-#endif\r
+//========================================================\r
+// General definitions\r
+//========================================================\r
 \r
-#ifdef CONFIG_USB_HCI\r
-//should be renamed and moved to another file\r
-typedef        enum _BOARD_TYPE_8192CUSB{\r
-       BOARD_USB_DONGLE                        = 0,            // USB dongle\r
-       BOARD_USB_High_PA               = 1,            // USB dongle with high power PA\r
-       BOARD_MINICARD                  = 2,            // Minicard\r
-       BOARD_USB_SOLO                  = 3,            // USB solo-Slim module\r
-       BOARD_USB_COMBO                 = 4,            // USB Combo-Slim module\r
-} BOARD_TYPE_8723BUSB, *PBOARD_TYPE_8723BUSB;\r
+#define MACID_NUM_8723B 128\r
+#define CAM_ENTRY_NUM_8723B 64\r
+\r
+#endif /* __RTL8723B_SPEC_H__ */\r
 \r
-#endif\r
index 2c5c7076d98775e63a343fca689b09f201e5bd8f..b998233610e2d375c64e41274974fcc932ed5158 100755 (executable)
 #ifndef __RTL8723B_XMIT_H__\r
 #define __RTL8723B_XMIT_H__\r
 \r
-//\r
-// Queue Select Value in TxDesc\r
-//\r
-#define QSLT_BK                                                        0x2//0x01\r
-#define QSLT_BE                                                        0x0\r
-#define QSLT_VI                                                        0x5//0x4\r
-#define QSLT_VO                                                        0x7//0x6\r
-#define QSLT_BEACON                                            0x10\r
-#define QSLT_HIGH                                              0x11\r
-#define QSLT_MGNT                                              0x12\r
-#define QSLT_CMD                                               0x13\r
 \r
 #define MAX_TID (15)\r
 \r
index bdc4d996075c1f03ef57bfce84988983994cf0a1..cc59417397a1d3c6e600254d0197819aba09f347 100755 (executable)
@@ -88,7 +88,7 @@ int rtw_android_cfg80211_pno_setup(struct net_device *net,
 #if defined(RTW_ENABLE_WIFI_CONTROL_FUNC)
 int rtw_android_wifictrl_func_add(void);
 void rtw_android_wifictrl_func_del(void);
-void* rtw_wl_android_prealloc(int section, unsigned long size);
+void* wl_android_prealloc(int section, unsigned long size);
 
 int wifi_get_irq_number(unsigned long *irq_flags_ptr);
 int wifi_set_power(int on, unsigned long msec);
@@ -99,5 +99,13 @@ static int rtw_android_wifictrl_func_add(void) { return 0; }
 static void rtw_android_wifictrl_func_del(void) {}
 #endif /* defined(RTW_ENABLE_WIFI_CONTROL_FUNC) */
 
+#ifdef CONFIG_GPIO_WAKEUP
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+int wifi_configure_gpio(void);
+#endif //CONFIG_PLATFORM_INTEL_BYT
+void wifi_free_gpio(unsigned int gpio);
+#endif //CONFIG_GPIO_WAKEUP
+
+
 #endif //__RTW_ANDROID_H__
 
index dccd5faa7b571ecdbfbcb37cd30ead44e54b998b..ed8598fca74690cc5dd360a4eb5dd79583dabab0 100755 (executable)
@@ -33,7 +33,8 @@ void free_mlme_ap_info(_adapter *padapter);
 //void update_BCNTIM(_adapter *padapter);\r
 void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len);\r
 void rtw_remove_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index);\r
-void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx);\r
+void _update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx, const char *tag);\r
+#define update_beacon(adapter, ie_id, oui, tx) _update_beacon((adapter), (ie_id), (oui), (tx), __func__)\r
 void add_RATid(_adapter *padapter, struct sta_info *psta, u8 rssi_level);\r
 void expire_timeout_chk(_adapter *padapter);\r
 void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta);\r
index 9086a61b66d53185d5fbfeda96e7a489173826d6..e7b2fa0a5d6fcb84d6e6c0529989bf11b948fab9 100755 (executable)
@@ -30,6 +30,7 @@
 
 void rtw_btcoex_Initialize(PADAPTER);
 void rtw_btcoex_PowerOnSetting(PADAPTER padapter);
+void rtw_btcoex_PreLoadFirmware(PADAPTER padapter);
 void rtw_btcoex_HAL_Initialize(PADAPTER padapter, u8 bWifiOnly);
 void rtw_btcoex_IpsNotify(PADAPTER, u8 type);
 void rtw_btcoex_LpsNotify(PADAPTER, u8 type);
index 154cf40808963717e5d07631238b7180c88442d3..eb0e33ea10f1b11c2067532bb715766c7cd461ac 100755 (executable)
@@ -173,6 +173,16 @@ struct P2P_PS_CTWPeriod_t {
        u8 CTWPeriod;   //TU
 };
 
+#ifdef CONFIG_P2P_WOWLAN
+
+struct P2P_WoWlan_Offload_t{
+       u8 Disconnect_Wkup_Drv:1;
+       u8 role:2;
+       u8 Wps_Config[2];
+};
+
+#endif //CONFIG_P2P_WOWLAN
+
 extern u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *obj);
 extern struct cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv);
 extern void rtw_free_cmd_obj(struct cmd_obj *pcmd);
@@ -235,6 +245,9 @@ enum LPS_CTRL_TYPE
        LPS_CTRL_SPECIAL_PACKET=4,
        LPS_CTRL_LEAVE=5,
        LPS_CTRL_TRAFFIC_BUSY = 6,
+       LPS_CTRL_TX_TRAFFIC_LEAVE = 7,
+       LPS_CTRL_RX_TRAFFIC_LEAVE = 8,  
+       LPS_CTRL_ENTER = 9,
 };
 
 enum RFINTFS {
@@ -952,6 +965,14 @@ struct TDLSoption_param
        u8 option;
 };
 
+/*H2C Handler index: 64 */
+struct RunInThread_param
+{
+       void (*func)(void*);
+       void *context;
+};
+
+
 #define GEN_CMD_CODE(cmd)      cmd ## _CMD_
 
 
@@ -1048,6 +1069,8 @@ extern u8 rtw_c2h_packet_wk_cmd(PADAPTER padapter, u8 *pbuf, u16 length);
 extern u8 rtw_c2h_wk_cmd(PADAPTER padapter, u8 *c2h_evt);
 //#endif
 
+u8 rtw_run_in_thread_cmd(PADAPTER padapter, void (*func)(void*), void* context);
+
 u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf);
 
 extern void rtw_survey_cmd_callback(_adapter  *padapter, struct cmd_obj *pcmd);
@@ -1141,7 +1164,9 @@ enum rtw_h2c_cmd
        GEN_CMD_CODE(_SetChannelSwitch), /*61*/
        GEN_CMD_CODE(_TDLS), /*62*/
        GEN_CMD_CODE(_ChkBMCSleepq), /*63*/
-       
+
+       GEN_CMD_CODE(_RunInThreadCMD), /*64*/
+
        MAX_H2CCMD
 };
 
@@ -1224,6 +1249,8 @@ struct _cmd_callback      rtw_cmd_callback[] =
        {GEN_CMD_CODE(_SetChannelSwitch), NULL},/*61*/
        {GEN_CMD_CODE(_TDLS), NULL},/*62*/
        {GEN_CMD_CODE(_ChkBMCSleepq), NULL}, /*63*/
+
+       {GEN_CMD_CODE(_RunInThreadCMD), NULL},/*64*/
 };
 #endif
 
index c9545411d89218c5ed57374accb67b6a76758ced..67edf7f0a6d0246d1c3e91ce96ef58e6b04650c8 100755 (executable)
@@ -194,6 +194,8 @@ extern void rtl871x_cedbg(const char *fmt, ...);
 
 #if defined(_dbgdump)
 
+#define DBG_871X_EXP(level, EXP) do { if (level <= GlobalDebugLevel) EXP; } while (0)
+
 /* with driver-defined prefix */
 #undef DBG_871X_LEVEL
 #define DBG_871X_LEVEL(level, fmt, arg...)     \
@@ -334,6 +336,12 @@ void mac_reg_dump(void *sel, _adapter *adapter);
 void bb_reg_dump(void *sel, _adapter *adapter);
 void rf_reg_dump(void *sel, _adapter *adapter);
 
+bool rtw_fwdl_test_trigger_chksum_fail(void);
+bool rtw_fwdl_test_trigger_wintint_rdy_fail(void);
+
+u32 rtw_get_wait_hiq_empty_ms(void);
+void rtw_sink_rtp_seq_dbg( _adapter *adapter,_pkt *pkt);
+
 #ifdef CONFIG_PROC_DEBUG
 ssize_t proc_set_write_reg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
 int proc_get_read_reg(struct seq_file *m, void *v);
@@ -357,7 +365,11 @@ int proc_get_ap_info(struct seq_file *m, void *v);
 int proc_get_adapter_state(struct seq_file *m, void *v);
 int proc_get_trx_info(struct seq_file *m, void *v);
 int proc_get_rate_ctl(struct seq_file *m, void *v);
+int proc_get_wifi_spec(struct seq_file *m, void *v);
 ssize_t proc_set_rate_ctl(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
+int proc_get_dis_pwt(struct seq_file *m, void *v);
+ssize_t proc_set_dis_pwt(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data); 
+
 int proc_get_suspend_resume_info(struct seq_file *m, void *v);
 
 ssize_t proc_set_fwdl_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
@@ -395,14 +407,24 @@ ssize_t proc_set_rx_ampdu(struct file *file, const char __user *buffer, size_t c
 
 int proc_get_rx_stbc(struct seq_file *m, void *v);
 ssize_t proc_set_rx_stbc(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
+
+
+int proc_get_rx_ampdu_factor(struct seq_file *m, void *v);
+ssize_t proc_set_rx_ampdu_factor(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
+
+int proc_get_rx_ampdu_density(struct seq_file *m, void *v);
+ssize_t proc_set_rx_ampdu_density(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
+
+int proc_get_tx_ampdu_density(struct seq_file *m, void *v);
+ssize_t proc_set_tx_ampdu_density(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
 #endif /* CONFIG_80211N_HT */
 
 int proc_get_en_fwps(struct seq_file *m, void *v);
 ssize_t proc_set_en_fwps(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
 
 //int proc_get_two_path_rssi(struct seq_file *m, void *v);
-int proc_get_rssi_disp(struct seq_file *m, void *v);
-ssize_t proc_set_rssi_disp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
+//int proc_get_rssi_disp(struct seq_file *m, void *v);
+//ssize_t proc_set_rssi_disp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
 
 #ifdef CONFIG_BT_COEXIST
 int proc_get_btcoex_dbg(struct seq_file *m, void *v);
@@ -434,6 +456,13 @@ int proc_get_rx_ring(struct seq_file *m, void *v);
 int proc_get_tx_ring(struct seq_file *m, void *v);
 #endif
 
+#ifdef CONFIG_P2P_WOWLAN
+int proc_get_p2p_wowlan_info(struct seq_file *m, void *v);
+#endif /* CONFIG_P2P_WOWLAN */
+
+int proc_get_new_bcn_max(struct seq_file *m, void *v);
+ssize_t proc_set_new_bcn_max(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
+
 #endif /* CONFIG_PROC_DEBUG */
 
 #endif //__RTW_DEBUG_H__
index 40269af8ed05a73a42b872ca7ac02fc595dd7916..84b3bfb134435c4b1836bb9e80032469145ffcd1 100755 (executable)
@@ -96,29 +96,74 @@ typedef enum _RT_HT_INF1_CAP{
 //------------------------------------------------------------
 // The HT Control field
 //------------------------------------------------------------
-#define SET_HT_CTRL_CSI_STEERING(_pEleStart, _val)                                     SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 6, 2, _val)
-#define SET_HT_CTRL_NDP_ANNOUNCEMENT(_pEleStart, _val)                 SET_BITS_TO_LE_1BYTE((_pEleStart)+3, 0, 1, _val)
-#define GET_HT_CTRL_NDP_ANNOUNCEMENT(_pEleStart)                                       LE_BITS_TO_1BYTE((_pEleStart)+3, 0, 1)
+#define SET_HT_CTRL_CSI_STEERING(_pEleStart, _val)                     SET_BITS_TO_LE_1BYTE(((u8*)(_pEleStart))+2, 6, 2, _val)
+#define SET_HT_CTRL_NDP_ANNOUNCEMENT(_pEleStart, _val)         SET_BITS_TO_LE_1BYTE(((u8*)(_pEleStart))+3, 0, 1, _val)
+#define GET_HT_CTRL_NDP_ANNOUNCEMENT(_pEleStart)                       LE_BITS_TO_1BYTE(((u8*)(_pEleStart))+3, 0, 1)
 
 // 20/40 BSS Coexist
-#define SET_EXT_CAPABILITY_ELE_BSS_COEXIST(_pEleStart, _val)                   SET_BITS_TO_LE_1BYTE((_pEleStart), 0, 1, _val)
-#define GET_EXT_CAPABILITY_ELE_BSS_COEXIST(_pEleStart)                         LE_BITS_TO_1BYTE((_pEleStart), 0, 1)
-
-
-#define GET_HT_CAPABILITY_ELE_LDPC_CAP(_pEleStart)                             LE_BITS_TO_1BYTE(_pEleStart, 0, 1)
-#define GET_HT_CAPABILITY_ELE_TX_STBC(_pEleStart)                                      LE_BITS_TO_1BYTE(_pEleStart, 7, 1)
-
-#define GET_HT_CAPABILITY_ELE_RX_STBC(_pEleStart)                                      LE_BITS_TO_1BYTE((_pEleStart)+1, 0, 2)
+#define SET_EXT_CAPABILITY_ELE_BSS_COEXIST(_pEleStart, _val)   SET_BITS_TO_LE_1BYTE(((u8*)(_pEleStart)), 0, 1, _val)
+#define GET_EXT_CAPABILITY_ELE_BSS_COEXIST(_pEleStart)                 LE_BITS_TO_1BYTE(((u8*)(_pEleStart)), 0, 1)
+
+/* HT Capabilities Info field */
+#define HT_CAP_ELE_CAP_INFO(_pEleStart)                                        ((u8*)(_pEleStart))
+#define GET_HT_CAP_ELE_LDPC_CAP(_pEleStart)                            LE_BITS_TO_1BYTE(((u8*)(_pEleStart)), 0, 1)
+#define GET_HT_CAP_ELE_CHL_WIDTH(_pEleStart)                   LE_BITS_TO_1BYTE(((u8*)(_pEleStart)), 1, 1)
+#define GET_HT_CAP_ELE_SM_PS(_pEleStart)                               LE_BITS_TO_1BYTE(((u8*)(_pEleStart)), 2, 2)
+#define GET_HT_CAP_ELE_GREENFIELD(_pEleStart)                  LE_BITS_TO_1BYTE(((u8*)(_pEleStart)), 4, 1)
+#define GET_HT_CAP_ELE_SHORT_GI20M(_pEleStart)                 LE_BITS_TO_1BYTE(((u8*)(_pEleStart)), 5, 1)
+#define GET_HT_CAP_ELE_SHORT_GI40M(_pEleStart)                 LE_BITS_TO_1BYTE(((u8*)(_pEleStart)), 6, 1)
+#define GET_HT_CAP_ELE_TX_STBC(_pEleStart)                             LE_BITS_TO_1BYTE(((u8*)(_pEleStart)), 7, 1)
+#define GET_HT_CAP_ELE_RX_STBC(_pEleStart)                             LE_BITS_TO_1BYTE(((u8*)(_pEleStart))+1, 0, 2)
+#define GET_HT_CAP_ELE_DELAYED_BA(_pEleStart)                  LE_BITS_TO_1BYTE(((u8*)(_pEleStart))+1, 2, 1)
+#define GET_HT_CAP_ELE_MAX_AMSDU_LENGTH(_pEleStart)            LE_BITS_TO_1BYTE(((u8*)(_pEleStart))+1, 3, 1)
+#define GET_HT_CAP_ELE_DSSS_CCK_40M(_pEleStart)                        LE_BITS_TO_1BYTE(((u8*)(_pEleStart))+1, 4, 1)
+#define GET_HT_CAP_ELE_FORTY_INTOLERANT(_pEleStart)            LE_BITS_TO_1BYTE(((u8*)(_pEleStart))+1, 6, 1)
+#define GET_HT_CAP_ELE_LSIG_TXOP_PROTECT(_pEleStart)   LE_BITS_TO_1BYTE(((u8*)(_pEleStart))+1, 7, 1)
+
+#define SET_HT_CAP_ELE_FORTY_INTOLERANT(_pEleStart, _val)      SET_BITS_TO_LE_1BYTE(((u8*)(_pEleStart))+1, 6, 1, _val)
+
+/* A-MPDU Parameters field */
+#define HT_CAP_ELE_AMPDU_PARA(_pEleStart)                              (((u8*)(_pEleStart))+2)
+#define GET_HT_CAP_ELE_MAX_AMPDU_LEN_EXP(_pEleStart)   LE_BITS_TO_1BYTE(((u8*)(_pEleStart))+2, 0, 2)
+#define GET_HT_CAP_ELE_MIN_MPDU_S_SPACE(_pEleStart)            LE_BITS_TO_1BYTE(((u8*)(_pEleStart))+2, 2, 3)
+
+#define HT_AMPDU_PARA_FMT "%02x " \
+       "MAX AMPDU len:%u bytes, MIN MPDU Start Spacing:%u"
+
+#define HT_AMPDU_PARA_ARG(x) \
+       *((u8*)(x)) \
+       , (1 << (13+GET_HT_CAP_ELE_MAX_AMPDU_LEN_EXP(((u8*)x)-2)))-1 \
+       , GET_HT_CAP_ELE_MIN_MPDU_S_SPACE(((u8*)x)-2)
+
+/* Supported MCS Set field */
+#define HT_CAP_ELE_SUP_MCS_SET(_pEleStart)                             (((u8*)(_pEleStart))+3)
+#define HT_CAP_ELE_RX_MCS_MAP(_pEleStart)                              HT_CAP_ELE_SUP_MCS_SET(_pEleStart)
+#define GET_HT_CAP_ELE_RX_HIGHEST_DATA_RATE(_pEleStart)        LE_BITS_TO_2BYTE(((u8*)(_pEleStart))+13, 0, 10)
+#define GET_HT_CAP_ELE_TX_MCS_DEF(_pEleStart)                  LE_BITS_TO_1BYTE(((u8*)(_pEleStart))+15, 0, 1)
+#define GET_HT_CAP_ELE_TRX_MCS_NEQ(_pEleStart)                 LE_BITS_TO_1BYTE(((u8*)(_pEleStart))+15, 1, 1)
+#define GET_HT_CAP_ELE_TX_MAX_SS(_pEleStart)                   LE_BITS_TO_1BYTE(((u8*)(_pEleStart))+15, 2, 2)
+#define GET_HT_CAP_ELE_TX_UEQM(_pEleStart)                             LE_BITS_TO_1BYTE(((u8*)(_pEleStart))+15, 4, 1)
+
+#define HT_SUP_MCS_SET_FMT "%02x %02x %02x %02x %02x%02x%02x%02x%02x%02x" \
+       /* "\n%02x%02x%02x%02x%02x%02x" */\
+       " %uMbps %s%s%s"
+#define HT_SUP_MCS_SET_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5], \
+       ((u8*)(x))[6],((u8*)(x))[7],((u8*)(x))[8],((u8*)(x))[9] \
+       /*,((u8*)(x))[10],((u8*)(x))[11], ((u8*)(x))[12],((u8*)(x))[13],((u8*)(x))[14],((u8*)(x))[15] */\
+       , GET_HT_CAP_ELE_RX_HIGHEST_DATA_RATE(((u8*)x)-3) \
+       , GET_HT_CAP_ELE_TX_MCS_DEF(((u8*)x)-3) ? "TX_MCS_DEF " : "" \
+       , GET_HT_CAP_ELE_TRX_MCS_NEQ(((u8*)x)-3) ? "TRX_MCS_NEQ " : "" \
+       , GET_HT_CAP_ELE_TX_UEQM(((u8*)x)-3) ? "TX_UEQM " : ""
 
 //TXBF Capabilities
-#define SET_HT_CAP_TXBF_RECEIVE_NDP_CAP(_pEleStart, _val)                                      SET_BITS_TO_LE_4BYTE( ((u8 *)(_pEleStart))+21, 3, 1, ((u8)_val) )
-#define SET_HT_CAP_TXBF_TRANSMIT_NDP_CAP(_pEleStart, _val)                             SET_BITS_TO_LE_4BYTE( ((u8 *)(_pEleStart))+21, 4, 1, ((u8)_val) )
-#define SET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(_pEleStart, _val)           SET_BITS_TO_LE_4BYTE( ((u8 *)(_pEleStart))+21, 10, 1, ((u8)_val) )
-#define SET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(_pEleStart, _val)           SET_BITS_TO_LE_4BYTE( ((u8 *)(_pEleStart))+21, 15, 2, ((u8)_val) )
+#define SET_HT_CAP_TXBF_RECEIVE_NDP_CAP(_pEleStart, _val)                                      SET_BITS_TO_LE_4BYTE( ((u8*)(_pEleStart))+21, 3, 1, ((u8)_val) )
+#define SET_HT_CAP_TXBF_TRANSMIT_NDP_CAP(_pEleStart, _val)                             SET_BITS_TO_LE_4BYTE( ((u8*)(_pEleStart))+21, 4, 1, ((u8)_val) )
+#define SET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(_pEleStart, _val)           SET_BITS_TO_LE_4BYTE( ((u8*)(_pEleStart))+21, 10, 1, ((u8)_val) )
+#define SET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(_pEleStart, _val)           SET_BITS_TO_LE_4BYTE( ((u8*)(_pEleStart))+21, 15, 2, ((u8)_val) )
 #define SET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(_pEleStart, _val)   SET_BITS_TO_LE_4BYTE( ((u8 *)(_pEleStart))+21, 23, 2, ((u8)_val) )
 
-#define GET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(_pEleStart)                 LE_BITS_TO_4BYTE((_pEleStart)+21, 10, 1)
-#define GET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(_pEleStart)                 LE_BITS_TO_4BYTE((_pEleStart)+21, 15, 2)
+#define GET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(_pEleStart)                 LE_BITS_TO_4BYTE(((u8*)(_pEleStart))+21, 10, 1)
+#define GET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(_pEleStart)                 LE_BITS_TO_4BYTE(((u8*)(_pEleStart))+21, 15, 2)
 
 #endif //_RTL871X_HT_H_
 
index 891bdaf8f387bd22cb4f9d4b3a8e34fd512c2da0..1cf2ab1b20f42d09f00ebb64a7a438d965c0eabb 100755 (executable)
@@ -187,6 +187,16 @@ struct tx_invite_resp_info{
        u8                                      token;  //      Used to record the dialog token of p2p invitation request frame.
 };
 
+#define MIRACAST_DISABLED 0
+#define MIRACAST_SOURCE 1
+#define MIRACAST_SINK 2
+#define MIRACAST_INVALID 3
+
+#define is_miracast_enabled(mode) \
+       (mode == MIRACAST_SOURCE || mode == MIRACAST_SINK)
+
+const char *get_miracast_mode_str(int mode);
+
 #ifdef CONFIG_WFD
 
 struct wifi_display_info{
@@ -208,7 +218,7 @@ struct wifi_display_info{
                                                                                                        //      0 -> WFD Source Device
                                                                                                        //      1 -> WFD Primary Sink Device
        enum    SCAN_RESULT_TYPE        scan_result_type;       //      Used when P2P is enable. This parameter will impact the scan result.
-
+       u8 stack_wfd_mode;
 };
 #endif //CONFIG_WFD
 
@@ -253,12 +263,34 @@ struct cfg80211_wifidirect_info{
        u8                                              restore_channel;
        struct ieee80211_channel        remain_on_ch_channel;
        enum nl80211_channel_type       remain_on_ch_type;
+       ATOMIC_T ro_ch_cookie_gen;
        u64                                             remain_on_ch_cookie;
        bool is_ro_ch;
        u32 last_ro_ch_time; /* this will be updated at the beginning and end of ro_ch */
 };
 #endif //CONFIG_IOCTL_CFG80211
 
+#ifdef CONFIG_P2P_WOWLAN
+
+enum P2P_WOWLAN_RECV_FRAME_TYPE
+{
+       P2P_WOWLAN_RECV_NEGO_REQ = 0,
+       P2P_WOWLAN_RECV_INVITE_REQ = 1,
+       P2P_WOWLAN_RECV_PROVISION_REQ = 2,
+};
+
+struct p2p_wowlan_info{
+
+       u8                                              is_trigger;
+       enum P2P_WOWLAN_RECV_FRAME_TYPE wowlan_recv_frame_type;
+       u8                                              wowlan_peer_addr[ETH_ALEN];
+       u16                                             wowlan_peer_wpsconfig;
+       u8                                              wowlan_peer_is_persistent;
+       u8                                              wowlan_peer_invitation_type;
+};
+
+#endif //CONFIG_P2P_WOWLAN
+
 struct wifidirect_info{
        _adapter*                               padapter;
        _timer                                  find_phase_timer;
@@ -284,6 +316,11 @@ struct wifidirect_info{
 #ifdef CONFIG_WFD
        struct wifi_display_info                *wfd_info;
 #endif 
+
+#ifdef CONFIG_P2P_WOWLAN
+       struct p2p_wowlan_info          p2p_wow_info;
+#endif //CONFIG_P2P_WOWLAN
+
        enum P2P_ROLE                   role;
        enum P2P_STATE                  pre_p2p_state;
        enum P2P_STATE                  p2p_state;
@@ -401,6 +438,18 @@ enum {
        RTW_ROAM_ACTIVE = BIT2,
 };
 
+struct beacon_keys {
+       u8 ssid[IW_ESSID_MAX_SIZE];
+       u32 ssid_len;
+       u8 bcn_channel;
+       u16 ht_cap_info;
+       u8 ht_info_infos_0_sco; // bit0 & bit1 in infos[0] is second channel offset
+       int encryp_protocol;
+       int pairwise_cipher;
+       int group_cipher;
+       int is_8021x;
+};
+
 struct mlme_priv {
 
        _lock   lock;
@@ -431,6 +480,12 @@ struct mlme_priv {
 
        struct wlan_network     cur_network;
        struct wlan_network *cur_network_scanned;
+
+       // bcn check info
+       struct beacon_keys cur_beacon_keys; // save current beacon keys
+       struct beacon_keys new_beacon_keys; // save new beacon keys
+       u8 new_beacon_cnts; // if new_beacon_cnts >= threshold, ap beacon is changed
+
 #ifdef CONFIG_ARP_KEEP_ALIVE
        // for arp offload keep alive
        u8      gw_mac_addr[6];
@@ -619,8 +674,8 @@ struct mlme_priv {
        u8      scanning_via_buddy_intf;
 #endif
 
-       u8      NumOfBcnInfoChkFail;
-       u32     timeBcnInfoChkStart;
+//     u8      NumOfBcnInfoChkFail;
+//     u32     timeBcnInfoChkStart;
 };
 
 #define rtw_mlme_set_auto_scan_int(adapter, ms) \
@@ -786,6 +841,9 @@ extern void rtw_free_assoc_resources(_adapter* adapter, int lock_scanned_queue);
 extern void rtw_indicate_disconnect(_adapter* adapter);
 extern void rtw_indicate_connect(_adapter* adapter);
 void rtw_indicate_scan_done( _adapter *padapter, bool aborted);
+
+u32 rtw_scan_abort_timeout(_adapter *adapter, u32 timeout_ms);
+void rtw_scan_abort_no_wait(_adapter *adapter);
 void rtw_scan_abort(_adapter *adapter);
 
 extern int rtw_restruct_sec_ie(_adapter *adapter,u8 *in_ie,u8 *out_ie,uint in_len);
index 35381e4c3c51920ce35f598eb84d9cc835d6ac61..f5ba9b4414b25883c0b70541db192975e1fd59a5 100755 (executable)
@@ -196,6 +196,7 @@ typedef enum _RT_CHANNEL_DOMAIN
        RT_CHANNEL_DOMAIN_FCC1_FCC9 = 0x55,
        RT_CHANNEL_DOMAIN_WORLD_ETSI13 = 0x56,
        RT_CHANNEL_DOMAIN_FCC1_FCC10 = 0x57,
+       RT_CHANNEL_DOMAIN_WORLD_MKK4 = 0x58,
        //===== Add new channel plan above this line===============//
        RT_CHANNEL_DOMAIN_MAX,
        RT_CHANNEL_DOMAIN_REALTEK_DEFINE = 0x7F,
@@ -248,11 +249,15 @@ typedef enum _RT_CHANNEL_DOMAIN_5G
        RT_CHANNEL_DOMAIN_5G_FCC9 = 0x1D,               //(w/o Weather radar)
        RT_CHANNEL_DOMAIN_5G_ETSI13 = 0x1E,             //(w/o Weather radar)
        RT_CHANNEL_DOMAIN_5G_FCC10 = 0x1F,              //Argentina (w/o Weather radar)
+       RT_CHANNEL_DOMAIN_5G_KCC2 = 0x20,               //Korea 5G
+       RT_CHANNEL_DOMAIN_5G_FCC11 = 0x21,              //US/Canada
+       RT_CHANNEL_DOMAIN_5G_NCC5 = 0x22,               //Taiwan
+       RT_CHANNEL_DOMAIN_5G_MKK4 = 0x23,               //Japan W52
        //===== Add new channel plan above this line===============//
        //===== Driver Self Defined =====//
-       RT_CHANNEL_DOMAIN_5G_FCC = 0x20,
-       RT_CHANNEL_DOMAIN_5G_JAPAN_NO_DFS = 0x21,
-       RT_CHANNEL_DOMAIN_5G_FCC4_NO_DFS = 0x22,
+       RT_CHANNEL_DOMAIN_5G_FCC = 0x30,
+       RT_CHANNEL_DOMAIN_5G_JAPAN_NO_DFS = 0x31,
+       RT_CHANNEL_DOMAIN_5G_FCC4_NO_DFS = 0x32,
        RT_CHANNEL_DOMAIN_5G_MAX,
 }RT_CHANNEL_DOMAIN_5G, *PRT_CHANNEL_DOMAIN_5G;
 
@@ -487,6 +492,7 @@ struct mlme_ext_info
 
 #if defined(CONFIG_STA_MODE_SCAN_UNDER_AP_MODE) || defined(CONFIG_ATMEL_RC_PATCH)
        u8 scan_cnt;
+       u8 backop_cnt;
 #endif //CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
 };
 
@@ -660,6 +666,7 @@ void SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_
 unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval);
 
 void read_cam(_adapter *padapter ,u8 entry, u8 *get_key);
+void dump_cam_table(_adapter *padapter);
 
 /* modify HW only */
 void _write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key);
@@ -711,8 +718,11 @@ void ERP_IE_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
 void VCS_update(_adapter *padapter, struct sta_info *psta);
 void   update_ldpc_stbc_cap(struct sta_info *psta);
 
-void update_beacon_info(_adapter *padapter, u8 *pframe, uint len, struct sta_info *psta);
+int rtw_get_bcn_keys(ADAPTER *Adapter, u8 *pframe, u32 packet_len,
+               struct beacon_keys *recv_beacon);
+void rtw_dump_bcn_keys(struct beacon_keys *recv_beacon);
 int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len);
+void update_beacon_info(_adapter *padapter, u8 *pframe, uint len, struct sta_info *psta);
 #ifdef CONFIG_DFS
 void process_csa_ie(_adapter *padapter, u8 *pframe, uint len);
 #endif //CONFIG_DFS
@@ -743,10 +753,22 @@ s16 rtw_get_camid(_adapter *adapter, struct sta_info* sta, s16 kid);
 s16 rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid);
 s16 rtw_camid_alloc(_adapter *adapter, struct sta_info *sta, u8 kid);
 void rtw_camid_free(_adapter *adapter, u8 cam_id);
-
-extern void rtw_alloc_macid(_adapter *padapter, struct sta_info *psta);
-extern void rtw_release_macid(_adapter *padapter, struct sta_info *psta);
-extern u8 rtw_search_max_mac_id(_adapter *padapter);
+bool rtw_camid_is_gk(_adapter *padapter, u8 entry);
+bool read_phy_cam_is_gtk(_adapter *padapter, u8 entry);
+
+struct macid_bmp;
+struct macid_ctl_t;
+void dump_macid_map(void *sel, struct macid_bmp *map, u8 max_num);
+bool rtw_macid_is_set(struct macid_bmp *map, u8 id);
+bool rtw_macid_is_used(struct macid_ctl_t *macid_ctl, u8 id);
+bool rtw_macid_is_bmc(struct macid_ctl_t *macid_ctl, u8 id);
+s8 rtw_macid_get_if_g(struct macid_ctl_t *macid_ctl, u8 id);
+s8 rtw_macid_get_ch_g(struct macid_ctl_t *macid_ctl, u8 id);
+void rtw_alloc_macid(_adapter *padapter, struct sta_info *psta);
+void rtw_release_macid(_adapter *padapter, struct sta_info *psta);
+u8 rtw_search_max_mac_id(_adapter *padapter);
+void rtw_macid_ctl_init(struct macid_ctl_t *macid_ctl);
+void rtw_macid_ctl_deinit(struct macid_ctl_t *macid_ctl);
 
 void report_join_res(_adapter *padapter, int res);
 void report_survey_event(_adapter *padapter, union recv_frame *precv_frame);
@@ -784,7 +806,7 @@ void issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status
 void issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da);
 s32 issue_probereq_ex(_adapter *padapter, NDIS_802_11_SSID *pssid, u8* da, u8 ch, bool append_wps, int try_cnt, int wait_ms);
 int issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms);
-s32 issue_nulldata_in_interrupt(PADAPTER padapter, u8 *da);
+s32 issue_nulldata_in_interrupt(PADAPTER padapter, u8 *da, unsigned int power_mode);
 int issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid, int try_cnt, int wait_ms);
 int issue_deauth(_adapter *padapter, unsigned char *da, unsigned short reason);
 int issue_deauth_ex(_adapter *padapter, u8 *da, unsigned short reason, int try_cnt, int wait_ms);
@@ -793,6 +815,8 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act
 #ifdef CONFIG_IEEE80211W
 void issue_action_SA_Query(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short tid);
 #endif //CONFIG_IEEE80211W
+int issue_action_SM_PS(_adapter *padapter ,  unsigned char *raddr , u8 NewMimoPsMode);
+int issue_action_SM_PS_wait_ack(_adapter *padapter, unsigned char *raddr, u8 NewMimoPsMode, int try_cnt, int wait_ms);
 unsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr);
 unsigned int send_beacon(_adapter *padapter);
 
@@ -832,7 +856,7 @@ void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res);
 void mlmeext_sta_del_event_callback(_adapter *padapter);
 void mlmeext_sta_add_event_callback(_adapter *padapter, struct sta_info *psta);
 
-void linked_status_chk(_adapter *padapter);
+void linked_status_chk(_adapter *padapter, u8 from_timer);
 
 void _linked_info_dump(_adapter *padapter);
 
@@ -933,6 +957,7 @@ u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf);
 u8 led_blink_hdl(_adapter *padapter, unsigned char *pbuf);
 u8 set_csa_hdl(_adapter *padapter, unsigned char *pbuf);       //Kurt: Handling DFS channel switch announcement ie.
 u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf);
+u8 run_in_thread_hdl(_adapter *padapter, u8 *pbuf);
 
 
 #define GEN_DRV_CMD_HANDLER(size, cmd) {size, &cmd ## _hdl},
@@ -1009,6 +1034,7 @@ struct cmd_hdl wlancmds[] =
        GEN_MLME_EXT_HANDLER(sizeof(struct SetChannelSwitch_param), set_csa_hdl) /*61*/
        GEN_MLME_EXT_HANDLER(sizeof(struct TDLSoption_param), tdls_hdl) /*62*/
        GEN_MLME_EXT_HANDLER(0, chk_bmc_sleepq_hdl) /*63*/
+       GEN_MLME_EXT_HANDLER(sizeof(struct RunInThread_param), run_in_thread_hdl) /*64*/
 };
 
 #endif
index 3fa8bb232f837566d29ef26ec9e07123820b4f85..e5f11415a4118868b2207d37bfe65da565efe768 100755 (executable)
@@ -53,6 +53,7 @@
 #define MPT_GET_THERMAL_METER          33
 #endif
 
+#define RTWPRIV_VER_INFO       1
 
 #define MAX_MP_XMITBUF_SZ      2048
 #define NR_MP_XMITFRAME                8
@@ -347,6 +348,7 @@ enum {
        CTA_TEST,
        MP_DISABLE_BT_COEXIST,
        MP_PwrCtlDM,
+       MP_GETVER,
 #ifdef CONFIG_WOWLAN
        MP_WOW_ENABLE,
 #endif
@@ -563,27 +565,63 @@ typedef enum _MPT_RATE_INDEX
        MPT_RATE_MCS13,
        MPT_RATE_MCS14,
        MPT_RATE_MCS15, /* 27 */
+       MPT_RATE_MCS16,
+       MPT_RATE_MCS17, // #29
+       MPT_RATE_MCS18,
+       MPT_RATE_MCS19,
+       MPT_RATE_MCS20,
+       MPT_RATE_MCS21,
+       MPT_RATE_MCS22, // #34
+       MPT_RATE_MCS23,
+       MPT_RATE_MCS24,
+       MPT_RATE_MCS25,
+       MPT_RATE_MCS26,
+       MPT_RATE_MCS27, // #39
+       MPT_RATE_MCS28, // #40
+       MPT_RATE_MCS29, // #41
+       MPT_RATE_MCS30, // #42
+       MPT_RATE_MCS31, // #43
        /* VHT rate. Total: 20*/
-       MPT_RATE_VHT1SS_MCS0 = 100,// To reserve MCS16~MCS31, the index starts from #100.
-       MPT_RATE_VHT1SS_MCS1, // #101
+       MPT_RATE_VHT1SS_MCS0,//  #44
+       MPT_RATE_VHT1SS_MCS1, // #
        MPT_RATE_VHT1SS_MCS2,
        MPT_RATE_VHT1SS_MCS3,
        MPT_RATE_VHT1SS_MCS4,
        MPT_RATE_VHT1SS_MCS5,
-       MPT_RATE_VHT1SS_MCS6, // #106
+       MPT_RATE_VHT1SS_MCS6, // #
        MPT_RATE_VHT1SS_MCS7,
        MPT_RATE_VHT1SS_MCS8,
-       MPT_RATE_VHT1SS_MCS9,
-       MPT_RATE_VHT2SS_MCS0,
-       MPT_RATE_VHT2SS_MCS1, // #111
+       MPT_RATE_VHT1SS_MCS9, //#53
+       MPT_RATE_VHT2SS_MCS0, //#54
+       MPT_RATE_VHT2SS_MCS1, 
        MPT_RATE_VHT2SS_MCS2,
        MPT_RATE_VHT2SS_MCS3,
        MPT_RATE_VHT2SS_MCS4,
        MPT_RATE_VHT2SS_MCS5,
-       MPT_RATE_VHT2SS_MCS6, // #116
+       MPT_RATE_VHT2SS_MCS6,
        MPT_RATE_VHT2SS_MCS7,
        MPT_RATE_VHT2SS_MCS8,
-       MPT_RATE_VHT2SS_MCS9,
+       MPT_RATE_VHT2SS_MCS9, //#63
+       MPT_RATE_VHT3SS_MCS0,
+       MPT_RATE_VHT3SS_MCS1, 
+       MPT_RATE_VHT3SS_MCS2,
+       MPT_RATE_VHT3SS_MCS3,
+       MPT_RATE_VHT3SS_MCS4,
+       MPT_RATE_VHT3SS_MCS5,
+       MPT_RATE_VHT3SS_MCS6, // #126
+       MPT_RATE_VHT3SS_MCS7,
+       MPT_RATE_VHT3SS_MCS8,
+       MPT_RATE_VHT3SS_MCS9,
+       MPT_RATE_VHT4SS_MCS0,
+       MPT_RATE_VHT4SS_MCS1, // #131
+       MPT_RATE_VHT4SS_MCS2,
+       MPT_RATE_VHT4SS_MCS3,
+       MPT_RATE_VHT4SS_MCS4,
+       MPT_RATE_VHT4SS_MCS5,
+       MPT_RATE_VHT4SS_MCS6, // #136
+       MPT_RATE_VHT4SS_MCS7,
+       MPT_RATE_VHT4SS_MCS8,
+       MPT_RATE_VHT4SS_MCS9,
        MPT_RATE_LAST
 }MPT_RATE_E, *PMPT_RATE_E;
 
@@ -786,6 +824,7 @@ extern void MP_PHY_SetRFPathSwitch(PADAPTER pAdapter ,BOOLEAN bMain);
 extern ULONG mpt_ProQueryCalTxPower(PADAPTER   pAdapter,u8 RfPath);
 extern void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart);
 extern u8 MptToMgntRate(u32    MptRateIdx);
+extern u8 rtw_mpRateParseFunc(PADAPTER pAdapter, u8 *targetStr);
 
 #endif //_RTW_MP_H_
 
index 04543f76db312fffd3f18e47f18e9e955279b7e1..a1d81ac4c9237dac18cad92418cadfa027433b68 100755 (executable)
@@ -21,7 +21,7 @@
 #define __RTW_ODM_H__
 
 #include <drv_types.h>
-
+#include "../hal/OUTSRC/phydm_types.h"
 /*
 * This file provides utilities/wrappers for rtw driver to use ODM
 */
@@ -39,5 +39,7 @@ void rtw_odm_adaptivity_parm_msg(void *sel,_adapter *adapter);
 void rtw_odm_adaptivity_parm_set(_adapter *adapter, s8 TH_L2H_ini, s8 TH_EDCCA_HL_diff,
        s8 IGI_Base, bool ForceEDCCA, u8 AdapEn_RSSI, u8 IGI_LowerBound);
 void rtw_odm_get_perpkt_rssi(void *sel, _adapter *adapter);
+void rtw_odm_acquirespinlock(_adapter *adapter,        RT_SPINLOCK_TYPE type);
+void rtw_odm_releasespinlock(_adapter *adapter,        RT_SPINLOCK_TYPE type);
 #endif // __RTW_ODM_H__
 
index 8b3f3ab568dcc2f9910e182da8f5d068fcf9f1f1..0eb89fa3bd8403ad7144de5180d359a933451b0b 100755 (executable)
@@ -63,7 +63,8 @@ enum Power_Mgnt
 
 #ifdef CONFIG_PNO_SUPPORT
 #define MAX_PNO_LIST_COUNT 16
-#define MAX_SCAN_LIST_COUNT 14 //2.4G only
+#define MAX_SCAN_LIST_COUNT 14 //2.4G only
+#define MAX_HIDDEN_AP 8                //8 hidden AP
 #endif
 
 /*
@@ -205,13 +206,15 @@ typedef enum _PS_DENY_REASON
 typedef struct pno_nlo_info
 {
        u32 fast_scan_period;                           //Fast scan period
-       u32     ssid_num;                               //number of entry
+       u8      ssid_num;                               //number of entry
+       u8      hidden_ssid_num;
        u32     slow_scan_period;                       //slow scan period
        u32     fast_scan_iterations;                   //Fast scan iterations
        u8      ssid_length[MAX_PNO_LIST_COUNT];        //SSID Length Array
        u8      ssid_cipher_info[MAX_PNO_LIST_COUNT];   //Cipher information for security
        u8      ssid_channel_info[MAX_PNO_LIST_COUNT];  //channel information
-}pno_nlo_info_t;       
+       u8      loc_probe_req[MAX_HIDDEN_AP];           //loc_probeReq
+}pno_nlo_info_t;
 
 typedef struct pno_ssid {
        u32             SSID_len;
@@ -316,12 +319,14 @@ struct pwrctrl_priv
        u8              wowlan_wake_reason;
        u8              wowlan_ap_mode;
        u8              wowlan_mode;
+       u8              wowlan_p2p_mode;
 #ifdef CONFIG_WOWLAN
        u8              wowlan_pattern;
        u8              wowlan_magic;
        u8              wowlan_unicast;
        u8              wowlan_pattern_idx;
        u8              wowlan_pno_enable;
+       u8              wowlan_from_cmd;
 #ifdef CONFIG_PNO_SUPPORT
        u8              pno_in_resume;
        u8              pno_inited;
@@ -430,6 +435,7 @@ void LPS_Enter(PADAPTER padapter, const char *msg);
 void LPS_Leave(PADAPTER padapter, const char *msg);
 void traffic_check_for_leave_lps(PADAPTER padapter, u8 tx, u32 tx_packets);
 void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode, const char *msg);
+void rtw_set_fw_in_ips_mode(PADAPTER padapter, u8 enable);
 void rtw_set_rpwm(_adapter * padapter, u8 val8);
 #endif
 
index ce01eb193e733b715ca46ccff03bde46f66febad..dab240e3efdc505ee11437a5d631e4e7ef7074b9 100755 (executable)
@@ -384,7 +384,7 @@ struct recv_priv
        //u8 *pallocated_urb_buf;
        _sema allrxreturnevt;
        uint    ff_hwaddr;
-       u8      rx_pending_cnt;
+       ATOMIC_T        rx_pending_cnt;
 
 #ifdef CONFIG_USB_INTERRUPT_IN_PIPE
 #ifdef PLATFORM_LINUX
@@ -455,7 +455,7 @@ struct recv_priv
        struct smooth_rssi_data signal_qual_data;
        struct smooth_rssi_data signal_strength_data;
 #endif //CONFIG_NEW_SIGNAL_STAT_PROCESS
-
+       u16 sink_udpport,pre_rtp_rxseq,cur_rtp_rxseq;
 };
 
 #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
index 516429f7e088e27e4e729054f013943362cd7409..6bd3f4c78d0db37d1b9d5b0a267877aaf0d1a3ef 100755 (executable)
@@ -1,2 +1,2 @@
-#define DRIVERVERSION  "v4.3.6.11_12942.20141204_BTCOEX20140507-4E40"
-#define BTCOEXVERSION  "BTCOEX20140507-4E40"
+#define DRIVERVERSION  "v4.3.9.6_13610.20150310_BTCOEX20140929-5443"
+#define BTCOEXVERSION  "BTCOEX20140929-5443"
index 8b28be34b0ae9f43adecec844e494dd819a2a93b..aea6365290f8b3e9479962c98c1d1b95fade0a4c 100755 (executable)
@@ -19,10 +19,8 @@ enum country_code_type_t {
        COUNTRY_CODE_MAX
 }; 
 
-int rtw_regd_init(_adapter *padapter,
-       void (*reg_notifier)(struct wiphy *wiphy,
-               struct regulatory_request *request));
-void rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request);
+int rtw_regd_init(_adapter *padapter);
+void rtw_reg_notify_by_driver(_adapter *adapter);
 
+#endif /* __RTW_WIFI_REGD_H__ */
 
-#endif
index 10bfb182a16f668fb224b1efb0968c62d2e7e569..d7d8fca072e22b436ee52ba1afd12a0e9f133027 100755 (executable)
 
 // xmit extension buff defination
 #define MAX_XMIT_EXTBUF_SZ     (1536)
+
+#ifdef CONFIG_SINGLE_XMIT_BUF
+#define NR_XMIT_EXTBUFF        (1)
+#else
 #define NR_XMIT_EXTBUFF        (32)
+#endif
 
 #define MAX_CMDBUF_SZ  (5120)  //(4096)
 
@@ -158,7 +163,7 @@ do{\
        #ifdef CONFIG_PCI_HCI
                #define TXDESC_SIZE ((TX_BUFFER_SEG_NUM ==0)?16: ((TX_BUFFER_SEG_NUM ==1)? 32:64) )
                #define TX_WIFI_INFO_SIZE 40  
-       #else  //USB or SDIO
+       #else  //8192E USB or SDIO
                #define TXDESC_SIZE 40
        #endif
 //8192EE_TODO
@@ -193,6 +198,105 @@ do{\
 #define TX_DESC_NEXT_DESC_OFFSET       (TXDESC_SIZE + 8)
 #endif //CONFIG_PCI_HCI
 
+#ifdef CONFIG_WOWLAN
+// The following foramt is 40 bytes tx description.
+// It supports 8192E, 8723B, 8812a.
+// Dword 0
+#define GET_TX_DESC_OWN(__pTxDesc)                     LE_BITS_TO_4BYTE(__pTxDesc, 31, 1)
+#define SET_TX_DESC_PKT_SIZE(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Value)
+#define SET_TX_DESC_OFFSET(__pTxDesc, __Value)         SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value)
+#define SET_TX_DESC_BMC(__pTxDesc, __Value)            SET_BITS_TO_LE_4BYTE(__pTxDesc, 24, 1, __Value)
+#define SET_TX_DESC_HTC(__pTxDesc, __Value)            SET_BITS_TO_LE_4BYTE(__pTxDesc, 25, 1, __Value)
+#define SET_TX_DESC_LAST_SEG(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc, 26, 1, __Value)
+#define SET_TX_DESC_FIRST_SEG(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc, 27, 1, __Value)
+#define SET_TX_DESC_LINIP(__pTxDesc, __Value)          SET_BITS_TO_LE_4BYTE(__pTxDesc, 28, 1, __Value)
+#define SET_TX_DESC_NO_ACM(__pTxDesc, __Value)         SET_BITS_TO_LE_4BYTE(__pTxDesc, 29, 1, __Value)
+#define SET_TX_DESC_GF(__pTxDesc, __Value)             SET_BITS_TO_LE_4BYTE(__pTxDesc, 30, 1, __Value)
+#define SET_TX_DESC_OWN(__pTxDesc, __Value)            SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value)
+// Dword 1
+#define SET_TX_DESC_MACID(__pTxDesc, __Value)          SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 7, __Value)
+#define SET_TX_DESC_QUEUE_SEL(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 8, 5, __Value)
+#define SET_TX_DESC_RDG_NAV_EXT(__pTxDesc, __Value)    SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 13, 1, __Value)
+#define SET_TX_DESC_LSIG_TXOP_EN(__pTxDesc, __Value)   SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 14, 1, __Value)
+#define SET_TX_DESC_PIFS(__pTxDesc, __Value)           SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 15, 1, __Value)
+#define SET_TX_DESC_RATE_ID(__pTxDesc, __Value)                SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 16, 5, __Value)
+#define SET_TX_DESC_EN_DESC_ID(__pTxDesc, __Value)     SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 21, 1, __Value)
+#define SET_TX_DESC_SEC_TYPE(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value)
+#define SET_TX_DESC_PKT_OFFSET(__pTxDesc, __Value)     SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 24, 5, __Value)
+// Dword 2
+#define SET_TX_DESC_PAID(__pTxDesc, __Value)           SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0,  9, __Value) 
+#define SET_TX_DESC_CCA_RTS(__pTxDesc, __Value)                SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 10, 2, __Value)
+#define SET_TX_DESC_AGG_ENABLE(__pTxDesc, __Value)     SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 12, 1, __Value)
+#define SET_TX_DESC_RDG_ENABLE(__pTxDesc, __Value)     SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 13, 1, __Value)
+#define SET_TX_DESC_AGG_BREAK(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 16, 1, __Value)
+#define SET_TX_DESC_MORE_FRAG(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 17, 1, __Value)
+#define SET_TX_DESC_RAW(__pTxDesc, __Value)            SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 18, 1, __Value)
+#define SET_TX_DESC_SPE_RPT(__pTxDesc, __Value)                SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 19, 1, __Value)
+#define SET_TX_DESC_AMPDU_DENSITY(__pTxDesc, __Value)  SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 20, 3, __Value)
+#define SET_TX_DESC_BT_INT(__pTxDesc, __Value)         SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 23, 1, __Value)
+#define SET_TX_DESC_GID(__pTxDesc, __Value)            SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 24, 6, __Value)
+// Dword 3
+#define SET_TX_DESC_WHEADER_LEN(__pTxDesc, __Value)    SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 0, 4, __Value)
+#define SET_TX_DESC_CHK_EN(__pTxDesc, __Value)         SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 4, 1, __Value)
+#define SET_TX_DESC_EARLY_MODE(__pTxDesc, __Value)     SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 5, 1, __Value)
+#define SET_TX_DESC_HWSEQ_SEL(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 6, 2, __Value)
+#define SET_TX_DESC_USE_RATE(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 8, 1, __Value)
+#define SET_TX_DESC_DISABLE_RTS_FB(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 9, 1, __Value)
+#define SET_TX_DESC_DISABLE_FB(__pTxDesc, __Value)     SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 10, 1, __Value)
+#define SET_TX_DESC_CTS2SELF(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 11, 1, __Value)
+#define SET_TX_DESC_RTS_ENABLE(__pTxDesc, __Value)     SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 12, 1, __Value)
+#define SET_TX_DESC_HW_RTS_ENABLE(__pTxDesc, __Value)  SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 13, 1, __Value)
+#define SET_TX_DESC_NAV_USE_HDR(__pTxDesc, __Value)    SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 15, 1, __Value)
+#define SET_TX_DESC_USE_MAX_LEN(__pTxDesc, __Value)    SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 16, 1, __Value)
+#define SET_TX_DESC_MAX_AGG_NUM(__pTxDesc, __Value)    SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 17, 5, __Value)
+#define SET_TX_DESC_NDPA(__pTxDesc, __Value)           SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 22, 2, __Value)
+#define SET_TX_DESC_AMPDU_MAX_TIME(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 24, 8, __Value)
+// Dword 4
+#define SET_TX_DESC_TX_RATE(__pTxDesc, __Value)                SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 0, 7, __Value)
+#define SET_TX_DESC_DATA_RATE_FB_LIMIT(__pTxDesc, __Value)     SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 8, 5, __Value)
+#define SET_TX_DESC_RTS_RATE_FB_LIMIT(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 13, 4, __Value)
+#define SET_TX_DESC_RETRY_LIMIT_ENABLE(__pTxDesc, __Value)     SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 17, 1, __Value)
+#define SET_TX_DESC_DATA_RETRY_LIMIT(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 18, 6, __Value)
+#define SET_TX_DESC_RTS_RATE(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 24, 5, __Value)
+// Dword 5
+#define SET_TX_DESC_DATA_SC(__pTxDesc, __Value)                SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 0, 4, __Value)
+#define SET_TX_DESC_DATA_SHORT(__pTxDesc, __Value)     SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 4, 1, __Value)
+#define SET_TX_DESC_DATA_BW(__pTxDesc, __Value)                SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 5, 2, __Value)
+#define SET_TX_DESC_DATA_LDPC(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 7, 1, __Value)
+#define SET_TX_DESC_DATA_STBC(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 8, 2, __Value)
+#define SET_TX_DESC_CTROL_STBC(__pTxDesc, __Value)     SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 10, 2, __Value)
+#define SET_TX_DESC_RTS_SHORT(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 12, 1, __Value)
+#define SET_TX_DESC_RTS_SC(__pTxDesc, __Value)         SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 13, 4, __Value)
+// Dword 6
+#define SET_TX_DESC_SW_DEFINE(__pTxDesc, __Value)      SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 0, 12, __Value)
+#define SET_TX_DESC_ANTSEL_A(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 16, 3, __Value)
+#define SET_TX_DESC_ANTSEL_B(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 19, 3, __Value)
+#define SET_TX_DESC_ANTSEL_C(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 22, 3, __Value)
+#define SET_TX_DESC_ANTSEL_D(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 25, 3, __Value)
+// Dword 7
+#ifdef CONFIG_PCI_HCI 
+#define SET_TX_DESC_TX_BUFFER_SIZE(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value)
+#else
+#define SET_TX_DESC_TX_DESC_CHECKSUM(__pTxDesc, __Value)SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value)
+#endif
+#define SET_TX_DESC_USB_TXAGG_NUM(__pTxDesc, __Value)  SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 24, 8, __Value)
+#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
+#define SET_TX_DESC_SDIO_TXSEQ(__pTxDesc, __Value)     SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 16, 8, __Value)
+#endif
+
+// Dword 8
+#define SET_TX_DESC_HWSEQ_EN(__pTxDesc, __Value)       SET_BITS_TO_LE_4BYTE(__pTxDesc+32, 15, 1, __Value)
+// Dword 9
+#define SET_TX_DESC_SEQ(__pTxDesc, __Value)            SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 12, 12, __Value)
+// Dword 10
+#define SET_TX_DESC_TX_BUFFER_ADDRESS(__pTxDesc, __Value)SET_BITS_TO_LE_4BYTE(__pTxDesc+40, 0, 32, __Value)
+#define GET_TX_DESC_TX_BUFFER_ADDRESS(__pTxDesc)       LE_BITS_TO_4BYTE(__pTxDesc+40, 0, 32)
+
+// Dword 11
+#define SET_TX_DESC_NEXT_DESC_ADDRESS(__pTxDesc, __Value)SET_BITS_TO_LE_4BYTE(__pTxDesc+48, 0, 32, __Value)
+// 40 bytes tx description end.
+#endif
+
 enum TXDESC_SC{
        SC_DONT_CARE = 0x00,
        SC_UPPER= 0x01, 
@@ -340,6 +444,7 @@ struct pkt_attrib
        u8      dhcp_pkt;
        u16     ether_type;
        u16     seqnum;
+       u8      hw_ssn_sel;     //for HW_SEQ0,1,2,3
        u16     pkt_hdrlen;     //the original 802.3 pkt header len
        u16     hdrlen;         //the WLAN Header Len
        u32     pktlen;         //the original 802.3 pkt raw_data len (not include ether_hdr data)
@@ -633,6 +738,8 @@ enum cmdbuf_type {
        CMDBUF_MAX
 };
 
+u8 rtw_get_hwseq_no(_adapter *padapter);
+
 struct xmit_priv       {
 
        _lock   lock;
@@ -744,7 +851,7 @@ struct      xmit_priv       {
        uint free_xmit_extbuf_cnt;
 
        struct xmit_buf pcmd_xmitbuf[CMDBUF_MAX];
-
+       u8   hw_ssn_seq_no;//mapping to REG_HW_SEQ 0,1,2,3
        u16     nqos_ssn;
        #ifdef CONFIG_TX_EARLY_MODE
 
index a048e83bda3d218b700ef1982efdf136a0298d9f..83c1c74c2ce261d455f2f0be78fc92cd466215a4 100755 (executable)
@@ -65,5 +65,20 @@ u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem);
 void usb_write_port_cancel(struct intf_hdl *pintfhdl);
 
 int usbctrl_vendorreq(struct intf_hdl *pintfhdl, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype);
+#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ
+int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request,
+       u16 value, u16 index, void *pdata, u16 len, u8 requesttype);
+#endif /* CONFIG_USB_SUPPORT_ASYNC_VDN_REQ */
+
+u8 usb_read8(struct intf_hdl *pintfhdl, u32 addr);
+u16 usb_read16(struct intf_hdl *pintfhdl, u32 addr);
+u32 usb_read32(struct intf_hdl *pintfhdl, u32 addr);
+int usb_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val);
+int usb_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val);
+int usb_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val);
+int usb_writeN(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata);
+u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem);
+void usb_recv_tasklet(void *priv);
+
 #endif
 
index 79d0a8864bfedbfac5435bd80d8a7e7de6f99dfd..d489ebfcf6426c75418a491a1102a38a95b1f332 100755 (executable)
@@ -92,5 +92,9 @@ extern sint rtw_endofpktfile (struct pkt_file *pfile);
 extern void rtw_os_pkt_complete(_adapter *padapter, _pkt *pkt);
 extern void rtw_os_xmit_complete(_adapter *padapter, struct xmit_frame *pxframe);
 
+void rtw_os_wake_queue_at_free_stainfo(_adapter *padapter, int *qcnt_freed);
+
+void dump_os_queue(void *sel, _adapter *padapter);
+
 #endif //__XMIT_OSDEP_H_
 
index a0dedaf6152e34a6cb8441a60054366ba5325350..12ce112da794678748f8cc8f770af286e601a89d 100755 (executable)
@@ -26,6 +26,7 @@
 #include <rtw_wifi_regd.h>\r
 \r
 #define RTW_MAX_MGMT_TX_CNT (8)\r
+#define RTW_MAX_MGMT_TX_MS_GAS (500)\r
 \r
 #define RTW_SCAN_IE_LEN_MAX      2304\r
 #define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 5000 //ms\r
 \r
 #endif\r
 \r
+#ifdef CONFIG_PLATFORM_ARM_SUN8I\r
+#define BUSY_TRAFFIC_SCAN_DENY_PERIOD  8000\r
+#else\r
+#define BUSY_TRAFFIC_SCAN_DENY_PERIOD  12000\r
+#endif\r
+\r
 static const u32 rtw_cipher_suites[] = {\r
        WLAN_CIPHER_SUITE_WEP40,\r
        WLAN_CIPHER_SUITE_WEP104,\r
@@ -377,7 +384,10 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
        u8 *notify_ie;\r
        size_t notify_ielen;\r
        s32 notify_signal;\r
-       u8 buf[MAX_BSSINFO_LEN], *pbuf;\r
+       //u8 buf[MAX_BSSINFO_LEN];\r
+\r
+       u8 *pbuf;\r
+       size_t buf_size = MAX_BSSINFO_LEN;\r
        size_t len,bssinf_len=0;\r
        struct rtw_ieee80211_hdr *pwlanhdr;\r
        unsigned short *fctrl;\r
@@ -387,12 +397,17 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
        struct wiphy *wiphy = wdev->wiphy;\r
        struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\r
 \r
-\r
+       pbuf = rtw_zmalloc(buf_size);\r
+       if(pbuf == NULL){\r
+               DBG_871X("%s pbuf allocate failed  !! \n",__FUNCTION__);\r
+               return bss;\r
+       }\r
+               \r
        //DBG_8192C("%s\n", __func__);\r
 \r
        bssinf_len = pnetwork->network.IELength+sizeof (struct rtw_ieee80211_hdr_3addr);\r
-       if(bssinf_len > MAX_BSSINFO_LEN){\r
-               DBG_871X("%s IE Length too long > %d byte \n",__FUNCTION__,MAX_BSSINFO_LEN);\r
+       if(bssinf_len > buf_size){\r
+               DBG_871X("%s IE Length too long > %zu byte \n",__FUNCTION__,buf_size);\r
                goto exit;\r
        }\r
 \r
@@ -522,7 +537,7 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
        DBG_8192C("notify_timestamp: %llu\n", notify_timestamp);\r
        #endif\r
 \r
-       pbuf = buf;\r
+       //pbuf = buf;\r
        \r
        pwlanhdr = (struct rtw_ieee80211_hdr *)pbuf;    \r
        fctrl = &(pwlanhdr->frame_ctl);\r
@@ -543,13 +558,12 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
        _rtw_memcpy(pwlanhdr->addr3, pnetwork->network.MacAddress, ETH_ALEN);\r
 \r
 \r
-       pbuf += sizeof(struct rtw_ieee80211_hdr_3addr); \r
+       //pbuf += sizeof(struct rtw_ieee80211_hdr_3addr);\r
        len = sizeof (struct rtw_ieee80211_hdr_3addr);\r
-\r
-       _rtw_memcpy(pbuf, pnetwork->network.IEs, pnetwork->network.IELength);\r
-       len += pnetwork->network.IELength;\r
-\r
-       *((u64*)pbuf) = cpu_to_le64(notify_timestamp);\r
+       _rtw_memcpy((pbuf+len), pnetwork->network.IEs, pnetwork->network.IELength);\r
+       *((u64*)(pbuf+len)) = cpu_to_le64(notify_timestamp);\r
+       \r
+       len += pnetwork->network.IELength;      \r
 \r
        //#ifdef CONFIG_P2P\r
        //if(rtw_get_p2p_ie(pnetwork->network.IEs+12, pnetwork->network.IELength-12, NULL, NULL))\r
@@ -559,7 +573,7 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
        //#endif\r
 \r
 #if 1  \r
-       bss = cfg80211_inform_bss_frame(wiphy, notify_channel, (struct ieee80211_mgmt *)buf,\r
+       bss = cfg80211_inform_bss_frame(wiphy, notify_channel, (struct ieee80211_mgmt *)pbuf,\r
                len, notify_signal, GFP_ATOMIC);\r
 #else                   \r
                        \r
@@ -609,8 +623,10 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
 #else\r
        cfg80211_put_bss(bss);\r
 #endif\r
-\r
-exit:  \r
+       \r
+exit:\r
+       if(pbuf)\r
+               rtw_mfree(pbuf, buf_size);      \r
        return bss;\r
        \r
 }\r
@@ -657,6 +673,11 @@ void rtw_cfg80211_ibss_indicate_connect(_adapter *padapter)
        struct wlan_network  *cur_network = &(pmlmepriv->cur_network);\r
        struct wireless_dev *pwdev = padapter->rtw_wdev;\r
        struct cfg80211_bss *bss = NULL;\r
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0))\r
+       struct wiphy *wiphy = pwdev->wiphy;\r
+       int freq = (int)cur_network->network.Configuration.DSConfig;\r
+       struct ieee80211_channel *chan;\r
+#endif\r
 \r
        DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));\r
        if (pwdev->iftype != NL80211_IFTYPE_ADHOC) \r
@@ -708,7 +729,12 @@ void rtw_cfg80211_ibss_indicate_connect(_adapter *padapter)
                        DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" BSS not found !!\n", FUNC_ADPT_ARG(padapter));\r
        }\r
        //notify cfg80211 that device joined an IBSS\r
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0))\r
+       chan = ieee80211_get_channel(wiphy, freq);\r
+       cfg80211_ibss_joined(padapter->pnetdev, cur_network->network.MacAddress, chan, GFP_ATOMIC);\r
+#else\r
        cfg80211_ibss_joined(padapter->pnetdev, cur_network->network.MacAddress, GFP_ATOMIC);\r
+#endif\r
 }\r
 \r
 void rtw_cfg80211_indicate_connect(_adapter *padapter)\r
@@ -807,18 +833,18 @@ check_bss:
        }\r
        else\r
        {\r
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0) || defined(COMPAT_KERNEL_RELEASE)\r
+       #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0) || defined(COMPAT_KERNEL_RELEASE)     \r
                DBG_8192C("pwdev->sme_state(b)=%d\n", pwdev->sme_state);\r
-#endif // kernel < 3.11\r
+       #endif\r
                cfg80211_connect_result(padapter->pnetdev, cur_network->network.MacAddress\r
                        , pmlmepriv->assoc_req+sizeof(struct rtw_ieee80211_hdr_3addr)+2\r
                        , pmlmepriv->assoc_req_len-sizeof(struct rtw_ieee80211_hdr_3addr)-2\r
                        , pmlmepriv->assoc_rsp+sizeof(struct rtw_ieee80211_hdr_3addr)+6\r
                        , pmlmepriv->assoc_rsp_len-sizeof(struct rtw_ieee80211_hdr_3addr)-6\r
                        , WLAN_STATUS_SUCCESS, GFP_ATOMIC);\r
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0) || defined(COMPAT_KERNEL_RELEASE)\r
+       #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0) || defined(COMPAT_KERNEL_RELEASE)     \r
                DBG_8192C("pwdev->sme_state(a)=%d\n", pwdev->sme_state);\r
-#endif // kernel < 3.11\r
+       #endif\r
        }\r
 }\r
 \r
@@ -857,7 +883,7 @@ void rtw_cfg80211_indicate_disconnect(_adapter *padapter)
 #endif //CONFIG_P2P\r
 \r
        if (!padapter->mlmepriv.not_indic_disco) {\r
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0) || defined(COMPAT_KERNEL_RELEASE)\r
+               #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0) || defined(COMPAT_KERNEL_RELEASE)                     \r
                DBG_8192C("pwdev->sme_state(b)=%d\n", pwdev->sme_state);\r
 \r
                if(pwdev->sme_state==CFG80211_SME_CONNECTING)\r
@@ -869,13 +895,14 @@ void rtw_cfg80211_indicate_disconnect(_adapter *padapter)
                        //DBG_8192C("pwdev->sme_state=%d\n", pwdev->sme_state);\r
 \r
                DBG_8192C("pwdev->sme_state(a)=%d\n", pwdev->sme_state);\r
-#else // kernel >= 3.11\r
-               if (check_fwstate(&padapter->mlmepriv, _FW_LINKED))\r
+               #else\r
+\r
+               if(check_fwstate(&padapter->mlmepriv, _FW_LINKED))              \r
                        cfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, GFP_ATOMIC);\r
                else\r
-                       cfg80211_connect_result(padapter->pnetdev, NULL, NULL, 0, NULL, 0,\r
+                       cfg80211_connect_result(padapter->pnetdev, NULL, NULL, 0, NULL, 0, \r
                                WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_ATOMIC/*GFP_KERNEL*/);\r
-#endif // kernel >= 3.11\r
+               #endif\r
        }\r
 }\r
        \r
@@ -1545,13 +1572,13 @@ static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev,
        \r
        if (params->seq_len && params->seq) \r
        {       \r
-               _rtw_memcpy(param->u.crypt.seq, params->seq, params->seq_len);\r
+               _rtw_memcpy(param->u.crypt.seq, (u8 *)params->seq, params->seq_len);\r
        }\r
 \r
        if(params->key_len && params->key)\r
        {\r
                param->u.crypt.key_len = params->key_len;               \r
-               _rtw_memcpy(param->u.crypt.key, params->key, params->key_len);\r
+               _rtw_memcpy(param->u.crypt.key, (u8 *)params->key, params->key_len);\r
        }       \r
 \r
        if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)\r
@@ -1685,8 +1712,13 @@ static int cfg80211_rtw_set_default_key(struct wiphy *wiphy,
 }\r
 \r
 static int cfg80211_rtw_get_station(struct wiphy *wiphy,\r
-                                   struct net_device *ndev,\r
-                                   u8 *mac, struct station_info *sinfo)\r
+                               struct net_device *ndev,\r
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0))\r
+                               u8 *mac, \r
+#else\r
+                               const u8 *mac,\r
+#endif\r
+                               struct station_info *sinfo)\r
 {\r
        int ret = 0;\r
        _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\r
@@ -1702,7 +1734,7 @@ static int cfg80211_rtw_get_station(struct wiphy *wiphy,
                goto exit;\r
        }\r
 \r
-       psta = rtw_get_stainfo(pstapriv, mac);\r
+       psta = rtw_get_stainfo(pstapriv, (u8 *)mac);\r
        if (psta == NULL) {\r
                DBG_8192C("%s, sta_info is null\n", __func__);\r
                ret = -ENOENT;\r
@@ -1720,7 +1752,7 @@ static int cfg80211_rtw_get_station(struct wiphy *wiphy,
        {\r
                struct wlan_network  *cur_network = &(pmlmepriv->cur_network);\r
 \r
-               if (_rtw_memcmp(mac, cur_network->network.MacAddress, ETH_ALEN) == _FALSE) {\r
+               if (_rtw_memcmp((u8 *)mac, cur_network->network.MacAddress, ETH_ALEN) == _FALSE) {\r
                        DBG_871X("%s, mismatch bssid="MAC_FMT"\n", __func__, MAC_ARG(cur_network->network.MacAddress));\r
                        ret = -ENOENT;\r
                        goto exit;\r
@@ -1993,7 +2025,16 @@ void rtw_cfg80211_surveydone_event_callback(_adapter *padapter)
                        //ev=translate_scan(padapter, a, pnetwork, ev, stop);\r
                        rtw_cfg80211_inform_bss(padapter, pnetwork);            \r
                }\r
-\r
+               /* //check ralink testbed RSN IE length\r
+               {\r
+                       if(_rtw_memcmp(pnetwork->network.Ssid.Ssid, "Ralink_11n_AP",13))\r
+                       {\r
+                               uint ie_len=0;\r
+                               u8 *p=NULL;\r
+                               p = rtw_get_ie(pnetwork->network.IEs + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pnetwork->network.IELength - _BEACON_IE_OFFSET_));\r
+                               DBG_871X("ie_len=%d\n", ie_len);\r
+                       }\r
+               }*/\r
                plist = get_next(plist);\r
        \r
        }\r
@@ -2285,7 +2326,7 @@ if (padapter->registrypriv.mp_mode == 1)
 \r
                passtime = rtw_get_passing_time_ms(lastscantime);\r
                lastscantime = rtw_get_current_time();\r
-               if (passtime > 12000)\r
+               if (passtime > BUSY_TRAFFIC_SCAN_DENY_PERIOD)\r
 #endif\r
                {\r
                        DBG_871X("%s: bBusyTraffic == _TRUE\n", __FUNCTION__);\r
@@ -2309,7 +2350,7 @@ if (padapter->registrypriv.mp_mode == 1)
 \r
                passtime = rtw_get_passing_time_ms(buddylastscantime);\r
                buddylastscantime = rtw_get_current_time();\r
-               if ((passtime > 12000)\r
+               if ((passtime > BUSY_TRAFFIC_SCAN_DENY_PERIOD)\r
 //#ifdef CONFIG_P2P\r
 //                     ||(!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE))\r
 //#endif //CONFIG_P2P\r
@@ -2896,7 +2937,7 @@ static int cfg80211_rtw_join_ibss(struct wiphy *wiphy, struct net_device *ndev,
        \r
        _rtw_memset(&ndis_ssid, 0, sizeof(NDIS_802_11_SSID));                   \r
        ndis_ssid.SsidLength = params->ssid_len;\r
-       _rtw_memcpy(ndis_ssid.Ssid, params->ssid, params->ssid_len);\r
+       _rtw_memcpy(ndis_ssid.Ssid, (u8 *)params->ssid, params->ssid_len);\r
 \r
        //DBG_8192C("ssid=%s, len=%zu\n", ndis_ssid.Ssid, params->ssid_len);\r
        \r
@@ -3041,7 +3082,7 @@ static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev,
        \r
        _rtw_memset(&ndis_ssid, 0, sizeof(NDIS_802_11_SSID));                   \r
        ndis_ssid.SsidLength = sme->ssid_len;\r
-       _rtw_memcpy(ndis_ssid.Ssid, sme->ssid, sme->ssid_len);\r
+       _rtw_memcpy(ndis_ssid.Ssid, (u8 *)sme->ssid, sme->ssid_len);\r
 \r
        DBG_8192C("ssid=%s, len=%zu\n", ndis_ssid.Ssid, sme->ssid_len);\r
        \r
@@ -3095,7 +3136,7 @@ static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev,
 \r
        DBG_8192C("%s, ie_len=%zu\n", __func__, sme->ie_len);\r
                        \r
-       ret = rtw_cfg80211_set_wpa_ie(padapter, sme->ie, sme->ie_len);\r
+       ret = rtw_cfg80211_set_wpa_ie(padapter, (u8 *)sme->ie, sme->ie_len);\r
        if (ret < 0)\r
                goto exit;\r
 \r
@@ -3191,7 +3232,7 @@ static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev,
 \r
        //rtw_set_802_11_encryption_mode(padapter, padapter->securitypriv.ndisencryptstatus);\r
 \r
-       if (rtw_set_802_11_connect(padapter, sme->bssid, &ndis_ssid) == _FALSE) {\r
+       if (rtw_set_802_11_connect(padapter, (u8 *)sme->bssid, &ndis_ssid) == _FALSE) {\r
                ret = -1;\r
                goto exit;\r
        }\r
@@ -3325,26 +3366,33 @@ static int cfg80211_rtw_set_pmksa(struct wiphy *wiphy,
 {\r
        u8      index,blInserted = _FALSE;\r
        _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\r
+       struct mlme_priv *mlme = &padapter->mlmepriv;\r
        struct security_priv    *psecuritypriv = &padapter->securitypriv;\r
        u8      strZeroMacAddress[ ETH_ALEN ] = { 0x00 };\r
 \r
-       DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));\r
+       DBG_871X(FUNC_NDEV_FMT" "MAC_FMT" "KEY_FMT"\n", FUNC_NDEV_ARG(ndev)\r
+               , MAC_ARG(pmksa->bssid), KEY_ARG(pmksa->pmkid));\r
 \r
-       if ( _rtw_memcmp( pmksa->bssid, strZeroMacAddress, ETH_ALEN ) == _TRUE )\r
+       if ( _rtw_memcmp((u8 *)pmksa->bssid, strZeroMacAddress, ETH_ALEN ) == _TRUE )\r
        {\r
                return -EINVAL;\r
        }\r
 \r
+       if (check_fwstate(mlme, _FW_LINKED) == _FALSE) {\r
+               DBG_871X(FUNC_NDEV_FMT" not set pmksa cause not in linked state\n", FUNC_NDEV_ARG(ndev));\r
+               return -EINVAL;\r
+       }\r
+\r
        blInserted = _FALSE;\r
        \r
        //overwrite PMKID\r
        for(index=0 ; index<NUM_PMKID_CACHE; index++)\r
        {\r
-               if( _rtw_memcmp( psecuritypriv->PMKIDList[index].Bssid, pmksa->bssid, ETH_ALEN) ==_TRUE )\r
+               if( _rtw_memcmp(psecuritypriv->PMKIDList[index].Bssid, (u8 *)pmksa->bssid, ETH_ALEN) ==_TRUE )\r
                { // BSSID is matched, the same AP => rewrite with new PMKID.\r
                        DBG_871X(FUNC_NDEV_FMT" BSSID exists in the PMKList.\n", FUNC_NDEV_ARG(ndev));\r
 \r
-                       _rtw_memcpy( psecuritypriv->PMKIDList[index].PMKID, pmksa->pmkid, WLAN_PMKID_LEN);\r
+                       _rtw_memcpy( psecuritypriv->PMKIDList[index].PMKID, (u8 *)pmksa->pmkid, WLAN_PMKID_LEN);\r
                        psecuritypriv->PMKIDList[index].bUsed = _TRUE;\r
                        psecuritypriv->PMKIDIndex = index+1;\r
                        blInserted = _TRUE;\r
@@ -3358,8 +3406,8 @@ static int cfg80211_rtw_set_pmksa(struct wiphy *wiphy,
                DBG_871X(FUNC_NDEV_FMT" Use the new entry index = %d for this PMKID.\n",\r
                        FUNC_NDEV_ARG(ndev), psecuritypriv->PMKIDIndex );\r
 \r
-               _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].Bssid, pmksa->bssid, ETH_ALEN);\r
-               _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].PMKID, pmksa->pmkid, WLAN_PMKID_LEN);\r
+               _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].Bssid, (u8 *)pmksa->bssid, ETH_ALEN);\r
+               _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].PMKID, (u8 *)pmksa->pmkid, WLAN_PMKID_LEN);\r
 \r
                psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].bUsed = _TRUE;\r
                psecuritypriv->PMKIDIndex++ ;\r
@@ -3380,16 +3428,18 @@ static int cfg80211_rtw_del_pmksa(struct wiphy *wiphy,
        _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\r
        struct security_priv    *psecuritypriv = &padapter->securitypriv;\r
 \r
-       DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));\r
+       DBG_871X(FUNC_NDEV_FMT" "MAC_FMT" "KEY_FMT"\n", FUNC_NDEV_ARG(ndev)\r
+               , MAC_ARG(pmksa->bssid), KEY_ARG(pmksa->pmkid));\r
 \r
        for(index=0 ; index<NUM_PMKID_CACHE; index++)\r
        {\r
-               if( _rtw_memcmp( psecuritypriv->PMKIDList[index].Bssid, pmksa->bssid, ETH_ALEN) ==_TRUE )\r
+               if( _rtw_memcmp(psecuritypriv->PMKIDList[index].Bssid, (u8 *)pmksa->bssid, ETH_ALEN) ==_TRUE )\r
                { // BSSID is matched, the same AP => Remove this PMKID information and reset it. \r
-                       _rtw_memset( psecuritypriv->PMKIDList[index].Bssid, 0x00, ETH_ALEN );\r
-                       _rtw_memset( psecuritypriv->PMKIDList[index].PMKID, 0x00, WLAN_PMKID_LEN );\r
+                       _rtw_memset(psecuritypriv->PMKIDList[index].Bssid, 0x00, ETH_ALEN );\r
+                       _rtw_memset(psecuritypriv->PMKIDList[index].PMKID, 0x00, WLAN_PMKID_LEN );\r
                        psecuritypriv->PMKIDList[index].bUsed = _FALSE;\r
                        bMatched = _TRUE;\r
+                       DBG_871X(FUNC_NDEV_FMT" clear id:%hhu\n", FUNC_NDEV_ARG(ndev), index);          \r
                        break;\r
                }       \r
        }\r
@@ -4114,7 +4164,12 @@ static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
 #endif //(LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0))\r
 \r
 static int     cfg80211_rtw_add_station(struct wiphy *wiphy, struct net_device *ndev,\r
-                              u8 *mac, struct station_parameters *params)\r
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0))\r
+                               u8 *mac, \r
+#else\r
+                               const u8 *mac,\r
+#endif\r
+                              struct station_parameters *params)\r
 {\r
        DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));\r
        \r
@@ -4122,7 +4177,12 @@ static int       cfg80211_rtw_add_station(struct wiphy *wiphy, struct net_device *ndev
 }\r
 \r
 static int     cfg80211_rtw_del_station(struct wiphy *wiphy, struct net_device *ndev,\r
-                              u8 *mac)\r
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0))\r
+                               u8 *mac\r
+#else\r
+                               const u8 *mac\r
+#endif\r
+                              )\r
 {\r
        int ret=0;      \r
        _irqL irqL;\r
@@ -4176,7 +4236,7 @@ static int        cfg80211_rtw_del_station(struct wiphy *wiphy, struct net_device *ndev
                \r
                plist = get_next(plist);        \r
        \r
-               if(_rtw_memcmp(mac, psta->hwaddr, ETH_ALEN))            \r
+               if(_rtw_memcmp((u8 *)mac, psta->hwaddr, ETH_ALEN))              \r
                {\r
                        if(psta->dot8021xalg == 1 && psta->bpairwise_key_installed == _FALSE)\r
                        {\r
@@ -4190,7 +4250,10 @@ static int       cfg80211_rtw_del_station(struct wiphy *wiphy, struct net_device *ndev
                                pstapriv->asoc_list_cnt--;\r
 \r
                                //_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\r
-                               updated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING);\r
+                               if (check_fwstate(pmlmepriv, (WIFI_AP_STATE)) == _TRUE)\r
+                                       updated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_PREV_AUTH_NOT_VALID);\r
+                               else\r
+                                       updated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING);\r
                                //_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\r
 \r
                                psta = NULL;\r
@@ -4213,7 +4276,12 @@ static int       cfg80211_rtw_del_station(struct wiphy *wiphy, struct net_device *ndev
 }\r
 \r
 static int     cfg80211_rtw_change_station(struct wiphy *wiphy, struct net_device *ndev,\r
-                                 u8 *mac, struct station_parameters *params)\r
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0))\r
+                               u8 *mac, \r
+#else\r
+                               const u8 *mac,\r
+#endif\r
+                               struct station_parameters *params)\r
 {\r
        DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));\r
        \r
@@ -4222,7 +4290,7 @@ static int        cfg80211_rtw_change_station(struct wiphy *wiphy, struct net_device *n
 \r
 struct sta_info *rtw_sta_info_get_by_idx(const int idx, struct sta_priv *pstapriv)\r
 \r
-{\r\r
+{\r
        _list   *phead, *plist;\r
        struct sta_info *psta = NULL;\r
        int i = 0;\r
@@ -4406,11 +4474,14 @@ void rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const
 \r
        rtw_action_frame_parse(frame, frame_len, &category, &action);\r
 \r
-       DBG_8192C("RTW_Rx:cur_ch=%d\n", channel);\r
-       if (msg)\r
-               DBG_871X("RTW_Rx:%s\n", msg);\r
-       else\r
-               DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action);\r
+       if (action == ACT_PUBLIC_GAS_INITIAL_REQ) {\r
+               rtw_set_scan_deny(adapter, 200);\r
+               rtw_scan_abort_no_wait(adapter);\r
+               #ifdef CONFIG_CONCURRENT_MODE\r
+               if (rtw_buddy_adapter_up(adapter))\r
+                       rtw_scan_abort_no_wait(adapter->pbuddy_adapter);\r
+               #endif\r
+       }\r
 \r
        if (channel <= RTW_CH_MAX_2G_CHANNEL)\r
                freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ);\r
@@ -4423,6 +4494,11 @@ void rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const
        cfg80211_rx_action(adapter->pnetdev, freq, frame, frame_len, GFP_ATOMIC);\r
 #endif\r
 \r
+       DBG_8192C("RTW_Rx:cur_ch=%d\n", channel);\r
+       if (msg)\r
+               DBG_871X("RTW_Rx:%s\n", msg);\r
+       else\r
+               DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action);\r
 }\r
 \r
 #ifdef CONFIG_P2P\r
@@ -4674,6 +4750,13 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
        struct mlme_ext_priv *pmlmeext;\r
        struct wifidirect_info *pwdinfo;\r
        struct cfg80211_wifidirect_info *pcfg80211_wdinfo;\r
+       u8 is_p2p_find = _FALSE;\r
+\r
+\r
+#ifndef CONFIG_RADIO_WORK\r
+       #define RTW_ROCH_DURATION_ENLARGE\r
+       #define RTW_ROCH_BACK_OP\r
+#endif\r
 \r
        if (ndev == NULL) {\r
                return  -EINVAL;\r
@@ -4684,19 +4767,20 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
        pmlmeext = &padapter->mlmeextpriv;\r
        pwdinfo = &padapter->wdinfo;\r
        pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;\r
+       #ifdef CONFIG_CONCURRENT_MODE\r
+       is_p2p_find=(duration < (pwdinfo->ext_listen_interval))? _TRUE : _FALSE;\r
+       #endif\r
+       *cookie = ATOMIC_INC_RETURN(&pcfg80211_wdinfo->ro_ch_cookie_gen);\r
 \r
-       DBG_871X(FUNC_ADPT_FMT" ch:%u duration:%d\n", FUNC_ADPT_ARG(padapter), remain_ch, duration);\r
+       DBG_871X(FUNC_ADPT_FMT" ch:%u duration:%d, cookie:0x%llx\n", FUNC_ADPT_ARG(padapter), remain_ch, duration, *cookie);\r
 \r
        if(pcfg80211_wdinfo->is_ro_ch == _TRUE)\r
        {\r
                DBG_8192C("%s, cancel ro ch timer\n", __func__);\r
-               \r
                _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer);\r
-\r
-#ifdef CONFIG_CONCURRENT_MODE\r
-                ATOMIC_SET(&pwdev_priv->ro_ch_to, 1);                  \r
-#endif //CONFIG_CONCURRENT_MODE        \r
-\r
+               #ifdef CONFIG_CONCURRENT_MODE\r
+               ATOMIC_SET(&pwdev_priv->ro_ch_to, 1);\r
+               #endif //CONFIG_CONCURRENT_MODE\r
                p2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK);\r
        }\r
 \r
@@ -4716,7 +4800,7 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
 \r
        rtw_scan_abort(padapter);\r
 #ifdef CONFIG_CONCURRENT_MODE          \r
-       if(rtw_buddy_adapter_up(padapter))      \r
+       if ((rtw_buddy_adapter_up(padapter)) && is_p2p_find)            //don't scan_abort during p2p_listen.\r
                rtw_scan_abort(padapter->pbuddy_adapter);                       \r
 #endif //CONFIG_CONCURRENT_MODE\r
 \r
@@ -4751,18 +4835,23 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
 \r
        rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);\r
        \r
-       \r
+#ifdef RTW_ROCH_DURATION_ENLARGE\r
        if(duration < 400)\r
                duration = duration*3;//extend from exper.\r
+#endif /* RTW_ROCH_DURATION_ENLARGE */\r
 \r
-\r
+#ifdef RTW_ROCH_BACK_OP\r
 #ifdef CONFIG_CONCURRENT_MODE\r
-       if(check_buddy_fwstate(padapter, _FW_LINKED) &&\r
-               (duration<pwdinfo->ext_listen_interval)) \r
+       if   (check_buddy_fwstate(padapter, _FW_LINKED))\r
        {\r
-               duration = duration +   pwdinfo->ext_listen_interval;\r
+               if (is_p2p_find)                                // p2p_find , duration<1000\r
+                       duration = duration +   pwdinfo->ext_listen_interval;\r
+               else                                                    // p2p_listen, duration=5000\r
+                       duration = pwdinfo->ext_listen_interval  \r
+                                    + (pwdinfo->ext_listen_interval/4);\r
        }\r
 #endif\r
+#endif /* RTW_ROCH_BACK_OP */\r
 \r
        pcfg80211_wdinfo->restore_channel = rtw_get_oper_ch(padapter);\r
 \r
@@ -4782,9 +4871,11 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
                                        issue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500);\r
                                \r
                                        ATOMIC_SET(&pwdev_priv->switch_ch_to, 0);\r
-                       \r
+\r
+                                       #ifdef RTW_ROCH_BACK_OP\r
                                        DBG_8192C("%s, set switch ch timer, duration=%d\n", __func__, duration-pwdinfo->ext_listen_interval);\r
-                                       _set_timer(&pwdinfo->ap_p2p_switch_timer, duration-pwdinfo->ext_listen_interval);       \r
+                                       _set_timer(&pwdinfo->ap_p2p_switch_timer, duration-pwdinfo->ext_listen_interval);\r
+                                       #endif /* RTW_ROCH_BACK_OP */\r
                                }                       \r
                        }\r
                \r
@@ -4875,7 +4966,7 @@ static s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy,
        pwdinfo = &padapter->wdinfo;\r
        pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;\r
 \r
-       DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));\r
+       DBG_871X(FUNC_ADPT_FMT" cookie:0x%llx\n", FUNC_ADPT_ARG(padapter), cookie);\r
 \r
        if (pcfg80211_wdinfo->is_ro_ch == _TRUE) {\r
                DBG_8192C("%s, cancel ro ch timer\n", __func__);\r
@@ -5082,33 +5173,33 @@ static int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy,
 #endif\r
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)) || defined(COMPAT_KERNEL_RELEASE)\r
        struct ieee80211_channel *chan,\r
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)\r
+       #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)\r
        bool offchan,\r
-#endif // kernel >= 2.6.38\r
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))\r
+       #endif\r
+       #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))\r
        enum nl80211_channel_type channel_type,\r
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\r
+       #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\r
        bool channel_type_valid,\r
-#endif // kernel >= 2.6.37\r
-#endif // kernel < 3.8\r
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)\r
+       #endif\r
+       #endif\r
+       #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)\r
        unsigned int wait,\r
-#endif // kernel >= 2.6.38\r
+       #endif\r
        const u8 *buf, size_t len,\r
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))\r
+       #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))\r
        bool no_cck,\r
-#endif // kernel >= 3.2\r
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0))\r
+       #endif\r
+       #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0))\r
        bool dont_wait_for_ack,\r
-#endif // kernel >= 3.3\r
-#else // kernel >= 3.14\r
+       #endif\r
+#else\r
        struct cfg80211_mgmt_tx_params *params,\r
-#endif // kernel >= 3.14\r
+#endif\r
        u64 *cookie)\r
 {\r
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))\r
        struct net_device *ndev = wdev_to_ndev(wdev);\r
-#endif // kernel >= 3.6\r
+#endif\r
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)) || defined(COMPAT_KERNEL_RELEASE)\r
        struct ieee80211_channel *chan = params->chan;\r
        bool offchan = params->offchan;\r
@@ -5117,7 +5208,7 @@ static int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy,
        size_t len = params->len;\r
        bool no_cck = params->no_cck;\r
        bool dont_wait_for_ack = params->dont_wait_for_ack;\r
-#endif // kernel >= 3.14\r
+#endif\r
        int ret = 0;\r
        int tx_ret;\r
        u32 dump_limit = RTW_MAX_MGMT_TX_CNT;\r
@@ -5192,10 +5283,27 @@ dump:
                goto cancel_ps_deny;\r
        }\r
 \r
-       do {\r
+       while (1) {\r
+               u32 sleep_ms = 0;\r
+               u32 retry_guarantee_ms = 0;\r
+\r
                dump_cnt++;\r
                tx_ret = _cfg80211_rtw_mgmt_tx(padapter, tx_ch, buf, len);\r
-       } while (dump_cnt < dump_limit && tx_ret != _SUCCESS);\r
+\r
+               switch (action) {\r
+               case ACT_PUBLIC_GAS_INITIAL_REQ:\r
+               case ACT_PUBLIC_GAS_INITIAL_RSP:\r
+                       sleep_ms = 50;\r
+                       retry_guarantee_ms = RTW_MAX_MGMT_TX_MS_GAS;\r
+               }\r
+\r
+               if (tx_ret == _SUCCESS\r
+                       || (dump_cnt >= dump_limit && rtw_get_passing_time_ms(start) >= retry_guarantee_ms))\r
+                               break;\r
+\r
+               if (sleep_ms > 0)\r
+                       rtw_msleep_os(sleep_ms);\r
+       }\r
 \r
        if (tx_ret != _SUCCESS || dump_cnt > 1) {\r
                DBG_871X(FUNC_ADPT_FMT" %s (%d/%d) in %d ms\n", FUNC_ADPT_ARG(padapter),\r
@@ -5898,7 +6006,7 @@ void rtw_cfg80211_init_wiphy(_adapter *padapter)
        }\r
 \r
        /* init regulary domain */\r
-       rtw_regd_init(padapter, rtw_reg_notifier);\r
+       rtw_regd_init(padapter);\r
 \r
        /* copy mac_addr to wiphy */\r
        _rtw_memcpy(wiphy->perm_addr, padapter->eeprompriv.mac_addr, ETH_ALEN);\r
@@ -5945,7 +6053,9 @@ static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy)
                                                                | BIT(NL80211_IFTYPE_ADHOC)\r
 #ifdef CONFIG_AP_MODE\r
                                                                | BIT(NL80211_IFTYPE_AP)\r
+#ifndef CONFIG_RADIO_WORK\r
                                                                | BIT(NL80211_IFTYPE_MONITOR)\r
+#endif /* !CONFIG_RADIO_WORK */\r
 #endif\r
 #if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE))\r
                                                                | BIT(NL80211_IFTYPE_P2P_CLIENT)\r
@@ -5960,7 +6070,9 @@ static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy)
 #endif         \r
 \r
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))\r
+#ifndef CONFIG_RADIO_WORK\r
        wiphy->software_iftypes |= BIT(NL80211_IFTYPE_MONITOR);\r
+#endif /* !CONFIG_RADIO_WORK */\r
 #endif\r
 \r
        /*\r
@@ -5995,10 +6107,10 @@ static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy)
 #if defined(CONFIG_PM) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0))\r
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0))\r
        wiphy->wowlan = wowlan_stub;\r
-#else // kernel >= 3.11\r
+#else\r
        wiphy->wowlan = &wowlan_stub;\r
-#endif // kernel >= 3.11\r
-#endif // kernle >= 3.0\r
+#endif\r
+#endif\r
 \r
 #if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))\r
        wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;\r
@@ -6013,6 +6125,10 @@ static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy)
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))\r
        //wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM;\r
 #endif\r
+\r
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(RTW_VENDOR_EXT_SUPPORT)\r
+       rtw_cfgvendor_attach(wiphy);\r
+#endif\r
 }\r
 \r
 static struct cfg80211_ops rtw_cfg80211_ops = {\r
@@ -6205,6 +6321,10 @@ void rtw_wdev_unregister(struct wireless_dev *wdev)
                unregister_netdev(pwdev_priv->pmon_ndev);\r
        }\r
 \r
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(RTW_VENDOR_EXT_SUPPORT)\r
+       rtw_cfgvendor_detach(wdev->wiphy);\r
+#endif\r
+\r
        wiphy_unregister(wdev->wiphy);\r
 }\r
 \r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_cfg80211.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/ioctl_cfg80211.h
new file mode 100755 (executable)
index 0000000..3727922
--- /dev/null
@@ -0,0 +1,179 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+#ifndef __IOCTL_CFG80211_H__\r
+#define __IOCTL_CFG80211_H__ \r
+\r
+\r
+#if defined(RTW_USE_CFG80211_STA_EVENT)\r
+       #undef CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER\r
+#endif\r
+\r
+struct rtw_wdev_invit_info {\r
+       u8 state; /* 0: req, 1:rep */\r
+       u8 peer_mac[ETH_ALEN];\r
+       u8 active;\r
+       u8 token;\r
+       u8 flags;\r
+       u8 status;\r
+       u8 req_op_ch;\r
+       u8 rsp_op_ch;\r
+};\r
+\r
+#define rtw_wdev_invit_info_init(invit_info) \\r
+       do { \\r
+               (invit_info)->state = 0xff; \\r
+               _rtw_memset((invit_info)->peer_mac, 0, ETH_ALEN); \\r
+               (invit_info)->active = 0xff; \\r
+               (invit_info)->token = 0; \\r
+               (invit_info)->flags = 0x00; \\r
+               (invit_info)->status = 0xff; \\r
+               (invit_info)->req_op_ch = 0; \\r
+               (invit_info)->rsp_op_ch = 0; \\r
+       } while (0)\r
+\r
+struct rtw_wdev_nego_info {\r
+       u8 state; /* 0: req, 1:rep, 2:conf */\r
+       u8 peer_mac[ETH_ALEN];\r
+       u8 active;\r
+       u8 token;\r
+       u8 status;\r
+       u8 req_intent;\r
+       u8 req_op_ch;\r
+       u8 req_listen_ch;\r
+       u8 rsp_intent;\r
+       u8 rsp_op_ch;\r
+       u8 conf_op_ch;\r
+};\r
+\r
+#define rtw_wdev_nego_info_init(nego_info) \\r
+       do { \\r
+               (nego_info)->state = 0xff; \\r
+               _rtw_memset((nego_info)->peer_mac, 0, ETH_ALEN); \\r
+               (nego_info)->active = 0xff; \\r
+               (nego_info)->token = 0; \\r
+               (nego_info)->status = 0xff; \\r
+               (nego_info)->req_intent = 0xff; \\r
+               (nego_info)->req_op_ch = 0; \\r
+               (nego_info)->req_listen_ch = 0; \\r
+               (nego_info)->rsp_intent = 0xff; \\r
+               (nego_info)->rsp_op_ch = 0; \\r
+               (nego_info)->conf_op_ch = 0; \\r
+       } while (0)\r
+\r
+struct rtw_wdev_priv\r
+{      \r
+       struct wireless_dev *rtw_wdev;\r
+       \r
+       _adapter *padapter;\r
+\r
+       struct cfg80211_scan_request *scan_request;\r
+       _lock scan_req_lock;\r
+\r
+       struct net_device *pmon_ndev;//for monitor interface\r
+       char ifname_mon[IFNAMSIZ + 1]; //interface name for monitor interface\r
+\r
+       u8 p2p_enabled;\r
+\r
+       u8 provdisc_req_issued;\r
+\r
+       struct rtw_wdev_invit_info invit_info;\r
+       struct rtw_wdev_nego_info nego_info;\r
+\r
+       u8 bandroid_scan;\r
+       bool block;\r
+       bool power_mgmt;\r
+\r
+#ifdef CONFIG_CONCURRENT_MODE\r
+       ATOMIC_T ro_ch_to;\r
+       ATOMIC_T switch_ch_to;  \r
+#endif \r
+       \r
+};\r
+\r
+#define wiphy_to_adapter(x) (*((_adapter**)wiphy_priv(x)))\r
+\r
+#define wdev_to_ndev(w) ((w)->netdev)\r
+\r
+int rtw_wdev_alloc(_adapter *padapter, struct device *dev);\r
+void rtw_wdev_free(struct wireless_dev *wdev);\r
+void rtw_wdev_unregister(struct wireless_dev *wdev);\r
+\r
+void rtw_cfg80211_init_wiphy(_adapter *padapter);\r
+\r
+void rtw_cfg80211_unlink_bss(_adapter *padapter, struct wlan_network *pnetwork);\r
+void rtw_cfg80211_surveydone_event_callback(_adapter *padapter);\r
+struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork);\r
+int rtw_cfg80211_check_bss(_adapter *padapter);\r
+void rtw_cfg80211_ibss_indicate_connect(_adapter *padapter);\r
+void rtw_cfg80211_indicate_connect(_adapter *padapter);\r
+void rtw_cfg80211_indicate_disconnect(_adapter *padapter);\r
+void rtw_cfg80211_indicate_scan_done(_adapter *adapter, bool aborted);\r
+\r
+#ifdef CONFIG_AP_MODE\r
+void rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint frame_len);\r
+void rtw_cfg80211_indicate_sta_disassoc(_adapter *padapter, unsigned char *da, unsigned short reason);\r
+#endif //CONFIG_AP_MODE\r
+\r
+void rtw_cfg80211_issue_p2p_provision_request(_adapter *padapter, const u8 *buf, size_t len);\r
+void rtw_cfg80211_rx_p2p_action_public(_adapter *padapter, u8 *pmgmt_frame, uint frame_len);\r
+void rtw_cfg80211_rx_action_p2p(_adapter *padapter, u8 *pmgmt_frame, uint frame_len);\r
+void rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const char*msg);\r
+\r
+int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len, int type);\r
+\r
+bool rtw_cfg80211_pwr_mgmt(_adapter *adapter);\r
+\r
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0))  && !defined(COMPAT_KERNEL_RELEASE)\r
+#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->pnetdev, freq, buf, len, gfp)\r
+#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))\r
+#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->pnetdev, freq, sig_dbm, buf, len, gfp)\r
+#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0))\r
+#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->rtw_wdev, freq, sig_dbm, buf, len, gfp)\r
+#else\r
+#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->rtw_wdev, freq, sig_dbm, buf, len,0,gfp)\r
+#endif\r
+\r
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0))  && !defined(COMPAT_KERNEL_RELEASE)\r
+#define rtw_cfg80211_send_rx_assoc(adapter, bss, buf, len) cfg80211_send_rx_assoc((adapter)->pnetdev, buf, len)\r
+#else\r
+#define rtw_cfg80211_send_rx_assoc(adapter, bss, buf, len) cfg80211_send_rx_assoc((adapter)->pnetdev, bss, buf, len)\r
+#endif\r
+\r
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))\r
+#define rtw_cfg80211_mgmt_tx_status(adapter, cookie, buf, len, ack, gfp) cfg80211_mgmt_tx_status((adapter)->pnetdev, cookie, buf, len, ack, gfp)\r
+#else\r
+#define rtw_cfg80211_mgmt_tx_status(adapter, cookie, buf, len, ack, gfp) cfg80211_mgmt_tx_status((adapter)->rtw_wdev, cookie, buf, len, ack, gfp)\r
+#endif\r
+\r
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))\r
+#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp)  cfg80211_ready_on_channel((adapter)->pnetdev, cookie, chan, channel_type, duration, gfp)\r
+#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->pnetdev, cookie, chan, chan_type, gfp)\r
+#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))\r
+#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp)  cfg80211_ready_on_channel((adapter)->rtw_wdev, cookie, chan, channel_type, duration, gfp)\r
+#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->rtw_wdev, cookie, chan, chan_type, gfp)\r
+#else\r
+#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp)  cfg80211_ready_on_channel((adapter)->rtw_wdev, cookie, chan, duration, gfp)\r
+#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->rtw_wdev, cookie, chan, gfp)\r
+#endif\r
+\r
+#include "rtw_cfgvendor.h"\r
+\r
+#endif //__IOCTL_CFG80211_H__\r
+\r
index 6124cb80b901d5e0d0bae347d08261c88613692e..1c6c50b91555bc770f2f426391a6c12db80bcfb6 100755 (executable)
@@ -23,7 +23,7 @@
 
 //#ifdef CONFIG_MP_INCLUDED
 #include <rtw_mp_ioctl.h>
-#include "../../hal/OUTSRC/odm_precomp.h"
+#include "../../hal/OUTSRC/phydm_precomp.h"
 //#endif
 
 #if defined(CONFIG_RTL8723A)
@@ -304,28 +304,12 @@ uint      rtw_is_cckratesonly_included(u8 *rate)
 }
 */
 
-static char *translate_scan(_adapter *padapter, 
+static int search_p2p_wfd_ie(_adapter *padapter,
                                struct iw_request_info* info, struct wlan_network *pnetwork,
                                char *start, char *stop)
 {
-       struct iw_event iwe;
-       u16 cap;
-       u32 ht_ielen = 0, vht_ielen = 0;
-       char custom[MAX_CUSTOM_LEN];
-       char *p;
-       u16 max_rate=0, rate, ht_cap=_FALSE, vht_cap = _FALSE;
-       u32 i = 0;      
-       char    *current_val;
-       long rssi;
-       u8 bw_40MHz=0, short_GI=0, bw_160MHz=0, vht_highest_rate = 0;
-       u16 mcs_rate=0, vht_data_rate=0;
-       u8 ie_offset = (pnetwork->network.Reserved[0] == 2? 0:12);
-       struct registry_priv *pregpriv = &padapter->registrypriv;
 #ifdef CONFIG_P2P
        struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
-#endif //CONFIG_P2P
-
-#ifdef CONFIG_P2P
 #ifdef CONFIG_WFD
        if ( SCAN_RESULT_ALL == pwdinfo->wfd_info->scan_result_type )
        {
@@ -357,7 +341,7 @@ static char *translate_scan(_adapter *padapter,
 
                        if ( blnGotP2PIE == _FALSE )
                        {
-                               return start;
+                               return _FALSE;
                        }
                        
                }
@@ -401,12 +385,547 @@ static char *translate_scan(_adapter *padapter,
                
                if ( blnGotWFD == _FALSE )
                {
-                       return start;
+                       return _FALSE;
                }
        }
 #endif // CONFIG_WFD
 
 #endif //CONFIG_P2P
+       return _TRUE;
+}
+ static inline char *iwe_stream_mac_addr_proess(_adapter *padapter,
+                               struct iw_request_info* info, struct wlan_network *pnetwork,
+                               char *start, char *stop,struct iw_event *iwe)
+{      
+       /*  AP MAC address  */
+       iwe->cmd = SIOCGIWAP;
+       iwe->u.ap_addr.sa_family = ARPHRD_ETHER;
+
+       _rtw_memcpy(iwe->u.ap_addr.sa_data, pnetwork->network.MacAddress, ETH_ALEN);
+       start = iwe_stream_add_event(info, start, stop, iwe, IW_EV_ADDR_LEN);   
+       return start;
+}
+ static inline char * iwe_stream_essid_proess(_adapter *padapter,
+                               struct iw_request_info* info, struct wlan_network *pnetwork,
+                               char *start, char *stop,struct iw_event *iwe)
+{
+       
+       /* Add the ESSID */
+       iwe->cmd = SIOCGIWESSID;
+       iwe->u.data.flags = 1;  
+       iwe->u.data.length = min((u16)pnetwork->network.Ssid.SsidLength, (u16)32);
+       start = iwe_stream_add_point(info, start, stop, iwe, pnetwork->network.Ssid.Ssid);              
+       return start;
+}
+
+ static inline char * iwe_stream_chan_process(_adapter *padapter,
+                               struct iw_request_info* info, struct wlan_network *pnetwork,
+                               char *start, char *stop,struct iw_event *iwe)
+{
+       if(pnetwork->network.Configuration.DSConfig<1 /*|| pnetwork->network.Configuration.DSConfig>14*/)
+               pnetwork->network.Configuration.DSConfig = 1;
+
+        /* Add frequency/channel */
+       iwe->cmd = SIOCGIWFREQ;
+       iwe->u.freq.m = rtw_ch2freq(pnetwork->network.Configuration.DSConfig) * 100000;
+       iwe->u.freq.e = 1;
+       iwe->u.freq.i = pnetwork->network.Configuration.DSConfig;
+       start = iwe_stream_add_event(info, start, stop, iwe, IW_EV_FREQ_LEN);
+       return start;
+}
+ static inline char * iwe_stream_mode_process(_adapter *padapter,
+                               struct iw_request_info* info, struct wlan_network *pnetwork,
+                               char *start, char *stop,struct iw_event *iwe,u16 cap)
+{
+       /* Add mode */
+       if(cap & (WLAN_CAPABILITY_IBSS |WLAN_CAPABILITY_BSS)){
+               iwe->cmd = SIOCGIWMODE;
+               if (cap & WLAN_CAPABILITY_BSS)
+                       iwe->u.mode = IW_MODE_MASTER;
+               else
+                       iwe->u.mode = IW_MODE_ADHOC;
+
+               start = iwe_stream_add_event(info, start, stop, iwe, IW_EV_UINT_LEN);
+       }
+       return start;
+ }
+ static inline char * iwe_stream_encryption_process(_adapter *padapter,
+                               struct iw_request_info* info, struct wlan_network *pnetwork,
+                               char *start, char *stop,struct iw_event *iwe,u16 cap)
+{      
+
+       /* Add encryption capability */
+       iwe->cmd = SIOCGIWENCODE;
+       if (cap & WLAN_CAPABILITY_PRIVACY)
+               iwe->u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
+       else
+               iwe->u.data.flags = IW_ENCODE_DISABLED;
+       iwe->u.data.length = 0;
+       start = iwe_stream_add_point(info, start, stop, iwe, pnetwork->network.Ssid.Ssid);
+       return start;
+
+}      
+
+ static inline char * iwe_stream_protocol_process(_adapter *padapter,
+                               struct iw_request_info* info, struct wlan_network *pnetwork,
+                               char *start, char *stop,struct iw_event *iwe)
+ {
+       u16 ht_cap=_FALSE,vht_cap = _FALSE;
+       u32 ht_ielen = 0, vht_ielen = 0;
+       char *p;
+       u8 ie_offset = (pnetwork->network.Reserved[0] == 2? 0:12);// Probe Request      
+               
+       //parsing HT_CAP_IE     
+       p = rtw_get_ie(&pnetwork->network.IEs[ie_offset], _HT_CAPABILITY_IE_, &ht_ielen, pnetwork->network.IELength-ie_offset); 
+       if(p && ht_ielen>0)             
+               ht_cap = _TRUE;                 
+
+       #ifdef CONFIG_80211AC_VHT
+       //parsing VHT_CAP_IE
+       p = rtw_get_ie(&pnetwork->network.IEs[ie_offset], EID_VHTCapability, &vht_ielen, pnetwork->network.IELength-ie_offset);
+       if(p && vht_ielen>0)
+               vht_cap = _TRUE;        
+       #endif
+        /* Add the protocol name */
+       iwe->cmd = SIOCGIWNAME;
+       if ((rtw_is_cckratesonly_included((u8*)&pnetwork->network.SupportedRates)) == _TRUE)            
+       {
+               if(ht_cap == _TRUE)
+                       snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11bn");
+               else
+                       snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11b");
+       }       
+       else if ((rtw_is_cckrates_included((u8*)&pnetwork->network.SupportedRates)) == _TRUE)   
+       {
+               if(ht_cap == _TRUE)
+                       snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11bgn");
+               else
+                       snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11bg");
+       }       
+       else
+       {
+               if(pnetwork->network.Configuration.DSConfig > 14)
+               {
+                       #ifdef CONFIG_80211AC_VHT
+                       if(vht_cap == _TRUE){
+                               snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11AC");
+                       }
+                       else 
+                       #endif  
+                       {
+                               if(ht_cap == _TRUE)
+                                       snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11an");
+                               else
+                                       snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11a");
+                       }
+               }
+               else
+               {
+                       if(ht_cap == _TRUE)
+                               snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11gn");
+                       else
+                               snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11g");
+               }
+       }
+       start = iwe_stream_add_event(info, start, stop, iwe, IW_EV_CHAR_LEN);
+       return start;
+ }
+                               
+ static inline char * iwe_stream_rate_process(_adapter *padapter,
+                               struct iw_request_info* info, struct wlan_network *pnetwork,
+                               char *start, char *stop,struct iw_event *iwe)
+{
+       u32 ht_ielen = 0, vht_ielen = 0;
+       char *p;
+       u16 max_rate=0, rate, ht_cap=_FALSE, vht_cap = _FALSE;
+       u32 i = 0;              
+       u8 bw_40MHz=0, short_GI=0, bw_160MHz=0, vht_highest_rate = 0;
+       u16 mcs_rate=0, vht_data_rate=0;
+       char custom[MAX_CUSTOM_LEN]={0};
+       u8 ie_offset = (pnetwork->network.Reserved[0] == 2? 0:12);// Probe Request      
+       
+       //parsing HT_CAP_IE     
+       p = rtw_get_ie(&pnetwork->network.IEs[ie_offset], _HT_CAPABILITY_IE_, &ht_ielen, pnetwork->network.IELength-ie_offset); 
+       if(p && ht_ielen>0)
+       {
+               struct rtw_ieee80211_ht_cap *pht_capie;
+               ht_cap = _TRUE;                 
+               pht_capie = (struct rtw_ieee80211_ht_cap *)(p+2);               
+               _rtw_memcpy(&mcs_rate , pht_capie->supp_mcs_set, 2);
+               bw_40MHz = (pht_capie->cap_info&IEEE80211_HT_CAP_SUP_WIDTH) ? 1:0;
+               short_GI = (pht_capie->cap_info&(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40)) ? 1:0;
+       }
+
+#ifdef CONFIG_80211AC_VHT
+       //parsing VHT_CAP_IE
+       p = rtw_get_ie(&pnetwork->network.IEs[ie_offset], EID_VHTCapability, &vht_ielen, pnetwork->network.IELength-ie_offset);
+       if(p && vht_ielen>0)
+       {
+               u8      mcs_map[2];
+
+               vht_cap = _TRUE;                
+               bw_160MHz = GET_VHT_CAPABILITY_ELE_CHL_WIDTH(p+2);
+               if(bw_160MHz)
+                       short_GI = GET_VHT_CAPABILITY_ELE_SHORT_GI160M(p+2);
+               else
+                       short_GI = GET_VHT_CAPABILITY_ELE_SHORT_GI80M(p+2);
+
+               _rtw_memcpy(mcs_map, GET_VHT_CAPABILITY_ELE_TX_MCS(p+2), 2);
+
+               vht_highest_rate = rtw_get_vht_highest_rate(mcs_map);
+               vht_data_rate = rtw_vht_mcs_to_data_rate(CHANNEL_WIDTH_80, short_GI, vht_highest_rate);
+       }
+#endif 
+       
+       /*Add basic and extended rates */       
+       p = custom;
+       p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), " Rates (Mb/s): ");
+       while(pnetwork->network.SupportedRates[i]!=0)
+       {
+               rate = pnetwork->network.SupportedRates[i]&0x7F; 
+               if (rate > max_rate)
+                       max_rate = rate;
+               p += snprintf(p, MAX_CUSTOM_LEN - (p - custom),
+                             "%d%s ", rate >> 1, (rate & 1) ? ".5" : "");
+               i++;
+       }
+#ifdef CONFIG_80211AC_VHT
+       if(vht_cap == _TRUE) {
+               max_rate = vht_data_rate;
+       }
+       else
+#endif         
+       if(ht_cap == _TRUE)
+       {
+               if(mcs_rate&0x8000)//MCS15
+               {
+                       max_rate = (bw_40MHz) ? ((short_GI)?300:270):((short_GI)?144:130);
+                       
+               }
+               else if(mcs_rate&0x0080)//MCS7
+               {
+                       max_rate = (bw_40MHz) ? ((short_GI)?150:135):((short_GI)?72:65);
+               }
+               else//default MCS7
+               {
+                       //DBG_871X("wx_get_scan, mcs_rate_bitmap=0x%x\n", mcs_rate);
+                       max_rate = (bw_40MHz) ? ((short_GI)?150:135):((short_GI)?72:65);
+               }
+
+               max_rate = max_rate*2;//Mbps/2;         
+       }
+
+       iwe->cmd = SIOCGIWRATE;
+       iwe->u.bitrate.fixed = iwe->u.bitrate.disabled = 0;
+       iwe->u.bitrate.value = max_rate * 500000;
+       start =iwe_stream_add_event(info, start, stop, iwe, IW_EV_PARAM_LEN);
+       return start ;
+}
+
+static inline char * iwe_stream_wpa_wpa2_process(_adapter *padapter,
+                               struct iw_request_info* info, struct wlan_network *pnetwork,
+                               char *start, char *stop,struct iw_event *iwe)
+{
+       int buf_size = MAX_WPA_IE_LEN*2;
+       //u8 pbuf[buf_size]={0};        
+       u8 *pbuf = rtw_zmalloc(buf_size);
+
+       u8 wpa_ie[255]={0},rsn_ie[255]={0};
+       u16 i, wpa_len=0,rsn_len=0;
+       u8 *p;
+       sint out_len=0;
+               
+       
+       if(pbuf){
+               p=pbuf; 
+       
+               //parsing WPA/WPA2 IE
+               if (pnetwork->network.Reserved[0] != 2) // Probe Request
+               {       
+                       out_len=rtw_get_sec_ie(pnetwork->network.IEs ,pnetwork->network.IELength,rsn_ie,&rsn_len,wpa_ie,&wpa_len);
+                       RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_wx_get_scan: ssid=%s\n",pnetwork->network.Ssid.Ssid));
+                       RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_wx_get_scan: wpa_len=%d rsn_len=%d\n",wpa_len,rsn_len));
+
+                       if (wpa_len > 0){
+                               
+                               _rtw_memset(pbuf, 0, buf_size);
+                               p += sprintf(p, "wpa_ie=");
+                               for (i = 0; i < wpa_len; i++) {
+                                       p += sprintf(p, "%02x", wpa_ie[i]);
+                               }
+
+                               if (wpa_len > 100) {
+                                       printk("-----------------Len %d----------------\n", wpa_len);
+                                       for (i = 0; i < wpa_len; i++) {
+                                               printk("%02x ", wpa_ie[i]);
+                                       }
+                                       printk("\n");
+                                       printk("-----------------Len %d----------------\n", wpa_len);
+                               }
+               
+                               _rtw_memset(iwe, 0, sizeof(*iwe));
+                               iwe->cmd = IWEVCUSTOM;
+                               iwe->u.data.length = strlen(pbuf);
+                               start = iwe_stream_add_point(info, start, stop, iwe,pbuf);
+                               
+                               _rtw_memset(iwe, 0, sizeof(*iwe));
+                               iwe->cmd =IWEVGENIE;
+                               iwe->u.data.length = wpa_len;
+                               start = iwe_stream_add_point(info, start, stop, iwe, wpa_ie);                   
+                       }
+                       if (rsn_len > 0){
+                               
+                               _rtw_memset(pbuf, 0, buf_size);
+                               p += sprintf(p, "rsn_ie=");
+                               for (i = 0; i < rsn_len; i++) {
+                                       p += sprintf(p, "%02x", rsn_ie[i]);
+                               }
+                               _rtw_memset(iwe, 0, sizeof(*iwe));
+                               iwe->cmd = IWEVCUSTOM;
+                               iwe->u.data.length = strlen(pbuf);
+                               start = iwe_stream_add_point(info, start, stop, iwe,pbuf);
+                       
+                               _rtw_memset(iwe, 0, sizeof(*iwe));
+                               iwe->cmd =IWEVGENIE;
+                               iwe->u.data.length = rsn_len;
+                               start = iwe_stream_add_point(info, start, stop, iwe, rsn_ie);           
+                       }
+               }
+       
+               rtw_mfree(pbuf, buf_size);      
+       }
+       return start;
+}
+
+static inline char * iwe_stream_wps_process(_adapter *padapter,
+                               struct iw_request_info* info, struct wlan_network *pnetwork,
+                               char *start, char *stop,struct iw_event *iwe)
+{      
+       //parsing WPS IE
+       uint cnt = 0,total_ielen;       
+       u8 *wpsie_ptr=NULL;
+       uint wps_ielen = 0;             
+       u8 ie_offset = (pnetwork->network.Reserved[0] == 2? 0:12);
+       
+       u8 *ie_ptr = pnetwork->network.IEs + ie_offset;
+       total_ielen= pnetwork->network.IELength - ie_offset;
+
+       if (pnetwork->network.Reserved[0] == 2) // Probe Request
+       {
+               ie_ptr = pnetwork->network.IEs;
+               total_ielen = pnetwork->network.IELength;
+       }
+       else     // Beacon or Probe Respones
+       {
+               ie_ptr = pnetwork->network.IEs + _FIXED_IE_LENGTH_;
+               total_ielen = pnetwork->network.IELength - _FIXED_IE_LENGTH_;
+       }    
+       while(cnt < total_ielen)
+       {
+               if(rtw_is_wps_ie(&ie_ptr[cnt], &wps_ielen) && (wps_ielen>2))                    
+               {
+                       wpsie_ptr = &ie_ptr[cnt];
+                       iwe->cmd =IWEVGENIE;
+                       iwe->u.data.length = (u16)wps_ielen;
+                       start = iwe_stream_add_point(info, start, stop,iwe, wpsie_ptr);                                         
+               }                       
+               cnt+=ie_ptr[cnt+1]+2; //goto next
+       }
+       return start;
+}
+
+static inline char * iwe_stream_wapi_process(_adapter *padapter,
+                               struct iw_request_info* info, struct wlan_network *pnetwork,
+                               char *start, char *stop,struct iw_event *iwe)
+{
+#ifdef CONFIG_WAPI_SUPPORT
+       char *p;
+               
+       if (pnetwork->network.Reserved[0] != 2) // Probe Request
+       {               
+               sint out_len_wapi=0;
+               /* here use static for stack size */
+               static u8 buf_wapi[MAX_WAPI_IE_LEN*2]={0};
+               static u8 wapi_ie[MAX_WAPI_IE_LEN]={0};
+               u16 wapi_len=0;
+               u16  i;
+
+               out_len_wapi=rtw_get_wapi_ie(pnetwork->network.IEs ,pnetwork->network.IELength,wapi_ie,&wapi_len);
+               RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_wx_get_scan: ssid=%s\n",pnetwork->network.Ssid.Ssid));
+               RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_wx_get_scan: wapi_len=%d \n",wapi_len));
+
+               DBG_871X("rtw_wx_get_scan: %s ",pnetwork->network.Ssid.Ssid);
+               DBG_871X("rtw_wx_get_scan: ssid = %d ",wapi_len);
+
+
+               if (wapi_len > 0)
+               {
+                       p=buf_wapi;
+                       //_rtw_memset(buf_wapi, 0, MAX_WAPI_IE_LEN*2);
+                       p += sprintf(p, "wapi_ie=");
+                       for (i = 0; i < wapi_len; i++) {
+                               p += sprintf(p, "%02x", wapi_ie[i]);
+                       }
+
+                       _rtw_memset(iwe, 0, sizeof(*iwe));
+                       iwe->cmd = IWEVCUSTOM;
+                       iwe->u.data.length = strlen(buf_wapi);
+                       start = iwe_stream_add_point(info, start, stop, iwe,buf_wapi);
+
+                       _rtw_memset(iwe, 0, sizeof(*iwe));
+                       iwe->cmd =IWEVGENIE;
+                       iwe->u.data.length = wapi_len;
+                       start = iwe_stream_add_point(info, start, stop, iwe, wapi_ie);
+               }
+       }
+#endif//#ifdef CONFIG_WAPI_SUPPORT
+       return start;
+}
+
+static inline char *  iwe_stream_rssi_process(_adapter *padapter,
+                               struct iw_request_info* info, struct wlan_network *pnetwork,
+                               char *start, char *stop,struct iw_event *iwe)
+{
+       u8 ss, sq;
+       struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
+       
+       /* Add quality statistics */
+       iwe->cmd = IWEVQUAL;
+       iwe->u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED 
+       #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+               | IW_QUAL_NOISE_UPDATED
+       #else
+               | IW_QUAL_NOISE_INVALID
+       #endif
+       #ifdef CONFIG_SIGNAL_DISPLAY_DBM
+               | IW_QUAL_DBM
+       #endif
+       ;
+
+       if ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE &&
+               is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)){
+               ss = padapter->recvpriv.signal_strength;
+               sq = padapter->recvpriv.signal_qual;
+       } else {
+               ss = pnetwork->network.PhyInfo.SignalStrength;
+               sq = pnetwork->network.PhyInfo.SignalQuality;
+       }
+       
+       
+       #ifdef CONFIG_SIGNAL_DISPLAY_DBM
+       iwe->u.qual.level = (u8) translate_percentage_to_dbm(ss);//dbm
+       #else
+       #ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING
+       {
+               /* Do signal scale mapping when using percentage as the unit of signal strength, since the scale mapping is skipped in odm */
+               
+               HAL_DATA_TYPE *pHal = GET_HAL_DATA(padapter);
+               
+               iwe->u.qual.level = (u8)odm_SignalScaleMapping(&pHal->odmpriv, ss);
+       }
+       #else
+       iwe->u.qual.level = (u8)ss;//%
+       #endif
+       #endif
+       
+       iwe->u.qual.qual = (u8)sq;   // signal quality
+
+       #ifdef CONFIG_PLATFORM_ROCKCHIPS
+       iwe->u.qual.noise = -100; // noise level suggest by zhf@rockchips
+       #else 
+       #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+       {
+               s16 tmp_noise=0;
+               rtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(pnetwork->network.Configuration.DSConfig), &(tmp_noise));
+               iwe->u.qual.noise = tmp_noise ;
+       }
+       #else
+       iwe->u.qual.noise = 0; // noise level
+       #endif  
+       #endif //CONFIG_PLATFORM_ROCKCHIPS
+       
+       //DBG_871X("iqual=%d, ilevel=%d, inoise=%d, iupdated=%d\n", iwe.u.qual.qual, iwe.u.qual.level , iwe.u.qual.noise, iwe.u.qual.updated);
+
+       start = iwe_stream_add_event(info, start, stop, iwe, IW_EV_QUAL_LEN);
+       return start;
+}
+
+static inline char *  iwe_stream_net_rsv_process(_adapter *padapter,
+                               struct iw_request_info* info, struct wlan_network *pnetwork,
+                               char *start, char *stop,struct iw_event *iwe)
+{      
+       u8 buf[32] = {0};
+       u8 * p,*pos;
+       int len;
+       p = buf;
+       pos = pnetwork->network.Reserved;
+       
+       p += sprintf(p, "fm=%02X%02X", pos[1], pos[0]);
+       _rtw_memset(iwe, 0, sizeof(*iwe));
+       iwe->cmd = IWEVCUSTOM;
+       iwe->u.data.length = strlen(buf);
+       start = iwe_stream_add_point(info, start, stop,iwe, buf);
+       return start;
+}
+
+#if 1
+static char *translate_scan(_adapter *padapter, 
+                               struct iw_request_info* info, struct wlan_network *pnetwork,
+                               char *start, char *stop)
+{      
+       struct iw_event iwe;
+       u16 cap = 0;
+       _rtw_memset(&iwe, 0, sizeof(iwe));
+       
+       if(_FALSE == search_p2p_wfd_ie(padapter,info,pnetwork,start,stop))
+               return start;
+
+       start = iwe_stream_mac_addr_proess(padapter,info,pnetwork,start,stop,&iwe);     
+       start = iwe_stream_essid_proess(padapter,info,pnetwork,start,stop,&iwe);        
+       start = iwe_stream_protocol_process(padapter,info,pnetwork,start,stop,&iwe);
+       if (pnetwork->network.Reserved[0] == 2) // Probe Request
+       {
+               cap = 0;
+       }
+       else
+       {
+               _rtw_memcpy((u8 *)&cap, rtw_get_capability_from_ie(pnetwork->network.IEs), 2);
+               cap = le16_to_cpu(cap);
+       }
+
+       start = iwe_stream_mode_process(padapter,info,pnetwork,start,stop,&iwe,cap);    
+       start = iwe_stream_chan_process(padapter,info,pnetwork,start,stop,&iwe);        
+       start = iwe_stream_encryption_process(padapter,info,pnetwork,start,stop,&iwe,cap);      
+       start = iwe_stream_rate_process(padapter,info,pnetwork,start,stop,&iwe);        
+       start = iwe_stream_wpa_wpa2_process(padapter,info,pnetwork,start,stop,&iwe);
+       start = iwe_stream_wps_process(padapter,info,pnetwork,start,stop,&iwe);
+       start = iwe_stream_wapi_process(padapter,info,pnetwork,start,stop,&iwe);
+       start = iwe_stream_rssi_process(padapter,info,pnetwork,start,stop,&iwe);
+       start = iwe_stream_net_rsv_process(padapter,info,pnetwork,start,stop,&iwe);     
+       
+       return start;   
+}
+#else
+static char *translate_scan(_adapter *padapter, 
+                               struct iw_request_info* info, struct wlan_network *pnetwork,
+                               char *start, char *stop)
+{
+       struct iw_event iwe;
+       u16 cap;
+       u32 ht_ielen = 0, vht_ielen = 0;
+       char custom[MAX_CUSTOM_LEN];
+       char *p;
+       u16 max_rate=0, rate, ht_cap=_FALSE, vht_cap = _FALSE;
+       u32 i = 0;      
+       char    *current_val;
+       long rssi;
+       u8 bw_40MHz=0, short_GI=0, bw_160MHz=0, vht_highest_rate = 0;
+       u16 mcs_rate=0, vht_data_rate=0;
+       u8 ie_offset = (pnetwork->network.Reserved[0] == 2? 0:12);
+       struct registry_priv *pregpriv = &padapter->registrypriv;
+       
+       if(_FALSE == search_p2p_wfd_ie(padapter,info,pnetwork,start,stop))
+               return start;
 
        /*  AP MAC address  */
        iwe.cmd = SIOCGIWAP;
@@ -414,7 +933,7 @@ static char *translate_scan(_adapter *padapter,
 
        _rtw_memcpy(iwe.u.ap_addr.sa_data, pnetwork->network.MacAddress, ETH_ALEN);
        start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_ADDR_LEN);
-
+       
        /* Add the ESSID */
        iwe.cmd = SIOCGIWESSID;
        iwe.u.data.flags = 1;   
@@ -796,6 +1315,7 @@ static char *translate_scan(_adapter *padapter,
        
        return start;   
 }
+#endif
 
 static int wpa_set_auth_algs(struct net_device *dev, u32 value)
 {      
@@ -1404,12 +1924,18 @@ static int rtw_wx_get_name(struct net_device *dev,
                {
                        if(pcur_bss->Configuration.DSConfig > 14)
                        {
-                               if(vht_cap == _TRUE)
+                       #ifdef CONFIG_80211AC_VHT
+                               if(vht_cap == _TRUE){
                                        snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11AC");
-                               else if(ht_cap == _TRUE)
-                                       snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11an");
+                               }
                                else
-                                       snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11a");
+                       #endif
+                               {
+                                       if(ht_cap == _TRUE)
+                                               snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11an");
+                                       else
+                                               snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11a");
+                               }
                        }
                        else
                        {
@@ -6675,6 +7201,10 @@ exit:
 #ifdef CONFIG_IOL
 #include <rtw_iol.h>
 #endif
+
+#ifdef DBG_CMD_QUEUE
+u8 dump_cmd_id=0;
+#endif
 static int rtw_dbg_port(struct net_device *dev,
                                struct iw_request_info *info,
                                union iwreq_data *wrqu, char *extra)
@@ -7047,7 +7577,7 @@ static int rtw_dbg_port(struct net_device *dev,
                                                        pxmitpriv->free_xmit_extbuf_cnt, pxmitpriv->free_xframe_ext_cnt,
                                                        precvpriv->free_recvframe_cnt);
                                                #ifdef CONFIG_USB_HCI
-                                               DBG_871X("rx_urb_pending_cn=%d\n", precvpriv->rx_pending_cnt);
+                                               DBG_871X("rx_urb_pending_cn=%d\n", ATOMIC_READ(&(precvpriv->rx_pending_cnt)));
                                                #endif
                                        }
                                        break;  
@@ -7176,7 +7706,7 @@ static int rtw_dbg_port(struct net_device *dev,
                                                        
                                                        DBG_871X("enable driver ctrl rx_ampdu_factor = %d\n", extra_arg);       
        
-                                                       if((extra_arg & 0x03) > 0x03)
+                                                       if(extra_arg > 0x03)
                                                                padapter->driver_rx_ampdu_factor = 0xFF;                                                
                                                        else
                                                                padapter->driver_rx_ampdu_factor = extra_arg;
@@ -7211,7 +7741,22 @@ static int rtw_dbg_port(struct net_device *dev,
                                        break;
                                case 0x11://dump linked status
                                        {
-                                                linked_info_dump(padapter,extra_arg);
+                                               int pre_mode;
+                                               pre_mode=padapter->bLinkInfoDump;
+                                               // linked_info_dump(padapter,extra_arg);
+                                                if(extra_arg==1 || (extra_arg==0 && pre_mode==1) ) //not consider pwr_saving 0:
+                                               {
+                                                       padapter->bLinkInfoDump = extra_arg;    
+               
+                                               }
+                                               else if( (extra_arg==2 ) || (extra_arg==0 && pre_mode==2))//consider power_saving
+                                               {               
+                                               //DBG_871X("linked_info_dump =%s \n", (padapter->bLinkInfoDump)?"enable":"disable")
+                                                       linked_info_dump(padapter,extra_arg);   
+                                               }
+
+
+                                                
                                        }                                       
                                        break;
 #ifdef CONFIG_80211N_HT
@@ -7369,7 +7914,7 @@ static int rtw_dbg_port(struct net_device *dev,
                                                        
                                                        DBG_871X("enable driver ctrl ampdu density = %d\n", extra_arg); 
        
-                                                       if((extra_arg & 0x07) > 0x07)
+                                                       if(extra_arg > 0x07)
                                                                padapter->driver_ampdu_spacing = 0xFF;                                          
                                                        else
                                                                padapter->driver_ampdu_spacing = extra_arg;
@@ -7414,9 +7959,9 @@ static int rtw_dbg_port(struct net_device *dev,
                                            * dbg 0x7f250000 [gpio_num], Get gpio value, gpio_num:0~7
                                            */                
                               
-                                           int value;
+                                           u8 value;
                                            DBG_871X("Read GPIO Value  extra_arg = %d\n",extra_arg);
-                                           value = rtw_get_gpio(dev,extra_arg);
+                                           value = rtw_hal_get_gpio(padapter,extra_arg);
                                            DBG_871X("Read GPIO Value = %d\n",value);                                        
                                            break;
                                    }
@@ -7429,7 +7974,7 @@ static int rtw_dbg_port(struct net_device *dev,
                                         
                                            int value;
                                            DBG_871X("Set GPIO Direction! arg = %d ,extra_arg=%d\n",arg ,extra_arg);
-                                           value = rtw_config_gpio(dev, arg, extra_arg);
+                                           value = rtw_hal_config_gpio(padapter, arg, extra_arg);
                                            DBG_871X("Set GPIO Direction %s \n",(value==-1)?"Fail!!!":"Success");
                                            break;
                                        }
@@ -7442,11 +7987,19 @@ static int rtw_dbg_port(struct net_device *dev,
                                         
                                                int value;
                                                DBG_871X("Set GPIO Value! arg = %d ,extra_arg=%d\n",arg ,extra_arg);
-                                               value = rtw_set_gpio_output_value(dev,arg,extra_arg);
+                                               value = rtw_hal_set_gpio_output_value(padapter,arg,extra_arg);
                                                DBG_871X("Set GPIO Value %s \n",(value==-1)?"Fail!!!":"Success");
                                                break;
                                        }
-#endif                            
+#endif          
+#ifdef DBG_CMD_QUEUE
+                               case 0x28:
+                                       {
+                                               dump_cmd_id = extra_arg;
+                                               DBG_871X("dump_cmd_id:%d\n",dump_cmd_id);
+                                       }
+                                       break;
+#endif //DBG_CMD_QUEUE
                                case 0xaa:
                                        {
                                                if((extra_arg & 0x7F)> 0x3F) extra_arg = 0xFF;
@@ -8165,9 +8718,9 @@ static int rtw_add_sta(struct net_device *dev, struct ieee_param *param)
        if(psta)
        {
                DBG_871X("rtw_add_sta(), free has been added psta=%p\n", psta);
-               _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);          
+               //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);                
                rtw_free_stainfo(padapter,  psta);              
-               _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
+               //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
 
                psta = NULL;
        }       
@@ -9011,37 +9564,32 @@ static int rtw_wowlan_ctrl(struct net_device *dev,
 
        if (!check_fwstate(pmlmepriv, _FW_LINKED) && 
                        check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
+#ifdef CONFIG_PNO_SUPPORT
+                       pwrctrlpriv->wowlan_pno_enable = _TRUE;
+#else
                        DBG_871X("[%s] WARNING: Please Connect With AP First!!\n", __func__);
                        goto _rtw_wowlan_ctrl_exit_free;
+#endif //CONFIG_PNO_SUPPORT
        }
 
        if (_rtw_memcmp( extra, "enable", 6 )) {
 
                padapter->registrypriv.mp_mode = 1;
 
-               while (pwrctrlpriv->bips_processing == _TRUE)
-                       rtw_msleep_os(1);
-
-               rtw_ps_deny(padapter, PS_DENY_SUSPEND);
+               pwrctrlpriv->wowlan_from_cmd = _TRUE;
 
-               rtw_cancel_all_timer(padapter);
-
-#ifdef CONFIG_CONCURRENT_MODE
-               if (padapter->pbuddy_adapter){
-                       rtw_cancel_all_timer(padapter->pbuddy_adapter);
-               }
-#endif // CONFIG_CONCURRENT_MODE
+               rtw_suspend_common(padapter);
 
-               LeaveAllPowerSaveModeDirect(padapter);
+       } else if (_rtw_memcmp( extra, "disable", 6 )) {
 
-               rtw_stop_cmd_thread(padapter);
+               rtw_resume_common(padapter);
 
-               rtw_ps_deny_cancel(padapter, PS_DENY_SUSPEND);
+               pwrctrlpriv->wowlan_from_cmd = _FALSE;
 
-               rtw_suspend_wow(padapter);
+#ifdef CONFIG_PNO_SUPPORT
+               pwrctrlpriv->wowlan_pno_enable = _FALSE;
+#endif //CONFIG_PNO_SUPPORT
 
-       } else if (_rtw_memcmp( extra, "disable", 6 )) {
-               rtw_resume_process_wow(padapter);
                padapter->registrypriv.mp_mode = 0;
        } else {
                DBG_871X("[%s] Invalid Parameter.\n", __func__);
@@ -9844,7 +10392,7 @@ static int rtw_mp_efuse_set(struct net_device *dev,
        u8 *ShadowMapWiFi = NULL;
        u8 *setrawdata = NULL;
        char *pch, *ptmp, *token, *tmp[3]={0x00,0x00,0x00};
-       u16 addr=0, cnts=0, BTStatus=0 , max_available_size=0;
+       u16 addr=0xFF, cnts=0, BTStatus=0 , max_available_size=0;
        int err;
 
        wrqu = (struct iw_point*)wdata;
@@ -10099,7 +10647,20 @@ static int rtw_mp_efuse_set(struct net_device *dev,
                addr = EEPROM_MAC_ADDR_8723BU;
                #endif
                #endif // CONFIG_RTL8723B
-
+               
+               #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)
+               #ifdef CONFIG_SDIO_HCI
+                               addr = EEPROM_MAC_ADDR_8821AS;
+               #endif
+               #ifdef CONFIG_PCI_HCI
+                               addr = EEPROM_MAC_ADDR_8821AE;
+               #endif
+               #ifdef CONFIG_USB_HCI
+                               addr = EEPROM_MAC_ADDR_8821AU;
+               #endif
+               
+               #endif // CONFIG_RTL8812A/CONFIG_RTL8821A
+               
                cnts = strlen(tmp[1]);
                if (cnts%2)
                {
@@ -10873,6 +11434,8 @@ static int rtw_mp_read_rf(struct net_device *dev,
                                while( *pch != '\0' )
                                {
                                        pnext = strpbrk(pch, " ");
+                                       if (!pnext)
+                                               break;
                                        pnext++;
                                        if ( *pnext != '\0' )
                                        {
@@ -10934,8 +11497,10 @@ static int rtw_mp_start(struct net_device *dev,
        rtw_write32(padapter, 0x765, 0x0000);
        rtw_write32(padapter, 0x948, 0x0000);
 #endif 
+#ifdef CONFIG_FOR_RTL8723BS_VQ0
+       rtw_write32(padapter, 0x765, 0x0000);
+       rtw_write32(padapter, 0x948, 0x0280);
 #endif
-#ifdef CONFIG_RTL8723B
        rtw_write8(padapter, 0x66, 0x27); //Open BT uart Log
        rtw_write8(padapter, 0xc50, 0x20); //for RX init Gain
 #endif 
@@ -10981,19 +11546,26 @@ static int rtw_mp_rate(struct net_device *dev,
        if (copy_from_user(input, wrqu->pointer, wrqu->length))
                        return -EFAULT;
                        
-       rate = rtw_atoi(input);
-       sprintf( extra, "Set data rate to %d" , rate );
-               
+       rate = rtw_mpRateParseFunc(padapter,input);
+
+       if (rate ==0 && strcmp(input,"1M")!=0)
+       {
+       rate = rtw_atoi(input); 
        if(rate <= 0x7f)
                rate = wifirate2_ratetbl_inx( (u8)rate);        
-       else if (rate < 0x90)
-        //HT  rate 0x80(MCS0)        ~ 0x8F(MCS15)       128~143
+       else if (rate < 0xC8)
                rate =(rate - 0x80 + MPT_RATE_MCS0);
-       else 
+               //HT  rate 0x80(MCS0)  ~ 0x8F(MCS15) ~ 0x9F(MCS31) 128~159 
+        //VHT1SS~2SS rate 0xA0 (VHT1SS_MCS0 44) ~ 0xB3 (VHT2SS_MCS9 #63) 160~179
+        //VHT rate 0xB4 (VHT3SS_MCS0 64) ~ 0xC7 (VHT2SS_MCS9 #83) 180~199 
+       //else
                //VHT rate 0x90(VHT1SS_MCS0) ~ 0x99(VHT1SS_MCS9) 144~153
-               rate =(rate - MPT_RATE_VHT1SS_MCS0); 
+       //      rate =(rate - MPT_RATE_VHT1SS_MCS0); 
+       }
+       _rtw_memset(extra, 0, wrqu->length);
 
-       //DBG_871X("%s: rate=%d\n", __func__, rate);
+       sprintf( extra, "Set data rate to %s index %d" ,input,rate );
+       DBG_871X("%s: %s rate index=%d \n", __func__,input,rate);
        
        if (rate >= MPT_RATE_LAST )     
        return -EINVAL;
@@ -11001,7 +11573,7 @@ static int rtw_mp_rate(struct net_device *dev,
        padapter->mppriv.rateidx = rate;
        Hal_SetDataRate(padapter);
        
-       wrqu->length = strlen(extra) + 1;
+       wrqu->length = strlen(extra);
        return 0;
 }
 
@@ -11021,14 +11593,13 @@ static int rtw_mp_channel(struct net_device *dev,
        
        channel = rtw_atoi(input);
        //DBG_871X("%s: channel=%d\n", __func__, channel);
+       _rtw_memset(extra, 0, wrqu->length);
        sprintf( extra, "Change channel %d to channel %d", padapter->mppriv.channel , channel );
        padapter->mppriv.channel = channel;
-       pHalData->CurrentChannel = channel;
        Hal_SetChannel(padapter);
+       pHalData->CurrentChannel = channel;
 
-       //cur_ch_offset =  rtw_get_offset_by_ch(padapter->mppriv.channel);
-       //set_channel_bwmode(padapter, padapter->mppriv.channel, cur_ch_offset, padapter->mppriv.bandwidth);
-       wrqu->length = strlen(extra) + 1;
+       wrqu->length = strlen(extra);
        return 0;
 }
 
@@ -11055,10 +11626,10 @@ static int rtw_mp_bandwidth(struct net_device *dev,
        DBG_871X("%s: bw=%d sg=%d \n", __func__, bandwidth , sg);
        
        padapter->mppriv.bandwidth = (u8)bandwidth;
-       pHalData->CurrentChannelBW = bandwidth;
        padapter->mppriv.preamble = sg;
        
        SetBandwidth(padapter);
+       pHalData->CurrentChannelBW = bandwidth;
        //cur_ch_offset =  rtw_get_offset_by_ch(padapter->mppriv.channel);
        //set_channel_bwmode(padapter, padapter->mppriv.channel, cur_ch_offset, bandwidth);
 
@@ -11084,7 +11655,7 @@ static int rtw_mp_txpower_index(struct net_device *dev,
        rfpath = rtw_atoi(input);
        txpower_inx = mpt_ProQueryCalTxPower(padapter, rfpath);
        sprintf(extra, " %d", txpower_inx);
-       wrqu->length = strlen(extra) + 1;
+       wrqu->length = strlen(extra);
 
        return 0;
 }
@@ -11118,7 +11689,7 @@ static int rtw_mp_txpower(struct net_device *dev,
        padapter->mppriv.bSetTxPower = 1;
                Hal_SetAntennaPathPower(padapter);
        }
-       wrqu->length = strlen(extra) + 1;
+       wrqu->length = strlen(extra);
        return 0;
 }
 
@@ -11136,7 +11707,7 @@ static int rtw_mp_ant_tx(struct net_device *dev,
                        
        //DBG_871X("%s: input=%s\n", __func__, input);  
        
-       sprintf( extra, "switch Tx antenna to %s", input );
+       sprintf( extra, "switch Tx antenna to %s", input);
        
        for (i=0; i < strlen(input); i++)
        {
@@ -11153,11 +11724,12 @@ static int rtw_mp_ant_tx(struct net_device *dev,
        //antenna |= BIT(extra[i]-'a');
        //DBG_871X("%s: antenna=0x%x\n", __func__, antenna);            
        padapter->mppriv.antenna_tx = antenna;
+       padapter->mppriv.antenna_rx = antenna;
        //DBG_871X("%s:mppriv.antenna_rx=%d\n", __func__, padapter->mppriv.antenna_tx);
        
        Hal_SetAntenna(padapter);
 
-       wrqu->length = strlen(extra) + 1;
+       wrqu->length = strlen(extra);
        return 0;
 }
 
@@ -11193,6 +11765,7 @@ static int rtw_mp_ant_rx(struct net_device *dev,
        }
        
        //DBG_871X("%s: antenna=0x%x\n", __func__, antenna);            
+       padapter->mppriv.antenna_tx = antenna;
        padapter->mppriv.antenna_rx = antenna;
        //DBG_871X("%s:mppriv.antenna_rx=%d\n", __func__, padapter->mppriv.antenna_rx);
        Hal_SetAntenna(padapter);
@@ -11680,7 +12253,7 @@ static int rtw_mp_thermal(struct net_device *dev,
                        struct iw_point *wrqu, char *extra)
 {
        u8 val;
-       u16 bwrite=1;
+       int bwrite=1;
        
        #ifdef CONFIG_RTL8192C
                        u16 addr=EEPROM_THERMAL_METER_92C;
@@ -11921,7 +12494,7 @@ static int rtw_mp_PwrCtlDM(struct net_device *dev,
 {
        PADAPTER padapter = rtw_netdev_priv(dev);
        u8              input[wrqu->length];
-       u8              bstart=1;
+       int             bstart=1;
        
        if (copy_from_user(input, wrqu->pointer, wrqu->length))
                        return -EFAULT;
@@ -11939,6 +12512,23 @@ static int rtw_mp_PwrCtlDM(struct net_device *dev,
        return 0;
 }
 
+static int rtw_mp_getver(struct net_device *dev,
+                       struct iw_request_info *info,
+                       union iwreq_data *wrqu, char *extra)
+{
+       PADAPTER padapter = rtw_netdev_priv(dev);
+       struct mp_priv *pmp_priv;
+       
+       pmp_priv = &padapter->mppriv;
+       
+       if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
+                       return -EFAULT;
+
+       sprintf(extra, "rtwpriv=%d\n",RTWPRIV_VER_INFO);
+       wrqu->data.length = strlen(extra);
+       return 0;
+}
+
 #if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B))
 /* update Tx AGC offset */
 static int rtw_mp_SetBT(struct net_device *dev,
@@ -12162,7 +12752,7 @@ static int rtw_mp_SetBT(struct net_device *dev,
        if ( strncmp(extra, "h2c", 3) == 0){
                        DBG_871X("SetBT h2c !\n");
                        padapter->bBTFWReady = _TRUE;
-                       FillH2CCmd(padapter, 0x63, 1, u1H2CBtMpOperParm);
+                       rtw_hal_fill_h2c_cmd(padapter, 0x63, 1, u1H2CBtMpOperParm);
                        goto exit;
                }
        if ( strncmp(extra, "2ant", 4) == 0){
@@ -12534,7 +13124,10 @@ static int rtw_mp_get(struct net_device *dev,
                        DBG_871X("mp_get MP_GET_TXPOWER_INX \n");
                        rtw_mp_txpower_index(dev,info,wrqu,extra);
                break;
-
+       case MP_GETVER:
+                       DBG_871X("mp_get MP_GETVER \n");
+                       rtw_mp_getver(dev,info,wdata,extra);
+                       break;
 #if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)
        case MP_SetBT:          
                        DBG_871X("set MP_SetBT \n");
@@ -13334,6 +13927,14 @@ extern void rtl8723b_cal_txdesc_chksum(struct tx_desc *ptxdesc);
 extern void rtl8723b_fill_default_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf);
 #define fill_default_txdesc rtl8723b_fill_default_txdesc
 #endif // CONFIG_RTL8723B
+#if defined(CONFIG_RTL8192E)
+extern void rtl8192e_cal_txdesc_chksum(struct tx_desc *ptxdesc);
+#define cal_txdesc_chksum rtl8192e_cal_txdesc_chksum
+#ifdef CONFIG_SDIO_HCI || defined(CONFIG_GSPI_HCI)
+extern void rtl8192es_fill_default_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf);
+#define fill_default_txdesc rtl8192es_fill_default_txdesc
+#endif // CONFIG_SDIO_HCI
+#endif //CONFIG_RTL8192E
 
 static s32 initLoopback(PADAPTER padapter)
 {
@@ -14081,64 +14682,6 @@ static iw_handler rtw_handlers[] =
        NULL,                                   /*---hole---*/
 }; 
 
-#if 0
-//defined(CONFIG_MP_INCLUDED) && defined(CONFIG_MP_IWPRIV_SUPPORT)
-static const struct iw_priv_args rtw_private_args[] =
-{      
-       { SIOCIWFIRSTPRIV + 0x00, IW_PRIV_TYPE_CHAR | 1024, 0 , ""},  //set 
-       { SIOCIWFIRSTPRIV + 0x01, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK , ""},//get
-/* --- sub-ioctls definitions --- */   
-               { MP_START , IW_PRIV_TYPE_CHAR | 1024, 0, "mp_start" }, //set
-               { MP_PHYPARA, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_phypara" },//get
-               { MP_STOP , IW_PRIV_TYPE_CHAR | 1024, 0, "mp_stop" }, //set
-               { MP_CHANNEL , IW_PRIV_TYPE_CHAR | 1024 , IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_channel" },//get
-               { MP_BANDWIDTH , IW_PRIV_TYPE_CHAR | 1024, 0, "mp_bandwidth"}, //set
-               { MP_RATE , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_rate" },//get
-               { MP_RESET_STATS , IW_PRIV_TYPE_CHAR | 1024, 0, "mp_reset_stats"},
-               { MP_QUERY , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK , "mp_query"}, //get
-               { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
-               { READ_REG , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "read_reg" },
-               { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
-               { MP_RATE , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_rate" },
-               { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
-               { READ_RF , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "read_rf" },
-               { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
-               { MP_PSD , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_psd"}, 
-               { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
-               { MP_DUMP, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_dump" },
-               { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
-               { MP_TXPOWER , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_txpower"},
-               { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
-               { MP_ANT_TX , IW_PRIV_TYPE_CHAR | 1024,  IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_ant_tx"},
-               { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
-               { MP_ANT_RX , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_ant_rx"},
-               { WRITE_REG, IW_PRIV_TYPE_CHAR | 1024, 0,"write_reg"},//set
-               { MP_NULL, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "NULL" },
-               { WRITE_RF, IW_PRIV_TYPE_CHAR | 1024, 0,"write_rf"},//set
-               { MP_NULL, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "NULL" },
-               { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
-               { MP_CTX , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_ctx"},
-               { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
-               { MP_ARX , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_arx"},
-               { MP_NULL, IW_PRIV_TYPE_CHAR | 128, 0,"NULL"},//set
-               { MP_THER , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_ther"},
-               { EFUSE_SET, IW_PRIV_TYPE_CHAR | 1024, 0, "efuse_set" },
-               { EFUSE_GET, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "efuse_get" },
-               { MP_PWRTRK , IW_PRIV_TYPE_CHAR | 1024, 0, "mp_pwrtrk"},
-               { MP_QueryDrvStats, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_drvquery" },
-               { MP_IOCTL, IW_PRIV_TYPE_CHAR | 1024, 0, "mp_ioctl"}, // mp_ioctl       
-               { MP_SetRFPathSwh, IW_PRIV_TYPE_CHAR | 1024, 0, "mp_setrfpath" },
-#ifdef CONFIG_RTL8723A
-               { MP_SetBT, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_setbt" },
-#endif
-       { SIOCIWFIRSTPRIV + 0x02, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK , "test"},//set
-};
-static iw_handler rtw_private_handler[] = 
-{
-       rtw_mp_set,
-       rtw_mp_get,
-};
-#else // not inlucde MP
 
 static const struct iw_priv_args rtw_private_args[] = {
        {
@@ -14290,6 +14833,7 @@ static const struct iw_priv_args rtw_private_args[] = {
                { MP_SetRFPathSwh, IW_PRIV_TYPE_CHAR | 1024, 0, "mp_setrfpath" },               
                { MP_PwrCtlDM, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_pwrctldm" },                
                { MP_GET_TXPOWER_INX, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_get_txpower" },
+               { MP_GETVER, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_priv_ver" },
                
 #if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)
                { MP_SetBT, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_setbt" },
@@ -14364,7 +14908,6 @@ static iw_handler rtw_private_handler[] =
 #endif // CONFIG_INTEL_WIDI
 };
 
-#endif // #if defined(CONFIG_MP_INCLUDED) && defined(CONFIG_MP_IWPRIV_SUPPORT)
 
 #if WIRELESS_EXT >= 17 
 static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev)
@@ -14415,7 +14958,9 @@ static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev)
                        //ODM_InbandNoise_Monitor(podmpriv,_TRUE,0x20,100);
                        rtw_ps_deny_cancel(padapter, PS_DENY_IOCTL);
                        rtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(info.chan), &(padapter->recvpriv.noise)); 
+                       #ifdef DBG_NOISE_MONITOR
                        DBG_871X("chan:%d,noise_level:%d\n",info.chan,padapter->recvpriv.noise);
+                       #endif
                }
 #endif         
                tmp_noise = padapter->recvpriv.noise;
@@ -14487,7 +15032,8 @@ static int get_priv_size(__u16 args)
 }
 // copy from net/wireless/wext.c end
 
-static int rtw_ioctl_wext_private(struct net_device *dev, union iwreq_data *wrq_data)
+
+static int _rtw_ioctl_wext_private(struct net_device *dev, union iwreq_data *wrq_data)
 {
        int err = 0;
        u8 *input = NULL;
@@ -14517,10 +15063,9 @@ static int rtw_ioctl_wext_private(struct net_device *dev, union iwreq_data *wrq_
 
        union iwreq_data wdata;
 
-
        _rtw_memcpy(&wdata, wrq_data, sizeof(wdata));
 
-       input_len = 2048;
+       input_len = wdata.data.length;
        input = rtw_zmalloc(input_len);
        if (NULL == input)
                return -ENOMEM;
@@ -14529,18 +15074,17 @@ static int rtw_ioctl_wext_private(struct net_device *dev, union iwreq_data *wrq_
                goto exit;
        }
        ptr = input;
-       len = strlen(input);
-
+       len = input_len;
        sscanf(ptr, "%16s", cmdname);
        cmdlen = strlen(cmdname);
-       DBG_8192C("%s: cmd=%s\n", __func__, cmdname);
+       DBG_871X("%s: cmd=%s\n", __func__, cmdname);
 
        // skip command string
        if (cmdlen > 0)
                cmdlen += 1; // skip one space
        ptr += cmdlen;
        len -= cmdlen;
-       DBG_8192C("%s: parameters=%s\n", __func__, ptr);
+       DBG_871X("%s: parameters=%s\n", __func__, ptr);
 
        priv = rtw_private_handler;
        priv_args = rtw_private_args;
@@ -14826,6 +15370,61 @@ exit:
        return err;
 }
 
+#ifdef CONFIG_COMPAT
+static int rtw_ioctl_compat_wext_private(struct net_device *dev, struct ifreq *rq)
+{
+       struct compat_iw_point iwp_compat;
+       union iwreq_data wrq_data;
+       int err = 0;
+       DBG_871X("%s:...\n", __func__);
+       if (copy_from_user(&iwp_compat, rq->ifr_ifru.ifru_data, sizeof(struct compat_iw_point)))
+                       return -EFAULT;
+       
+       wrq_data.data.pointer = compat_ptr(iwp_compat.pointer);
+       wrq_data.data.length = iwp_compat.length;
+       wrq_data.data.flags = iwp_compat.flags;
+
+       err = _rtw_ioctl_wext_private(dev, &wrq_data);
+
+       iwp_compat.pointer = ptr_to_compat(wrq_data.data.pointer);
+       iwp_compat.length = wrq_data.data.length;
+       iwp_compat.flags = wrq_data.data.flags;
+       if (copy_to_user(rq->ifr_ifru.ifru_data, &iwp_compat, sizeof(struct compat_iw_point)))
+                       return -EFAULT;
+
+       return err;
+}
+#endif // CONFIG_COMPAT
+
+static int rtw_ioctl_standard_wext_private(struct net_device *dev, struct ifreq *rq)
+{
+       struct iw_point *iwp;
+       struct ifreq ifrq;
+       union iwreq_data wrq_data;
+       int err = 0;
+       iwp = &wrq_data.data;
+       DBG_871X("%s:...\n", __func__);
+       if (copy_from_user(iwp, rq->ifr_ifru.ifru_data, sizeof(struct iw_point)))
+               return -EFAULT;
+
+       err = _rtw_ioctl_wext_private(dev, &wrq_data);
+
+       if (copy_to_user(rq->ifr_ifru.ifru_data, iwp, sizeof(struct iw_point)))
+               return -EFAULT;
+
+       return err;
+}
+static int rtw_ioctl_wext_private(struct net_device *dev, struct ifreq *rq)
+{
+#ifdef CONFIG_COMPAT
+       if(is_compat_task())
+               return rtw_ioctl_compat_wext_private( dev, rq );
+       else
+#endif // CONFIG_COMPAT
+               return rtw_ioctl_standard_wext_private( dev, rq );
+}
+
 int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
 {
        struct iwreq *wrq = (struct iwreq *)rq;
@@ -14846,8 +15445,8 @@ int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                        break;
 #endif
 #endif // CONFIG_AP_MODE
-               case SIOCDEVPRIVATE:
-                       ret = rtw_ioctl_wext_private(dev, &wrq->u);
+               case SIOCDEVPRIVATE:                            
+                        ret = rtw_ioctl_wext_private(dev, rq);
                        break;
                case (SIOCDEVPRIVATE+1):
                        ret = rtw_android_priv_cmd(dev, rq, cmd);
index c2cc56d6e231b909339fe72198a76a04d2639e59..ba0ab12f46e6d3014d16729334cb2b316430d7eb 100755 (executable)
@@ -464,11 +464,7 @@ static int mgnt_netdev_open(struct net_device *pnetdev)
 
        init_usb_anchor(&phostapdpriv->anchored);
        
-       if(!rtw_netif_queue_stopped(pnetdev))
-               rtw_netif_start_queue(pnetdev);
-       else
-               rtw_netif_wake_queue(pnetdev);
-
+       rtw_netif_wake_queue(pnetdev);
 
        netif_carrier_on(pnetdev);
                
@@ -486,9 +482,8 @@ static int mgnt_netdev_close(struct net_device *pnetdev)
 
        netif_carrier_off(pnetdev);
 
-       if (!rtw_netif_queue_stopped(pnetdev))
-               rtw_netif_stop_queue(pnetdev);
-       
+       rtw_netif_stop_queue(pnetdev);
+
        //rtw_write16(phostapdpriv->padapter, 0x0116, 0x3f3f);
        
        return 0;       
index f8a0e06a3be12b32a93d1227076e9f0a23d1ef4d..1eef779c4292d0a6ea94a017f5cfc9b86eb34844 100755 (executable)
@@ -54,7 +54,11 @@ int rtw_adhoc_tx_pwr = 1;
 int rtw_soft_ap = 0;
 //int smart_ps = 1;
 #ifdef CONFIG_POWER_SAVING
-int rtw_power_mgnt = 1;
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+int rtw_power_mgnt = PS_MODE_MAX;
+#else
+int rtw_power_mgnt = PS_MODE_MIN;
+#endif 
 #ifdef CONFIG_IPS_LEVEL_2
 int rtw_ips_mode = IPS_LEVEL_2;
 #else
@@ -213,7 +217,11 @@ char* ifname = "wlan%d";
 module_param(ifname, charp, 0644);
 MODULE_PARM_DESC(ifname, "The default name to allocate for first interface");
 
-char* if2name = "p2p0";
+#ifdef CONFIG_PLATFORM_ANDROID
+char* if2name = "p2p%d";
+#else //CONFIG_PLATFORM_ANDROID
+char* if2name = "wlan%d";
+#endif //CONFIG_PLATFORM_ANDROID
 module_param(if2name, charp, 0644);
 MODULE_PARM_DESC(if2name, "The default name to allocate for second interface");
 
@@ -332,6 +340,30 @@ uint rtw_adaptivity_mode = CONFIG_RTW_ADAPTIVITY_MODE;
 module_param(rtw_adaptivity_mode, uint, 0644);
 MODULE_PARM_DESC(rtw_adaptivity_mode, "0:normal, 1:carrier sense");
 
+uint rtw_nhm_en = CONFIG_RTW_NHM_EN;
+module_param(rtw_nhm_en, uint, 0644);
+MODULE_PARM_DESC(rtw_nhm_en, "0:disable, 1:enable");
+
+uint rtw_amplifier_type_2g = CONFIG_RTW_AMPLIFIER_TYPE_2G;
+module_param(rtw_amplifier_type_2g, uint, 0644);
+MODULE_PARM_DESC(rtw_amplifier_type_2g, "BIT3:2G ext-PA, BIT4:2G ext-LNA");
+
+uint rtw_amplifier_type_5g = CONFIG_RTW_AMPLIFIER_TYPE_5G;
+module_param(rtw_amplifier_type_5g, uint, 0644);
+MODULE_PARM_DESC(rtw_amplifier_type_5g, "BIT6:5G ext-PA, BIT7:5G ext-LNA");
+
+uint rtw_RFE_type = 64;
+module_param(rtw_RFE_type, uint, 0644);
+MODULE_PARM_DESC(rtw_RFE_type, "default init value:64");
+
+uint rtw_TxBBSwing_2G = 0xFF;
+module_param(rtw_TxBBSwing_2G, uint, 0644);
+MODULE_PARM_DESC(rtw_TxBBSwing_2G, "default init value:0xFF");
+
+uint rtw_TxBBSwing_5G = 0xFF;
+module_param(rtw_TxBBSwing_5G, uint, 0644);
+MODULE_PARM_DESC(rtw_TxBBSwing_5G, "default init value:0xFF");
+
 #if defined(CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY) //eFuse: Regulatory selection=1
 int rtw_tx_pwr_lmt_enable = 1;
 int rtw_tx_pwr_by_rate = 1;
@@ -355,7 +387,7 @@ module_param(rtw_tx_pwr_by_rate, int, 0644);
 MODULE_PARM_DESC(rtw_tx_pwr_by_rate,"0:Disable, 1:Enable, 2: Depend on efuse");
 
 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
-char *rtw_phy_file_path = "";
+char *rtw_phy_file_path = REALTEK_CONFIG_PATH;
 module_param(rtw_phy_file_path, charp, 0644);
 MODULE_PARM_DESC(rtw_phy_file_path, "The path of phy parameter");
 // PHY FILE Bit Map
@@ -378,6 +410,9 @@ static uint loadparam(PADAPTER padapter, _nic_hdl pnetdev);
 int _netdev_open(struct net_device *pnetdev);
 int netdev_open (struct net_device *pnetdev);
 static int netdev_close (struct net_device *pnetdev);
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+extern int rtw_sdio_set_power(int on);
+#endif //CONFIG_PLATFORM_INTEL_BYT
 
 //#ifdef RTK_DMP_PLATFORM
 uint loadparam( _adapter *padapter,  _nic_hdl  pnetdev)
@@ -539,10 +574,12 @@ _func_enter_;
        registry_par->RegEnableTxPowerByRate = (u8)rtw_tx_pwr_by_rate;
 
        registry_par->RegPowerBase = 14;
-       registry_par->TxBBSwing_2G = 0xFF;
-       registry_par->TxBBSwing_5G = 0xFF;
+       registry_par->TxBBSwing_2G = (s8)rtw_TxBBSwing_2G;
+       registry_par->TxBBSwing_5G = (s8)rtw_TxBBSwing_5G;
        registry_par->bEn_RFE = 1;
-       registry_par->RFE_Type = 64;
+       registry_par->RFE_Type = (u8)rtw_RFE_type;
+       registry_par->AmplifierType_2G = (u8)rtw_amplifier_type_2g;
+       registry_par->AmplifierType_5G = (u8)rtw_amplifier_type_5g;
 
 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
        registry_par->load_phy_file = (u8)rtw_load_phy_file;
@@ -551,8 +588,11 @@ _func_enter_;
        registry_par->qos_opt_enable = (u8)rtw_qos_opt_enable;
 
        registry_par->hiq_filter = (u8)rtw_hiq_filter;
+
        registry_par->adaptivity_en = (u8)rtw_adaptivity_en;
        registry_par->adaptivity_mode = (u8)rtw_adaptivity_mode;
+       registry_par->nhm_en = (u8)rtw_nhm_en;
+
 _func_exit_;
 
        return status;
@@ -626,14 +666,16 @@ unsigned int rtw_classify8021d(struct sk_buff *skb)
        return dscp >> 5;
 }
 
 static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
-                       , void *accel_priv
-#endif // kernle >= 3.13
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
-                       , select_queue_fallback_t fallback
-#endif // kernel >= 3.14
-       )
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)     
+                               , void *accel_priv
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) 
+                               , select_queue_fallback_t fallback
+#endif
+
+#endif
+)
 {
        _adapter        *padapter = rtw_netdev_priv(dev);
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
@@ -677,14 +719,13 @@ u16 rtw_recv_select_queue(struct sk_buff *skb)
 }
 
 #endif
-
 static int rtw_ndev_notifier_call(struct notifier_block * nb, unsigned long state, void *ptr)
-{
+{      
 #if (LINUX_VERSION_CODE>=KERNEL_VERSION(3,11,0))
        struct net_device *dev = netdev_notifier_info_to_dev(ptr);
-#else // kernel < 3.11
+#else
        struct net_device *dev = ptr;
-#endif // kernel < 3.11
+#endif
 
 #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))
        if (dev->netdev_ops->ndo_do_ioctl != rtw_ioctl)
@@ -1052,8 +1093,10 @@ u8 rtw_init_default_value(_adapter *padapter)
 
        //for debug purpose
        padapter->fix_rate = 0xFF;
+       padapter->data_fb = 0;
        padapter->driver_ampdu_spacing = 0xFF;
        padapter->driver_rx_ampdu_factor =  0xFF;
+       padapter->driver_rx_ampdu_spacing = 0xFF;
        padapter->fix_ba_rxbuf_bz = 0xFF;
 
        return ret;
@@ -1073,17 +1116,15 @@ struct dvobj_priv *devobj_init(void)
        _rtw_mutex_init(&pdvobj->setch_mutex);
        _rtw_mutex_init(&pdvobj->setbw_mutex);
 
-       _rtw_spinlock_init(&pdvobj->lock);
-
-       pdvobj->macid[1] = _TRUE; //macid=1 for bc/mc stainfo
-
        pdvobj->processing_dev_remove = _FALSE;
 
        ATOMIC_SET(&pdvobj->disable_func, 0);
 
+       rtw_macid_ctl_init(&pdvobj->macid_ctl);
        _rtw_spinlock_init(&pdvobj->cam_ctl.lock);
 
        return pdvobj;
+
 }
 
 void devobj_deinit(struct dvobj_priv *pdvobj)
@@ -1091,17 +1132,16 @@ void devobj_deinit(struct dvobj_priv *pdvobj)
        if(!pdvobj)
                return;
 
-       _rtw_spinlock_free(&pdvobj->lock);
-
        _rtw_mutex_free(&pdvobj->hw_init_mutex);
        _rtw_mutex_free(&pdvobj->h2c_fwcmd_mutex);
        _rtw_mutex_free(&pdvobj->setch_mutex);
        _rtw_mutex_free(&pdvobj->setbw_mutex);
 
+       rtw_macid_ctl_deinit(&pdvobj->macid_ctl);
        _rtw_spinlock_free(&pdvobj->cam_ctl.lock);
 
        rtw_mfree((u8*)pdvobj, sizeof(*pdvobj));
-}
+}      
 
 u8 rtw_reset_drv_sw(_adapter *padapter)
 {
@@ -1162,8 +1202,6 @@ _func_enter_;
 
        ret8 = rtw_init_default_value(padapter);
 
-       rtw_init_hal_com_default_value(padapter);
-
        if ((rtw_init_cmd_priv(&padapter->cmdpriv)) == _FAIL)
        {
                RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init cmd_priv\n"));
@@ -1248,6 +1286,7 @@ _func_enter_;
        padapter->stapriv.padapter = padapter;
        padapter->setband = GHZ24_50;
        padapter->fix_rate = 0xFF;
+       padapter->data_fb = 0;
        padapter->fix_ba_rxbuf_bz = 0xFF;
        rtw_init_bcmc_stainfo(padapter);
 
@@ -1482,11 +1521,7 @@ int _netdev_vir_if_open(struct net_device *pnetdev)
 
        _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
 
-       if(!rtw_netif_queue_stopped(pnetdev))
-               rtw_netif_start_queue(pnetdev);
-       else
-               rtw_netif_wake_queue(pnetdev);
-
+       rtw_netif_wake_queue(pnetdev);
 
        DBG_871X(FUNC_NDEV_FMT" exit\n", FUNC_NDEV_ARG(pnetdev));
        return 0;
@@ -1527,8 +1562,7 @@ static int netdev_vir_if_close(struct net_device *pnetdev)
 
        if(pnetdev)
        {
-               if (!rtw_netif_queue_stopped(pnetdev))
-                       rtw_netif_stop_queue(pnetdev);
+               rtw_netif_stop_queue(pnetdev);
        }
 
 #ifdef CONFIG_IOCTL_CFG80211
@@ -1800,6 +1834,42 @@ int _netdev_if2_open(struct net_device *pnetdev)
 
        DBG_871X("+871x_drv - if2_open, bup=%d\n", padapter->bup);
 
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+       if (padapter->bup == _FALSE)
+       {
+               u8 mac[ETH_ALEN];
+
+               //get mac address from primary_padapter
+               if (primary_padapter->bup == _FALSE)
+                       rtw_macaddr_cfg(primary_padapter->eeprompriv.mac_addr);
+
+               _rtw_memcpy(mac, primary_padapter->eeprompriv.mac_addr, ETH_ALEN);
+
+               if (((mac[0] == 0xff) && (mac[1] == 0xff) && (mac[2] == 0xff) &&
+                    (mac[3] == 0xff) && (mac[4] == 0xff) && (mac[5] == 0xff)) ||
+                   ((mac[0] == 0x0) && (mac[1] == 0x0) && (mac[2] == 0x0) &&
+                    (mac[3] == 0x0) && (mac[4] == 0x0) && (mac[5] == 0x0)))
+               {
+                       mac[0] = 0x00;
+                       mac[1] = 0xe0;
+                       mac[2] = 0x4c;
+                       mac[3] = 0x87;
+                       mac[4] = 0x11;
+                       mac[5] = 0x22;
+               }
+               else
+               {
+                       //If the BIT1 is 0, the address is universally administered.
+                       //If it is 1, the address is locally administered
+                       mac[0] |= BIT(1); // locally administered
+               }
+
+               _rtw_memcpy(padapter->eeprompriv.mac_addr, mac, ETH_ALEN);
+               rtw_init_wifidirect_addrs(padapter, padapter->eeprompriv.mac_addr, padapter->eeprompriv.mac_addr);
+               _rtw_memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN);
+       }
+#endif //CONFIG_PLATFORM_INTEL_BYT
+
        if(primary_padapter->bup == _FALSE || primary_padapter->hw_init_completed == _FALSE)
        {
                _netdev_open(primary_padapter->pnetdev);
@@ -1845,10 +1915,7 @@ int _netdev_if2_open(struct net_device *pnetdev)
        // secondary interface shares the timer with primary interface.
        //_set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
 
-       if(!rtw_netif_queue_stopped(pnetdev))
-               rtw_netif_start_queue(pnetdev);
-       else
-               rtw_netif_wake_queue(pnetdev);
+       rtw_netif_wake_queue(pnetdev);
 
        DBG_871X("-871x_drv - if2_open, bup=%d\n", padapter->bup);
        return 0;
@@ -1870,9 +1937,9 @@ int netdev_if2_open(struct net_device *pnetdev)
        _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
        struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
 
-
-       if (pwrctrlpriv->bInSuspend == _TRUE) {
-               DBG_871X(FUNC_ADPT_FMT ": bInSuspend=%d\n", FUNC_ADPT_ARG(padapter), pwrctrlpriv->bInSuspend);
+       if (pwrctrlpriv->bInSuspend == _TRUE)
+       {
+               DBG_871X("+871x_drv - netdev_if2_open, bInSuspend=%d\n", pwrctrlpriv->bInSuspend);
                return 0;
        }
 
@@ -1896,8 +1963,7 @@ static int netdev_if2_close(struct net_device *pnetdev)
 
        if(pnetdev)
        {
-               if (!rtw_netif_queue_stopped(pnetdev))
-                       rtw_netif_stop_queue(pnetdev);
+               rtw_netif_stop_queue(pnetdev);
        }
 
 #ifdef CONFIG_P2P
@@ -2243,6 +2309,10 @@ int _netdev_open(struct net_device *pnetdev)
 
        padapter->netif_up = _TRUE;
 
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+       rtw_sdio_set_power(1);
+#endif //CONFIG_PLATFORM_INTEL_BYT
+
        if(pwrctrlpriv->ps_flag == _TRUE){
                padapter->net_closed = _FALSE;
                goto netdev_open_normal_process;
@@ -2250,6 +2320,12 @@ int _netdev_open(struct net_device *pnetdev)
 
        if(padapter->bup == _FALSE)
        {
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+               rtw_macaddr_cfg(padapter->eeprompriv.mac_addr);
+               rtw_init_wifidirect_addrs(padapter, padapter->eeprompriv.mac_addr, padapter->eeprompriv.mac_addr);
+               _rtw_memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN);
+#endif //CONFIG_PLATFORM_INTEL_BYT
+
                padapter->bDriverStopped = _FALSE;
                padapter->bSurpriseRemoved = _FALSE;
                padapter->bCardDisableWOHSM = _FALSE;
@@ -2287,6 +2363,12 @@ int _netdev_open(struct net_device *pnetdev)
 
                padapter->bup = _TRUE;
                pwrctrlpriv->bips_processing = _FALSE;
+
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+#ifdef CONFIG_BT_COEXIST       
+               rtw_btcoex_IpsNotify(padapter, IPS_NONE);
+#endif // CONFIG_BT_COEXIST
+#endif //CONFIG_PLATFORM_INTEL_BYT             
        }
        padapter->net_closed = _FALSE;
 
@@ -2297,10 +2379,7 @@ int _netdev_open(struct net_device *pnetdev)
 #endif 
 
        //netif_carrier_on(pnetdev);//call this func when rtw_joinbss_event_callback return success
-       if(!rtw_netif_queue_stopped(pnetdev))
-               rtw_netif_start_queue(pnetdev);
-       else
-               rtw_netif_wake_queue(pnetdev);
+       rtw_netif_wake_queue(pnetdev);
 
 #ifdef CONFIG_BR_EXT
        netdev_br_init(pnetdev);
@@ -2495,6 +2574,7 @@ static int netdev_close(struct net_device *pnetdev)
 
        RT_TRACE(_module_os_intfs_c_,_drv_info_,("+871x_drv - drv_close\n"));
 
+#ifndef CONFIG_PLATFORM_INTEL_BYT
        if(pwrctl->bInternalAutoSuspend == _TRUE)
        {
                //rtw_pwr_wakeup(padapter);
@@ -2519,8 +2599,7 @@ static int netdev_close(struct net_device *pnetdev)
                //s1.
                if(pnetdev)
                {
-                       if (!rtw_netif_queue_stopped(pnetdev))
-                               rtw_netif_stop_queue(pnetdev);
+                       rtw_netif_stop_queue(pnetdev);
                }
 
 #ifndef CONFIG_ANDROID
@@ -2559,6 +2638,24 @@ static int netdev_close(struct net_device *pnetdev)
 #ifdef CONFIG_WAPI_SUPPORT
        rtw_wapi_disable_tx(padapter);
 #endif
+#else //!CONFIG_PLATFORM_INTEL_BYT
+
+       if (pwrctl->bInSuspend == _TRUE)
+       {
+               DBG_871X("+871x_drv - drv_close, bInSuspend=%d\n", pwrctl->bInSuspend);
+               return 0;
+       }
+
+       rtw_scan_abort(padapter); // stop scanning process before wifi is going to down
+
+       DBG_871X("netdev_close, bips_processing=%d\n", pwrctl->bips_processing);
+       while (pwrctl->bips_processing == _TRUE) // waiting for ips_processing done before call rtw_dev_unload()
+               rtw_msleep_os(1);       
+
+       rtw_dev_unload(padapter);
+       rtw_sdio_set_power(0);
+
+#endif //!CONFIG_PLATFORM_INTEL_BYT
 
        RT_TRACE(_module_os_intfs_c_,_drv_info_,("-871x_drv - drv_close\n"));
        DBG_871X("-871x_drv - drv_close, bup=%d\n", padapter->bup);
@@ -2839,11 +2936,17 @@ static int get_defaultgw(u32 *ip_addr ,char mac[])
 int    rtw_gw_addr_query(_adapter *padapter)
 {
        struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
+       struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
        u32 gw_addr = 0; // default gw address
        unsigned char gw_mac[32] = {0}; // default gw mac
        int i;
        int res;
 
+       if (pwrctl->wowlan_from_cmd == _TRUE) {
+               DBG_871X("%s: return cuz wowlan_from_cmd\n", __func__);
+               return 0;
+       }
+
        res = get_defaultgw(&gw_addr, gw_mac);
        if(!res)
        {
@@ -2951,14 +3054,19 @@ int rtw_suspend_free_assoc_resource(_adapter *padapter)
 {
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct net_device *pnetdev = padapter->pnetdev;
+#ifdef CONFIG_P2P
        struct wifidirect_info* pwdinfo = &padapter->wdinfo;
+#endif // CONFIG_P2P
 
        DBG_871X("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));
 
        if (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_RESUME)) {
                if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)
                        && check_fwstate(pmlmepriv, _FW_LINKED)
-                       && rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
+#ifdef CONFIG_P2P
+                       && rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)
+#endif // CONFIG_P2P
+                       )
                {
                        DBG_871X("%s %s(" MAC_FMT "), length:%d assoc_ssid.length:%d\n",__FUNCTION__,
                                        pmlmepriv->cur_network.network.Ssid.Ssid,
@@ -3025,6 +3133,9 @@ int rtw_suspend_wow(_adapter *padapter)
 
        DBG_871X("wowlan_mode: %d\n", pwrpriv->wowlan_mode);
        DBG_871X("wowlan_pno_enable: %d\n", pwrpriv->wowlan_pno_enable);
+#ifdef CONFIG_P2P_WOWLAN
+       DBG_871X("wowlan_p2p_enable: %d\n", pwrpriv->wowlan_p2p_enable);
+#endif
        
        if (pwrpriv->wowlan_mode == _TRUE) {
                if(pnetdev)
@@ -3118,8 +3229,10 @@ int rtw_suspend_wow(_adapter *padapter)
                }
                #endif  
 
-               if(pwrpriv->wowlan_pno_enable)
-                       DBG_871X_LEVEL(_drv_always_, "%s: pno: %d\n", __func__, pwrpriv->wowlan_pno_enable);
+               if(pwrpriv->wowlan_pno_enable) {
+                       DBG_871X_LEVEL(_drv_always_, "%s: pno: %d\n", __func__,
+                                       pwrpriv->wowlan_pno_enable);
+               }
                #ifdef CONFIG_LPS
                else
                        rtw_set_ps_mode(padapter, PS_MODE_DTIM, 0, 0, "WOWLAN");
@@ -3370,6 +3483,10 @@ int rtw_suspend_common(_adapter *padapter)
        }
 #endif // CONFIG_BT_COEXIST
 
+#if defined(CONFIG_WOWLAN) && defined(CONFIG_GPIO_WAKEUP)
+       rtw_clear_hostwakeupgpio(padapter);
+#endif // CONFIG_WOWLAN && CONFIG_GPIO_WAKEUP
+
        rtw_ps_deny_cancel(padapter, PS_DENY_SUSPEND);
 
        if (check_fwstate(pmlmepriv,WIFI_STATION_STATE) == _TRUE
@@ -3384,8 +3501,17 @@ int rtw_suspend_common(_adapter *padapter)
                        pwrpriv->wowlan_mode |= pwrpriv->wowlan_pno_enable;
                }
 
-               if (pwrpriv->wowlan_mode == _TRUE)      
-               rtw_suspend_wow(padapter);
+       #ifdef CONFIG_P2P_WOWLAN
+               if(!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE) || P2P_ROLE_DISABLE != padapter->wdinfo.role)
+               {
+                       pwrpriv->wowlan_p2p_mode = _TRUE;
+               }
+               if(_TRUE == pwrpriv->wowlan_p2p_mode)
+                       pwrpriv->wowlan_mode |= pwrpriv->wowlan_p2p_mode;
+       #endif //CONFIG_P2P_WOWLAN
+
+               if (pwrpriv->wowlan_mode == _TRUE)
+                       rtw_suspend_wow(padapter);
                else
                        rtw_suspend_normal(padapter);
                
@@ -3542,10 +3668,7 @@ _func_enter_;
 
                // start netif queue
                if (pnetdev) {
-                       if(!rtw_netif_queue_stopped(pnetdev))
-                               rtw_netif_start_queue(pnetdev);
-                       else 
-                               rtw_netif_wake_queue(pnetdev);
+                       rtw_netif_wake_queue(pnetdev);
                }
        }
        else{
@@ -3717,20 +3840,14 @@ _func_enter_;
        if (rtw_buddy_adapter_up(padapter)) {                   
                pbuddy_netdev = padapter->pbuddy_adapter->pnetdev;                      
                if(pbuddy_netdev){
-                       if (!rtw_netif_queue_stopped(pbuddy_netdev))
-                               rtw_netif_start_queue(pbuddy_netdev);
-                       else
-                               rtw_netif_wake_queue(pbuddy_netdev);
+                       rtw_netif_wake_queue(pbuddy_netdev);
                }
        }
 #endif
        
        // start netif queue
        if (pnetdev) {
-               if(!rtw_netif_queue_stopped(pnetdev))
-                       rtw_netif_start_queue(pnetdev);
-               else 
-                       rtw_netif_wake_queue(pnetdev);
+               rtw_netif_wake_queue(pnetdev);
        }
 
        if( padapter->pid[1]!=0) {
@@ -3891,6 +4008,9 @@ int rtw_resume_common(_adapter *padapter)
        
        _func_enter_;
 
+       if (pwrpriv->bInSuspend == _FALSE)
+               return 0;
+
        DBG_871X_LEVEL(_drv_always_, "resume start\n");
        DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); 
 
@@ -3949,3 +4069,28 @@ int rtw_resume_common(_adapter *padapter)
        return ret;
 }
 
+#ifdef CONFIG_GPIO_API
+u8 rtw_get_gpio(struct net_device *netdev, u8 gpio_num)
+{
+       _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
+       return rtw_hal_get_gpio(adapter, gpio_num);
+}
+EXPORT_SYMBOL(rtw_get_gpio);
+
+int  rtw_set_gpio_output_value(struct net_device *netdev, u8 gpio_num, BOOLEAN isHigh)
+{
+       u8 direction = 0;
+       u8 res = -1;
+       _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
+       return rtw_hal_set_gpio_output_value(adapter, gpio_num,isHigh);
+}
+EXPORT_SYMBOL(rtw_set_gpio_output_value);
+
+int rtw_config_gpio(struct net_device *netdev, u8 gpio_num, BOOLEAN isOutput)
+{
+       _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);        
+       return rtw_hal_config_gpio(adapter,gpio_num,isOutput);  
+}
+EXPORT_SYMBOL(rtw_config_gpio);
+#endif //#ifdef CONFIG_GPIO_API 
+
index 57fc16f733683b3eff35c785e8ed8c34f57aa929..2c2a47ab66a3d65db4646772dea308d09db1ae43 100755 (executable)
@@ -302,6 +302,7 @@ _pkt *rtw_os_alloc_msdu_pkt(union recv_frame *prframe, u16 nSubframe_Length, u8
 void rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, struct rx_pkt_attrib *pattrib)
 {
        struct mlme_priv*pmlmepriv = &padapter->mlmepriv;
+       struct recv_priv *precvpriv = &(padapter->recvpriv);
 #ifdef CONFIG_BR_EXT
        void *br_port = NULL;
 #endif
@@ -388,7 +389,8 @@ void rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, struct rx_pkt_attri
                        }                                                       
                }
 #endif // CONFIG_BR_EXT
-
+               if( precvpriv->sink_udpport > 0)
+                       rtw_sink_rtp_seq_dbg(padapter,pkt);
                pkt->protocol = eth_type_trans(pkt, padapter->pnetdev);
                pkt->dev = padapter->pnetdev;
 
@@ -569,12 +571,13 @@ int rtw_recv_indicatepkt(_adapter *padapter, union recv_frame *precv_frame)
        _queue  *pfree_recv_queue;
        _pkt *skb;
        struct mlme_priv*pmlmepriv = &padapter->mlmepriv;
-       struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
-
-_func_enter_;
+       struct rx_pkt_attrib *pattrib;
+       
+       if(NULL == precv_frame)
+               goto _recv_indicatepkt_drop;
 
        DBG_COUNTER(padapter->rx_logs.os_indicate);
-
+       pattrib = &precv_frame->u.hdr.attrib;
        precvpriv = &(padapter->recvpriv);
        pfree_recv_queue = &(precvpriv->free_recv_queue);
 
@@ -642,7 +645,6 @@ _recv_indicatepkt_end:
 
        RT_TRACE(_module_recv_osdep_c_,_drv_info_,("\n rtw_recv_indicatepkt :after rtw_os_recv_indicate_pkt!!!!\n"));
 
-_func_exit_;
 
         return _SUCCESS;
 
@@ -653,9 +655,8 @@ _recv_indicatepkt_drop:
                 rtw_free_recvframe(precv_frame, pfree_recv_queue);
 
         DBG_COUNTER(padapter->rx_logs.os_indicate_err);
-        return _FAIL;
 
-_func_exit_;
+        return _FAIL;
 
 }
 
index 1c9ada1e407af5aa4dedff678319e51858ed9e3c..abb99f087d4fd04592ba5172b1899094b0aa3762 100755 (executable)
@@ -161,7 +161,8 @@ typedef struct compat_android_wifi_priv_cmd {
  */
 static int g_wifi_on = _TRUE;
 
-unsigned int oob_irq;
+unsigned int oob_irq = 0;
+unsigned int oob_gpio = 0;
 
 #ifdef CONFIG_PNO_SUPPORT
 /* 
@@ -443,31 +444,11 @@ int rtw_android_getband(struct net_device *net, char *command, int total_len)
        return bytes_written;
 }
 
-enum {
-       MIRACAST_DISABLED = 0,
-       MIRACAST_SOURCE,
-       MIRACAST_SINK,
-       MIRACAST_INVALID,
-};
-
-static const char *miracast_mode_str[] = {
-       "DISABLED",
-       "SOURCE",
-       "SINK",
-       "INVALID",
-};
-
-static const char *get_miracast_mode_str(int mode)
-{
-       if (mode < MIRACAST_DISABLED || mode >= MIRACAST_INVALID)
-               mode = MIRACAST_INVALID;
-
-       return miracast_mode_str[mode];
-}
-
+#ifdef CONFIG_WFD
 int rtw_android_set_miracast_mode(struct net_device *net, char *command, int total_len)
 {
        _adapter *adapter = (_adapter *)rtw_netdev_priv(net);
+       struct wifi_display_info *wfd_info = &adapter->wfd_info;
        char *arg = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_MIRACAST]) + 1;
        u8 mode;
        int num;
@@ -476,12 +457,14 @@ int rtw_android_set_miracast_mode(struct net_device *net, char *command, int tot
        num = sscanf(arg, "%hhu", &mode);
 
        if (num >= 1) {
-               DBG_871X("Miracast mode: %s(%u)\n", get_miracast_mode_str(mode), mode);
+               wfd_info->stack_wfd_mode = mode;
+               DBG_871X("Miracast mode: %s(%u)\n", get_miracast_mode_str(wfd_info->stack_wfd_mode), wfd_info->stack_wfd_mode);
                ret = _SUCCESS;
        }
 
-       return (ret==_SUCCESS)?0:-1;
+       return (ret == _SUCCESS)?0:-1;
 }
+#endif /* CONFIG_WFD */
 
 int get_int_from_command( char* pcmd )
 {
@@ -709,10 +692,6 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
                bytes_written = rtw_android_getband(net, command, priv_cmd.total_len);
                break;
 
-       case ANDROID_WIFI_CMD_MIRACAST:
-               bytes_written = rtw_android_set_miracast_mode(net, command, priv_cmd.total_len);
-               break;
-
        case ANDROID_WIFI_CMD_COUNTRY:
                bytes_written = rtw_android_set_country(net, command, priv_cmd.total_len);
                break;
@@ -756,6 +735,10 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
 #endif //CONFIG_IOCTL_CFG80211
 
 #ifdef CONFIG_WFD
+       case ANDROID_WIFI_CMD_MIRACAST:
+               bytes_written = rtw_android_set_miracast_mode(net, command, priv_cmd.total_len);
+               break;
+
        case ANDROID_WIFI_CMD_WFD_ENABLE:
        {
                //      Commented by Albert 2012/07/24
@@ -848,17 +831,18 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
        }
 #ifdef CONFIG_GTK_OL
        case ANDROID_WIFI_CMD_GTK_REKEY_OFFLOAD:
-               rtw_gtk_offload(net, (u8 *)&priv_cmd.buf);
+               rtw_gtk_offload(net, (u8*)command);
                break;
 #endif //CONFIG_GTK_OL         
        case ANDROID_WIFI_CMD_P2P_DISABLE:
        {
+#ifdef CONFIG_P2P
                struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;     
-               struct wifidirect_info  *pwdinfo= &(padapter->wdinfo);
                u8 channel, ch_offset;
                u16 bwmode;
 
                rtw_p2p_enable(padapter, P2P_ROLE_DISABLE);
+#endif // CONFIG_P2P
                break;
        }
        default:
@@ -910,14 +894,9 @@ static struct resource *wifi_irqres = NULL;
 static int wifi_add_dev(void);
 static void wifi_del_dev(void);
 
-extern int rockchip_wifi_get_oob_irq(void);
 int rtw_android_wifictrl_func_add(void)
 {
        int ret = 0;
-#if 1
-        oob_irq = rockchip_wifi_get_oob_irq();
-        printk("%s: rockchip_wifi_get_oob_irq :%d\n", __func__, oob_irq);
-#else
        sema_init(&wifi_control_sem, 0);
 
        ret = wifi_add_dev();
@@ -932,22 +911,20 @@ int rtw_android_wifictrl_func_add(void)
                ret = -EINVAL;
                DBG_871X("%s: platform_driver_register timeout\n", __FUNCTION__);
        }
-#endif
+
        return ret;
 }
 
 void rtw_android_wifictrl_func_del(void)
 {
-#if 0
        if (g_wifidev_registered)
        {
                wifi_del_dev();
                g_wifidev_registered = 0;
        }
-#endif
 }
 
-void *rtw_wl_android_prealloc(int section, unsigned long size)
+void *wl_android_prealloc(int section, unsigned long size)
 {
        void *alloc_ptr = NULL;
        if (wifi_control_data && wifi_control_data->mem_prealloc) {
@@ -1043,9 +1020,13 @@ static int wifi_probe(struct platform_device *pdev)
                        wifi_irqres->start, wifi_wake_gpio);
 
        if (wifi_wake_gpio > 0) {
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+               wifi_configure_gpio();
+#else //CONFIG_PLATFORM_INTEL_BYT
                gpio_request(wifi_wake_gpio, "oob_irq");
                gpio_direction_input(wifi_wake_gpio);
                oob_irq = gpio_to_irq(wifi_wake_gpio);
+#endif //CONFIG_PLATFORM_INTEL_BYT
                printk("%s oob_irq:%d\n", __func__, oob_irq);
        }
        else if(wifi_irqres)
@@ -1233,3 +1214,34 @@ static void wifi_del_dev(void)
 }
 #endif /* defined(RTW_ENABLE_WIFI_CONTROL_FUNC) */
 
+#ifdef CONFIG_GPIO_WAKEUP
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+int wifi_configure_gpio(void)
+{
+       if (gpio_request(oob_gpio, "oob_irq")) {
+               DBG_871X("## %s Cannot request GPIO\n", __FUNCTION__);
+               return -1;
+       }
+       gpio_export(oob_gpio, 0);
+       if (gpio_direction_input(oob_gpio)) {
+               DBG_871X("## %s Cannot set GPIO direction input\n", __FUNCTION__);
+               return -1;
+       }
+       if ((oob_irq = gpio_to_irq(oob_gpio)) < 0) {
+               DBG_871X("## %s Cannot convert GPIO to IRQ\n", __FUNCTION__);
+               return -1;
+       }
+
+       DBG_871X("## %s OOB_IRQ=%d\n", __FUNCTION__, oob_irq);
+
+       return 0;
+}
+#endif //CONFIG_PLATFORM_INTEL_BYT
+void wifi_free_gpio(unsigned int gpio)
+{
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+       if(gpio)
+               gpio_free(gpio);
+#endif //CONFIG_PLATFORM_INTEL_BYT
+}
+#endif //CONFIG_GPIO_WAKEUP
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_cfgvendor.c b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_cfgvendor.c
new file mode 100755 (executable)
index 0000000..2e249c9
--- /dev/null
@@ -0,0 +1,1319 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2014 Realtek Corporation. All rights reserved.
+ *                                        
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+#include <drv_types.h>
+
+/*
+#include <linux/kernel.h>
+#include <linux/if_arp.h>
+#include <asm/uaccess.h>
+
+#include <linux/kernel.h>
+#include <linux/kthread.h>
+#include <linux/netdevice.h>
+#include <linux/sched.h>
+#include <linux/etherdevice.h>
+#include <linux/wireless.h>
+#include <linux/ieee80211.h>
+#include <linux/wait.h>
+#include <net/cfg80211.h>
+*/
+
+#include <net/rtnetlink.h>
+
+#ifdef CONFIG_IOCTL_CFG80211
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(RTW_VENDOR_EXT_SUPPORT)
+
+#ifdef DBG_MEM_ALLOC
+extern bool match_mstat_sniff_rules(const enum mstat_f flags, const size_t size);
+struct sk_buff * dbg_rtw_cfg80211_vendor_event_alloc(struct wiphy *wiphy, int len, int event_id, gfp_t gfp
+       , const enum mstat_f flags, const char *func, const int line)
+{
+       struct sk_buff *skb;
+       unsigned int truesize = 0;
+
+       skb = cfg80211_vendor_event_alloc(wiphy, len, event_id, gfp);
+
+       if(skb)
+               truesize = skb->truesize;
+
+       if(!skb || truesize < len || match_mstat_sniff_rules(flags, truesize))
+               DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d), skb:%p, truesize=%u\n", func, line, __FUNCTION__, len, skb, truesize);
+
+       rtw_mstat_update(
+               flags
+               , skb ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
+               , truesize
+       );
+
+       return skb;
+}
+
+void dbg_rtw_cfg80211_vendor_event(struct sk_buff *skb, gfp_t gfp
+       , const enum mstat_f flags, const char *func, const int line)
+{
+       unsigned int truesize = skb->truesize;
+
+       if(match_mstat_sniff_rules(flags, truesize))
+               DBG_871X("DBG_MEM_ALLOC %s:%d %s, truesize=%u\n", func, line, __FUNCTION__, truesize);
+
+       cfg80211_vendor_event(skb, gfp);
+
+       rtw_mstat_update(
+               flags
+               , MSTAT_FREE
+               , truesize
+       );
+}
+
+struct sk_buff *dbg_rtw_cfg80211_vendor_cmd_alloc_reply_skb(struct wiphy *wiphy, int len
+       , const enum mstat_f flags, const char *func, const int line)
+{
+       struct sk_buff *skb;
+       unsigned int truesize = 0;
+
+       skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len);
+
+       if(skb)
+               truesize = skb->truesize;
+
+       if(!skb || truesize < len || match_mstat_sniff_rules(flags, truesize))
+               DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d), skb:%p, truesize=%u\n", func, line, __FUNCTION__, len, skb, truesize);
+
+       rtw_mstat_update(
+               flags
+               , skb ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
+               , truesize
+       );
+
+       return skb;
+}
+
+int dbg_rtw_cfg80211_vendor_cmd_reply(struct sk_buff *skb
+       , const enum mstat_f flags, const char *func, const int line)
+{
+       unsigned int truesize = skb->truesize;
+       int ret;
+
+       if(match_mstat_sniff_rules(flags, truesize))
+               DBG_871X("DBG_MEM_ALLOC %s:%d %s, truesize=%u\n", func, line, __FUNCTION__, truesize);
+
+       ret = cfg80211_vendor_cmd_reply(skb);
+
+       rtw_mstat_update(
+               flags
+               , MSTAT_FREE
+               , truesize
+       );
+
+       return ret;
+}
+
+#define rtw_cfg80211_vendor_event_alloc(wiphy, len, event_id, gfp) \
+       dbg_rtw_cfg80211_vendor_event_alloc(wiphy, len, event_id, gfp, MSTAT_FUNC_CFG_VENDOR|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)
+       
+#define rtw_cfg80211_vendor_event(skb, gfp) \
+       dbg_rtw_cfg80211_vendor_event(skb, gfp, MSTAT_FUNC_CFG_VENDOR|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)
+       
+#define rtw_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len) \
+       dbg_rtw_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len, MSTAT_FUNC_CFG_VENDOR|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)
+
+#define rtw_cfg80211_vendor_cmd_reply(skb) \
+               dbg_rtw_cfg80211_vendor_cmd_reply(skb, MSTAT_FUNC_CFG_VENDOR|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)
+#else
+#define rtw_cfg80211_vendor_event_alloc(wiphy, len, event_id, gfp) \
+       cfg80211_vendor_event_alloc(wiphy, len, event_id, gfp)
+       
+#define rtw_cfg80211_vendor_event(skb, gfp) \
+       cfg80211_vendor_event(skb, gfp)
+       
+#define rtw_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len) \
+       cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len)
+
+#define rtw_cfg80211_vendor_cmd_reply(skb) \
+       cfg80211_vendor_cmd_reply(skb)
+#endif /* DBG_MEM_ALLOC */
+
+/*
+ * This API is to be used for asynchronous vendor events. This
+ * shouldn't be used in response to a vendor command from its
+ * do_it handler context (instead rtw_cfgvendor_send_cmd_reply should
+ * be used).
+ */
+int rtw_cfgvendor_send_async_event(struct wiphy *wiphy,
+       struct net_device *dev, int event_id, const void  *data, int len)
+{
+       u16 kflags;
+       struct sk_buff *skb;
+
+       kflags = in_atomic() ? GFP_ATOMIC : GFP_KERNEL;
+
+       /* Alloc the SKB for vendor_event */
+       skb = rtw_cfg80211_vendor_event_alloc(wiphy, len, event_id, kflags);
+       if (!skb) {
+               DBG_871X_LEVEL(_drv_err_, FUNC_NDEV_FMT" skb alloc failed", FUNC_NDEV_ARG(dev));
+               return -ENOMEM;
+       }
+
+       /* Push the data to the skb */
+       nla_put_nohdr(skb, len, data);
+
+       rtw_cfg80211_vendor_event(skb, kflags);
+
+       return 0;
+}
+
+static int rtw_cfgvendor_send_cmd_reply(struct wiphy *wiphy,
+       struct net_device *dev, const void  *data, int len)
+{
+       struct sk_buff *skb;
+
+       /* Alloc the SKB for vendor_event */
+       skb = rtw_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len);
+       if (unlikely(!skb)) {
+               DBG_871X_LEVEL(_drv_err_, FUNC_NDEV_FMT" skb alloc failed", FUNC_NDEV_ARG(dev));
+               return -ENOMEM;
+       }
+
+       /* Push the data to the skb */
+       nla_put_nohdr(skb, len, data);
+
+       return rtw_cfg80211_vendor_cmd_reply(skb);
+}
+
+#define WIFI_FEATURE_INFRA              0x0001      /* Basic infrastructure mode        */
+#define WIFI_FEATURE_INFRA_5G           0x0002      /* Support for 5 GHz Band           */
+#define WIFI_FEATURE_HOTSPOT            0x0004      /* Support for GAS/ANQP             */
+#define WIFI_FEATURE_P2P                0x0008      /* Wifi-Direct                      */
+#define WIFI_FEATURE_SOFT_AP            0x0010      /* Soft AP                          */
+#define WIFI_FEATURE_GSCAN              0x0020      /* Google-Scan APIs                 */
+#define WIFI_FEATURE_NAN                0x0040      /* Neighbor Awareness Networking    */
+#define WIFI_FEATURE_D2D_RTT            0x0080      /* Device-to-device RTT             */
+#define WIFI_FEATURE_D2AP_RTT           0x0100      /* Device-to-AP RTT                 */
+#define WIFI_FEATURE_BATCH_SCAN         0x0200      /* Batched Scan (legacy)            */
+#define WIFI_FEATURE_PNO                0x0400      /* Preferred network offload        */
+#define WIFI_FEATURE_ADDITIONAL_STA     0x0800      /* Support for two STAs             */
+#define WIFI_FEATURE_TDLS               0x1000      /* Tunnel directed link setup       */
+#define WIFI_FEATURE_TDLS_OFFCHANNEL    0x2000      /* Support for TDLS off channel     */
+#define WIFI_FEATURE_EPR                0x4000      /* Enhanced power reporting         */
+#define WIFI_FEATURE_AP_STA             0x8000      /* Support for AP STA Concurrency   */
+
+#define MAX_FEATURE_SET_CONCURRRENT_GROUPS  3
+
+#include <hal_data.h>
+int rtw_dev_get_feature_set(struct net_device *dev)
+{
+       _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
+       HAL_DATA_TYPE *HalData = GET_HAL_DATA(adapter);
+       HAL_VERSION *hal_ver = &HalData->VersionID;
+
+       int feature_set = 0;
+
+       feature_set |= WIFI_FEATURE_INFRA;
+
+       if(IS_92D(*hal_ver) || IS_8812_SERIES(*hal_ver) || IS_8821_SERIES(*hal_ver))
+               feature_set |= WIFI_FEATURE_INFRA_5G;
+
+       feature_set |= WIFI_FEATURE_P2P;
+       feature_set |= WIFI_FEATURE_SOFT_AP;
+
+       feature_set |= WIFI_FEATURE_ADDITIONAL_STA;
+
+       return feature_set;
+}
+
+int *rtw_dev_get_feature_set_matrix(struct net_device *dev, int *num)
+{
+       int feature_set_full, mem_needed;
+       int *ret;
+
+       *num = 0;
+       mem_needed = sizeof(int) * MAX_FEATURE_SET_CONCURRRENT_GROUPS;
+       ret = (int *)rtw_malloc(mem_needed);
+
+       if (!ret) {
+               DBG_871X_LEVEL(_drv_err_, FUNC_NDEV_FMT" failed to allocate %d bytes\n"
+                       , FUNC_NDEV_ARG(dev), mem_needed);
+               return ret;
+       }
+
+       feature_set_full = rtw_dev_get_feature_set(dev);
+
+       ret[0] = (feature_set_full & WIFI_FEATURE_INFRA) |
+                (feature_set_full & WIFI_FEATURE_INFRA_5G) |
+                (feature_set_full & WIFI_FEATURE_NAN) |
+                (feature_set_full & WIFI_FEATURE_D2D_RTT) |
+                (feature_set_full & WIFI_FEATURE_D2AP_RTT) |
+                (feature_set_full & WIFI_FEATURE_PNO) |
+                (feature_set_full & WIFI_FEATURE_BATCH_SCAN) |
+                (feature_set_full & WIFI_FEATURE_GSCAN) |
+                (feature_set_full & WIFI_FEATURE_HOTSPOT) |
+                (feature_set_full & WIFI_FEATURE_ADDITIONAL_STA) |
+                (feature_set_full & WIFI_FEATURE_EPR);
+
+       ret[1] = (feature_set_full & WIFI_FEATURE_INFRA) |
+                (feature_set_full & WIFI_FEATURE_INFRA_5G) |
+                /* Not yet verified NAN with P2P */
+                /* (feature_set_full & WIFI_FEATURE_NAN) | */
+                (feature_set_full & WIFI_FEATURE_P2P) |
+                (feature_set_full & WIFI_FEATURE_D2AP_RTT) |
+                (feature_set_full & WIFI_FEATURE_D2D_RTT) |
+                (feature_set_full & WIFI_FEATURE_EPR);
+
+       ret[2] = (feature_set_full & WIFI_FEATURE_INFRA) |
+                (feature_set_full & WIFI_FEATURE_INFRA_5G) |
+                (feature_set_full & WIFI_FEATURE_NAN) |
+                (feature_set_full & WIFI_FEATURE_D2D_RTT) |
+                (feature_set_full & WIFI_FEATURE_D2AP_RTT) |
+                (feature_set_full & WIFI_FEATURE_TDLS) |
+                (feature_set_full & WIFI_FEATURE_TDLS_OFFCHANNEL) |
+                (feature_set_full & WIFI_FEATURE_EPR);
+       *num = MAX_FEATURE_SET_CONCURRRENT_GROUPS;
+
+       return ret;
+}
+
+static int rtw_cfgvendor_get_feature_set(struct wiphy *wiphy,
+       struct wireless_dev *wdev, const void  *data, int len)
+{
+       int err = 0;
+       int reply;
+
+       reply = rtw_dev_get_feature_set(wdev_to_ndev(wdev));
+
+       err =  rtw_cfgvendor_send_cmd_reply(wiphy, wdev_to_ndev(wdev), &reply, sizeof(int));
+
+       if (unlikely(err))
+               DBG_871X_LEVEL(_drv_err_, FUNC_NDEV_FMT" Vendor Command reply failed ret:%d \n"
+                       , FUNC_NDEV_ARG(wdev_to_ndev(wdev)), err);
+
+       return err;
+}
+
+static int rtw_cfgvendor_get_feature_set_matrix(struct wiphy *wiphy,
+       struct wireless_dev *wdev, const void  *data, int len)
+{
+       int err = 0;
+       struct sk_buff *skb;
+       int *reply;
+       int num, mem_needed, i;
+
+       reply = rtw_dev_get_feature_set_matrix(wdev_to_ndev(wdev), &num);
+
+       if (!reply) {
+               DBG_871X_LEVEL(_drv_err_, FUNC_NDEV_FMT" Could not get feature list matrix\n"
+                       , FUNC_NDEV_ARG(wdev_to_ndev(wdev)));
+               err = -EINVAL;
+               return err;
+       }
+
+       mem_needed = VENDOR_REPLY_OVERHEAD + (ATTRIBUTE_U32_LEN * num) +
+                    ATTRIBUTE_U32_LEN;
+
+       /* Alloc the SKB for vendor_event */
+       skb = rtw_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, mem_needed);
+       if (unlikely(!skb)) {
+               DBG_871X_LEVEL(_drv_err_, FUNC_NDEV_FMT" skb alloc failed", FUNC_NDEV_ARG(wdev_to_ndev(wdev)));
+               err = -ENOMEM;
+               goto exit;
+       }
+
+       nla_put_u32(skb, ANDR_WIFI_ATTRIBUTE_NUM_FEATURE_SET, num);
+       for (i = 0; i < num; i++) {
+               nla_put_u32(skb, ANDR_WIFI_ATTRIBUTE_FEATURE_SET, reply[i]);
+       }
+
+       err =  rtw_cfg80211_vendor_cmd_reply(skb);
+
+       if (unlikely(err))
+               DBG_871X_LEVEL(_drv_err_, FUNC_NDEV_FMT" Vendor Command reply failed ret:%d \n"
+                       , FUNC_NDEV_ARG(wdev_to_ndev(wdev)), err);
+exit:
+       rtw_mfree((u8*)reply, sizeof(int)*num);
+       return err;
+}
+
+#if defined(GSCAN_SUPPORT) && 0
+int wl_cfgvendor_send_hotlist_event(struct wiphy *wiphy,
+       struct net_device *dev, void  *data, int len, wl_vendor_event_t event)
+{
+       u16 kflags;
+       const void *ptr;
+       struct sk_buff *skb;
+       int malloc_len, total, iter_cnt_to_send, cnt;
+       gscan_results_cache_t *cache = (gscan_results_cache_t *)data;
+
+       total = len/sizeof(wifi_gscan_result_t);
+       while (total > 0) {
+               malloc_len = (total * sizeof(wifi_gscan_result_t)) + VENDOR_DATA_OVERHEAD;
+               if (malloc_len > NLMSG_DEFAULT_SIZE) {
+                       malloc_len = NLMSG_DEFAULT_SIZE;
+               }
+               iter_cnt_to_send =
+                  (malloc_len - VENDOR_DATA_OVERHEAD)/sizeof(wifi_gscan_result_t);
+               total = total - iter_cnt_to_send;
+
+               kflags = in_atomic() ? GFP_ATOMIC : GFP_KERNEL;
+
+               /* Alloc the SKB for vendor_event */
+               skb = rtw_cfg80211_vendor_event_alloc(wiphy, malloc_len, event, kflags);
+               if (!skb) {
+                       WL_ERR(("skb alloc failed"));
+                       return -ENOMEM;
+               }
+
+               while (cache && iter_cnt_to_send) {
+                       ptr = (const void *) &cache->results[cache->tot_consumed];
+
+                       if (iter_cnt_to_send < (cache->tot_count - cache->tot_consumed))
+                               cnt = iter_cnt_to_send;
+                       else
+                               cnt = (cache->tot_count - cache->tot_consumed);
+
+                       iter_cnt_to_send -= cnt;
+                       cache->tot_consumed += cnt;
+                       /* Push the data to the skb */
+                       nla_append(skb, cnt * sizeof(wifi_gscan_result_t), ptr);
+                       if (cache->tot_consumed == cache->tot_count)
+                               cache = cache->next;
+
+               }
+
+               rtw_cfg80211_vendor_event(skb, kflags);
+       }
+
+       return 0;
+}
+
+
+static int wl_cfgvendor_gscan_get_capabilities(struct wiphy *wiphy,
+       struct wireless_dev *wdev, const void  *data, int len)
+{
+       int err = 0;
+       struct bcm_cfg80211 *cfg = wiphy_priv(wiphy);
+       dhd_pno_gscan_capabilities_t *reply = NULL;
+       uint32 reply_len = 0;
+
+
+       reply = dhd_dev_pno_get_gscan(bcmcfg_to_prmry_ndev(cfg),
+          DHD_PNO_GET_CAPABILITIES, NULL, &reply_len);
+       if (!reply) {
+               WL_ERR(("Could not get capabilities\n"));
+               err = -EINVAL;
+               return err;
+       }
+
+       err =  rtw_cfgvendor_send_cmd_reply(wiphy, bcmcfg_to_prmry_ndev(cfg),
+               reply, reply_len);
+
+       if (unlikely(err))
+               WL_ERR(("Vendor Command reply failed ret:%d \n", err));
+
+       kfree(reply);
+       return err;
+}
+
+static int wl_cfgvendor_gscan_get_channel_list(struct wiphy *wiphy,
+       struct wireless_dev *wdev, const void  *data, int len)
+{
+       int err = 0, type, band;
+       struct bcm_cfg80211 *cfg = wiphy_priv(wiphy);
+       uint16 *reply = NULL;
+       uint32 reply_len = 0, num_channels, mem_needed;
+       struct sk_buff *skb;
+
+       type = nla_type(data);
+
+       if (type == GSCAN_ATTRIBUTE_BAND) {
+               band = nla_get_u32(data);
+       } else {
+               return -1;
+       }
+
+       reply = dhd_dev_pno_get_gscan(bcmcfg_to_prmry_ndev(cfg),
+          DHD_PNO_GET_CHANNEL_LIST, &band, &reply_len);
+
+       if (!reply) {
+               WL_ERR(("Could not get channel list\n"));
+               err = -EINVAL;
+               return err;
+       }
+       num_channels =  reply_len/ sizeof(uint32);
+       mem_needed = reply_len + VENDOR_REPLY_OVERHEAD + (ATTRIBUTE_U32_LEN * 2);
+
+       /* Alloc the SKB for vendor_event */
+       skb = rtw_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, mem_needed);
+       if (unlikely(!skb)) {
+               WL_ERR(("skb alloc failed"));
+               err = -ENOMEM;
+               goto exit;
+       }
+
+       nla_put_u32(skb, GSCAN_ATTRIBUTE_NUM_CHANNELS, num_channels);
+       nla_put(skb, GSCAN_ATTRIBUTE_CHANNEL_LIST, reply_len, reply);
+
+       err =  rtw_cfg80211_vendor_cmd_reply(skb);
+
+       if (unlikely(err))
+               WL_ERR(("Vendor Command reply failed ret:%d \n", err));
+exit:
+       kfree(reply);
+       return err;
+}
+
+static int wl_cfgvendor_gscan_get_batch_results(struct wiphy *wiphy,
+       struct wireless_dev *wdev, const void  *data, int len)
+{
+       int err = 0;
+       struct bcm_cfg80211 *cfg = wiphy_priv(wiphy);
+       gscan_results_cache_t *results, *iter;
+       uint32 reply_len, complete = 0, num_results_iter;
+       int32 mem_needed;
+       wifi_gscan_result_t *ptr;
+       uint16 num_scan_ids, num_results;
+       struct sk_buff *skb;
+       struct nlattr *scan_hdr;
+
+       dhd_dev_wait_batch_results_complete(bcmcfg_to_prmry_ndev(cfg));
+       dhd_dev_pno_lock_access_batch_results(bcmcfg_to_prmry_ndev(cfg));
+       results = dhd_dev_pno_get_gscan(bcmcfg_to_prmry_ndev(cfg),
+                    DHD_PNO_GET_BATCH_RESULTS, NULL, &reply_len);
+
+       if (!results) {
+               WL_ERR(("No results to send %d\n", err));
+               err =  rtw_cfgvendor_send_cmd_reply(wiphy, bcmcfg_to_prmry_ndev(cfg),
+                       results, 0);
+
+               if (unlikely(err))
+                       WL_ERR(("Vendor Command reply failed ret:%d \n", err));
+               dhd_dev_pno_unlock_access_batch_results(bcmcfg_to_prmry_ndev(cfg));
+               return err;
+       }
+       num_scan_ids = reply_len & 0xFFFF;
+       num_results = (reply_len & 0xFFFF0000) >> 16;
+       mem_needed = (num_results * sizeof(wifi_gscan_result_t)) +
+                    (num_scan_ids * GSCAN_BATCH_RESULT_HDR_LEN) +
+                    VENDOR_REPLY_OVERHEAD + SCAN_RESULTS_COMPLETE_FLAG_LEN;
+
+       if (mem_needed > (int32)NLMSG_DEFAULT_SIZE) {
+               mem_needed = (int32)NLMSG_DEFAULT_SIZE;
+               complete = 0;
+       } else {
+               complete = 1;
+       }
+
+       WL_TRACE(("complete %d mem_needed %d max_mem %d\n", complete, mem_needed,
+               (int)NLMSG_DEFAULT_SIZE));
+       /* Alloc the SKB for vendor_event */
+       skb = rtw_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, mem_needed);
+       if (unlikely(!skb)) {
+               WL_ERR(("skb alloc failed"));
+               dhd_dev_pno_unlock_access_batch_results(bcmcfg_to_prmry_ndev(cfg));
+               return -ENOMEM;
+       }
+       iter = results;
+
+       nla_put_u32(skb, GSCAN_ATTRIBUTE_SCAN_RESULTS_COMPLETE, complete);
+
+       mem_needed = mem_needed - (SCAN_RESULTS_COMPLETE_FLAG_LEN + VENDOR_REPLY_OVERHEAD);
+
+       while (iter && ((mem_needed - GSCAN_BATCH_RESULT_HDR_LEN)  > 0)) {
+               scan_hdr = nla_nest_start(skb, GSCAN_ATTRIBUTE_SCAN_RESULTS);
+               nla_put_u32(skb, GSCAN_ATTRIBUTE_SCAN_ID, iter->scan_id);
+               nla_put_u8(skb, GSCAN_ATTRIBUTE_SCAN_FLAGS, iter->flag);
+               num_results_iter =
+                   (mem_needed - GSCAN_BATCH_RESULT_HDR_LEN)/sizeof(wifi_gscan_result_t);
+
+               if ((iter->tot_count - iter->tot_consumed) < num_results_iter)
+                       num_results_iter = iter->tot_count - iter->tot_consumed;
+
+               nla_put_u32(skb, GSCAN_ATTRIBUTE_NUM_OF_RESULTS, num_results_iter);
+               if (num_results_iter) {
+                       ptr = &iter->results[iter->tot_consumed];
+                       iter->tot_consumed += num_results_iter;
+                       nla_put(skb, GSCAN_ATTRIBUTE_SCAN_RESULTS,
+                        num_results_iter * sizeof(wifi_gscan_result_t), ptr);
+               }
+               nla_nest_end(skb, scan_hdr);
+               mem_needed -= GSCAN_BATCH_RESULT_HDR_LEN +
+                   (num_results_iter * sizeof(wifi_gscan_result_t));
+               iter = iter->next;
+       }
+
+       dhd_dev_gscan_batch_cache_cleanup(bcmcfg_to_prmry_ndev(cfg));
+       dhd_dev_pno_unlock_access_batch_results(bcmcfg_to_prmry_ndev(cfg));
+
+       return rtw_cfg80211_vendor_cmd_reply(skb);
+}
+
+static int wl_cfgvendor_initiate_gscan(struct wiphy *wiphy,
+       struct wireless_dev *wdev, const void  *data, int len)
+{
+       int err = 0;
+       struct bcm_cfg80211 *cfg = wiphy_priv(wiphy);
+       int type, tmp = len;
+       int run = 0xFF;
+       int flush = 0;
+       const struct nlattr *iter;
+
+       nla_for_each_attr(iter, data, len, tmp) {
+               type = nla_type(iter);
+               if (type == GSCAN_ATTRIBUTE_ENABLE_FEATURE)
+                       run = nla_get_u32(iter);
+               else if (type == GSCAN_ATTRIBUTE_FLUSH_FEATURE)
+                       flush = nla_get_u32(iter);
+       }
+
+       if (run != 0xFF) {
+               err = dhd_dev_pno_run_gscan(bcmcfg_to_prmry_ndev(cfg), run, flush);
+
+               if (unlikely(err))
+                       WL_ERR(("Could not run gscan:%d \n", err));
+               return err;
+       } else {
+               return -1;
+       }
+
+
+}
+
+static int wl_cfgvendor_enable_full_scan_result(struct wiphy *wiphy,
+       struct wireless_dev *wdev, const void  *data, int len)
+{
+       int err = 0;
+       struct bcm_cfg80211 *cfg = wiphy_priv(wiphy);
+       int type;
+       bool real_time = FALSE;
+
+       type = nla_type(data);
+
+       if (type == GSCAN_ATTRIBUTE_ENABLE_FULL_SCAN_RESULTS) {
+               real_time = nla_get_u32(data);
+
+               err = dhd_dev_pno_enable_full_scan_result(bcmcfg_to_prmry_ndev(cfg), real_time);
+
+               if (unlikely(err))
+                       WL_ERR(("Could not run gscan:%d \n", err));
+
+       } else {
+               err = -1;
+       }
+
+       return err;
+}
+
+static int wl_cfgvendor_set_scan_cfg(struct wiphy *wiphy,
+       struct wireless_dev *wdev, const void  *data, int len)
+{
+       int err = 0;
+       struct bcm_cfg80211 *cfg = wiphy_priv(wiphy);
+       gscan_scan_params_t *scan_param;
+       int j = 0;
+       int type, tmp, tmp1, tmp2, k = 0;
+       const struct nlattr *iter, *iter1, *iter2;
+       struct dhd_pno_gscan_channel_bucket  *ch_bucket;
+
+       scan_param = kzalloc(sizeof(gscan_scan_params_t), GFP_KERNEL);
+       if (!scan_param) {
+               WL_ERR(("Could not set GSCAN scan cfg, mem alloc failure\n"));
+               err = -EINVAL;
+               return err;
+
+       }
+
+       scan_param->scan_fr = PNO_SCAN_MIN_FW_SEC;
+       nla_for_each_attr(iter, data, len, tmp) {
+               type = nla_type(iter);
+
+               if (j >= GSCAN_MAX_CH_BUCKETS)
+                       break;
+
+               switch (type) {
+                       case GSCAN_ATTRIBUTE_BASE_PERIOD:
+                               scan_param->scan_fr = nla_get_u32(iter)/1000;
+                               break;
+                       case GSCAN_ATTRIBUTE_NUM_BUCKETS:
+                               scan_param->nchannel_buckets = nla_get_u32(iter);
+                               break;
+                       case GSCAN_ATTRIBUTE_CH_BUCKET_1:
+                       case GSCAN_ATTRIBUTE_CH_BUCKET_2:
+                       case GSCAN_ATTRIBUTE_CH_BUCKET_3:
+                       case GSCAN_ATTRIBUTE_CH_BUCKET_4:
+                       case GSCAN_ATTRIBUTE_CH_BUCKET_5:
+                       case GSCAN_ATTRIBUTE_CH_BUCKET_6:
+                       case GSCAN_ATTRIBUTE_CH_BUCKET_7:
+                               nla_for_each_nested(iter1, iter, tmp1) {
+                                       type = nla_type(iter1);
+                                       ch_bucket =
+                                       scan_param->channel_bucket;
+
+                                       switch (type) {
+                                               case GSCAN_ATTRIBUTE_BUCKET_ID:
+                                               break;
+                                               case GSCAN_ATTRIBUTE_BUCKET_PERIOD:
+                                                       ch_bucket[j].bucket_freq_multiple =
+                                                           nla_get_u32(iter1)/1000;
+                                                       break;
+                                               case GSCAN_ATTRIBUTE_BUCKET_NUM_CHANNELS:
+                                                       ch_bucket[j].num_channels =
+                                                            nla_get_u32(iter1);
+                                                       break;
+                                               case GSCAN_ATTRIBUTE_BUCKET_CHANNELS:
+                                                       nla_for_each_nested(iter2, iter1, tmp2) {
+                                                               if (k >= PFN_SWC_RSSI_WINDOW_MAX)
+                                                                       break;
+                                                               ch_bucket[j].chan_list[k] =
+                                                                    nla_get_u32(iter2);
+                                                               k++;
+                                                       }
+                                                       k = 0;
+                                                       break;
+                                               case GSCAN_ATTRIBUTE_BUCKETS_BAND:
+                                                       ch_bucket[j].band = (uint16)
+                                                            nla_get_u32(iter1);
+                                                       break;
+                                               case GSCAN_ATTRIBUTE_REPORT_EVENTS:
+                                                       ch_bucket[j].report_flag = (uint8)
+                                                            nla_get_u32(iter1);
+                                                       break;
+                                       }
+                               }
+                               j++;
+                               break;
+               }
+       }
+
+       if (dhd_dev_pno_set_cfg_gscan(bcmcfg_to_prmry_ndev(cfg),
+            DHD_PNO_SCAN_CFG_ID, scan_param, 0) < 0) {
+               WL_ERR(("Could not set GSCAN scan cfg\n"));
+               err = -EINVAL;
+       }
+
+       kfree(scan_param);
+       return err;
+
+}
+
+static int wl_cfgvendor_hotlist_cfg(struct wiphy *wiphy,
+       struct wireless_dev *wdev, const void  *data, int len)
+{
+       int err = 0;
+       struct bcm_cfg80211 *cfg = wiphy_priv(wiphy);
+       gscan_hotlist_scan_params_t *hotlist_params;
+       int tmp, tmp1, tmp2, type, j = 0, dummy;
+       const struct nlattr *outer, *inner, *iter;
+       uint8 flush = 0;
+       struct bssid_t *pbssid;
+
+       hotlist_params = (gscan_hotlist_scan_params_t *)kzalloc(len, GFP_KERNEL);
+       if (!hotlist_params) {
+               WL_ERR(("Cannot Malloc mem to parse config commands size - %d bytes \n", len));
+               return -1;
+       }
+
+       hotlist_params->lost_ap_window = GSCAN_LOST_AP_WINDOW_DEFAULT;
+
+       nla_for_each_attr(iter, data, len, tmp2) {
+               type = nla_type(iter);
+               switch (type) {
+                       case GSCAN_ATTRIBUTE_HOTLIST_BSSIDS:
+                               pbssid = hotlist_params->bssid;
+                               nla_for_each_nested(outer, iter, tmp) {
+                                       nla_for_each_nested(inner, outer, tmp1) {
+                                               type = nla_type(inner);
+
+                                               switch (type) {
+                                                       case GSCAN_ATTRIBUTE_BSSID:
+                                                               memcpy(&(pbssid[j].macaddr),
+                                                                 nla_data(inner), ETHER_ADDR_LEN);
+                                                               break;
+                                                       case GSCAN_ATTRIBUTE_RSSI_LOW:
+                                                               pbssid[j].rssi_reporting_threshold =
+                                                                        (int8) nla_get_u8(inner);
+                                                               break;
+                                                       case GSCAN_ATTRIBUTE_RSSI_HIGH:
+                                                               dummy = (int8) nla_get_u8(inner);
+                                                               break;
+                                               }
+                                       }
+                                       j++;
+                               }
+                               hotlist_params->nbssid = j;
+                               break;
+                       case GSCAN_ATTRIBUTE_HOTLIST_FLUSH:
+                               flush = nla_get_u8(iter);
+                               break;
+                       case GSCAN_ATTRIBUTE_LOST_AP_SAMPLE_SIZE:
+                               hotlist_params->lost_ap_window = nla_get_u32(iter);
+                               break;
+                       }
+
+       }
+
+       if (dhd_dev_pno_set_cfg_gscan(bcmcfg_to_prmry_ndev(cfg),
+             DHD_PNO_GEOFENCE_SCAN_CFG_ID, hotlist_params, flush) < 0) {
+               WL_ERR(("Could not set GSCAN HOTLIST cfg\n"));
+               err = -EINVAL;
+               goto exit;
+       }
+exit:
+       kfree(hotlist_params);
+       return err;
+}
+static int wl_cfgvendor_set_batch_scan_cfg(struct wiphy *wiphy,
+       struct wireless_dev *wdev, const void  *data, int len)
+{
+       int err = 0, tmp, type;
+       struct bcm_cfg80211 *cfg = wiphy_priv(wiphy);
+       gscan_batch_params_t batch_param;
+       const struct nlattr *iter;
+
+       batch_param.mscan = batch_param.bestn = 0;
+       batch_param.buffer_threshold = GSCAN_BATCH_NO_THR_SET;
+
+       nla_for_each_attr(iter, data, len, tmp) {
+               type = nla_type(iter);
+
+               switch (type) {
+                       case GSCAN_ATTRIBUTE_NUM_AP_PER_SCAN:
+                               batch_param.bestn = nla_get_u32(iter);
+                               break;
+                       case GSCAN_ATTRIBUTE_NUM_SCANS_TO_CACHE:
+                               batch_param.mscan = nla_get_u32(iter);
+                               break;
+                       case GSCAN_ATTRIBUTE_REPORT_THRESHOLD:
+                               batch_param.buffer_threshold = nla_get_u32(iter);
+                               break;
+               }
+       }
+
+       if (dhd_dev_pno_set_cfg_gscan(bcmcfg_to_prmry_ndev(cfg),
+              DHD_PNO_BATCH_SCAN_CFG_ID, &batch_param, 0) < 0) {
+               WL_ERR(("Could not set batch cfg\n"));
+               err = -EINVAL;
+               return err;
+       }
+
+       return err;
+}
+
+static int wl_cfgvendor_significant_change_cfg(struct wiphy *wiphy,
+       struct wireless_dev *wdev, const void  *data, int len)
+{
+       int err = 0;
+       struct bcm_cfg80211 *cfg = wiphy_priv(wiphy);
+       gscan_swc_params_t *significant_params;
+       int tmp, tmp1, tmp2, type, j = 0;
+       const struct nlattr *outer, *inner, *iter;
+       uint8 flush = 0;
+       wl_pfn_significant_bssid_t *pbssid;
+
+       significant_params = (gscan_swc_params_t *) kzalloc(len, GFP_KERNEL);
+       if (!significant_params) {
+               WL_ERR(("Cannot Malloc mem to parse config commands size - %d bytes \n", len));
+               return -1;
+       }
+
+
+       nla_for_each_attr(iter, data, len, tmp2) {
+               type = nla_type(iter);
+
+               switch (type) {
+                       case GSCAN_ATTRIBUTE_SIGNIFICANT_CHANGE_FLUSH:
+                       flush = nla_get_u8(iter);
+                       break;
+                       case GSCAN_ATTRIBUTE_RSSI_SAMPLE_SIZE:
+                               significant_params->rssi_window = nla_get_u16(iter);
+                               break;
+                       case GSCAN_ATTRIBUTE_LOST_AP_SAMPLE_SIZE:
+                               significant_params->lost_ap_window = nla_get_u16(iter);
+                               break;
+                       case GSCAN_ATTRIBUTE_MIN_BREACHING:
+                               significant_params->swc_threshold = nla_get_u16(iter);
+                               break;
+                       case GSCAN_ATTRIBUTE_SIGNIFICANT_CHANGE_BSSIDS:
+                               pbssid = significant_params->bssid_elem_list;
+                               nla_for_each_nested(outer, iter, tmp) {
+                                       nla_for_each_nested(inner, outer, tmp1) {
+                                                       switch (nla_type(inner)) {
+                                                               case GSCAN_ATTRIBUTE_BSSID:
+                                                               memcpy(&(pbssid[j].macaddr),
+                                                                    nla_data(inner),
+                                                                    ETHER_ADDR_LEN);
+                                                               break;
+                                                               case GSCAN_ATTRIBUTE_RSSI_HIGH:
+                                                               pbssid[j].rssi_high_threshold =
+                                                                      (int8) nla_get_u8(inner);
+                                                               break;
+                                                               case GSCAN_ATTRIBUTE_RSSI_LOW:
+                                                               pbssid[j].rssi_low_threshold =
+                                                                     (int8) nla_get_u8(inner);
+                                                               break;
+                                                       }
+                                               }
+                                       j++;
+                               }
+                               break;
+               }
+       }
+       significant_params->nbssid = j;
+
+       if (dhd_dev_pno_set_cfg_gscan(bcmcfg_to_prmry_ndev(cfg),
+           DHD_PNO_SIGNIFICANT_SCAN_CFG_ID, significant_params, flush) < 0) {
+               WL_ERR(("Could not set GSCAN significant cfg\n"));
+               err = -EINVAL;
+               goto exit;
+       }
+exit:
+       kfree(significant_params);
+       return err;
+}
+#endif /* GSCAN_SUPPORT */
+
+#if defined(RTT_SUPPORT) && 0
+void wl_cfgvendor_rtt_evt(void *ctx, void *rtt_data)
+{
+       struct wireless_dev *wdev = (struct wireless_dev *)ctx;
+       struct wiphy *wiphy;
+       struct sk_buff *skb;
+       uint32 tot_len = NLMSG_DEFAULT_SIZE, entry_len = 0;
+       gfp_t kflags;
+       rtt_report_t *rtt_report = NULL;
+       rtt_result_t *rtt_result = NULL;
+       struct list_head *rtt_list;
+       wiphy = wdev->wiphy;
+
+       WL_DBG(("In\n"));
+       /* Push the data to the skb */
+       if (!rtt_data) {
+               WL_ERR(("rtt_data is NULL\n"));
+               goto exit;
+       }
+       rtt_list = (struct list_head *)rtt_data;
+       kflags = in_atomic() ? GFP_ATOMIC : GFP_KERNEL;
+       /* Alloc the SKB for vendor_event */
+       skb = rtw_cfg80211_vendor_event_alloc(wiphy, tot_len, GOOGLE_RTT_COMPLETE_EVENT, kflags);
+       if (!skb) {
+               WL_ERR(("skb alloc failed"));
+               goto exit;
+       }
+       /* fill in the rtt results on each entry */
+       list_for_each_entry(rtt_result, rtt_list, list) {
+               entry_len = 0;
+               if (rtt_result->TOF_type == TOF_TYPE_ONE_WAY) {
+                       entry_len = sizeof(rtt_report_t);
+                       rtt_report = kzalloc(entry_len, kflags);
+                       if (!rtt_report) {
+                               WL_ERR(("rtt_report alloc failed"));
+                               goto exit;
+                       }
+                       rtt_report->addr = rtt_result->peer_mac;
+                       rtt_report->num_measurement = 1; /* ONE SHOT */
+                       rtt_report->status = rtt_result->err_code;
+                       rtt_report->type = (rtt_result->TOF_type == TOF_TYPE_ONE_WAY) ? RTT_ONE_WAY: RTT_TWO_WAY;
+                       rtt_report->peer = rtt_result->target_info->peer;
+                       rtt_report->channel = rtt_result->target_info->channel;
+                       rtt_report->rssi = rtt_result->avg_rssi;
+                       /* tx_rate */
+                       rtt_report->tx_rate = rtt_result->tx_rate;
+                       /* RTT */
+                       rtt_report->rtt = rtt_result->meanrtt;
+                       rtt_report->rtt_sd = rtt_result->sdrtt;
+                       /* convert to centi meter */
+                       if (rtt_result->distance != 0xffffffff)
+                               rtt_report->distance = (rtt_result->distance >> 2) * 25;
+                       else /* invalid distance */
+                               rtt_report->distance = -1;
+
+                       rtt_report->ts = rtt_result->ts;
+                       nla_append(skb, entry_len, rtt_report);
+                       kfree(rtt_report);
+               }
+       }
+       rtw_cfg80211_vendor_event(skb, kflags);
+exit:
+       return;
+}
+
+static int wl_cfgvendor_rtt_set_config(struct wiphy *wiphy, struct wireless_dev *wdev,
+                                       const void *data, int len) {
+       int err = 0, rem, rem1, rem2, type;
+       rtt_config_params_t rtt_param;
+       rtt_target_info_t* rtt_target = NULL;
+       const struct nlattr *iter, *iter1, *iter2;
+       int8 eabuf[ETHER_ADDR_STR_LEN];
+       int8 chanbuf[CHANSPEC_STR_LEN];
+       struct bcm_cfg80211 *cfg = wiphy_priv(wiphy);
+
+       WL_DBG(("In\n"));
+       err = dhd_dev_rtt_register_noti_callback(wdev->netdev, wdev, wl_cfgvendor_rtt_evt);
+       if (err < 0) {
+               WL_ERR(("failed to register rtt_noti_callback\n"));
+               goto exit;
+       }
+       memset(&rtt_param, 0, sizeof(rtt_param));
+       nla_for_each_attr(iter, data, len, rem) {
+               type = nla_type(iter);
+               switch (type) {
+               case RTT_ATTRIBUTE_TARGET_CNT:
+                       rtt_param.rtt_target_cnt = nla_get_u8(iter);
+                       if (rtt_param.rtt_target_cnt > RTT_MAX_TARGET_CNT) {
+                               WL_ERR(("exceed max target count : %d\n",
+                                       rtt_param.rtt_target_cnt));
+                               err = BCME_RANGE;
+                       }
+                       break;
+               case RTT_ATTRIBUTE_TARGET_INFO:
+                       rtt_target = rtt_param.target_info;
+                       nla_for_each_nested(iter1, iter, rem1) {
+                               nla_for_each_nested(iter2, iter1, rem2) {
+                                       type = nla_type(iter2);
+                                       switch (type) {
+                                       case RTT_ATTRIBUTE_TARGET_MAC:
+                                               memcpy(&rtt_target->addr, nla_data(iter2), ETHER_ADDR_LEN);
+                                               break;
+                                       case RTT_ATTRIBUTE_TARGET_TYPE:
+                                               rtt_target->type = nla_get_u8(iter2);
+                                               break;
+                                       case RTT_ATTRIBUTE_TARGET_PEER:
+                                               rtt_target->peer= nla_get_u8(iter2);
+                                               break;
+                                       case RTT_ATTRIBUTE_TARGET_CHAN:
+                                               memcpy(&rtt_target->channel, nla_data(iter2),
+                                                       sizeof(rtt_target->channel));
+                                               break;
+                                       case RTT_ATTRIBUTE_TARGET_MODE:
+                                               rtt_target->continuous = nla_get_u8(iter2);
+                                               break;
+                                       case RTT_ATTRIBUTE_TARGET_INTERVAL:
+                                               rtt_target->interval = nla_get_u32(iter2);
+                                               break;
+                                       case RTT_ATTRIBUTE_TARGET_NUM_MEASUREMENT:
+                                               rtt_target->measure_cnt = nla_get_u32(iter2);
+                                               break;
+                                       case RTT_ATTRIBUTE_TARGET_NUM_PKT:
+                                               rtt_target->ftm_cnt = nla_get_u32(iter2);
+                                               break;
+                                       case RTT_ATTRIBUTE_TARGET_NUM_RETRY:
+                                               rtt_target->retry_cnt = nla_get_u32(iter2);
+                                       }
+                               }
+                               /* convert to chanspec value */
+                               rtt_target->chanspec = dhd_rtt_convert_to_chspec(rtt_target->channel);
+                               if (rtt_target->chanspec == 0) {
+                                       WL_ERR(("Channel is not valid \n"));
+                                       goto exit;
+                               }
+                               WL_INFORM(("Target addr %s, Channel : %s for RTT \n",
+                                       bcm_ether_ntoa((const struct ether_addr *)&rtt_target->addr, eabuf),
+                                       wf_chspec_ntoa(rtt_target->chanspec, chanbuf)));
+                               rtt_target++;
+                       }
+                       break;
+               }
+       }
+       WL_DBG(("leave :target_cnt : %d\n", rtt_param.rtt_target_cnt));
+       if (dhd_dev_rtt_set_cfg(bcmcfg_to_prmry_ndev(cfg), &rtt_param) < 0) {
+               WL_ERR(("Could not set RTT configuration\n"));
+               err = -EINVAL;
+       }
+exit:
+       return err;
+}
+
+static int wl_cfgvendor_rtt_cancel_config(struct wiphy *wiphy, struct wireless_dev *wdev,
+                                       const void *data, int len)
+{
+       int err = 0, rem, type, target_cnt = 0;
+       const struct nlattr *iter;
+       struct ether_addr *mac_list = NULL, *mac_addr = NULL;
+       struct bcm_cfg80211 *cfg = wiphy_priv(wiphy);
+
+       nla_for_each_attr(iter, data, len, rem) {
+               type = nla_type(iter);
+               switch (type) {
+               case RTT_ATTRIBUTE_TARGET_CNT:
+                       target_cnt = nla_get_u8(iter);
+                       mac_list = (struct ether_addr *)kzalloc(target_cnt * ETHER_ADDR_LEN , GFP_KERNEL);
+                       if (mac_list == NULL) {
+                               WL_ERR(("failed to allocate mem for mac list\n"));
+                               goto exit;
+                       }
+                       mac_addr = &mac_list[0];
+                       break;
+               case RTT_ATTRIBUTE_TARGET_MAC:
+                       if (mac_addr)
+                               memcpy(mac_addr++, nla_data(iter), ETHER_ADDR_LEN);
+                       else {
+                               WL_ERR(("mac_list is NULL\n"));
+                               goto exit;
+                       }
+                       break;
+               }
+               if (dhd_dev_rtt_cancel_cfg(bcmcfg_to_prmry_ndev(cfg), mac_list, target_cnt) < 0) {
+                       WL_ERR(("Could not cancel RTT configuration\n"));
+                       err = -EINVAL;
+                       goto exit;
+               }
+       }
+exit:
+       if (mac_list)
+               kfree(mac_list);
+       return err;
+}
+static int wl_cfgvendor_rtt_get_capability(struct wiphy *wiphy, struct wireless_dev *wdev,
+                                       const void *data, int len)
+{
+       int err = 0;
+       struct bcm_cfg80211 *cfg = wiphy_priv(wiphy);
+       rtt_capabilities_t capability;
+
+       err = dhd_dev_rtt_capability(bcmcfg_to_prmry_ndev(cfg), &capability);
+       if (unlikely(err)) {
+               WL_ERR(("Vendor Command reply failed ret:%d \n", err));
+               goto exit;
+       }
+       err =  rtw_cfgvendor_send_cmd_reply(wiphy, bcmcfg_to_prmry_ndev(cfg),
+               &capability, sizeof(capability));
+
+       if (unlikely(err)) {
+               WL_ERR(("Vendor Command reply failed ret:%d \n", err));
+       }
+exit:
+       return err;
+}
+
+#endif /* RTT_SUPPORT */
+static int wl_cfgvendor_priv_string_handler(struct wiphy *wiphy,
+       struct wireless_dev *wdev, const void  *data, int len)
+{
+       int err = 0;
+       u8 resp[1] = {'\0'};
+
+       DBG_871X_LEVEL(_drv_always_, FUNC_NDEV_FMT" %s\n", FUNC_NDEV_ARG(wdev_to_ndev(wdev)), (char*)data);
+       err =  rtw_cfgvendor_send_cmd_reply(wiphy, wdev_to_ndev(wdev), resp, 1);
+       if (unlikely(err))
+               DBG_871X_LEVEL(_drv_err_, FUNC_NDEV_FMT"Vendor Command reply failed ret:%d \n"
+                       , FUNC_NDEV_ARG(wdev_to_ndev(wdev)), err);
+
+       return err;
+#if 0
+       struct bcm_cfg80211 *cfg = wiphy_priv(wiphy);
+       int err = 0;
+       int data_len = 0;
+
+       bzero(cfg->ioctl_buf, WLC_IOCTL_MAXLEN);
+
+       if (strncmp((char *)data, BRCM_VENDOR_SCMD_CAPA, strlen(BRCM_VENDOR_SCMD_CAPA)) == 0) {
+               err = wldev_iovar_getbuf(bcmcfg_to_prmry_ndev(cfg), "cap", NULL, 0,
+                       cfg->ioctl_buf, WLC_IOCTL_MAXLEN, &cfg->ioctl_buf_sync);
+               if (unlikely(err)) {
+                       WL_ERR(("error (%d)\n", err));
+                       return err;
+               }
+               data_len = strlen(cfg->ioctl_buf);
+               cfg->ioctl_buf[data_len] = '\0';
+       }
+
+       err =  rtw_cfgvendor_send_cmd_reply(wiphy, bcmcfg_to_prmry_ndev(cfg),
+               cfg->ioctl_buf, data_len+1);
+       if (unlikely(err))
+               WL_ERR(("Vendor Command reply failed ret:%d \n", err));
+       else
+               WL_INFORM(("Vendor Command reply sent successfully!\n"));
+
+       return err;
+#endif
+}
+
+static const struct wiphy_vendor_command rtw_vendor_cmds [] = {
+       {
+               {
+                       .vendor_id = OUI_BRCM,
+                       .subcmd = BRCM_VENDOR_SCMD_PRIV_STR
+               },
+               .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
+               .doit = wl_cfgvendor_priv_string_handler
+       },
+#if defined(GSCAN_SUPPORT) && 0
+       {
+               {
+                       .vendor_id = OUI_GOOGLE,
+                       .subcmd = GSCAN_SUBCMD_GET_CAPABILITIES
+               },
+               .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
+               .doit = wl_cfgvendor_gscan_get_capabilities
+       },
+       {
+               {
+                       .vendor_id = OUI_GOOGLE,
+                       .subcmd = GSCAN_SUBCMD_SET_CONFIG
+               },
+               .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
+               .doit = wl_cfgvendor_set_scan_cfg
+       },
+       {
+               {
+                       .vendor_id = OUI_GOOGLE,
+                       .subcmd = GSCAN_SUBCMD_SET_SCAN_CONFIG
+               },
+               .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
+               .doit = wl_cfgvendor_set_batch_scan_cfg
+       },
+       {
+               {
+                       .vendor_id = OUI_GOOGLE,
+                       .subcmd = GSCAN_SUBCMD_ENABLE_GSCAN
+               },
+               .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
+               .doit = wl_cfgvendor_initiate_gscan
+       },
+       {
+               {
+                       .vendor_id = OUI_GOOGLE,
+                       .subcmd = GSCAN_SUBCMD_ENABLE_FULL_SCAN_RESULTS
+               },
+               .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
+               .doit = wl_cfgvendor_enable_full_scan_result
+       },
+       {
+               {
+                       .vendor_id = OUI_GOOGLE,
+                       .subcmd = GSCAN_SUBCMD_SET_HOTLIST
+               },
+               .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
+               .doit = wl_cfgvendor_hotlist_cfg
+       },
+       {
+               {
+                       .vendor_id = OUI_GOOGLE,
+                       .subcmd = GSCAN_SUBCMD_SET_SIGNIFICANT_CHANGE_CONFIG
+               },
+               .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
+               .doit = wl_cfgvendor_significant_change_cfg
+       },
+       {
+               {
+                       .vendor_id = OUI_GOOGLE,
+                       .subcmd = GSCAN_SUBCMD_GET_SCAN_RESULTS
+               },
+               .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
+               .doit = wl_cfgvendor_gscan_get_batch_results
+       },
+       {
+               {
+                       .vendor_id = OUI_GOOGLE,
+                       .subcmd = GSCAN_SUBCMD_GET_CHANNEL_LIST
+               },
+               .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
+               .doit = wl_cfgvendor_gscan_get_channel_list
+       },
+#endif /* GSCAN_SUPPORT */
+#if defined(RTT_SUPPORT) && 0
+       {
+               {
+                       .vendor_id = OUI_GOOGLE,
+                       .subcmd = RTT_SUBCMD_SET_CONFIG
+               },
+               .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
+               .doit = wl_cfgvendor_rtt_set_config
+       },
+       {
+               {
+                       .vendor_id = OUI_GOOGLE,
+                       .subcmd = RTT_SUBCMD_CANCEL_CONFIG
+               },
+               .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
+               .doit = wl_cfgvendor_rtt_cancel_config
+       },
+       {
+               {
+                       .vendor_id = OUI_GOOGLE,
+                       .subcmd = RTT_SUBCMD_GETCAPABILITY
+               },
+               .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
+               .doit = wl_cfgvendor_rtt_get_capability
+       },
+#endif /* RTT_SUPPORT */
+       {
+               {
+                       .vendor_id = OUI_GOOGLE,
+                       .subcmd = ANDR_WIFI_SUBCMD_GET_FEATURE_SET
+               },
+               .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
+               .doit = rtw_cfgvendor_get_feature_set
+       },
+       {
+               {
+                       .vendor_id = OUI_GOOGLE,
+                       .subcmd = ANDR_WIFI_SUBCMD_GET_FEATURE_SET_MATRIX
+               },
+               .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
+               .doit = rtw_cfgvendor_get_feature_set_matrix
+       }
+};
+
+static const struct  nl80211_vendor_cmd_info rtw_vendor_events [] = {
+               { OUI_BRCM, BRCM_VENDOR_EVENT_UNSPEC },
+               { OUI_BRCM, BRCM_VENDOR_EVENT_PRIV_STR },
+#if defined(GSCAN_SUPPORT) && 0
+               { OUI_GOOGLE, GOOGLE_GSCAN_SIGNIFICANT_EVENT },
+               { OUI_GOOGLE, GOOGLE_GSCAN_GEOFENCE_FOUND_EVENT },
+               { OUI_GOOGLE, GOOGLE_GSCAN_BATCH_SCAN_EVENT },
+               { OUI_GOOGLE, GOOGLE_SCAN_FULL_RESULTS_EVENT },
+#endif /* GSCAN_SUPPORT */
+#if defined(RTT_SUPPORT) && 0
+               { OUI_GOOGLE, GOOGLE_RTT_COMPLETE_EVENT },
+#endif /* RTT_SUPPORT */
+#if defined(GSCAN_SUPPORT) && 0
+               { OUI_GOOGLE, GOOGLE_SCAN_COMPLETE_EVENT },
+               { OUI_GOOGLE, GOOGLE_GSCAN_GEOFENCE_LOST_EVENT }
+#endif /* GSCAN_SUPPORT */
+};
+
+int rtw_cfgvendor_attach(struct wiphy *wiphy)
+{
+
+       DBG_871X("Register RTW cfg80211 vendor cmd(0x%x) interface \n", NL80211_CMD_VENDOR);
+
+       wiphy->vendor_commands  = rtw_vendor_cmds;
+       wiphy->n_vendor_commands = ARRAY_SIZE(rtw_vendor_cmds);
+       wiphy->vendor_events    = rtw_vendor_events;
+       wiphy->n_vendor_events  = ARRAY_SIZE(rtw_vendor_events);
+
+       return 0;
+}
+
+int rtw_cfgvendor_detach(struct wiphy *wiphy)
+{
+       DBG_871X("Vendor: Unregister RTW cfg80211 vendor interface \n");
+
+       wiphy->vendor_commands  = NULL;
+       wiphy->vendor_events    = NULL;
+       wiphy->n_vendor_commands = 0;
+       wiphy->n_vendor_events  = 0;
+
+       return 0;
+}
+#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(RTW_VENDOR_EXT_SUPPORT) */
+
+#endif /* CONFIG_IOCTL_CFG80211 */
+
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_cfgvendor.h b/drivers/net/wireless/rockchip_wlan/rtl8723bu/os_dep/linux/rtw_cfgvendor.h
new file mode 100755 (executable)
index 0000000..7c349e7
--- /dev/null
@@ -0,0 +1,246 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2014 Realtek Corporation. All rights reserved.
+ *                                        
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+#ifndef _RTW_CFGVENDOR_H_
+#define _RTW_CFGVENDOR_H_
+
+#define OUI_BRCM    0x001018
+#define OUI_GOOGLE  0x001A11
+#define BRCM_VENDOR_SUBCMD_PRIV_STR    1
+#define ATTRIBUTE_U32_LEN                  (NLA_HDRLEN  + 4)
+#define VENDOR_ID_OVERHEAD                 ATTRIBUTE_U32_LEN
+#define VENDOR_SUBCMD_OVERHEAD             ATTRIBUTE_U32_LEN
+#define VENDOR_DATA_OVERHEAD               (NLA_HDRLEN)
+
+#define SCAN_RESULTS_COMPLETE_FLAG_LEN       ATTRIBUTE_U32_LEN
+#define SCAN_INDEX_HDR_LEN                   (NLA_HDRLEN)
+#define SCAN_ID_HDR_LEN                      ATTRIBUTE_U32_LEN
+#define SCAN_FLAGS_HDR_LEN                   ATTRIBUTE_U32_LEN
+#define GSCAN_NUM_RESULTS_HDR_LEN            ATTRIBUTE_U32_LEN
+#define GSCAN_RESULTS_HDR_LEN                (NLA_HDRLEN)
+#define GSCAN_BATCH_RESULT_HDR_LEN  (SCAN_INDEX_HDR_LEN + SCAN_ID_HDR_LEN + \
+                                                                       SCAN_FLAGS_HDR_LEN + \
+                                                               GSCAN_NUM_RESULTS_HDR_LEN + \
+                                                                       GSCAN_RESULTS_HDR_LEN)
+
+#define VENDOR_REPLY_OVERHEAD       (VENDOR_ID_OVERHEAD + \
+                                                                       VENDOR_SUBCMD_OVERHEAD + \
+                                                                       VENDOR_DATA_OVERHEAD)
+typedef enum {
+       /* don't use 0 as a valid subcommand */
+       VENDOR_NL80211_SUBCMD_UNSPECIFIED,
+
+       /* define all vendor startup commands between 0x0 and 0x0FFF */
+       VENDOR_NL80211_SUBCMD_RANGE_START = 0x0001,
+       VENDOR_NL80211_SUBCMD_RANGE_END   = 0x0FFF,
+
+       /* define all GScan related commands between 0x1000 and 0x10FF */
+       ANDROID_NL80211_SUBCMD_GSCAN_RANGE_START = 0x1000,
+       ANDROID_NL80211_SUBCMD_GSCAN_RANGE_END   = 0x10FF,
+
+       /* define all NearbyDiscovery related commands between 0x1100 and 0x11FF */
+       ANDROID_NL80211_SUBCMD_NBD_RANGE_START = 0x1100,
+       ANDROID_NL80211_SUBCMD_NBD_RANGE_END   = 0x11FF,
+
+       /* define all RTT related commands between 0x1100 and 0x11FF */
+       ANDROID_NL80211_SUBCMD_RTT_RANGE_START = 0x1100,
+       ANDROID_NL80211_SUBCMD_RTT_RANGE_END   = 0x11FF,
+
+       ANDROID_NL80211_SUBCMD_LSTATS_RANGE_START = 0x1200,
+       ANDROID_NL80211_SUBCMD_LSTATS_RANGE_END   = 0x12FF,
+
+       ANDROID_NL80211_SUBCMD_TDLS_RANGE_START = 0x1300,
+       ANDROID_NL80211_SUBCMD_TDLS_RANGE_END   = 0x13FF,
+       /* This is reserved for future usage */
+
+} ANDROID_VENDOR_SUB_COMMAND;
+
+enum wl_vendor_subcmd {
+       BRCM_VENDOR_SCMD_UNSPEC,
+       BRCM_VENDOR_SCMD_PRIV_STR,
+       GSCAN_SUBCMD_GET_CAPABILITIES = ANDROID_NL80211_SUBCMD_GSCAN_RANGE_START,
+       GSCAN_SUBCMD_SET_CONFIG,
+       GSCAN_SUBCMD_SET_SCAN_CONFIG,
+       GSCAN_SUBCMD_ENABLE_GSCAN,
+       GSCAN_SUBCMD_GET_SCAN_RESULTS,
+       GSCAN_SUBCMD_SCAN_RESULTS,
+       GSCAN_SUBCMD_SET_HOTLIST,
+       GSCAN_SUBCMD_SET_SIGNIFICANT_CHANGE_CONFIG,
+       GSCAN_SUBCMD_ENABLE_FULL_SCAN_RESULTS,
+       GSCAN_SUBCMD_GET_CHANNEL_LIST,
+       ANDR_WIFI_SUBCMD_GET_FEATURE_SET,
+       ANDR_WIFI_SUBCMD_GET_FEATURE_SET_MATRIX,
+       RTT_SUBCMD_SET_CONFIG = ANDROID_NL80211_SUBCMD_RTT_RANGE_START,
+       RTT_SUBCMD_CANCEL_CONFIG,
+       RTT_SUBCMD_GETCAPABILITY,
+    /* Add more sub commands here */
+    VENDOR_SUBCMD_MAX
+};
+
+enum gscan_attributes {
+    GSCAN_ATTRIBUTE_NUM_BUCKETS = 10,
+    GSCAN_ATTRIBUTE_BASE_PERIOD,
+    GSCAN_ATTRIBUTE_BUCKETS_BAND,
+    GSCAN_ATTRIBUTE_BUCKET_ID,
+    GSCAN_ATTRIBUTE_BUCKET_PERIOD,
+    GSCAN_ATTRIBUTE_BUCKET_NUM_CHANNELS,
+    GSCAN_ATTRIBUTE_BUCKET_CHANNELS,
+    GSCAN_ATTRIBUTE_NUM_AP_PER_SCAN,
+    GSCAN_ATTRIBUTE_REPORT_THRESHOLD,
+    GSCAN_ATTRIBUTE_NUM_SCANS_TO_CACHE,
+    GSCAN_ATTRIBUTE_BAND = GSCAN_ATTRIBUTE_BUCKETS_BAND,
+
+    GSCAN_ATTRIBUTE_ENABLE_FEATURE = 20,
+    GSCAN_ATTRIBUTE_SCAN_RESULTS_COMPLETE,
+    GSCAN_ATTRIBUTE_FLUSH_FEATURE,
+    GSCAN_ATTRIBUTE_ENABLE_FULL_SCAN_RESULTS,
+    GSCAN_ATTRIBUTE_REPORT_EVENTS,
+    /* remaining reserved for additional attributes */
+    GSCAN_ATTRIBUTE_NUM_OF_RESULTS = 30,
+    GSCAN_ATTRIBUTE_FLUSH_RESULTS,
+    GSCAN_ATTRIBUTE_SCAN_RESULTS,                       /* flat array of wifi_scan_result */
+    GSCAN_ATTRIBUTE_SCAN_ID,                            /* indicates scan number */
+    GSCAN_ATTRIBUTE_SCAN_FLAGS,                         /* indicates if scan was aborted */
+    GSCAN_ATTRIBUTE_AP_FLAGS,                           /* flags on significant change event */
+    GSCAN_ATTRIBUTE_NUM_CHANNELS,
+    GSCAN_ATTRIBUTE_CHANNEL_LIST,
+
+       /* remaining reserved for additional attributes */
+
+    GSCAN_ATTRIBUTE_SSID = 40,
+    GSCAN_ATTRIBUTE_BSSID,
+    GSCAN_ATTRIBUTE_CHANNEL,
+    GSCAN_ATTRIBUTE_RSSI,
+    GSCAN_ATTRIBUTE_TIMESTAMP,
+    GSCAN_ATTRIBUTE_RTT,
+    GSCAN_ATTRIBUTE_RTTSD,
+
+    /* remaining reserved for additional attributes */
+
+    GSCAN_ATTRIBUTE_HOTLIST_BSSIDS = 50,
+    GSCAN_ATTRIBUTE_RSSI_LOW,
+    GSCAN_ATTRIBUTE_RSSI_HIGH,
+    GSCAN_ATTRIBUTE_HOSTLIST_BSSID_ELEM,
+    GSCAN_ATTRIBUTE_HOTLIST_FLUSH,
+
+    /* remaining reserved for additional attributes */
+    GSCAN_ATTRIBUTE_RSSI_SAMPLE_SIZE = 60,
+    GSCAN_ATTRIBUTE_LOST_AP_SAMPLE_SIZE,
+    GSCAN_ATTRIBUTE_MIN_BREACHING,
+    GSCAN_ATTRIBUTE_SIGNIFICANT_CHANGE_BSSIDS,
+    GSCAN_ATTRIBUTE_SIGNIFICANT_CHANGE_FLUSH,
+    GSCAN_ATTRIBUTE_MAX
+};
+
+enum gscan_bucket_attributes {
+       GSCAN_ATTRIBUTE_CH_BUCKET_1,
+       GSCAN_ATTRIBUTE_CH_BUCKET_2,
+       GSCAN_ATTRIBUTE_CH_BUCKET_3,
+       GSCAN_ATTRIBUTE_CH_BUCKET_4,
+       GSCAN_ATTRIBUTE_CH_BUCKET_5,
+       GSCAN_ATTRIBUTE_CH_BUCKET_6,
+       GSCAN_ATTRIBUTE_CH_BUCKET_7
+};
+
+enum gscan_ch_attributes {
+       GSCAN_ATTRIBUTE_CH_ID_1,
+       GSCAN_ATTRIBUTE_CH_ID_2,
+       GSCAN_ATTRIBUTE_CH_ID_3,
+       GSCAN_ATTRIBUTE_CH_ID_4,
+       GSCAN_ATTRIBUTE_CH_ID_5,
+       GSCAN_ATTRIBUTE_CH_ID_6,
+       GSCAN_ATTRIBUTE_CH_ID_7
+};
+
+enum rtt_attributes {
+       RTT_ATTRIBUTE_TARGET_CNT,
+       RTT_ATTRIBUTE_TARGET_INFO,
+       RTT_ATTRIBUTE_TARGET_MAC,
+       RTT_ATTRIBUTE_TARGET_TYPE,
+       RTT_ATTRIBUTE_TARGET_PEER,
+       RTT_ATTRIBUTE_TARGET_CHAN,
+       RTT_ATTRIBUTE_TARGET_MODE,
+       RTT_ATTRIBUTE_TARGET_INTERVAL,
+       RTT_ATTRIBUTE_TARGET_NUM_MEASUREMENT,
+       RTT_ATTRIBUTE_TARGET_NUM_PKT,
+       RTT_ATTRIBUTE_TARGET_NUM_RETRY
+};
+
+typedef enum wl_vendor_event {
+       BRCM_VENDOR_EVENT_UNSPEC,
+       BRCM_VENDOR_EVENT_PRIV_STR,
+       GOOGLE_GSCAN_SIGNIFICANT_EVENT,
+       GOOGLE_GSCAN_GEOFENCE_FOUND_EVENT,
+       GOOGLE_GSCAN_BATCH_SCAN_EVENT,
+       GOOGLE_SCAN_FULL_RESULTS_EVENT,
+       GOOGLE_RTT_COMPLETE_EVENT,
+       GOOGLE_SCAN_COMPLETE_EVENT,
+       GOOGLE_GSCAN_GEOFENCE_LOST_EVENT
+} wl_vendor_event_t;
+
+enum andr_wifi_feature_set_attr {
+    ANDR_WIFI_ATTRIBUTE_NUM_FEATURE_SET,
+    ANDR_WIFI_ATTRIBUTE_FEATURE_SET
+};
+
+typedef enum wl_vendor_gscan_attribute {
+       ATTR_START_GSCAN,
+       ATTR_STOP_GSCAN,
+       ATTR_SET_SCAN_BATCH_CFG_ID, /* set batch scan params */
+       ATTR_SET_SCAN_GEOFENCE_CFG_ID, /* set list of bssids to track */
+       ATTR_SET_SCAN_SIGNIFICANT_CFG_ID, /* set list of bssids, rssi threshold etc.. */
+       ATTR_SET_SCAN_CFG_ID, /* set common scan config params here */
+       ATTR_GET_GSCAN_CAPABILITIES_ID,
+    /* Add more sub commands here */
+    ATTR_GSCAN_MAX
+} wl_vendor_gscan_attribute_t;
+
+typedef enum gscan_batch_attribute {
+       ATTR_GSCAN_BATCH_BESTN,
+       ATTR_GSCAN_BATCH_MSCAN,
+       ATTR_GSCAN_BATCH_BUFFER_THRESHOLD
+} gscan_batch_attribute_t;
+
+typedef enum gscan_geofence_attribute {
+       ATTR_GSCAN_NUM_HOTLIST_BSSID,
+       ATTR_GSCAN_HOTLIST_BSSID
+} gscan_geofence_attribute_t;
+
+typedef enum gscan_complete_event {
+       WIFI_SCAN_BUFFER_FULL,
+       WIFI_SCAN_COMPLETE
+} gscan_complete_event_t;
+
+/* Capture the BRCM_VENDOR_SUBCMD_PRIV_STRINGS* here */
+#define BRCM_VENDOR_SCMD_CAPA  "cap"
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(RTW_VENDOR_EXT_SUPPORT)
+extern int rtw_cfgvendor_attach(struct wiphy *wiphy);
+extern int rtw_cfgvendor_detach(struct wiphy *wiphy);
+extern int rtw_cfgvendor_send_async_event(struct wiphy *wiphy,
+                  struct net_device *dev, int event_id, const void  *data, int len);
+#if defined(GSCAN_SUPPORT) && 0
+extern int wl_cfgvendor_send_hotlist_event(struct wiphy *wiphy,
+                struct net_device *dev, void  *data, int len, wl_vendor_event_t event);
+#endif
+#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(RTW_VENDOR_EXT_SUPPORT) */
+
+#endif /* _RTW_CFGVENDOR_H_ */
+
index 039578642edfb3ba272f4826f1af26b88252fa4d..c752173b69cdf9488b5dd7d40d1baec8f6755b34 100755 (executable)
@@ -19,6 +19,7 @@
  ******************************************************************************/
 
 #include <drv_types.h>
+#include <hal_data.h>
 #include "rtw_proc.h"
 
 #ifdef CONFIG_PROC_DEBUG
@@ -69,9 +70,9 @@ inline struct proc_dir_entry *rtw_proc_create_entry(const char *name, struct pro
        struct proc_dir_entry *entry;
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26))
-       entry = proc_create_data(name,  S_IFREG|S_IRUGO, parent, fops, data);
+       entry = proc_create_data(name,  S_IFREG|S_IRUGO|S_IWUGO, parent, fops, data);
 #else
-       entry = create_proc_entry(name, S_IFREG|S_IRUGO, parent);
+       entry = create_proc_entry(name, S_IFREG|S_IRUGO|S_IWUGO, parent);
        if (entry) {
                entry->data = data;
                entry->proc_fops = fops;
@@ -261,14 +262,93 @@ static int proc_get_rf_reg_dump(struct seq_file *m, void *v)
 
        return 0;
 }
-static int proc_get_linked_info_dump(struct seq_file *m, void *v)
+
+
+//gpio setting
+#ifdef CONFIG_GPIO_API
+static ssize_t proc_set_config_gpio(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
+{
+       struct net_device *dev = data;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       char tmp[32]={0}; 
+       int num=0,gpio_pin=0,gpio_mode=0;//gpio_mode:0 input  1:output;
+       
+       if (count < 2)
+               return -EFAULT;
+       if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) 
+       {
+               num     =sscanf(tmp, "%d %d",&gpio_pin,&gpio_mode);
+               DBG_871X("num=%d gpio_pin=%d mode=%d\n",num,gpio_pin,gpio_mode);
+               padapter->pre_gpio_pin=gpio_pin;
+
+               if(gpio_mode==0 || gpio_mode==1  )
+                       rtw_hal_config_gpio(padapter, gpio_pin,gpio_mode);      
+       }
+       return count;
+
+}
+static ssize_t proc_set_gpio_output_value(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
 {
+       struct net_device *dev = data;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       char tmp[32]={0}; 
+       int num=0,gpio_pin=0,pin_mode=0;//pin_mode: 1 high         0:low
+       
+       if (count < 2)
+               return -EFAULT;
+       if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) 
+       {
+               num     =sscanf(tmp, "%d %d",&gpio_pin,&pin_mode);
+               DBG_871X("num=%d gpio_pin=%d pin_high=%d\n",num,gpio_pin,pin_mode);
+               padapter->pre_gpio_pin=gpio_pin;
+               
+               if(pin_mode==0 || pin_mode==1  )
+                       rtw_hal_set_gpio_output_value(padapter, gpio_pin,pin_mode);     
+       }
+       return count;
+}
+static int proc_get_gpio(struct seq_file *m, void *v)
+{
+       u8 gpioreturnvalue=0;
        struct net_device *dev = m->private;
+       
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       if(!padapter)   
+               return -EFAULT;
+       gpioreturnvalue = rtw_hal_get_gpio(padapter, padapter->pre_gpio_pin);
+       DBG_871X_SEL_NL(m, "get_gpio %d:%d \n",padapter->pre_gpio_pin ,gpioreturnvalue);
+       
+       return 0;
+
+}
+static ssize_t proc_set_gpio(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
+{
+       struct net_device *dev = data;
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       char tmp[32]={0}; 
+       int num=0,gpio_pin=0;
        
-       if(padapter)
-               DBG_871X_SEL_NL(m, "linked_info_dump :%s \n", (padapter->bLinkInfoDump)?"enable":"disable");
+       if (count < 1)
+               return -EFAULT;
+       if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) 
+       {
+               num     =sscanf(tmp, "%d",&gpio_pin);
+               DBG_871X("num=%d gpio_pin=%d\n",num,gpio_pin);
+               padapter->pre_gpio_pin=gpio_pin;
+               
+       }
+               return count;
+}
+#endif
+
 
+static int proc_get_linked_info_dump(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       if(padapter)    
+               DBG_871X_SEL_NL(m, "linked_info_dump :%s \n", (padapter->bLinkInfoDump)?"enable":"disable");
+       
        return 0;
 }
 
@@ -276,28 +356,40 @@ static ssize_t proc_set_linked_info_dump(struct file *file, const char __user *b
 {
        struct net_device *dev = data;
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
-       
-       char tmp[2];
-       int mode=0;
+
+       char tmp[32]={0}; 
+       int mode=0,pre_mode=0;
+       int num=0;      
 
        if (count < 1)
                return -EFAULT;
 
-       if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
+       pre_mode=padapter->bLinkInfoDump;
+       DBG_871X("pre_mode=%d \n",pre_mode);
 
-               int num = sscanf(tmp, "%d ", &mode);
+       if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) 
+       {
+               num     =sscanf(tmp, "%d ", &mode);
+               DBG_871X("num=%d mode=%d\n",num,mode);
 
-               if( padapter )
+               if(num!=1)
                {
-                       //padapter->bLinkInfoDump = mode;
-                       //DBG_871X("linked_info_dump =%s \n", (padapter->bLinkInfoDump)?"enable":"disable");
-                        linked_info_dump(padapter,mode);               
+                       DBG_871X("argument number is wrong\n");
+                               return -EFAULT;
                }
-
-       }
        
+               if(mode==1 || (mode==0 && pre_mode==1) ) //not consider pwr_saving 0:
+               {
+                       padapter->bLinkInfoDump = mode; 
+               
+               }
+               else if( (mode==2 ) || (mode==0 && pre_mode==2))//consider power_saving
+               {               
+                       //DBG_871X("linked_info_dump =%s \n", (padapter->bLinkInfoDump)?"enable":"disable")
+                       linked_info_dump(padapter,mode);        
+               }
+       }
        return count;
-       
 }
 
 int proc_get_rx_info(struct seq_file *m, void *v)
@@ -318,6 +410,15 @@ int proc_get_rx_info(struct seq_file *m, void *v)
        return 0;
 }      
 
+static int proc_get_mac_qinfo(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
+
+       rtw_hal_get_hwreg(adapter, HW_VAR_DUMP_MAC_QUEUE_INFO, (u8 *)m);
+
+       return 0;
+}
 
 ssize_t proc_reset_rx_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
 {
@@ -339,6 +440,137 @@ ssize_t proc_reset_rx_info(struct file *file, const char __user *buffer, size_t
        return count;
 }
 
+int proc_get_wifi_spec(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct registry_priv    *pregpriv = &padapter->registrypriv;
+       
+       DBG_871X_SEL_NL(m,"wifi_spec=%d\n",pregpriv->wifi_spec);
+       return 0;
+}
+
+static int proc_get_chan_plan(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+
+       DBG_871X_SEL_NL(m,"Channel plan=0x%02x\n",padapter->mlmepriv.ChannelPlan);      
+       return 0;
+}
+static ssize_t proc_set_chan_plan(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
+{
+       struct net_device *dev = data;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct SetChannelPlan_param setChannelPlan_param;
+       
+       char tmp[32];
+       u8 chan_plan = RT_CHANNEL_DOMAIN_REALTEK_DEFINE;
+       
+       if (!padapter)
+               return -EFAULT;
+
+       if (count < 1)
+       {
+               DBG_871X("argument size is less than 1\n");
+               return -EFAULT;
+       }       
+
+       if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
+
+               int num = sscanf(tmp, "%hhx", &chan_plan);
+
+               if (num !=  1) {
+                       DBG_871X("invalid read_reg parameter!\n");
+                       return count;
+               }
+
+       }
+       setChannelPlan_param.channel_plan = chan_plan;
+       if( H2C_SUCCESS != set_chplan_hdl(padapter, (unsigned char *)&setChannelPlan_param) )
+               return -EFAULT;
+               
+       return count;
+
+}
+
+static int proc_get_udpport(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct recv_priv *precvpriv = &(padapter->recvpriv);
+
+       DBG_871X_SEL_NL(m,"%d\n",precvpriv->sink_udpport);      
+       return 0;
+}
+static ssize_t proc_set_udpport(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
+{
+       struct net_device *dev = data;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct recv_priv *precvpriv = &(padapter->recvpriv);
+       int sink_udpport = 0;   
+       char tmp[32];
+       
+       
+       if (!padapter)
+               return -EFAULT;
+
+       if (count < 1)
+       {
+               DBG_871X("argument size is less than 1\n");
+               return -EFAULT;
+       }       
+
+       if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
+
+               int num = sscanf(tmp, "%d", &sink_udpport);
+
+               if (num !=  1) {
+                       DBG_871X("invalid input parameter number!\n");
+                       return count;
+               }
+
+       }
+       precvpriv->sink_udpport = sink_udpport;
+       
+       return count;
+
+}
+
+static int proc_get_macid_info(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
+       struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+       struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
+       u8 i;
+
+       DBG_871X_SEL_NL(m, "max_num:%u\n", macid_ctl->num);
+       DBG_871X_SEL_NL(m, "\n");
+
+       DBG_871X_SEL_NL(m, "used:\n");
+       dump_macid_map(m, &macid_ctl->used, macid_ctl->num);
+       DBG_871X_SEL_NL(m, "\n");
+
+       DBG_871X_SEL_NL(m, "%-3s %-3s %-4s %-4s"
+               "\n"
+               , "id", "bmc", "if_g", "ch_g"
+       );
+
+       for (i=0;i<macid_ctl->num;i++) {
+               if (rtw_macid_is_used(macid_ctl, i))
+                       DBG_871X_SEL_NL(m, "%3u %3u %4d %4d"
+                               "\n"
+                               , i
+                               , rtw_macid_is_bmc(macid_ctl, i)
+                               , rtw_macid_get_if_g(macid_ctl, i)
+                               , rtw_macid_get_ch_g(macid_ctl, i)
+                       );
+       }
+
+       return 0;
+}
+
 static int proc_get_cam(struct seq_file *m, void *v)
 {
        struct net_device *dev = m->private;
@@ -468,11 +700,14 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = {
        {"adapter_state", proc_get_adapter_state, NULL},
        {"trx_info", proc_get_trx_info, NULL},
        {"rate_ctl", proc_get_rate_ctl, proc_set_rate_ctl},
+       {"dis_pwt_ctl", proc_get_dis_pwt, proc_set_dis_pwt},
+       {"mac_qinfo", proc_get_mac_qinfo, NULL},
+       {"macid_info", proc_get_macid_info, NULL},
        {"cam", proc_get_cam, proc_set_cam},
        {"cam_cache", proc_get_cam_cache, NULL},
        {"suspend_info", proc_get_suspend_resume_info, NULL},
        {"rx_info", proc_get_rx_info, proc_reset_rx_info},
-
+       {"wifi_spec",proc_get_wifi_spec,NULL},
 #ifdef CONFIG_LAYER2_ROAMING
        {"roam_flags", proc_get_roam_flags, proc_set_roam_flags},
        {"roam_param", proc_get_roam_param, proc_set_roam_param},
@@ -511,12 +746,15 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = {
        {"ampdu_enable", proc_get_ampdu_enable, proc_set_ampdu_enable},
        {"rx_stbc", proc_get_rx_stbc, proc_set_rx_stbc},
        {"rx_ampdu", proc_get_rx_ampdu, proc_set_rx_ampdu},
+       {"rx_ampdu_factor",proc_get_rx_ampdu_factor,proc_set_rx_ampdu_factor},
+       {"rx_ampdu_density",proc_get_rx_ampdu_density,proc_set_rx_ampdu_density},
+       {"tx_ampdu_density",proc_get_tx_ampdu_density,proc_set_tx_ampdu_density},        
 #endif /* CONFIG_80211N_HT */
 
        {"en_fwps", proc_get_en_fwps, proc_set_en_fwps},
 
        //{"path_rssi", proc_get_two_path_rssi, NULL},
-       {"rssi_disp",proc_get_rssi_disp, proc_set_rssi_disp},
+//     {"rssi_disp",proc_get_rssi_disp, proc_set_rssi_disp},
 
 #ifdef CONFIG_BT_COEXIST
        {"btcoex_dbg", proc_get_btcoex_dbg, proc_set_btcoex_dbg},
@@ -528,6 +766,13 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = {
        {"sreset", proc_get_sreset, proc_set_sreset},
 #endif /* DBG_CONFIG_ERROR_DETECT */
        {"linked_info_dump",proc_get_linked_info_dump,proc_set_linked_info_dump},
+
+#ifdef CONFIG_GPIO_API
+       {"get_gpio",proc_get_gpio,proc_set_gpio},
+       {"set_gpio_output_value",proc_get_dummy,proc_set_gpio_output_value},
+       {"config_gpio",proc_get_dummy,proc_set_config_gpio},
+#endif
+
 #ifdef CONFIG_DBG_COUNTER
        {"rx_logs", proc_get_rx_logs, NULL},
        {"tx_logs", proc_get_tx_logs, NULL},
@@ -538,6 +783,12 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = {
        {"rx_ring", proc_get_rx_ring, NULL},
        {"tx_ring", proc_get_tx_ring, NULL},
 #endif
+#ifdef CONFIG_P2P_WOWLAN
+       {"p2p_wowlan_info", proc_get_p2p_wowlan_info, NULL},
+#endif
+       {"chan_plan",proc_get_chan_plan,proc_set_chan_plan},
+       {"new_bcn_max", proc_get_new_bcn_max, proc_set_new_bcn_max},
+       {"sink_udpport",proc_get_udpport,proc_set_udpport},
 };
 
 const int adapter_proc_hdls_num = sizeof(adapter_proc_hdls) / sizeof(struct rtw_proc_hdl);
@@ -712,6 +963,78 @@ ssize_t proc_set_odm_adaptivity(struct file *file, const char __user *buffer, si
        return count;
 }
 
+static char *phydm_msg = NULL;
+#define PHYDM_MSG_LEN  80*24
+
+int proc_get_phydm_cmd(struct seq_file *m, void *v)
+{
+       struct net_device *netdev;
+       PADAPTER padapter;
+       PHAL_DATA_TYPE pHalData;
+       PDM_ODM_T phydm;
+
+
+       netdev = m->private;
+       padapter = (PADAPTER)rtw_netdev_priv(netdev);
+       pHalData = GET_HAL_DATA(padapter);
+       phydm = &pHalData->odmpriv;
+
+       if (NULL == phydm_msg) {
+               phydm_msg = rtw_zmalloc(PHYDM_MSG_LEN);
+               if (NULL == phydm_msg)
+                       return -ENOMEM;
+
+               PhyDM_Cmd(phydm, NULL, 0, 0, phydm_msg, PHYDM_MSG_LEN);
+       }
+
+       DBG_871X_SEL(m, "%s\n", phydm_msg);
+
+       rtw_mfree(phydm_msg, PHYDM_MSG_LEN);
+       phydm_msg = NULL;
+
+       return 0;
+}
+
+ssize_t proc_set_phydm_cmd(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
+{
+       struct net_device *netdev;
+       PADAPTER padapter;
+       PHAL_DATA_TYPE pHalData;
+       PDM_ODM_T phydm;
+       char tmp[64] = {0};
+
+
+       netdev = (struct net_device*)data;
+       padapter = (PADAPTER)rtw_netdev_priv(netdev);
+       pHalData = GET_HAL_DATA(padapter);
+       phydm = &pHalData->odmpriv;
+
+       if (count < 1)
+               return -EFAULT;
+
+       if (count > sizeof(tmp))
+               return -EFAULT;
+
+       if (buffer && !copy_from_user(tmp, buffer, count)) {
+               if (NULL == phydm_msg) {
+                       phydm_msg = rtw_zmalloc(PHYDM_MSG_LEN);
+                       if (NULL == phydm_msg)
+                               return -ENOMEM;
+               } else {
+                       _rtw_memset(phydm_msg, 0, PHYDM_MSG_LEN);
+               }
+
+               PhyDM_Cmd(phydm, tmp, count, 1, phydm_msg, PHYDM_MSG_LEN);
+
+               if (strlen(phydm_msg) == 0) {
+                       rtw_mfree(phydm_msg, PHYDM_MSG_LEN);
+                       phydm_msg = NULL;
+               }
+       }
+
+       return count;
+}
+
 /*
 * rtw_odm_proc:
 * init/deinit when register/unregister net_device, along with rtw_adapter_proc
@@ -721,6 +1044,7 @@ const struct rtw_proc_hdl odm_proc_hdls [] = {
        {"dbg_level", proc_get_odm_dbg_level, proc_set_odm_dbg_level},
        {"ability", proc_get_odm_ability, proc_set_odm_ability},
        {"adaptivity", proc_get_odm_adaptivity, proc_set_odm_adaptivity},
+       {"cmd", proc_get_phydm_cmd, proc_set_phydm_cmd},
 };
 
 const int odm_proc_hdls_num = sizeof(odm_proc_hdls) / sizeof(struct rtw_proc_hdl);
@@ -809,6 +1133,11 @@ void rtw_odm_proc_deinit(_adapter *adapter)
        remove_proc_entry("odm", adapter->dir_dev);
 
        adapter->dir_odm = NULL;
+
+       if (phydm_msg) {
+               rtw_mfree(phydm_msg, PHYDM_MSG_LEN);
+               phydm_msg = NULL;
+       }
 }
 
 struct proc_dir_entry *rtw_adapter_proc_init(struct net_device *dev)
index d45a28e2bb46f3e53831b7dd55898251ced3d0b4..9aee7bf56f68240c664064bc015297c854aa8057 100755 (executable)
@@ -40,12 +40,12 @@ void rtw_adapter_proc_replace(struct net_device *dev);
 
 #else //!CONFIG_PROC_DEBUG
 
-struct proc_dir_entry *get_rtw_drv_proc(void) {return NULL;}
-int rtw_drv_proc_init(void) {return 0;}
-void rtw_drv_proc_deinit(void) {}
-struct proc_dir_entry *rtw_adapter_proc_init(struct net_device *dev){return NULL;}
-void rtw_adapter_proc_deinit(struct net_device *dev){}
-void rtw_adapter_proc_replace(struct net_device *dev){}
+#define get_rtw_drv_proc() NULL
+#define rtw_drv_proc_init() 0
+#define rtw_drv_proc_deinit() do {} while (0)
+#define rtw_adapter_proc_init(dev) NULL
+#define rtw_adapter_proc_deinit(dev) do {} while (0)
+#define rtw_adapter_proc_replace(dev) do {} while (0)
 
 #endif //!CONFIG_PROC_DEBUG
 
index 8d26548a0b24b7a160504f98bbb01769fad82b6e..571c4b8420bfec0be5e09f6bb0feb23ab65de665 100755 (executable)
@@ -959,10 +959,7 @@ int rtw_hw_resume(_adapter *padapter)
        netif_device_attach(pnetdev);
        netif_carrier_on(pnetdev);
 
-       if(!rtw_netif_queue_stopped(pnetdev))
-               rtw_netif_start_queue(pnetdev);
-       else
-               rtw_netif_wake_queue(pnetdev);
+       rtw_netif_wake_queue(pnetdev);
 
        pwrpriv->bkeepfwalive = _FALSE;
        pwrpriv->brfoffbyhw = _FALSE;
@@ -1693,7 +1690,7 @@ _func_exit_;
 extern int console_suspend_enabled;
 #endif
 
-static int rtw_drv_entry(void)
+static int  rtw_drv_entry(void)
 {
        int ret = 0;
 
@@ -1754,7 +1751,8 @@ static void rtw_drv_halt(void)
 }
 
 #include "wifi_version.h"
-
+//extern int wifi_activate_usb(void);
+//extern int wifi_deactivate_usb(void);
 extern int rockchip_wifi_power(int on);
 extern int rockchip_wifi_set_carddetect(int val);
 
@@ -1765,7 +1763,6 @@ int rockchip_wifi_init_module_rtkwifi(void)
     printk("==== Launching Wi-Fi driver! (Powered by Rockchip) ====\n");
     printk("=======================================================\n");
     printk("Realtek 8723BU USB WiFi driver (Powered by Rockchip,Ver %s) init.\n", RTL8723BU_DRV_VERSION);
-
     rockchip_wifi_power(1);
     return rtw_drv_entry();
 }
@@ -1777,18 +1774,14 @@ void rockchip_wifi_exit_module_rtkwifi(void)
     printk("==== Dislaunching Wi-Fi driver! (Powered by Rockchip) ====\n");
     printk("=======================================================\n");
     printk("Realtek 8723BU USB WiFi driver (Powered by Rockchip,Ver %s) init.\n", RTL8723BU_DRV_VERSION);
-
     rtw_drv_halt();
     rockchip_wifi_power(0);
+  // wifi_deactivate_usb();
 }
 
-#ifdef CONFIG_RTL8723BU
+
 EXPORT_SYMBOL(rockchip_wifi_init_module_rtkwifi);
 EXPORT_SYMBOL(rockchip_wifi_exit_module_rtkwifi);
-#else
-module_init(rockchip_wifi_init_module_rtkwifi);
-module_exit(rockchip_wifi_exit_module_rtkwifi);
-#endif
 //module_init(rtw_drv_entry);
 //module_exit(rtw_drv_halt);
 
index d854d7690995dc431485928131ef66a13b3dcee9..b552caf212a18045e01cc9afcdd7054995036259 100755 (executable)
 #include <hal_data.h>\r
 #include <rtw_sreset.h>\r
 \r
+#ifdef CONFIG_RTL8192D\r
+#include <Hal8192DPhyReg.h>\r
+#endif\r
+\r
+\r
+struct rtw_async_write_data {\r
+       u8 data[VENDOR_CMD_MAX_DATA_LEN];\r
+       struct usb_ctrlrequest dr;\r
+};\r
+       \r
 int usbctrl_vendorreq(struct intf_hdl *pintfhdl, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype)\r
 {\r
        _adapter        *padapter = pintfhdl->padapter;\r
@@ -178,13 +188,13 @@ static void _usbctrl_vendorreq_async_callback(struct urb *urb, struct pt_regs *r
 {\r
        if (urb) {\r
                if (urb->context) {\r
-                       rtw_mfree(urb->context);\r
+                       rtw_mfree(urb->context, sizeof(struct rtw_async_write_data));\r
                }\r
                usb_free_urb(urb);\r
        }\r
 }\r
 \r
-static int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request,\r
+int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request,\r
        u16 value, u16 index, void *pdata, u16 len, u8 requesttype)\r
 {\r
        int rc;\r
@@ -192,10 +202,7 @@ static int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request,
        u8 reqtype;\r
        struct usb_ctrlrequest *dr;\r
        struct urb *urb;\r
-       struct rtl819x_async_write_data {\r
-               u8 data[VENDOR_CMD_MAX_DATA_LEN];\r
-               struct usb_ctrlrequest dr;\r
-       } *buf;\r
+       struct rtw_async_write_data *buf;\r
 \r
 \r
        if (requesttype == VENDOR_READ) {\r
@@ -243,70 +250,7 @@ exit:
        return rc;\r
 }\r
 \r
-int usb_write_async(struct usb_device *udev, u32 addr, void *pdata, u16 len)\r
-{\r
-       u8 request;\r
-       u8 requesttype;\r
-       u16 wvalue;\r
-       u16 index;\r
-\r
-       int ret;\r
-\r
-       requesttype = VENDOR_WRITE;//write_out\r
-       request = REALTEK_USB_VENQT_CMD_REQ;\r
-       index = REALTEK_USB_VENQT_CMD_IDX;//n/a\r
 \r
-       wvalue = (u16)(addr&0x0000ffff);\r
-\r
-       ret = _usbctrl_vendorreq_async_write(udev, request, wvalue, index, pdata, len, requesttype);\r
-\r
-       return ret;\r
-}\r
-\r
-int usb_async_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val)\r
-{\r
-       u8 data;\r
-       int ret;\r
-       struct dvobj_priv  *pdvobjpriv = (struct dvobj_priv  *)pintfhdl->pintf_dev;\r
-       struct usb_device *udev=pdvobjpriv->pusbdev;\r
-\r
-       _func_enter_;\r
-       data = val;\r
-       ret = usb_write_async(udev, addr, &data, 1);\r
-       _func_exit_;\r
-\r
-       return ret;\r
-}\r
-\r
-int usb_async_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val)\r
-{\r
-       u16 data;\r
-       int ret;\r
-       struct dvobj_priv  *pdvobjpriv = (struct dvobj_priv  *)pintfhdl->pintf_dev;\r
-       struct usb_device *udev=pdvobjpriv->pusbdev;\r
-\r
-       _func_enter_;\r
-       data = val;\r
-       ret = usb_write_async(udev, addr, &data, 2);\r
-       _func_exit_;\r
-\r
-       return ret;\r
-}\r
-\r
-int usb_async_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val)\r
-{\r
-       u32 data;\r
-       int ret;\r
-       struct dvobj_priv  *pdvobjpriv = (struct dvobj_priv  *)pintfhdl->pintf_dev;\r
-       struct usb_device *udev=pdvobjpriv->pusbdev;\r
-\r
-       _func_enter_;\r
-       data = val;\r
-       ret = usb_write_async(udev, addr, &data, 4);\r
-       _func_exit_;\r
-       \r
-       return ret;\r
-}\r
 #endif /* CONFIG_USB_SUPPORT_ASYNC_VDN_REQ */\r
 \r
 unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr)\r
@@ -781,3 +725,436 @@ void usb_write_port_cancel(struct intf_hdl *pintfhdl)
        }\r
 }\r
 \r
+void usb_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf)\r
+{\r
+\r
+       precvbuf->transfer_len = 0;\r
+\r
+       precvbuf->len = 0;\r
+\r
+       precvbuf->ref_cnt = 0;\r
+\r
+       if(precvbuf->pbuf)\r
+       {\r
+               precvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pbuf;\r
+               precvbuf->pend = precvbuf->pdata + MAX_RECVBUF_SZ;\r
+       }\r
+\r
+}\r
+\r
+int recvbuf2recvframe(PADAPTER padapter, void *ptr);\r
+\r
+#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX\r
+void usb_recv_tasklet(void *priv)\r
+{      \r
+       struct recv_buf *precvbuf = NULL;\r
+       _adapter        *padapter = (_adapter*)priv;\r
+       struct recv_priv        *precvpriv = &padapter->recvpriv;\r
+\r
+       while (NULL != (precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue)))\r
+       {\r
+               if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE))\r
+               {\r
+                       DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved \n");\r
+                       \r
+                       break;\r
+               }\r
+               \r
+\r
+               recvbuf2recvframe(padapter, precvbuf);\r
+\r
+               rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);\r
+       }       \r
+       \r
+}\r
+\r
+void usb_read_port_complete(struct urb *purb, struct pt_regs *regs)\r
+{      \r
+       struct recv_buf *precvbuf = (struct recv_buf *)purb->context;   \r
+       _adapter                        *padapter =(_adapter *)precvbuf->adapter;\r
+       struct recv_priv        *precvpriv = &padapter->recvpriv;\r
+\r
+       RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n"));\r
+       \r
+       ATOMIC_DEC(&(precvpriv->rx_pending_cnt));\r
+               \r
+       if (RTW_CANNOT_RX(padapter))\r
+       {\r
+               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", padapter->bDriverStopped, padapter->bSurpriseRemoved));                \r
+               DBG_8192C("%s() RX Warning! bDriverStopped(%d) OR bSurpriseRemoved(%d) \n", \r
+               __FUNCTION__,padapter->bDriverStopped, padapter->bSurpriseRemoved);\r
+               goto exit;\r
+       }\r
+\r
+       if(purb->status==0)//SUCCESS\r
+       {\r
+               if ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE))\r
+               {\r
+                       RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: (purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)\n"));\r
+\r
+                       rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);\r
+               }\r
+               else \r
+               {                       \r
+                       rtw_reset_continual_io_error(adapter_to_dvobj(padapter));\r
+                       \r
+                       precvbuf->transfer_len = purb->actual_length;   \r
+\r
+                       //rtw_enqueue_rx_transfer_buffer(precvpriv, rx_transfer_buf);                   \r
+                       rtw_enqueue_recvbuf(precvbuf, &precvpriv->recv_buf_pending_queue);\r
+\r
+                       tasklet_schedule(&precvpriv->recv_tasklet);                     \r
+               }               \r
+       }\r
+       else\r
+       {\r
+               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete : purb->status(%d) != 0 \n", purb->status));\r
+       \r
+               DBG_8192C("###=> usb_read_port_complete => urb status(%d)\n", purb->status);\r
+\r
+               if(rtw_inc_and_chk_continual_io_error(adapter_to_dvobj(padapter)) == _TRUE ){\r
+                       padapter->bSurpriseRemoved = _TRUE;\r
+               }\r
+\r
+               switch(purb->status) {\r
+                       case -EINVAL:\r
+                       case -EPIPE:                    \r
+                       case -ENODEV:\r
+                       case -ESHUTDOWN:\r
+                               //padapter->bSurpriseRemoved=_TRUE;\r
+                               //RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n"));\r
+                       case -ENOENT:\r
+                               padapter->bDriverStopped=_TRUE;                 \r
+                               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n"));\r
+                               break;\r
+                       case -EPROTO:\r
+                       case -EILSEQ:\r
+                       case -ETIME:\r
+                       case -ECOMM:\r
+                       case -EOVERFLOW:\r
+                               #ifdef DBG_CONFIG_ERROR_DETECT  \r
+                               {       \r
+                                       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);\r
+                                       pHalData->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL;                     \r
+                               }\r
+                               #endif\r
+                               rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);                    \r
+                               break;\r
+                       case -EINPROGRESS:\r
+                               DBG_8192C("ERROR: URB IS IN PROGRESS!/n");\r
+                               break;\r
+                       default:\r
+                               break;                          \r
+               }\r
+               \r
+       }       \r
+\r
+exit:  \r
+       \r
+_func_exit_;\r
+}\r
+\r
+u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)\r
+{              \r
+       int err;\r
+       unsigned int pipe;\r
+       u32 ret = _SUCCESS;\r
+       PURB purb = NULL;       \r
+       struct recv_buf *precvbuf = (struct recv_buf *)rmem;\r
+       _adapter                *adapter = pintfhdl->padapter;\r
+       struct dvobj_priv       *pdvobj = adapter_to_dvobj(adapter);\r
+       struct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobj);\r
+       struct recv_priv        *precvpriv = &adapter->recvpriv;\r
+       struct usb_device       *pusbd = pdvobj->pusbdev;\r
+\r
+_func_enter_;\r
+       \r
+       if (RTW_CANNOT_RX(adapter) || (precvbuf == NULL))\r
+       {\r
+               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( RTW_CANNOT_RX ) || precvbuf == NULL!!!\n"));\r
+               return _FAIL;\r
+       }\r
+\r
+       usb_init_recvbuf(adapter, precvbuf);\r
+\r
+       if(precvbuf->pbuf)\r
+       {                       \r
+               ATOMIC_INC(&(precvpriv->rx_pending_cnt));\r
+               purb = precvbuf->purb;          \r
+\r
+               //translate DMA FIFO addr to pipehandle\r
+               pipe = ffaddr2pipehdl(pdvobj, addr);    \r
+\r
+               usb_fill_bulk_urb(purb, pusbd, pipe, \r
+                                       precvbuf->pbuf,\r
+                                       MAX_RECVBUF_SZ,\r
+                                       usb_read_port_complete,\r
+                                       precvbuf);//context is precvbuf\r
+\r
+               purb->transfer_dma = precvbuf->dma_transfer_addr;\r
+               purb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;                                                                \r
+\r
+               err = usb_submit_urb(purb, GFP_ATOMIC); \r
+               if((err) && (err != (-EPERM)))\r
+               {\r
+                       RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x", err, purb->status));\r
+                       DBG_8192C("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n",err,purb->status);\r
+                       ret = _FAIL;\r
+               }\r
+               \r
+       }\r
+\r
+_func_exit_;\r
+\r
+       return ret;\r
+}\r
+#else  // CONFIG_USE_USB_BUFFER_ALLOC_RX\r
+\r
+void usb_recv_tasklet(void *priv)\r
+{\r
+       _pkt                    *pskb;\r
+       _adapter                *padapter = (_adapter*)priv;\r
+       struct recv_priv        *precvpriv = &padapter->recvpriv;\r
+       struct recv_buf *precvbuf = NULL;\r
+       \r
+       while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue)))\r
+       {\r
+               if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE))\r
+               {\r
+                       DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved \n");\r
+#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER\r
+                       if(rtw_free_skb_premem(pskb)!=0)\r
+#endif //CONFIG_PREALLOC_RX_SKB_BUFFER\r
+\r
+                       rtw_skb_free(pskb);\r
+                       break;\r
+               }\r
+       \r
+               recvbuf2recvframe(padapter, pskb);\r
+\r
+#ifdef CONFIG_PREALLOC_RECV_SKB\r
+\r
+               skb_reset_tail_pointer(pskb);\r
+\r
+               pskb->len = 0;\r
+               \r
+               skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb);\r
+               \r
+#else\r
+               rtw_skb_free(pskb);\r
+#endif\r
+               if (NULL != (precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue))) {\r
+                       precvbuf->pskb = NULL;\r
+                       precvbuf->reuse = _FALSE;\r
+                       rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);\r
+               }\r
+       }\r
+}\r
+\r
+\r
+void usb_read_port_complete(struct urb *purb, struct pt_regs *regs)\r
+{\r
+       _irqL irqL;\r
+       uint isevt, *pbuf;\r
+       struct recv_buf *precvbuf = (struct recv_buf *)purb->context;   \r
+       _adapter                        *padapter =(_adapter *)precvbuf->adapter;\r
+       struct recv_priv        *precvpriv = &padapter->recvpriv;       \r
+       \r
+       RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n"));\r
+               \r
+       ATOMIC_DEC(&(precvpriv->rx_pending_cnt));\r
+       \r
+       if(RTW_CANNOT_RX(padapter))\r
+       {\r
+               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", padapter->bDriverStopped, padapter->bSurpriseRemoved));                \r
+               \r
+       #ifdef CONFIG_PREALLOC_RECV_SKB\r
+               precvbuf->reuse = _TRUE;\r
+       #else\r
+               if(precvbuf->pskb){\r
+                       DBG_8192C("==> free skb(%p)\n",precvbuf->pskb);\r
+                       rtw_skb_free(precvbuf->pskb);\r
+               }       \r
+       #endif\r
+               DBG_8192C("%s() RX Warning! bDriverStopped(%d) OR bSurpriseRemoved(%d) \n", \r
+               __FUNCTION__,padapter->bDriverStopped, padapter->bSurpriseRemoved);\r
+               goto exit;\r
+       }\r
+\r
+       if(purb->status==0)//SUCCESS\r
+       {\r
+               if ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE))\r
+               {\r
+                       RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: (purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)\n"));\r
+                       precvbuf->reuse = _TRUE;\r
+                       rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);\r
+                       DBG_8192C("%s()-%d: RX Warning!\n", __FUNCTION__, __LINE__);    \r
+               }\r
+               else \r
+               {       \r
+                       rtw_reset_continual_io_error(adapter_to_dvobj(padapter));\r
+                       \r
+                       precvbuf->transfer_len = purb->actual_length;                   \r
+                       skb_put(precvbuf->pskb, purb->actual_length);   \r
+                       skb_queue_tail(&precvpriv->rx_skb_queue, precvbuf->pskb);\r
+#ifndef CONFIG_FIX_NR_BULKIN_BUFFER\r
+                       if (skb_queue_len(&precvpriv->rx_skb_queue)<=1)\r
+#endif\r
+                               tasklet_schedule(&precvpriv->recv_tasklet);\r
+\r
+                       precvbuf->pskb = NULL;\r
+                       precvbuf->reuse = _FALSE;\r
+                       rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);                    \r
+               }               \r
+       }\r
+       else\r
+       {\r
+               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete : purb->status(%d) != 0 \n", purb->status));\r
+       \r
+               DBG_8192C("###=> usb_read_port_complete => urb status(%d)\n", purb->status);\r
+\r
+               if(rtw_inc_and_chk_continual_io_error(adapter_to_dvobj(padapter)) == _TRUE ){\r
+                       padapter->bSurpriseRemoved = _TRUE;\r
+               }\r
+\r
+               switch(purb->status) {\r
+                       case -EINVAL:\r
+                       case -EPIPE:                    \r
+                       case -ENODEV:\r
+                       case -ESHUTDOWN:\r
+                               //padapter->bSurpriseRemoved=_TRUE;\r
+                               //RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n"));\r
+                       case -ENOENT:\r
+                               padapter->bDriverStopped=_TRUE;                 \r
+                               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n"));\r
+                               break;\r
+                       case -EPROTO:\r
+                       case -EILSEQ:\r
+                       case -ETIME:\r
+                       case -ECOMM:\r
+                       case -EOVERFLOW:\r
+                               #ifdef DBG_CONFIG_ERROR_DETECT  \r
+                               {       \r
+                                       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);\r
+                                       pHalData->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL;                     \r
+                               }\r
+                               #endif\r
+                               precvbuf->reuse = _TRUE;\r
+                               rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);                    \r
+                               break;\r
+                       case -EINPROGRESS:\r
+                               DBG_8192C("ERROR: URB IS IN PROGRESS!/n");\r
+                               break;\r
+                       default:\r
+                               break;                          \r
+               }\r
+               \r
+       }       \r
+\r
+exit:  \r
+       \r
+_func_exit_;\r
+       \r
+}\r
+\r
+u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)\r
+{\r
+       _irqL irqL;\r
+       int err;\r
+       unsigned int pipe;\r
+       SIZE_PTR tmpaddr=0;\r
+       SIZE_PTR alignment=0;\r
+       u32 ret = _SUCCESS;\r
+       PURB purb = NULL;\r
+       struct recv_buf *precvbuf = (struct recv_buf *)rmem;\r
+       _adapter                *adapter = pintfhdl->padapter;\r
+       struct dvobj_priv       *pdvobj = adapter_to_dvobj(adapter);\r
+       struct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobj);\r
+       struct recv_priv        *precvpriv = &adapter->recvpriv;\r
+       struct usb_device       *pusbd = pdvobj->pusbdev;\r
+       \r
+\r
+_func_enter_;\r
+       \r
+       if (RTW_CANNOT_RX(adapter) || (precvbuf == NULL))\r
+       {\r
+               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( RTW_CANNOT_RX ) || precvbuf == NULL!!!\n"));\r
+               return _FAIL;\r
+       }\r
+\r
+#ifdef CONFIG_PREALLOC_RECV_SKB\r
+       if((precvbuf->reuse == _FALSE) || (precvbuf->pskb == NULL))\r
+       {\r
+               if (NULL != (precvbuf->pskb = skb_dequeue(&precvpriv->free_recv_skb_queue)))\r
+               {\r
+                       precvbuf->reuse = _TRUE;\r
+               }\r
+       }\r
+#endif\r
+\r
+       usb_init_recvbuf(adapter, precvbuf);            \r
+\r
+       //re-assign for linux based on skb\r
+       if((precvbuf->reuse == _FALSE) || (precvbuf->pskb == NULL))\r
+       {\r
+#ifndef CONFIG_FIX_NR_BULKIN_BUFFER\r
+               precvbuf->pskb = rtw_skb_alloc(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ);\r
+#endif\r
+               if(precvbuf->pskb == NULL)              \r
+               {\r
+                       if (0)\r
+                       DBG_8192C("usb_read_port() enqueue precvbuf=%p \n", precvbuf);\r
+                       //enqueue precvbuf and wait for free skb\r
+                       rtw_enqueue_recvbuf(precvbuf, &precvpriv->recv_buf_pending_queue);\r
+                       return _FAIL;\r
+               }\r
+\r
+               tmpaddr = (SIZE_PTR)precvbuf->pskb->data;\r
+               alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);\r
+               skb_reserve(precvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment));\r
+\r
+               precvbuf->phead = precvbuf->pskb->head;\r
+               precvbuf->pdata = precvbuf->pskb->data;\r
+               precvbuf->ptail = skb_tail_pointer(precvbuf->pskb);\r
+               precvbuf->pend = skb_end_pointer(precvbuf->pskb);\r
+               precvbuf->pbuf = precvbuf->pskb->data;\r
+       }       \r
+       else//reuse skb\r
+       {\r
+               precvbuf->phead = precvbuf->pskb->head;\r
+               precvbuf->pdata = precvbuf->pskb->data;\r
+               precvbuf->ptail = skb_tail_pointer(precvbuf->pskb);\r
+               precvbuf->pend = skb_end_pointer(precvbuf->pskb);\r
+               precvbuf->pbuf = precvbuf->pskb->data;\r
+\r
+               precvbuf->reuse = _FALSE;\r
+       }\r
+\r
+       ATOMIC_INC(&(precvpriv->rx_pending_cnt));\r
+       \r
+       purb = precvbuf->purb;\r
+\r
+       //translate DMA FIFO addr to pipehandle\r
+       pipe = ffaddr2pipehdl(pdvobj, addr);\r
+\r
+       usb_fill_bulk_urb(purb, pusbd, pipe, \r
+                                       precvbuf->pbuf,\r
+                                       MAX_RECVBUF_SZ,\r
+                                       usb_read_port_complete,\r
+                                       precvbuf);//context is precvbuf\r
+\r
+       err = usb_submit_urb(purb, GFP_ATOMIC);\r
+       if((err) && (err != (-EPERM)))\r
+       {\r
+               RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x", err, purb->status));\r
+               DBG_8192C("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n",err,purb->status);\r
+               ret = _FAIL;\r
+       }\r
+\r
+_func_exit_;\r
+\r
+       return ret;\r
+}\r
+#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX\r
+\r
+\r
index 54d1331ba81e2d8d3009066bb64dbd973814b7fc..04ffe781a410fdeeaef48fb25e501c14f1a92fe6 100755 (executable)
@@ -268,10 +268,15 @@ static void _rtw_reg_apply_radar_flags(struct wiphy *wiphy)
                if (!_rtw_is_radar_freq(ch->center_freq))
                        continue;
 #ifdef CONFIG_DFS
-               if (!(ch->flags & IEEE80211_CHAN_DISABLED))
-                       ch->flags |= IEEE80211_CHAN_RADAR |
-                           IEEE80211_CHAN_NO_IBSS;
-#endif
+               if (!(ch->flags & IEEE80211_CHAN_DISABLED)) {
+                       ch->flags |= IEEE80211_CHAN_RADAR;
+                       #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0))
+                       ch->flags |= (IEEE80211_CHAN_NO_IBSS|IEEE80211_CHAN_PASSIVE_SCAN);
+                       #else
+                       ch->flags |= IEEE80211_CHAN_NO_IR;
+                       #endif
+               }
+#endif //CONFIG_DFS
 
 #if 0
                /*
@@ -354,16 +359,19 @@ static void _rtw_reg_apply_flags(struct wiphy *wiphy)
                            rtw_ieee80211_channel_to_frequency(channel,
                                                               IEEE80211_BAND_5GHZ);
 
+
                ch = ieee80211_get_channel(wiphy, freq);
                if (ch) {
-                       if (channel_set[i].ScanType == SCAN_PASSIVE)
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0))
-                               ch->flags = IEEE80211_CHAN_PASSIVE_SCAN;
-#else // kernel >= 3.14
+                       if (channel_set[i].ScanType == SCAN_PASSIVE) {
+                               #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0))
+                               ch->flags = (IEEE80211_CHAN_NO_IBSS|IEEE80211_CHAN_PASSIVE_SCAN);
+                               #else
                                ch->flags = IEEE80211_CHAN_NO_IR;
-#endif // kernel >= 3.14
-                       else
+                               #endif
+                       }
+                       else {
                                ch->flags = 0;
+                       }
                }
        }
 
@@ -478,26 +486,52 @@ static const struct ieee80211_regdomain *_rtw_regdomain_select(struct
 #endif
 }
 
-static void _rtw_regd_init_wiphy(struct rtw_regulatory *reg,
-                               struct wiphy *wiphy,
-                               void (*reg_notifier) (struct wiphy * wiphy,
-                                                    struct regulatory_request *
-                                                    request))
+void _rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
+{
+       struct rtw_regulatory *reg = NULL;
+
+       DBG_8192C("%s\n", __func__);
+
+       _rtw_reg_notifier_apply(wiphy, request, reg);
+}
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0))
+int rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
+#else
+void rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
+#endif
+{
+       _rtw_reg_notifier(wiphy, request);
+       #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0))
+       return 0;
+       #endif
+}
+
+void rtw_reg_notify_by_driver(_adapter *adapter)
+{
+       if ((adapter->rtw_wdev != NULL) && (adapter->rtw_wdev->wiphy)) {
+               struct regulatory_request request;
+               request.initiator = NL80211_REGDOM_SET_BY_DRIVER;
+               rtw_reg_notifier(adapter->rtw_wdev->wiphy, &request);
+       }
+}
+
+static void _rtw_regd_init_wiphy(struct rtw_regulatory *reg, struct wiphy *wiphy)
 {
        const struct ieee80211_regdomain *regd;
 
-       wiphy->reg_notifier = reg_notifier;
+       wiphy->reg_notifier = rtw_reg_notifier;
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0))
+       #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0))
        wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY;
        wiphy->flags &= ~WIPHY_FLAG_STRICT_REGULATORY;
        wiphy->flags &= ~WIPHY_FLAG_DISABLE_BEACON_HINTS;
-#else // kernel >= 3.14
+       #else
        wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
        wiphy->regulatory_flags &= ~REGULATORY_STRICT_REG;
        wiphy->regulatory_flags &= ~REGULATORY_DISABLE_BEACON_HINTS;
-#endif // kernel >= 3.14
-
+       #endif
+       
        regd = _rtw_regdomain_select(reg);
        wiphy_apply_custom_regulatory(wiphy, regd);
 
@@ -518,11 +552,8 @@ static struct country_code_to_enum_rd *_rtw_regd_find_country(u16 countrycode)
        return NULL;
 }
 
-int rtw_regd_init(_adapter * padapter,
-                 void (*reg_notifier) (struct wiphy * wiphy,
-                                      struct regulatory_request * request))
+int rtw_regd_init(_adapter * padapter)
 {
-       //struct registry_priv  *registrypriv = &padapter->registrypriv;
        struct wiphy *wiphy = padapter->rtw_wdev->wiphy;
 
 #if 0
@@ -540,17 +571,9 @@ int rtw_regd_init(_adapter * padapter,
                  __func__, rtw_regd->alpha2[0], rtw_regd->alpha2[1]);
 #endif
 
-       _rtw_regd_init_wiphy(NULL, wiphy, reg_notifier);
+       _rtw_regd_init_wiphy(NULL, wiphy);
 
        return 0;
 }
-
-void rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
-{
-       struct rtw_regulatory *reg = NULL;
-
-       DBG_8192C("%s\n", __func__);
-
-       _rtw_reg_notifier_apply(wiphy, request, reg);
-}
 #endif //CONFIG_IOCTL_CFG80211
+
index 29eb9dd91bea8541501158d369f9a488d19eeb09..7cd319cd6e010e382862ef58c37b3084012e6020 100755 (executable)
@@ -1,13 +1,13 @@
 /*
  * Yongle Lai @ Rockchip
  */
-#ifndef WIFI_VERSION_H
-#define WIFI_VERSION_H
+#ifndef _WIFI_VERSION_H_
+#define _WIFI_VERSION_H_
 
 /*
- * Marvell MV8686 driver version.
+ * Broadcom BCM4319 driver version.
  */
-#define RTL8723BU_DRV_VERSION "3.00.WFD"
+#define RTL8723BU_DRV_VERSION "4.39.WFD"
 
 #endif /* WIFI_VERSION_H */
 
index 43af7562010a05d56d620e9534cb16d638fd0b28..db9b311f321f82a496a49882eca886771ff17eb8 100755 (executable)
@@ -21,6 +21,7 @@
 
 #include <drv_types.h>
 
+#define DBG_DUMP_OS_QUEUE_CTL 0
 
 uint rtw_remainder_len(struct pkt_file *pfile)
 {
@@ -187,28 +188,78 @@ void rtw_os_xmit_resource_free(_adapter *padapter, struct xmit_buf *pxmitbuf,u32
        }
 }
 
+void dump_os_queue(void *sel, _adapter *padapter)
+{
+       struct net_device *ndev = padapter->pnetdev;
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+       int i;
+
+       for (i=0;i<4;i++) {
+               DBG_871X_SEL_NL(sel, "os_queue[%d]:%s\n"
+                       , i, __netif_subqueue_stopped(ndev, i)?"stopped":"waked");
+       }
+#else
+       DBG_871X_SEL_NL(sel, "os_queue:%s\n"
+                       , netif_queue_stopped(ndev)?"stopped":"waked");
+#endif
+}
+
 #define WMM_XMIT_THRESHOLD     (NR_XMITFRAME*2/5)
 
-void rtw_os_pkt_complete(_adapter *padapter, _pkt *pkt)
+inline static bool rtw_os_need_wake_queue(_adapter *padapter, u16 qidx)
 {
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
-       u16     queue;
        struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
 
-       queue = skb_get_queue_mapping(pkt);
        if (padapter->registrypriv.wifi_spec) {
-               if(__netif_subqueue_stopped(padapter->pnetdev, queue) &&
-                       (pxmitpriv->hwxmits[queue].accnt < WMM_XMIT_THRESHOLD))
-               {
-                       netif_wake_subqueue(padapter->pnetdev, queue);
-               }
+               if (pxmitpriv->hwxmits[qidx].accnt < WMM_XMIT_THRESHOLD)
+                       return _TRUE;
+       } else {
+               return _TRUE;
+       }
+       return _FALSE;
+#else
+       return _TRUE;
+#endif
+}
+
+inline static bool rtw_os_need_stop_queue(_adapter *padapter, u16 qidx)
+{
+       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+       if (padapter->registrypriv.wifi_spec) {
+               /* No free space for Tx, tx_worker is too slow */
+               if (pxmitpriv->hwxmits[qidx].accnt > WMM_XMIT_THRESHOLD)
+                       return _TRUE;
        } else {
-               if(__netif_subqueue_stopped(padapter->pnetdev, queue))
-                       netif_wake_subqueue(padapter->pnetdev, queue);
+               if(pxmitpriv->free_xmitframe_cnt<=4)
+                       return _TRUE;
        }
 #else
-       if (netif_queue_stopped(padapter->pnetdev))
+       if(pxmitpriv->free_xmitframe_cnt<=4)
+               return _TRUE;
+#endif
+       return _FALSE;
+}
+
+void rtw_os_pkt_complete(_adapter *padapter, _pkt *pkt)
+{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+       u16     qidx;
+
+       qidx = skb_get_queue_mapping(pkt);
+       if (rtw_os_need_wake_queue(padapter, qidx)) {
+               if (DBG_DUMP_OS_QUEUE_CTL)
+                       DBG_871X(FUNC_ADPT_FMT": netif_wake_subqueue[%d]\n", FUNC_ADPT_ARG(padapter), qidx);
+               netif_wake_subqueue(padapter->pnetdev, qidx);
+       }
+#else
+       if (rtw_os_need_wake_queue(padapter, 0)) {
+               if (DBG_DUMP_OS_QUEUE_CTL)
+                       DBG_871X(FUNC_ADPT_FMT": netif_wake_queue\n", FUNC_ADPT_ARG(padapter));
                netif_wake_queue(padapter->pnetdev);
+       }
 #endif
 
        rtw_skb_free(pkt);
@@ -259,30 +310,53 @@ void rtw_os_xmit_schedule(_adapter *padapter)
 #endif
 }
 
-static void rtw_check_xmit_resource(_adapter *padapter, _pkt *pkt)
+static bool rtw_check_xmit_resource(_adapter *padapter, _pkt *pkt)
 {
+       bool busy = _FALSE;
        struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
 #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
-       u16     queue;
+       u16     qidx;
+
+       qidx = skb_get_queue_mapping(pkt);
+       if (rtw_os_need_stop_queue(padapter, qidx)) {
+               if (DBG_DUMP_OS_QUEUE_CTL)
+                       DBG_871X(FUNC_ADPT_FMT": netif_stop_subqueue[%d]\n", FUNC_ADPT_ARG(padapter), qidx);
+               netif_stop_subqueue(padapter->pnetdev, qidx);
+               busy = _TRUE;
+       }
+#else
+       if (rtw_os_need_stop_queue(padapter, 0)) {
+               if (DBG_DUMP_OS_QUEUE_CTL)
+                       DBG_871X(FUNC_ADPT_FMT": netif_stop_queue\n", FUNC_ADPT_ARG(padapter));
+               rtw_netif_stop_queue(padapter->pnetdev);
+               busy = _TRUE;
+       }
+#endif
+       return busy;
+}
 
-       queue = skb_get_queue_mapping(pkt);
-       if (padapter->registrypriv.wifi_spec) {
-               /* No free space for Tx, tx_worker is too slow */
-               if (pxmitpriv->hwxmits[queue].accnt > WMM_XMIT_THRESHOLD) {
-                       //DBG_871X("%s(): stop netif_subqueue[%d]\n", __FUNCTION__, queue);
-                       netif_stop_subqueue(padapter->pnetdev, queue);
-               }
-       } else {
-               if(pxmitpriv->free_xmitframe_cnt<=4) {
-                       if (!netif_tx_queue_stopped(netdev_get_tx_queue(padapter->pnetdev, queue)))
-                               netif_stop_subqueue(padapter->pnetdev, queue);
+void rtw_os_wake_queue_at_free_stainfo(_adapter *padapter, int *qcnt_freed)
+{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+       int i;
+
+       for (i=0;i<4;i++) {
+               if (qcnt_freed[i] == 0)
+                       continue;
+
+               if(rtw_os_need_wake_queue(padapter, i)) {
+                       if (DBG_DUMP_OS_QUEUE_CTL)
+                               DBG_871X(FUNC_ADPT_FMT": netif_wake_subqueue[%d]\n", FUNC_ADPT_ARG(padapter), i);
+                       netif_wake_subqueue(padapter->pnetdev, i);
                }
        }
 #else
-       if(pxmitpriv->free_xmitframe_cnt<=4)
-       {
-               if (!rtw_netif_queue_stopped(padapter->pnetdev))
-                       rtw_netif_stop_queue(padapter->pnetdev);
+       if (qcnt_freed[0] || qcnt_freed[1] || qcnt_freed[2] || qcnt_freed[3]) {
+               if(rtw_os_need_wake_queue(padapter, 0)) {
+                       if (DBG_DUMP_OS_QUEUE_CTL)
+                               DBG_871X(FUNC_ADPT_FMT": netif_wake_queue\n", FUNC_ADPT_ARG(padapter));
+                       netif_wake_queue(padapter->pnetdev);
+               }
        }
 #endif
 }
@@ -441,7 +515,7 @@ _func_enter_;
 
 drop_packet:
        pxmitpriv->tx_drop++;
-       rtw_skb_free(pkt);
+       rtw_os_pkt_complete(padapter, pkt);
        RT_TRACE(_module_xmit_osdep_c_, _drv_notice_, ("rtw_xmit_entry: drop, tx_drop=%d\n", (u32)pxmitpriv->tx_drop));
 
 exit:
index 681889bf964f2d8ee5d88155367fca853059ee4a..dcef0e75acf5252efeeedf3dd8e59497829261a7 100755 (executable)
@@ -751,7 +751,7 @@ inline void *dbg_rtw_usb_buffer_alloc(struct usb_device *dev, size_t size, dma_a
        void *p;
 
        if(match_mstat_sniff_rules(flags, size))
-               DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, size);
+               DBG_871X("DBG_MEM_ALLOC %s:%d %s(%zu)\n", func, line, __FUNCTION__, size);
 
        p = _rtw_usb_buffer_alloc(dev, size, dma);
        
@@ -768,7 +768,7 @@ inline void dbg_rtw_usb_buffer_free(struct usb_device *dev, size_t size, void *a
 {
 
        if(match_mstat_sniff_rules(flags, size))
-               DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, size);
+               DBG_871X("DBG_MEM_ALLOC %s:%d %s(%zu)\n", func, line, __FUNCTION__, size);
 
        _rtw_usb_buffer_free(dev, size, addr, dma);
 
@@ -782,7 +782,7 @@ inline void dbg_rtw_usb_buffer_free(struct usb_device *dev, size_t size, void *a
 
 #endif /* defined(DBG_MEM_ALLOC) */
 
-void* rtw_malloc2d(int h, int w, int size)
+void* rtw_malloc2d(int h, int w, size_t size)
 {
        int j;
 
@@ -1404,7 +1404,12 @@ void rtw_msleep_os(int ms)
 {
 
 #ifdef PLATFORM_LINUX
-
+       #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36))
+       if (ms < 20) {
+               unsigned long us = ms * 1000UL;
+               usleep_range(us, us + 1000UL);
+       } else
+       #endif
        msleep((unsigned int)ms);
 
 #endif 
@@ -1423,16 +1428,19 @@ void rtw_msleep_os(int ms)
 }
 void rtw_usleep_os(int us)
 {
-
 #ifdef PLATFORM_LINUX
-       
-      // msleep((unsigned int)us);
-      if ( 1 < (us/1000) )
-                msleep(1);
+
+       // msleep((unsigned int)us);
+       #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36))
+       usleep_range(us, us + 1);       
+       #else
+       if ( 1 < (us/1000) )
+               msleep(1);
       else
                msleep( (us/1000) + 1);
+       #endif
+#endif
 
-#endif 
 #ifdef PLATFORM_FREEBSD
        //Delay for delay microseconds 
        DELAY(us);