Wifi: update rtl8189es/etv to version 4.00(V4.3.10_12447.20141008).
authorgwl <gwl@rock-chips.com>
Mon, 13 Oct 2014 03:38:26 +0000 (11:38 +0800)
committergwl <gwl@rock-chips.com>
Mon, 13 Oct 2014 03:38:37 +0000 (11:38 +0800)
259 files changed:
drivers/net/wireless/rockchip_wlan/rtl8189es/Makefile [changed mode: 0644->0755]
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_ap.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_beamforming.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_br_ext.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_bt_mp.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_btcoex.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_cmd.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_debug.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_ieee80211.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_iol.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_mem.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_mlme.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_mlme_ext.c [changed mode: 0644->0755]
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_mp.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_mp_ioctl.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_odm.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_p2p.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_pwrctrl.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_recv.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_security.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_sreset.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_sta_mgt.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_tdls.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_vht.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_wlan_util.c
drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_xmit.c [changed mode: 0644->0755]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/HalPwrSeqCmd.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8723a1Ant.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtcOutSrc.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/Mp_Precomp.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/HalPhyRf.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/Mp_Precomp.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/PhyDM_Adaptivity.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/PhyDM_Adaptivity.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm.c [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm.h [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_AntDiv.c [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_AntDiv.h [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_HWConfig.c [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_HWConfig.h [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_RegDefine11AC.h [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_RegDefine11N.h [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_debug.c [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_debug.h [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_interface.c [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_interface.h [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_precomp.h [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_reg.h [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_types.h [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_ACS.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_ACS.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_AntDect.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_AntDect.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_AntDiv.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_AntDiv.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_CfoTracking.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_CfoTracking.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_DIG.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_DIG.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_DynamicBBPowerSaving.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_DynamicBBPowerSaving.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_DynamicTxPower.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_DynamicTxPower.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_EdcaTurboCheck.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_EdcaTurboCheck.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_HWConfig.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_HWConfig.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_NoiseMonitor.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_NoiseMonitor.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_PathDiv.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_PathDiv.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_PowerTracking.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_PowerTracking.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_RXHP.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_RXHP.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_RaInfo.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_RaInfo.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_RegDefine11AC.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_RegDefine11N.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_debug.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_debug.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_interface.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_interface.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_precomp.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_reg.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_types.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/Hal8188ERateAdaptive.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/Hal8188EReg.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/HalHWImg8188E_BB.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/HalHWImg8188E_BB.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/HalHWImg8188E_FW.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/HalHWImg8188E_FW.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/HalHWImg8188E_MAC.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/HalHWImg8188E_MAC.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/HalHWImg8188E_RF.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/HalHWImg8188E_RF.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/HalPhyRf_8188e.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/HalPhyRf_8188e.h
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/Mp_Precomp.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/odm_RTL8188E.c [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/odm_RTL8188E.h [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/odm_RegConfig8188E.c [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/odm_RegConfig8188E.h [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/phydm_RTL8188E.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/phydm_RTL8188E.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/phydm_RegConfig8188E.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/phydm_RegConfig8188E.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/hal_btcoex.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/hal_com.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/hal_com_phycfg.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/hal_dm.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/hal_dm.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/hal_intf.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/rtl8188e/rtl8188e_cmd.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/rtl8188e/rtl8188e_dm.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/rtl8188e/rtl8188e_hal_init.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/rtl8188e/rtl8188e_mp.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/rtl8188e/rtl8188e_phycfg.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/rtl8188e/rtl8188e_rxdesc.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/rtl8188e/rtl8188e_xmit.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/rtl8188e/sdio/rtl8189es_xmit.c
drivers/net/wireless/rockchip_wlan/rtl8189es/hal/rtl8188e/sdio/sdio_halinit.c
drivers/net/wireless/rockchip_wlan/rtl8189es/include/Hal8188EPhyReg.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/Hal8192CPhyReg.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/Hal8192DPhyReg.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/Hal8192EPhyCfg.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/Hal8192EPhyReg.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/Hal8812PhyReg.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/Hal8812PwrSeq.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/autoconf.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/drv_conf.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/drv_types.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/gspi_hal.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/gspi_ops.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/hal_btcoex.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/hal_com.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/hal_com_h2c.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/hal_com_phycfg.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/hal_com_reg.h [changed mode: 0644->0755]
drivers/net/wireless/rockchip_wlan/rtl8189es/include/hal_data.h [changed mode: 0644->0755]
drivers/net/wireless/rockchip_wlan/rtl8189es/include/hal_gspi.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/include/hal_intf.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/hal_pg.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/ieee80211.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/ioctl_cfg80211.h [deleted file]
drivers/net/wireless/rockchip_wlan/rtl8189es/include/linux/wireless.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/osdep_intf.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/osdep_service.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/osdep_service_linux.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/pci_hal.h [changed mode: 0644->0755]
drivers/net/wireless/rockchip_wlan/rtl8189es/include/pci_ops.h [changed mode: 0644->0755]
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8188e_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8188e_hal.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8188e_led.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8188e_recv.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8188e_spec.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8188e_xmit.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8192c_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8192c_hal.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8192c_recv.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8192c_spec.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8192c_xmit.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8192d_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8192d_hal.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8192d_recv.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8192d_spec.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8192d_xmit.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8192e_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8192e_hal.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8192e_recv.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8192e_spec.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8192e_xmit.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8723a_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8723a_hal.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8723a_spec.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8723a_xmit.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8723b_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8723b_hal.h [changed mode: 0644->0755]
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8723b_led.h [changed mode: 0644->0755]
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8723b_recv.h [changed mode: 0644->0755]
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8723b_spec.h [changed mode: 0644->0755]
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8723b_xmit.h [changed mode: 0644->0755]
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8812a_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8812a_hal.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8812a_recv.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8812a_spec.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8812a_xmit.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtl8821a_spec.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_android.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_ap.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_bt_mp.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_btcoex.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_debug.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_eeprom.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_event.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_ht.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_io.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_mem.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_mlme.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_mlme_ext.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_mp.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_mp_phy_regdef.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_odm.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_pwrctrl.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_recv.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_security.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_version.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_wifi_regd.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_xmit.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/sdio_hal.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/sdio_ops.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/usb_ops_linux.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/wifi.h
drivers/net/wireless/rockchip_wlan/rtl8189es/include/xmit_osdep.h
drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/custom_gpio_linux.c
drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/ioctl_cfg80211.c
drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/ioctl_cfg80211.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/ioctl_linux.c
drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/mlme_linux.c
drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/os_intfs.c
drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/recv_linux.c
drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/rtw_android.c
drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/rtw_cfgvendor.c [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/rtw_cfgvendor.h [new file with mode: 0644]
drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/rtw_proc.c
drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/rtw_proc.h
drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/sdio_intf.c
drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/wifi_regd.c
drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/wifi_version.h
drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/xmit_linux.c
drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/osdep_service.c
drivers/net/wireless/rockchip_wlan/rtl8189es/platform/platform_ARM_SUNnI_sdio.c

old mode 100644 (file)
new mode 100755 (executable)
index bff1789..92d9b26
@@ -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
@@ -47,26 +47,32 @@ CONFIG_BT_COEXIST = n
 CONFIG_RTL8192CU_REDEFINE_1X1 = n
 CONFIG_INTEL_WIDI = n
 CONFIG_WAPI_SUPPORT = n
-CONFIG_EFUSE_CONFIG_FILE = n
+CONFIG_EFUSE_CONFIG_FILE = y
 CONFIG_EXT_CLK = n
 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_ODM_ADAPTIVITY = n
-CONFIG_FIND_BEST_CHANNEL = n
+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 = y
-CONFIG_GPIO_WAKEUP = y
+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
+CONFIG_RTW_SDIO_PM_KEEP_POWER = n
 ###################### Platform Related #######################
 CONFIG_PLATFORM_I386_PC = n
 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
@@ -86,14 +92,13 @@ CONFIG_PLATFORM_TEGRA4_DALMORE = n
 CONFIG_PLATFORM_ARM_TCC8900 = n
 CONFIG_PLATFORM_ARM_TCC8920 = n
 CONFIG_PLATFORM_ARM_TCC8920_JB42 = n
-CONFIG_PLATFORM_ARM_RK2818 = n
+CONFIG_PLATFORM_ARM_RK2818 = y
 CONFIG_PLATFORM_ARM_RK3066 = n
-CONFIG_PLATFORM_ARM_RK3188 = y
+CONFIG_PLATFORM_ARM_RK3188 = n
 CONFIG_PLATFORM_ARM_URBETTER = n
 CONFIG_PLATFORM_ARM_TI_PANDA = n
 CONFIG_PLATFORM_MIPS_JZ4760 = n
 CONFIG_PLATFORM_DMP_PHILIPS = n
-CONFIG_PLATFORM_TI_DM365 = n
 CONFIG_PLATFORM_MSTAR_TITANIA12 = n
 CONFIG_PLATFORM_MSTAR = n
 CONFIG_PLATFORM_SZEBOOK = n
@@ -107,6 +112,9 @@ CONFIG_PLATFORM_ARM_RTD299X = n
 CONFIG_PLATFORM_ARM_SPREADTRUM_6820 = n
 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
@@ -140,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
@@ -159,16 +168,28 @@ _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\
-               hal/OUTSRC/HalPhyRf.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/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
@@ -186,10 +207,11 @@ _OUTSRC_FILES += hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.o \
                                hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.o \
                                hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.o \
                                hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.o \
-                               hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.o
+                               hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.o \
+                               hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.o
 endif
-               
-########### HAL_RTL8192C #################################                                                                             
+
+########### HAL_RTL8192C #################################
 
 ifeq ($(CONFIG_RTL8192C), y)
 RTL871X = rtl8192c
@@ -214,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
 
@@ -223,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)
@@ -271,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 \
@@ -311,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 \
@@ -322,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
@@ -357,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
 
@@ -373,6 +395,10 @@ ifeq ($(CONFIG_SDIO_HCI), y)
 MODULE_NAME = 8189es
 endif
 
+ifeq ($(CONFIG_GSPI_HCI), y)
+MODULE_NAME = 8189es
+endif
+
 ifeq ($(CONFIG_USB_HCI), y)
 MODULE_NAME = 8188eu
 endif
@@ -410,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\
@@ -418,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
 
@@ -476,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
 
@@ -533,13 +559,9 @@ _OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/HalHWImg8812A_FW.o\
                hal/OUTSRC/$(RTL871X)/HalHWImg8812A_MAC.o\
                hal/OUTSRC/$(RTL871X)/HalHWImg8812A_BB.o\
                hal/OUTSRC/$(RTL871X)/HalHWImg8812A_RF.o\
-               hal/OUTSRC/$(RTL871X)/HalHWImg8812A_TestChip_FW.o\
-               hal/OUTSRC/$(RTL871X)/HalHWImg8812A_TestChip_MAC.o\
-               hal/OUTSRC/$(RTL871X)/HalHWImg8812A_TestChip_BB.o\
-               hal/OUTSRC/$(RTL871X)/HalHWImg8812A_TestChip_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)
@@ -564,14 +586,12 @@ _OUTSRC_FILES += hal/OUTSRC/rtl8821a/HalHWImg8821A_FW.o\
                hal/OUTSRC/rtl8821a/HalHWImg8821A_MAC.o\
                hal/OUTSRC/rtl8821a/HalHWImg8821A_BB.o\
                hal/OUTSRC/rtl8821a/HalHWImg8821A_RF.o\
-               hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_MAC.o\
-               hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_BB.o\
-               hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_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
@@ -602,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 \
@@ -625,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)
@@ -692,6 +712,14 @@ endif
 
 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
+EXTRA_CFLAGS += -DWIFIMAC_PATH=\"/data/wifimac.txt\"
 endif
 
 ifeq ($(CONFIG_EXT_CLK), y)
@@ -704,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)
@@ -714,8 +744,24 @@ ifeq ($(CONFIG_CALIBRATE_TX_POWER_TO_MAX), y)
 EXTRA_CFLAGS += -DCONFIG_CALIBRATE_TX_POWER_TO_MAX
 endif
 
-ifeq ($(CONFIG_ODM_ADAPTIVITY), y)
-EXTRA_CFLAGS += -DCONFIG_ODM_ADAPTIVITY
+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
+endif
+
+ifeq ($(CONFIG_RTW_ADAPTIVITY_MODE), normal)
+EXTRA_CFLAGS += -DCONFIG_RTW_ADAPTIVITY_MODE=0
+else ifeq ($(CONFIG_RTW_ADAPTIVITY_MODE), carrier_sense)
+EXTRA_CFLAGS += -DCONFIG_RTW_ADAPTIVITY_MODE=1
+endif
+
+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)
@@ -743,20 +789,31 @@ 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_FIND_BEST_CHANNEL), y)
-EXTRA_CFLAGS += -DCONFIG_FIND_BEST_CHANNEL
-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
 SUBARCH := $(shell uname -m | sed -e s/i.86/i386/)
@@ -768,20 +825,6 @@ MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
 INSTALL_PREFIX :=
 endif
 
-ifeq ($(CONFIG_PLATFORM_ARM_WMT), y)
-EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
-EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
-EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
-EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS
-ifeq ($(CONFIG_SDIO_HCI), y)
-_PLATFORM_FILES += platform/platform_ARM_WMT_sdio.o
-endif
-ARCH := arm
-CROSS_COMPILE := arm_1103_le-
-KSRC := $(shell pwd)/../../../../
-MODULE_NAME :=8189es_kk
-endif
-
 ifeq ($(CONFIG_PLATFORM_ACTIONS_ATM702X), y)
 EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ACTIONS_ATM702X
 #ARCH := arm
@@ -826,6 +869,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
@@ -938,7 +994,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
@@ -956,10 +1012,24 @@ 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-
+#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
+CROSS_COMPILE := /opt/montavista/pro5.0/devkit/arm/v5t_le/bin/arm-linux-
+KSRC:= /home/vivotek/lsp/DM365/kernel_platform/kernel/linux-2.6.18
+KERNELOUTPUT := ${PRODUCTDIR}/tmp
 KVER  := 2.6.18
-KSRC := /home/cnsd4/Appro/mv_pro_5.0/montavista/pro/devkit/lsp/ti-davinci/linux-dm365
+endif
+
+ifeq ($(CONFIG_PLATFORM_MOZART), y)
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MOZART
+ARCH := arm
+CROSS_COMPILE := /home/vivotek/lsp/mozart3v2/Mozart3e_Toolchain/build_arm_nofpu/usr/bin/arm-linux-
+KVER  := $(shell uname -r)
+KSRC:= /opt/Vivotek/lsp/mozart3v2/kernel_platform/kernel/mozart_kernel-1.17
+KERNELOUTPUT := /home/pink/sample/ODM/IP8136W-VINT/tmp/kernel
 endif
 
 ifeq ($(CONFIG_PLATFORM_TEGRA3_CARDHU), y)
@@ -1017,28 +1087,34 @@ MODULE_NAME := wlan
 endif
 
 ifeq ($(CONFIG_PLATFORM_ARM_RK2818), y)
-EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS -DCONFIG_MINIMAL_MEMORY_USAGE
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS
+ifeq ($(CONFIG_SDIO_HCI), y)
+EXTRA_CFLAGS += -DCONFIG_RESUME_IN_WORKQUEUE
+endif
 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
+MODULE_NAME := 8189es
 endif
 
 ifeq ($(CONFIG_PLATFORM_ARM_RK3188), y)
-EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS -DCONFIG_MINIMAL_MEMORY_USAGE
-#EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC
-EXTRA_CFLAGS += -DRTW_SUPPORT_PLATFORM_SHUTDOWN
-EXTRA_CFLAGS += -DRTW_USE_CFG80211_STA_EVENT
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS
+# 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
-EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211
+# 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
-MODULE_NAME := 8189es
+MODULE_NAME := wlan
 endif
 
 ifeq ($(CONFIG_PLATFORM_ARM_RK3066), y)
+EXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_RK3066
 EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC
 EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
@@ -1083,7 +1159,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
@@ -1195,7 +1271,7 @@ 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
+EXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_QOS_OPTIMIZATION
 
 EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS
 ifeq ($(CONFIG_USB_HCI), y)
@@ -1207,13 +1283,17 @@ _PLATFORM_FILES += platform/platform_ARM_SUNnI_sdio.o
 endif
 
 ARCH := arm
-CROSS_COMPILE := /home/android_sdk/Allwinner/a23/android-jb42/lichee/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-
-KVER  := 3.4.39
-KSRC :=/home/android_sdk/Allwinner/a23/android-jb42/lichee/linux-3.4
+# ===Cross compile setting for Android 4.2 SDK ===
+#CROSS_COMPILE := /home/android_sdk/Allwinner/a23/android-jb42/lichee/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-
+#KSRC :=/home/android_sdk/Allwinner/a23/android-jb42/lichee/linux-3.4
+# ===Cross compile setting for Android 4.4 SDK ===
+CROSS_COMPILE := /home/isaac/inet-a23-android4.4/A23_4.4/lichee/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-
+KSRC :=/home/isaac/inet-a23-android4.4/A23_4.4/lichee/linux-3.4
 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)
@@ -1259,7 +1339,53 @@ _PLATFORM_FILES += platform/platform_sprd_sdio.o
 endif
 endif
 
-ifeq ($(CONFIG_MULTIDRV), y)   
+ifeq ($(CONFIG_PLATFORM_ARM_WMT), y)
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
+EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
+EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
+EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS
+ifeq ($(CONFIG_SDIO_HCI), y)
+_PLATFORM_FILES += platform/platform_ARM_WMT_sdio.o
+endif
+ARCH := arm
+CROSS_COMPILE := /home/android_sdk/WonderMedia/wm8880-android4.4/toolchain/arm_201103_gcc4.5.2/mybin/arm_1103_le-
+KSRC := /home/android_sdk/WonderMedia/wm8880-android4.4/kernel4.4/
+MODULE_NAME :=8189es_kk
+endif
+
+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
@@ -1276,6 +1402,7 @@ endif
 
 endif
 
+USER_MODULE_NAME ?=
 ifneq ($(USER_MODULE_NAME),)
 MODULE_NAME := $(USER_MODULE_NAME)
 endif
@@ -1315,7 +1442,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)
@@ -1365,7 +1492,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 cb5c55302f08d28a5127dde37517142596e7784b..ca634367f4fe5d6984f5017a67a301a0cd065b56 100644 (file)
@@ -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
@@ -992,33 +990,46 @@ void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta)
                //check if sta supports rx ampdu\r
                phtpriv_sta->ampdu_enable = phtpriv_ap->ampdu_enable;\r
 \r
-               //check if sta support s Short GI 20M\r
-               if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20))\r
-               {\r
-                       phtpriv_sta->sgi_20m = _TRUE;\r
+               phtpriv_sta->rx_ampdu_min_spacing = (phtpriv_sta->ht_cap.ampdu_params_info&IEEE80211_HT_CAP_AMPDU_DENSITY)>>2;\r
+       \r
+               // bwmode\r
+               if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH))\r
+               {                       \r
+                       psta->bw_mode = CHANNEL_WIDTH_40;\r
                }\r
-               //check if sta support s Short GI 40M\r
-               if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_40))\r
+               else\r
+               {                       \r
+                       psta->bw_mode = CHANNEL_WIDTH_20;\r
+               }               \r
+\r
+               if(pmlmeext->cur_bwmode < psta->bw_mode)\r
                {\r
-                       phtpriv_sta->sgi_40m = _TRUE;\r
+                       psta->bw_mode = pmlmeext->cur_bwmode;\r
                }\r
 \r
-               // bwmode\r
-               if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH))\r
+               phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset;\r
+\r
+\r
+               //check if sta support s Short GI 20M \r
+               if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20))\r
                {\r
-                       phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset;\r
-                       psta->bw_mode = CHANNEL_WIDTH_40;\r
+                       phtpriv_sta->sgi_20m = _TRUE;\r
                }\r
-               else\r
+               \r
+               //check if sta support s Short GI 40M \r
+               if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_40))\r
                {\r
-                       psta->bw_mode = CHANNEL_WIDTH_20;\r
+                       if(psta->bw_mode == CHANNEL_WIDTH_40) //according to psta->bw_mode\r
+                               phtpriv_sta->sgi_40m = _TRUE;\r
+                       else\r
+                               phtpriv_sta->sgi_40m = _FALSE;\r
                }\r
 \r
                psta->qos_option = _TRUE;\r
 \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
@@ -1026,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
@@ -1720,9 +1731,14 @@ int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf,  int len)
        if(p && ie_len>0)\r
        {\r
                u8 rf_type=0;\r
-               HT_CAP_AMPDU_FACTOR max_rx_ampdu_factor=0;\r
+               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
@@ -1730,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
@@ -1751,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
@@ -1766,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
@@ -1800,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
@@ -2363,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
@@ -2441,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
@@ -2879,6 +2917,10 @@ u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reaso
                issue_deauth(padapter, psta->hwaddr, reason);\r
        }\r
 \r
+#ifdef CONFIG_BEAMFORMING\r
+       beamforming_wk_cmd(padapter, BEAMFORMING_CTRL_LEAVE, psta->hwaddr, ETH_ALEN, 1);\r
+#endif\r
+\r
        psta->htpriv.agg_enable_bitmap = 0x0;//reset\r
        psta->htpriv.candidate_tid_bitmap = 0x0;//reset\r
 \r
@@ -2912,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
@@ -2969,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
@@ -3175,13 +3215,14 @@ 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
        \r
        //for ACL \r
        _rtw_init_listhead(&(pacl_list->acl_node_q.queue));\r
@@ -3209,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
@@ -3244,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 100644 (file)
@@ -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 100644 (file)
@@ -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 63fbf9e40373d5b664ac98a4b9da13cc184bc656..73f2105becede0352f8b7bc592b1dd088d3ebabd 100644 (file)
@@ -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
@@ -529,7 +525,7 @@ MPTBT_FwC2hBtMpCtrl(
        \r
        if(Adapter->bBTFWReady == _FALSE || Adapter->registrypriv.mp_mode == 0 )\r
        {       \r
-               DBG_8192C("Ignore C2H BT MP Info since not in MP mode \n");\r
+               //DBG_8192C("Ignore C2H BT MP Info since not in MP mode \n");\r
                return;\r
        }\r
        if( length > 32 || length < 3 )\r
index 43ebaf7ea4916c2ed1a002a4d6aa692c185c9981..157b8757066a136bcb40ccb92e60f0d1d45ae189 100644 (file)
@@ -28,9 +28,19 @@ void rtw_btcoex_Initialize(PADAPTER padapter)
        hal_btcoex_Initialize(padapter);
 }
 
-void rtw_btcoex_HAL_Initialize(PADAPTER padapter)
+void rtw_btcoex_PowerOnSetting(PADAPTER padapter)
 {
-       hal_btcoex_InitHwConfig(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);
 }
 
 void rtw_btcoex_IpsNotify(PADAPTER padapter, u8 type)
@@ -150,9 +160,9 @@ void rtw_btcoex_HaltNotify(PADAPTER padapter)
        hal_btcoex_HaltNotify(padapter);
 }
 
-void rtw_btcoex_SwitchGntBt(PADAPTER padapter)
+void rtw_btcoex_SwitchBtTRxMask(PADAPTER padapter)
 {
-       hal_btcoex_SwitchGntBt(padapter);       
+       hal_btcoex_SwitchBtTRxMask(padapter);   
 }
 
 void rtw_btcoex_Switch(PADAPTER padapter, u8 enable)
@@ -240,9 +250,9 @@ void rtw_btcoex_SetChipType(PADAPTER padapter, u8 chipType)
        hal_btcoex_SetChipType(padapter, chipType);
 }
 
-void rtw_btcoex_SetPGAntNum(PADAPTER padapter, u8 antNum, u8 antInverse)
+void rtw_btcoex_SetPGAntNum(PADAPTER padapter, u8 antNum)
 {
-       hal_btcoex_SetPgAntNum(padapter, antNum, antInverse);
+       hal_btcoex_SetPgAntNum(padapter, antNum);
 }
 
 u8 rtw_btcoex_GetPGAntNum(PADAPTER padapter)
@@ -250,6 +260,11 @@ u8 rtw_btcoex_GetPGAntNum(PADAPTER padapter)
        return hal_btcoex_GetPgAntNum(padapter);
 }
 
+void rtw_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath)
+{
+       hal_btcoex_SetSingleAntPath(padapter, singleAntPath);
+}
+
 u32 rtw_btcoex_GetRaMask(PADAPTER padapter)
 {
        return hal_btcoex_GetRaMask(padapter);
@@ -291,15 +306,53 @@ u8 rtw_btcoex_IsBtLinkExist(PADAPTER padapter)
 void rtw_btcoex_RejectApAggregatedPacket(PADAPTER padapter, u8 enable)
 {
        struct mlme_ext_info *pmlmeinfo;
-       struct sta_info *psta;
 
        pmlmeinfo = &padapter->mlmeextpriv.mlmext_info;
-       psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));
 
        if (_TRUE == enable)
        {
+               struct sta_info *psta = NULL;
+
                pmlmeinfo->bAcceptAddbaReq = _FALSE;
-               send_delba(padapter, 0, psta->hwaddr);
+
+               if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) {
+                       psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));
+                       if (psta)
+                               send_delba(padapter, 0, psta->hwaddr);
+               } else if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) {
+                       _irqL irqL;
+                       _list *phead, *plist;
+                       u8 peer_num = 0;
+                       char peers[NUM_STA];
+                       struct sta_priv *pstapriv = &padapter->stapriv;
+                       int i;
+
+                       _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
+
+                       phead = &pstapriv->asoc_list;
+                       plist = get_next(phead);
+
+                       while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {
+                               int stainfo_offset;
+                               
+                               psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);
+                               plist = get_next(plist);
+
+                               stainfo_offset = rtw_stainfo_offset(pstapriv, psta);
+                               if (stainfo_offset_valid(stainfo_offset))
+                                       peers[peer_num++] = stainfo_offset;
+                       }
+       
+                       _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
+
+                       if (peer_num) {
+                               for (i = 0; i < peer_num; i++) {
+                                       psta = rtw_get_stainfo_by_offset(pstapriv, peers[i]);
+                                       if (psta)
+                                               send_delba(padapter, 0, psta->hwaddr);
+                               }
+                       }
+               }
        }
        else
        {
index 0f9068e3b4f280e682c87cbfb939cf41fe7ea5e5..bf9d31c6c37c613341b55cba702ba8dffcfb3573 100644 (file)
@@ -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);
        }
 
@@ -329,7 +413,6 @@ int rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj)
        if(cmd_obj->cmdcode == GEN_CMD_CODE(_SetChannelPlan))
                bAllow = _TRUE;
 
-
        if( (pcmdpriv->padapter->hw_init_completed ==_FALSE && bAllow == _FALSE)
                || ATOMIC_READ(&(pcmdpriv->cmdthd_running)) == _FALSE   //com_thread not running
        )
@@ -352,7 +435,7 @@ u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj)
        int res = _FAIL;
        PADAPTER padapter = pcmdpriv->padapter;
        
-_func_enter_;
+_func_enter_;  
        
        if (cmd_obj == NULL) {
                goto exit;
@@ -373,7 +456,6 @@ _func_enter_;
 
        res = _rtw_enqueue_cmd(&pcmdpriv->cmd_queue, cmd_obj);
 
-       
        if(res == _SUCCESS)
                _rtw_up_sema(&pcmdpriv->cmd_queue_sema);
        
@@ -389,6 +471,7 @@ struct      cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv)
        struct cmd_obj *cmd_obj;
        
 _func_enter_;          
+
        cmd_obj = _rtw_dequeue_cmd(&pcmdpriv->cmd_queue);
                
 _func_exit_;                   
@@ -405,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)
@@ -431,19 +516,12 @@ _func_exit_;
 
 void rtw_stop_cmd_thread(_adapter *adapter)
 {
-       struct cmd_priv *pcmdpriv = &(adapter->cmdpriv);
-       u8 res;
-
        if(adapter->cmdThread &&
                ATOMIC_READ(&(adapter->cmdpriv.cmdthd_running)) == _TRUE &&
                adapter->cmdpriv.stop_req == 0)
        {
-               DBG_871X("%s: up sema\n", __func__);
                adapter->cmdpriv.stop_req = 1;
                _rtw_up_sema(&adapter->cmdpriv.cmd_queue_sema);
-               DBG_871X("%s: terminate_cmdthread_sema: %d\n",
-                       __func__,
-                       adapter->cmdpriv.terminate_cmdthread_sema.count);
                _rtw_down_sema(&adapter->cmdpriv.terminate_cmdthread_sema);
        }
 }
@@ -460,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,8 +563,6 @@ _func_enter_;
                {
                        DBG_871X_LEVEL(_drv_always_, "%s: DriverStopped(%d) SurpriseRemoved(%d) break at line %d\n",
                                __FUNCTION__, padapter->bDriverStopped, padapter->bSurpriseRemoved, __LINE__);
-                       DBG_871X("%s: terminate_cmdthread_sema: %d\n", __func__,
-                               padapter->cmdpriv.terminate_cmdthread_sema.count);
                        break;
                }
 
@@ -495,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)
@@ -530,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;
                }
 
@@ -537,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)))
@@ -626,11 +714,9 @@ post_process:
 #ifdef CONFIG_LPS_LCLK
                        rtw_unregister_cmd_alive(padapter);
 #endif
-                       DBG_871X("%s: pcmd==NULL\n", __FUNCTION__);
                        break;
                }
-
-               DBG_871X("%s: leaving... drop cmdcode:%u size:%d\n", __FUNCTION__, pcmd->cmdcode, pcmd->cmdsz);
+               //DBG_871X("%s: leaving... drop cmdcode:%u size:%d\n", __FUNCTION__, pcmd->cmdcode, pcmd->cmdsz);
 
                if (pcmd->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) {
                        extra_parm = (struct drvextra_cmd_parm *)pcmd->parmbuf;
@@ -639,13 +725,16 @@ post_process:
                        }
                }
 
-               rtw_free_cmd_obj(pcmd);
+               rtw_free_cmd_obj(pcmd); 
        }while(1);
 
        _rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema);
+       ATOMIC_SET(&(pcmdpriv->cmdthd_running), _FALSE);
 
 _func_exit_;
+
        thread_exit();
+
 }
 
 
@@ -1353,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)
        {
@@ -1424,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], 
@@ -1445,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;
 
@@ -1659,7 +1748,6 @@ _func_exit_;
 }
 
 u8 rtw_clearstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 enqueue)
-
 {
        struct cmd_obj*                 ph2c;
        struct set_stakey_parm  *psetstakey_para;
@@ -1679,7 +1767,6 @@ _func_enter_;
                        clear_cam_entry(padapter, cam_id);
                        rtw_camid_free(padapter, cam_id);
                }
-
        }
        else
        {
@@ -2114,15 +2201,11 @@ _func_enter_;
        else
        {
                //no need to enqueue, do the cmd hdl directly and free cmd parameter
-               if( H2C_SUCCESS !=set_chplan_hdl(padapter, (unsigned char *)setChannelPlan_param) )
+               if( H2C_SUCCESS != set_chplan_hdl(padapter, (unsigned char *)setChannelPlan_param) )
                        res = _FAIL;
                
                rtw_mfree((u8 *)setChannelPlan_param, sizeof(struct SetChannelPlan_param));
        }
-
-       //do something based on res...
-       if(res == _SUCCESS)
-               padapter->mlmepriv.ChannelPlan = chplan;
        
 exit:
 
@@ -2296,10 +2379,18 @@ 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;
-       u16     BusyThreshold = 100;
+#ifdef CONFIG_BT_COEXIST
+       u16     BusyThresholdHigh = 25;
+       u16     BusyThresholdLow = 10;
+#else
+       u16     BusyThresholdHigh = 100;
+       u16     BusyThresholdLow = 75;
+#endif
+       u16     BusyThreshold = BusyThresholdHigh;
        u8      bBusyTraffic = _FALSE, bTxBusyTraffic = _FALSE, bRxBusyTraffic = _FALSE;
        u8      bHigherBusyTraffic = _FALSE, bHigherBusyRxTraffic = _FALSE, bHigherBusyTxTraffic = _FALSE;
 
@@ -2320,16 +2411,12 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer)
        if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) 
                /*&& !MgntInitAdapterInProgress(pMgntInfo)*/)
        {
-#ifdef CONFIG_BT_COEXIST
-               if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 25 ||
-                       pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 25 )
-#else // !CONFIG_BT_COEXIST
                // if we raise bBusyTraffic in last watchdog, using lower threshold.
                if (pmlmepriv->LinkDetectInfo.bBusyTraffic)
-                       BusyThreshold = 75;
+                               BusyThreshold = BusyThresholdLow;
+
                if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > BusyThreshold ||
                        pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > BusyThreshold )
-#endif // !CONFIG_BT_COEXIST
                {
                        bBusyTraffic = _TRUE;
 
@@ -2383,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)
@@ -2402,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
@@ -2414,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
@@ -2530,8 +2627,9 @@ 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);
        }
 
 #ifdef CONFIG_BEAMFORMING
@@ -2624,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;
        }
@@ -3053,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;
@@ -3068,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);
@@ -3087,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
                {
@@ -3134,6 +3240,147 @@ exit:
 }
 #endif
 
+#ifdef CONFIG_BT_COEXIST
+struct btinfo {
+       u8 cid;
+       u8 len;
+
+       u8 bConnection:1;
+       u8 bSCOeSCO:1;
+       u8 bInQPage:1;
+       u8 bACLBusy:1;
+       u8 bSCOBusy:1;
+       u8 bHID:1;
+       u8 bA2DP:1;
+       u8 bFTP:1;
+
+       u8 retry_cnt:4;
+       u8 rsvd_34:1;
+       u8 rsvd_35:1;
+       u8 rsvd_36:1;
+       u8 rsvd_37:1;
+
+       u8 rssi;
+
+       u8 rsvd_50:1;
+       u8 rsvd_51:1;
+       u8 rsvd_52:1;
+       u8 rsvd_53:1;
+       u8 rsvd_54:1;
+       u8 rsvd_55:1;
+       u8 eSCO_SCO:1;
+       u8 Master_Slave:1;
+
+       u8 rsvd_6;
+       u8 rsvd_7;
+};
+
+void btinfo_evt_dump(void *sel, void *buf)
+{
+       struct btinfo *info = (struct btinfo *)buf;
+       
+       DBG_871X_SEL_NL(sel, "cid:0x%02x, len:%u\n", info->cid, info->len);
+
+       if (info->len > 2)
+       DBG_871X_SEL_NL(sel, "byte2:%s%s%s%s%s%s%s%s\n"
+               , info->bConnection?"bConnection ":""
+               , info->bSCOeSCO?"bSCOeSCO ":""
+               , info->bInQPage?"bInQPage ":""
+               , info->bACLBusy?"bACLBusy ":""
+               , info->bSCOBusy?"bSCOBusy ":""
+               , info->bHID?"bHID ":""
+               , info->bA2DP?"bA2DP ":""
+               , info->bFTP?"bFTP":""
+       );
+
+       if (info->len > 3)
+       DBG_871X_SEL_NL(sel, "retry_cnt:%u\n", info->retry_cnt);
+
+       if (info->len > 4)
+       DBG_871X_SEL_NL(sel, "rssi:%u\n", info->rssi);
+
+       if (info->len > 5)
+       DBG_871X_SEL_NL(sel, "byte5:%s%s\n"
+               , info->eSCO_SCO?"eSCO_SCO ":""
+               , info->Master_Slave?"Master_Slave ":""
+       );
+}
+
+static void rtw_btinfo_hdl(_adapter *adapter, u8 *buf, u16 buf_len)
+{
+       #define BTINFO_WIFI_FETCH 0x23
+       #define BTINFO_BT_AUTO_RPT 0x27
+       struct btinfo *info = (struct btinfo *)buf;
+       u8 cmd_idx;
+       u8 len;
+
+       cmd_idx = info->cid;
+
+       if (info->len > buf_len-2) {
+               rtw_warn_on(1);
+               len = buf_len-2;
+       } else {
+               len = info->len;
+       }
+
+//#define DBG_PROC_SET_BTINFO_EVT
+#ifdef DBG_PROC_SET_BTINFO_EVT
+       btinfo_evt_dump(RTW_DBGDUMP, info);
+#endif
+
+       /* transform BT-FW btinfo to WiFI-FW C2H format and notify */
+       if (cmd_idx == BTINFO_WIFI_FETCH)
+               buf[1] = 0;
+       else if (cmd_idx == BTINFO_BT_AUTO_RPT)
+               buf[1] = 2;
+       rtw_btcoex_BtInfoNotify(adapter ,len+1, &buf[1]);
+}
+
+u8 rtw_btinfo_cmd(_adapter *adapter, u8 *buf, u16 len)
+{
+       struct cmd_obj *ph2c;
+       struct drvextra_cmd_parm *pdrvextra_cmd_parm;
+       u8 *btinfo;
+       struct cmd_priv *pcmdpriv = &adapter->cmdpriv;
+       u8      res = _SUCCESS;
+
+       ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
+       if (ph2c == NULL) {
+               res = _FAIL;
+               goto exit;
+       }
+
+       pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
+       if (pdrvextra_cmd_parm == NULL) {
+               rtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));
+               res = _FAIL;
+               goto exit;
+       }
+
+       btinfo = rtw_zmalloc(len);
+       if (btinfo == NULL) {
+               rtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));
+               rtw_mfree((u8*)pdrvextra_cmd_parm, sizeof(struct drvextra_cmd_parm));
+               res = _FAIL;
+               goto exit;
+       }
+
+       pdrvextra_cmd_parm->ec_id = BTINFO_WK_CID;
+       pdrvextra_cmd_parm->type = 0;
+       pdrvextra_cmd_parm->size = len;
+       pdrvextra_cmd_parm->pbuf = btinfo;
+
+       _rtw_memcpy(btinfo, buf, len);
+
+       init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
+
+       res = rtw_enqueue_cmd(pcmdpriv, ph2c);
+
+exit:
+       return res;
+}
+#endif
+
 //#ifdef CONFIG_C2H_PACKET_EN
 u8 rtw_c2h_packet_wk_cmd(PADAPTER padapter, u8 *pbuf, u16 length)
 {
@@ -3207,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;
@@ -3366,7 +3649,11 @@ u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf)
                case DM_RA_MSK_WK_CID:
                        rtw_dm_ra_mask_hdl(padapter, (struct sta_info *)pdrvextra_cmd->pbuf);
                        break;
-
+#ifdef CONFIG_BT_COEXIST
+               case BTINFO_WK_CID:
+                       rtw_btinfo_hdl(padapter ,pdrvextra_cmd->pbuf, pdrvextra_cmd->size);
+                       break;
+#endif
                default:
                        break;
        }
@@ -3404,16 +3691,16 @@ _func_exit_;
 void rtw_disassoc_cmd_callback(_adapter*       padapter,  struct cmd_obj *pcmd)
 {
        _irqL   irqL;
-       struct  mlme_priv *pmlmepriv = &padapter->mlmepriv;
-
-_func_enter_;
+       struct  mlme_priv *pmlmepriv = &padapter->mlmepriv;
+       
+_func_enter_;  
 
        if (pcmd->res != H2C_SUCCESS)
        {
                _enter_critical_bh(&pmlmepriv->lock, &irqL);
                set_fwstate(pmlmepriv, _FW_LINKED);
                _exit_critical_bh(&pmlmepriv->lock, &irqL);
-
+                               
                RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ***Error: disconnect_cmd_callback Fail ***\n."));
 
                goto exit;
@@ -3425,16 +3712,16 @@ _func_enter_;
 
        // free cmd
        rtw_free_cmd_obj(pcmd);
-
+       
 exit:
-
-_func_exit_;
+       
+_func_exit_;   
 }
 
 
 void rtw_joinbss_cmd_callback(_adapter*        padapter,  struct cmd_obj *pcmd)
 {
-       struct  mlme_priv       *pmlmepriv = &padapter->mlmepriv;
+       struct  mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct  mlme_ext_priv   *pmlmeext = &padapter->mlmeextpriv;
        struct  mlme_ext_info   *pmlmeinfo = &(pmlmeext->mlmext_info);
        u16     val;
index 6413f5b921fd7e575fb63b151bc48dd96beec1cc..72cad7378d2c9fd850bf7ecbe233c93f6d5d4577 100644 (file)
@@ -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)
 {
@@ -466,15 +511,18 @@ int proc_get_survey_info(struct seq_file *m, void *v)
        struct wlan_network     *pnetwork = NULL;
        _list   *plist, *phead;
        s32 notify_signal;
+       s16 notify_noise = 0;
        u16  index = 0;
 
        _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  %5s  %s\n","index", "bssid", "ch", "dBm", "SdBm", "age", "ssid");
+       DBG_871X_SEL_NL(m, "%5s  %-17s  %3s  %-3s  %-4s  %-4s  %5s  %s\n","index", "bssid", "ch", "RSSI", "SdBm", "Noise", "age", "ssid");
        while(1)
        {
                if (rtw_end_of_queue_search(phead,plist)== _TRUE)
@@ -490,13 +538,18 @@ int proc_get_survey_info(struct seq_file *m, void *v)
                } else {
                        notify_signal = translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);//dbm
                }
+
+               #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+               rtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(pnetwork->network.Configuration.DSConfig), &(notify_noise));
+               #endif
        
-               DBG_871X_SEL_NL(m, "%5d  "MAC_FMT"  %3d  %3d  %4d  %5d  %s\n", 
+               DBG_871X_SEL_NL(m, "%5d  "MAC_FMT"  %3d  %3d  %4d  %4d  %5d  %s\n", 
                        ++index,
                        MAC_ARG(pnetwork->network.MacAddress), 
                        pnetwork->network.Configuration.DSConfig,
                        (int)pnetwork->network.Rssi,
                        notify_signal,
+                       notify_noise,
                        rtw_get_passing_time_ms((u32)pnetwork->last_scanned),
                        //translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength),
                        pnetwork->network.Ssid.Ssid);
@@ -564,8 +617,14 @@ int proc_get_adapter_state(struct seq_file *m, void *v)
        struct net_device *dev = m->private;
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
 
-       DBG_871X_SEL_NL(m, "bSurpriseRemoved=%d, bDriverStopped=%d\n", 
-                                               padapter->bSurpriseRemoved, padapter->bDriverStopped);
+#ifdef CONFIG_CONCURRENT_MODE
+       DBG_871X_SEL_NL(m, "name=%s, iface_type=%d, bSurpriseRemoved=%d, bDriverStopped=%d\n",
+                                       dev->name, padapter->iface_type,
+                                       padapter->bSurpriseRemoved, padapter->bDriverStopped);
+#else
+       DBG_871X_SEL_NL(m, "name=%s, bSurpriseRemoved=%d, bDriverStopped=%d\n",
+                                       dev->name, padapter->bSurpriseRemoved, padapter->bDriverStopped);
+#endif
 
        return 0;
 }
@@ -579,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"
@@ -593,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\n", 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");
        }
@@ -621,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;
@@ -649,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;
@@ -667,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;
@@ -712,24 +810,268 @@ int proc_get_suspend_resume_info(struct seq_file *m, void *v)
        return 0;
 }
 
-int proc_get_rx_signal(struct seq_file *m, void *v)
+#ifdef CONFIG_DBG_COUNTER
+
+int proc_get_rx_logs(struct seq_file *m, void *v)
 {
        struct net_device *dev = m->private;
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
-       struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
+       struct rx_logs *rx_logs = &padapter->rx_logs;
+
+       DBG_871X_SEL_NL(m, 
+               "intf_rx=%d\n"
+               "intf_rx_err_recvframe=%d\n"
+               "intf_rx_err_skb=%d\n"
+               "intf_rx_report=%d\n"
+               "core_rx=%d\n"
+               "core_rx_pre=%d\n"
+               "core_rx_pre_ver_err=%d\n"
+               "core_rx_pre_mgmt=%d\n"
+               "core_rx_pre_mgmt_err_80211w=%d\n"
+               "core_rx_pre_mgmt_err=%d\n"
+               "core_rx_pre_ctrl=%d\n"
+               "core_rx_pre_ctrl_err=%d\n"
+               "core_rx_pre_data=%d\n"
+               "core_rx_pre_data_wapi_seq_err=%d\n"
+               "core_rx_pre_data_wapi_key_err=%d\n"
+               "core_rx_pre_data_handled=%d\n"
+               "core_rx_pre_data_err=%d\n"
+               "core_rx_pre_data_unknown=%d\n"
+               "core_rx_pre_unknown=%d\n"
+               "core_rx_enqueue=%d\n"
+               "core_rx_dequeue=%d\n"
+               "core_rx_post=%d\n"
+               "core_rx_post_decrypt=%d\n"
+               "core_rx_post_decrypt_wep=%d\n"
+               "core_rx_post_decrypt_tkip=%d\n"
+               "core_rx_post_decrypt_aes=%d\n"
+               "core_rx_post_decrypt_wapi=%d\n"
+               "core_rx_post_decrypt_hw=%d\n"
+               "core_rx_post_decrypt_unknown=%d\n"
+               "core_rx_post_decrypt_err=%d\n"
+               "core_rx_post_defrag_err=%d\n"
+               "core_rx_post_portctrl_err=%d\n"
+               "core_rx_post_indicate=%d\n"
+               "core_rx_post_indicate_in_oder=%d\n"
+               "core_rx_post_indicate_reoder=%d\n"
+               "core_rx_post_indicate_err=%d\n"
+               "os_indicate=%d\n"
+               "os_indicate_ap_mcast=%d\n"
+               "os_indicate_ap_forward=%d\n"
+               "os_indicate_ap_self=%d\n"
+               "os_indicate_err=%d\n"
+               "os_netif_ok=%d\n"
+               "os_netif_err=%d\n",
+               rx_logs->intf_rx,
+               rx_logs->intf_rx_err_recvframe,
+               rx_logs->intf_rx_err_skb,
+               rx_logs->intf_rx_report,
+               rx_logs->core_rx,
+               rx_logs->core_rx_pre,
+               rx_logs->core_rx_pre_ver_err,
+               rx_logs->core_rx_pre_mgmt,
+               rx_logs->core_rx_pre_mgmt_err_80211w,
+               rx_logs->core_rx_pre_mgmt_err,
+               rx_logs->core_rx_pre_ctrl,
+               rx_logs->core_rx_pre_ctrl_err,
+               rx_logs->core_rx_pre_data,
+               rx_logs->core_rx_pre_data_wapi_seq_err,
+               rx_logs->core_rx_pre_data_wapi_key_err,
+               rx_logs->core_rx_pre_data_handled,
+               rx_logs->core_rx_pre_data_err,
+               rx_logs->core_rx_pre_data_unknown,
+               rx_logs->core_rx_pre_unknown,
+               rx_logs->core_rx_enqueue,
+               rx_logs->core_rx_dequeue,
+               rx_logs->core_rx_post,
+               rx_logs->core_rx_post_decrypt,
+               rx_logs->core_rx_post_decrypt_wep,
+               rx_logs->core_rx_post_decrypt_tkip,
+               rx_logs->core_rx_post_decrypt_aes,
+               rx_logs->core_rx_post_decrypt_wapi,
+               rx_logs->core_rx_post_decrypt_hw,
+               rx_logs->core_rx_post_decrypt_unknown,
+               rx_logs->core_rx_post_decrypt_err,
+               rx_logs->core_rx_post_defrag_err,
+               rx_logs->core_rx_post_portctrl_err,
+               rx_logs->core_rx_post_indicate,
+               rx_logs->core_rx_post_indicate_in_oder,
+               rx_logs->core_rx_post_indicate_reoder,
+               rx_logs->core_rx_post_indicate_err,
+               rx_logs->os_indicate,
+               rx_logs->os_indicate_ap_mcast,
+               rx_logs->os_indicate_ap_forward,
+               rx_logs->os_indicate_ap_self,
+               rx_logs->os_indicate_err,
+               rx_logs->os_netif_ok,
+               rx_logs->os_netif_err
+       );
 
-       DBG_871X_SEL_NL(m, "rssi:%d\n", padapter->recvpriv.rssi);
-       //DBG_871X_SEL_NL(m, "rxpwdb:%d\n", padapter->recvpriv.rxpwdb);
-       DBG_871X_SEL_NL(m, "signal_strength:%u\n", padapter->recvpriv.signal_strength);
-       DBG_871X_SEL_NL(m, "signal_qual:%u\n", padapter->recvpriv.signal_qual);
-       DBG_871X_SEL_NL(m, "noise:%u\n", padapter->recvpriv.noise);
-       rtw_odm_get_perpkt_rssi(m,padapter);
-       #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
-       rtw_get_raw_rssi_info(m,padapter);
-       #endif
        return 0;
 }
 
+int proc_get_tx_logs(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct tx_logs *tx_logs = &padapter->tx_logs;
+       
+       DBG_871X_SEL_NL(m,
+               "os_tx=%d\n"
+               "os_tx_err_up=%d\n"
+               "os_tx_err_xmit=%d\n"
+               "os_tx_m2u=%d\n"
+               "os_tx_m2u_ignore_fw_linked=%d\n"
+               "os_tx_m2u_ignore_self=%d\n"
+               "os_tx_m2u_entry=%d\n"
+               "os_tx_m2u_entry_err_xmit=%d\n"
+               "os_tx_m2u_entry_err_skb=%d\n"
+               "os_tx_m2u_stop=%d\n"
+               "core_tx=%d\n"
+               "core_tx_err_pxmitframe=%d\n"
+               "core_tx_err_brtx=%d\n"
+               "core_tx_upd_attrib=%d\n"
+               "core_tx_upd_attrib_adhoc=%d\n"
+               "core_tx_upd_attrib_sta=%d\n"
+               "core_tx_upd_attrib_ap=%d\n"
+               "core_tx_upd_attrib_unknown=%d\n"
+               "core_tx_upd_attrib_dhcp=%d\n"
+               "core_tx_upd_attrib_icmp=%d\n"
+               "core_tx_upd_attrib_active=%d\n"
+               "core_tx_upd_attrib_err_ucast_sta=%d\n"
+               "core_tx_upd_attrib_err_ucast_ap_link=%d\n"
+               "core_tx_upd_attrib_err_sta=%d\n"
+               "core_tx_upd_attrib_err_link=%d\n"
+               "core_tx_upd_attrib_err_sec=%d\n"
+               "core_tx_ap_enqueue_warn_fwstate=%d\n"
+               "core_tx_ap_enqueue_warn_sta=%d\n"
+               "core_tx_ap_enqueue_warn_nosta=%d\n"
+               "core_tx_ap_enqueue_warn_link=%d\n"
+               "core_tx_ap_enqueue_warn_trigger=%d\n"
+               "core_tx_ap_enqueue_mcast=%d\n"
+               "core_tx_ap_enqueue_ucast=%d\n"
+               "core_tx_ap_enqueue=%d\n"
+               "intf_tx=%d\n"
+               "intf_tx_pending_ac=%d\n"
+               "intf_tx_pending_fw_under_survey=%d\n"
+               "intf_tx_pending_fw_under_linking=%d\n"
+               "intf_tx_pending_xmitbuf=%d\n"
+               "intf_tx_enqueue=%d\n"
+               "core_tx_enqueue=%d\n"
+               "core_tx_enqueue_class=%d\n"
+               "core_tx_enqueue_class_err_sta=%d\n"
+               "core_tx_enqueue_class_err_nosta=%d\n"
+               "core_tx_enqueue_class_err_fwlink=%d\n"
+               "intf_tx_direct=%d\n"
+               "intf_tx_direct_err_coalesce=%d\n"
+               "intf_tx_dequeue=%d\n"
+               "intf_tx_dequeue_err_coalesce=%d\n"
+               "intf_tx_dump_xframe=%d\n"
+               "intf_tx_dump_xframe_err_txdesc=%d\n"
+               "intf_tx_dump_xframe_err_port=%d\n",
+               tx_logs->os_tx,
+               tx_logs->os_tx_err_up,
+               tx_logs->os_tx_err_xmit,
+               tx_logs->os_tx_m2u,
+               tx_logs->os_tx_m2u_ignore_fw_linked,
+               tx_logs->os_tx_m2u_ignore_self,
+               tx_logs->os_tx_m2u_entry,
+               tx_logs->os_tx_m2u_entry_err_xmit,
+               tx_logs->os_tx_m2u_entry_err_skb,
+               tx_logs->os_tx_m2u_stop,
+               tx_logs->core_tx,
+               tx_logs->core_tx_err_pxmitframe,
+               tx_logs->core_tx_err_brtx,
+               tx_logs->core_tx_upd_attrib,
+               tx_logs->core_tx_upd_attrib_adhoc,
+               tx_logs->core_tx_upd_attrib_sta,
+               tx_logs->core_tx_upd_attrib_ap,
+               tx_logs->core_tx_upd_attrib_unknown,
+               tx_logs->core_tx_upd_attrib_dhcp,
+               tx_logs->core_tx_upd_attrib_icmp,
+               tx_logs->core_tx_upd_attrib_active,
+               tx_logs->core_tx_upd_attrib_err_ucast_sta,
+               tx_logs->core_tx_upd_attrib_err_ucast_ap_link,
+               tx_logs->core_tx_upd_attrib_err_sta,
+               tx_logs->core_tx_upd_attrib_err_link,
+               tx_logs->core_tx_upd_attrib_err_sec,
+               tx_logs->core_tx_ap_enqueue_warn_fwstate,
+               tx_logs->core_tx_ap_enqueue_warn_sta,
+               tx_logs->core_tx_ap_enqueue_warn_nosta,
+               tx_logs->core_tx_ap_enqueue_warn_link,
+               tx_logs->core_tx_ap_enqueue_warn_trigger,
+               tx_logs->core_tx_ap_enqueue_mcast,
+               tx_logs->core_tx_ap_enqueue_ucast,
+               tx_logs->core_tx_ap_enqueue,
+               tx_logs->intf_tx,
+               tx_logs->intf_tx_pending_ac,
+               tx_logs->intf_tx_pending_fw_under_survey,
+               tx_logs->intf_tx_pending_fw_under_linking,
+               tx_logs->intf_tx_pending_xmitbuf,
+               tx_logs->intf_tx_enqueue,
+               tx_logs->core_tx_enqueue,
+               tx_logs->core_tx_enqueue_class,
+               tx_logs->core_tx_enqueue_class_err_sta,
+               tx_logs->core_tx_enqueue_class_err_nosta,
+               tx_logs->core_tx_enqueue_class_err_fwlink,
+               tx_logs->intf_tx_direct,
+               tx_logs->intf_tx_direct_err_coalesce,
+               tx_logs->intf_tx_dequeue,
+               tx_logs->intf_tx_dequeue_err_coalesce,
+               tx_logs->intf_tx_dump_xframe,
+               tx_logs->intf_tx_dump_xframe_err_txdesc,
+               tx_logs->intf_tx_dump_xframe_err_port
+       );
+
+       return 0;
+}
+
+int proc_get_int_logs(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+
+       DBG_871X_SEL_NL(m,
+               "all=%d\n"
+               "err=%d\n"
+               "tbdok=%d\n"
+               "tbder=%d\n"
+               "bcnderr=%d\n"
+               "bcndma=%d\n"
+               "bcndma_e=%d\n"
+               "rx=%d\n"
+               "rx_rdu=%d\n"
+               "rx_fovw=%d\n"
+               "txfovw=%d\n"
+               "mgntok=%d\n"
+               "highdok=%d\n"
+               "bkdok=%d\n"
+               "bedok=%d\n"
+               "vidok=%d\n"
+               "vodok=%d\n",
+               padapter->int_logs.all,
+               padapter->int_logs.err,
+               padapter->int_logs.tbdok,
+               padapter->int_logs.tbder,
+               padapter->int_logs.bcnderr,
+               padapter->int_logs.bcndma,
+               padapter->int_logs.bcndma_e,
+               padapter->int_logs.rx,
+               padapter->int_logs.rx_rdu,
+               padapter->int_logs.rx_fovw,
+               padapter->int_logs.txfovw,
+               padapter->int_logs.mgntok,
+               padapter->int_logs.highdok,
+               padapter->int_logs.bkdok,
+               padapter->int_logs.bedok,
+               padapter->int_logs.vidok,
+               padapter->int_logs.vodok
+       );
+
+       return 0;
+}
+
+#endif // CONFIG_DBG_COUNTER
 
 int proc_get_hw_status(struct seq_file *m, void *v)
 {
@@ -744,6 +1086,24 @@ int proc_get_hw_status(struct seq_file *m, void *v)
        return 0;
 }
 
+int proc_get_rx_signal(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
+
+       DBG_871X_SEL_NL(m, "rssi:%d\n", padapter->recvpriv.rssi);
+       //DBG_871X_SEL_NL(m, "rxpwdb:%d\n", padapter->recvpriv.rxpwdb);
+       DBG_871X_SEL_NL(m, "signal_strength:%u\n", padapter->recvpriv.signal_strength);
+       DBG_871X_SEL_NL(m, "signal_qual:%u\n", padapter->recvpriv.signal_qual);
+       DBG_871X_SEL_NL(m, "noise:%d\n", padapter->recvpriv.noise);
+       rtw_odm_get_perpkt_rssi(m,padapter);
+       #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
+       rtw_get_raw_rssi_info(m,padapter);
+       #endif
+       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;
@@ -807,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);
                }
        }
        
@@ -930,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);
@@ -945,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)
@@ -980,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);
@@ -1044,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);
@@ -1089,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)
@@ -1131,6 +1620,11 @@ int proc_get_all_sta_info(struct seq_file *m, void *v)
                                DBG_871X_SEL_NL(m, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);
 #endif //CONFIG_80211N_HT
                                DBG_871X_SEL_NL(m, "sleepq_len=%d\n", psta->sleepq_len);
+                               DBG_871X_SEL_NL(m, "sta_xmitpriv.vo_q_qcnt=%d\n", psta->sta_xmitpriv.vo_q.qcnt);
+                               DBG_871X_SEL_NL(m, "sta_xmitpriv.vi_q_qcnt=%d\n", psta->sta_xmitpriv.vi_q.qcnt);
+                               DBG_871X_SEL_NL(m, "sta_xmitpriv.be_q_qcnt=%d\n", psta->sta_xmitpriv.be_q.qcnt);
+                               DBG_871X_SEL_NL(m, "sta_xmitpriv.bk_q_qcnt=%d\n", psta->sta_xmitpriv.bk_q.qcnt);
+
                                DBG_871X_SEL_NL(m, "capability=0x%x\n", psta->capability);
                                DBG_871X_SEL_NL(m, "flags=0x%x\n", psta->flags);
                                DBG_871X_SEL_NL(m, "wpa_psk=0x%x\n", psta->wpa_psk);
@@ -1199,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 ) {
@@ -1403,5 +1897,148 @@ ssize_t proc_set_sreset(struct file *file, const char __user *buffer, size_t cou
 }
 #endif /* DBG_CONFIG_ERROR_DETECT */
 
+#ifdef CONFIG_PCI_HCI
+
+int proc_get_rx_ring(struct seq_file *m, void *v)
+{
+       _irqL irqL;
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *) rtw_netdev_priv(dev);
+       struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
+       struct recv_priv *precvpriv = &padapter->recvpriv;
+       struct rtw_rx_ring *rx_ring = &precvpriv->rx_ring[RX_MPDU_QUEUE];
+       int i, j;
+
+       DBG_871X_SEL_NL(m, "rx ring (%p)\n", rx_ring);
+       DBG_871X_SEL_NL(m, "  dma: 0x%08x\n", (int) rx_ring->dma);
+       DBG_871X_SEL_NL(m, "  idx: %d\n", rx_ring->idx);
+
+       _enter_critical(&pdvobjpriv->irq_th_lock, &irqL);
+       for (i=0; i<precvpriv->rxringcount; i++)
+       {
+               struct recv_stat *entry = &rx_ring->desc[i];
+               struct sk_buff *skb = rx_ring->rx_buf[i];
+
+               DBG_871X_SEL_NL(m, "  desc[%03d]: %p, rx_buf[%03d]: 0x%08x\n",
+                       i, entry, i, cpu_to_le32(*((dma_addr_t *)skb->cb)));
+
+               for (j=0; j<sizeof(*entry)/4; j++)
+               {
+                       if ((j % 4) == 0)
+                               DBG_871X_SEL_NL(m, "  0x%03x", j);
+
+                       DBG_871X_SEL_NL(m, " 0x%08x ", ((int *) entry)[j]);
+
+                       if ((j % 4) == 3)
+                               DBG_871X_SEL_NL(m, "\n");
+               }
+       }
+       _exit_critical(&pdvobjpriv->irq_th_lock, &irqL);
+
+       return 0;
+}
+
+int proc_get_tx_ring(struct seq_file *m, void *v)
+{
+       _irqL irqL;
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *) rtw_netdev_priv(dev);
+       struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
+       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
+       int i, j, k;
+
+       _enter_critical(&pdvobjpriv->irq_th_lock, &irqL);
+       for (i = 0; i < PCI_MAX_TX_QUEUE_COUNT; i++)
+       {
+               struct rtw_tx_ring *tx_ring = &pxmitpriv->tx_ring[i];
+
+               DBG_871X_SEL_NL(m, "tx ring[%d] (%p)\n", i, tx_ring);
+               DBG_871X_SEL_NL(m, "  dma: 0x%08x\n", (int) tx_ring->dma);
+               DBG_871X_SEL_NL(m, "  idx: %d\n", tx_ring->idx);
+               DBG_871X_SEL_NL(m, "  entries: %d\n", tx_ring->entries);
+//             DBG_871X_SEL_NL(m, "  queue: %d\n", tx_ring->queue);
+               DBG_871X_SEL_NL(m, "  qlen: %d\n", tx_ring->qlen);
+
+               for (j=0; j < pxmitpriv->txringcount[i]; j++)
+               {
+                       struct tx_desc *entry = &tx_ring->desc[j];
+
+                       DBG_871X_SEL_NL(m, "  desc[%03d]: %p\n", j, entry);
+                       for (k=0; k < sizeof(*entry)/4; k++)
+                       {
+                               if ((k % 4) == 0)
+                                       DBG_871X_SEL_NL(m, "  0x%03x", k);
+
+                               DBG_871X_SEL_NL(m, " 0x%08x ", ((int *) entry)[k]);
+
+                               if ((k % 4) == 3)
+                                       DBG_871X_SEL_NL(m, "\n");
+                       }
+               }
+       }
+       _exit_critical(&pdvobjpriv->irq_th_lock, &irqL);
+
+       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 789d30fa4ec00c57907f96577051e5a676ca6a03..224714b06c242b26ee4677011eb5c194efda0da2 100644 (file)
@@ -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,72 +1349,145 @@ 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;
 #include <linux/rfkill-wlan.h>
 void rtw_macaddr_cfg(u8 *mac_addr)
 {
-    u8 mac[ETH_ALEN];
-
-    if(mac_addr == NULL)    return;
-
-    if ( rtw_initmac )
-    {   //  Users specify the mac address
-        int jj,kk;
+       u8 mac[ETH_ALEN];
+       if(mac_addr == NULL)    return;
+       
+       if ( rtw_initmac )
+       {       //      Users specify the mac address
+               int jj,kk;
 
-        for( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 )
+               for( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 )
+               {
+                       mac[jj] = key_2char2num(rtw_initmac[kk], rtw_initmac[kk+ 1]);
+               }
+               _rtw_memcpy(mac_addr, mac, ETH_ALEN);
+       }
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+       else if (0 == rtw_get_mac_addr_intel(mac))
+       {
+               _rtw_memcpy(mac_addr, mac, ETH_ALEN);
+       }
+#endif //CONFIG_PLATFORM_INTEL_BYT
+       else
         {
-            mac[jj] = key_2char2num(rtw_initmac[kk], rtw_initmac[kk+ 1]);
-        }
-        _rtw_memcpy(mac_addr, mac, ETH_ALEN);
-    }
-    else
-    {
-        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)) {
-            printk("=========> get mac address from flash=[%02x:%02x:%02x:%02x:%02x:%02x]\n", mac[0], mac[1],
-                mac[2], mac[3], mac[4], mac[5]);
-            _rtw_memcpy(mac_addr, mac, ETH_ALEN);
-        } else {
-            //  Use the mac address stored in the Efuse
-            _rtw_memcpy(mac, mac_addr, ETH_ALEN);
+               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)) {
+                   printk("=========> get mac address from flash=[%02x:%02x:%02x:%02x:%02x:%02x]\n", mac[0], mac[1],
+                       mac[2], mac[3], mac[4], mac[5]);
+                   _rtw_memcpy(mac_addr, mac, ETH_ALEN);
+               } 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) &&
-         (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] = 0x00;
-        mac[5] = 0x00;
-        // use default mac addresss
-        _rtw_memcpy(mac_addr, mac, ETH_ALEN);
-        DBG_871X("MAC Address from efuse error, assign default one !!!\n");
-    }
-
-    DBG_871X("rtw_macaddr_cfg MAC Address  = "MAC_FMT"\n", MAC_ARG(mac_addr));
-}
-
-void dump_ies(u8 *buf, u32 buf_len)
+       
+       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] = 0x00;
+               mac[5] = 0x00;
+               // use default mac addresss
+               _rtw_memcpy(mac_addr, mac, ETH_ALEN);
+               DBG_871X("MAC Address from efuse error, assign default one !!!\n");
+       }       
+
+       DBG_871X("rtw_macaddr_cfg MAC Address  = "MAC_FMT"\n", MAC_ARG(mac_addr));
+}
+
+#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
 
@@ -1420,7 +1495,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;
@@ -1438,7 +1513,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);
        }
@@ -1516,7 +1591,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;
@@ -1533,7 +1608,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);
        }       
@@ -1737,7 +1812,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"
@@ -1758,7 +1833,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;
                }
        }
@@ -1774,12 +1849,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) {
@@ -1792,10 +1866,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_);
+                       }
                }
        }
 }
@@ -1803,7 +1877,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;
@@ -1820,7 +1894,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 100644 (file)
@@ -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
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_mem.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/core/rtw_mem.c
new file mode 100644 (file)
index 0000000..a4de3e6
--- /dev/null
@@ -0,0 +1,103 @@
+\r
+#include <drv_types.h>\r
+#include <rtw_mem.h>\r
+\r
+MODULE_LICENSE("GPL");\r
+MODULE_DESCRIPTION("Realtek Wireless Lan Driver");\r
+MODULE_AUTHOR("Realtek Semiconductor Corp.");\r
+MODULE_VERSION("DRIVERVERSION");\r
+\r
+struct sk_buff_head rtk_skb_mem_q;\r
+struct u8* rtk_buf_mem[NR_RECVBUFF];\r
+\r
+struct u8      * rtw_get_buf_premem(int index)\r
+{\r
+       printk("%s, rtk_buf_mem index : %d\n", __func__, index);\r
+       return rtk_buf_mem[index];\r
+}\r
+\r
+struct sk_buff *rtw_alloc_skb_premem(void)\r
+{\r
+       struct sk_buff *skb = NULL;\r
+\r
+       skb = skb_dequeue(&rtk_skb_mem_q);\r
+\r
+       printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
+\r
+       return skb;     \r
+}\r
+EXPORT_SYMBOL(rtw_alloc_skb_premem);\r
+\r
+int rtw_free_skb_premem(struct sk_buff *pskb)\r
+{\r
+       if(!pskb)\r
+               return -1;\r
+\r
+       if(skb_queue_len(&rtk_skb_mem_q) >= NR_PREALLOC_RECV_SKB)       \r
+               return -1;\r
+       \r
+       skb_queue_tail(&rtk_skb_mem_q, pskb);\r
+       \r
+       printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
+\r
+       return 0;\r
+}\r
+EXPORT_SYMBOL(rtw_free_skb_premem);\r
+\r
+static int __init rtw_mem_init(void)\r
+{\r
+       int i;\r
+       SIZE_PTR tmpaddr=0;\r
+       SIZE_PTR alignment=0;\r
+       struct sk_buff *pskb=NULL;\r
+\r
+       printk("%s\n", __func__);\r
+\r
+#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX\r
+       for(i=0; i<NR_RECVBUFF; i++)\r\r
+       {\r\r
+               rtk_buf_mem[i] = usb_buffer_alloc(dev, size, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), dma);\r
+       }\r
+#endif //CONFIG_USE_USB_BUFFER_ALLOC_RX\r
+\r
+       skb_queue_head_init(&rtk_skb_mem_q);\r
+\r
+       for(i=0; i<NR_PREALLOC_RECV_SKB; i++)\r
+       {\r
+               pskb = __dev_alloc_skb(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);\r
+               if(pskb)\r
+               {               \r
+                       tmpaddr = (SIZE_PTR)pskb->data;\r
+                       alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);\r
+                       skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment));\r
+\r
+                       skb_queue_tail(&rtk_skb_mem_q, pskb);\r
+               }\r
+               else\r
+               {\r
+                       printk("%s, alloc skb memory fail!\n", __func__);\r
+               }\r
+\r
+               pskb=NULL;\r
+       }\r
+\r
+       printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
+\r
+       return 0;\r
+       \r
+}\r
+\r
+static void __exit rtw_mem_exit(void)\r
+{\r
+       if (skb_queue_len(&rtk_skb_mem_q)) {\r
+               printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
+       }\r
+\r
+       skb_queue_purge(&rtk_skb_mem_q);\r
+\r
+       printk("%s\n", __func__);\r
+}\r
+\r
+module_init(rtw_mem_init);\r
+module_exit(rtw_mem_exit);\r
+\r
index 6b9abd77f753a5dbb387de27ec2bef79e8205150..eb40179e81ccf6723bd7b7c16b85367e737f1eb5 100644 (file)
 extern void indicate_wx_scan_complete_event(_adapter *padapter);
 extern u8 rtw_do_join(_adapter * padapter);
 
-#ifdef CONFIG_DISABLE_MCS13TO15
-extern unsigned char   MCS_rate_2R_MCS13TO15_OFF[16];
-extern unsigned char   MCS_rate_2R[16];
-#else //CONFIG_DISABLE_MCS13TO15
-extern unsigned char   MCS_rate_2R[16];
-#endif //CONFIG_DISABLE_MCS13TO15
-extern unsigned char   MCS_rate_1R[16];
 
 sint   _rtw_init_mlme_priv (_adapter* padapter)
 {
@@ -162,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){
@@ -172,6 +168,7 @@ _func_enter_;
                        rtw_vmfree(pmlmepriv->free_bss_buf, MAX_BSS_CNT * sizeof(struct wlan_network));
                }
        }
+exit:
 _func_exit_;   
 }
 
@@ -540,19 +537,19 @@ void rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork
 _func_enter_;          
        RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_network==> ssid = %s \n\n" , pnetwork->network.Ssid.Ssid));
        _rtw_free_network(pmlmepriv, pnetwork, is_freeall);
-_func_exit_;           
+_func_exit_;
 }
 
 void rtw_free_network_nolock(_adapter * padapter, struct wlan_network *pnetwork );
 void rtw_free_network_nolock(_adapter * padapter, struct wlan_network *pnetwork )
 {
-_func_enter_;
+_func_enter_;          
        //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_network==> ssid = %s \n\n" , pnetwork->network.Ssid.Ssid));
        _rtw_free_network_nolock(&(padapter->mlmepriv), pnetwork);
 #ifdef CONFIG_IOCTL_CFG80211
        rtw_cfg80211_unlink_bss(padapter, pnetwork);
 #endif //CONFIG_IOCTL_CFG80211
-_func_exit_;
+_func_exit_;           
 }
 
 
@@ -870,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;
@@ -898,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;
@@ -1452,6 +1451,14 @@ _func_enter_;
        
 _func_exit_;
 }
+
+void rtw_reset_rx_info(struct debug_priv *pdbgpriv){
+       pdbgpriv->dbg_rx_ampdu_drop_count = 0;
+       pdbgpriv->dbg_rx_ampdu_forced_indicate_count = 0;
+       pdbgpriv->dbg_rx_ampdu_loss_count = 0;
+       pdbgpriv->dbg_rx_dup_mgt_frame_drop_count = 0;
+       pdbgpriv->dbg_rx_ampdu_window_shift_cnt = 0;
+}
        
 /*
 *rtw_free_assoc_resources: the caller has to lock pmlmepriv->lock
@@ -1460,9 +1467,12 @@ void rtw_free_assoc_resources(_adapter *adapter, int lock_scanned_queue)
 {
        _irqL irqL;
        struct wlan_network* pwlan = NULL;
-       struct  mlme_priv *pmlmepriv = &adapter->mlmepriv;
-       struct  sta_priv *pstapriv = &adapter->stapriv;
+       struct  mlme_priv *pmlmepriv = &adapter->mlmepriv;
+       struct  sta_priv *pstapriv = &adapter->stapriv;
        struct wlan_network *tgt_network = &pmlmepriv->cur_network;
+       struct dvobj_priv *psdpriv = adapter->dvobj;
+       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;        
+
        
 #ifdef CONFIG_TDLS
        struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;
@@ -1485,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);
                
        }
 
@@ -1505,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,32 +1529,14 @@ _func_enter_;
        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
        }       
@@ -1565,6 +1557,8 @@ _func_enter_;
        
        adapter->securitypriv.key_mask = 0;
 
+       rtw_reset_rx_info(pdbgpriv);
+
 _func_exit_;   
        
 }
@@ -1638,6 +1632,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_;  
        
@@ -1645,6 +1641,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)
@@ -2033,9 +2045,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);
@@ -2320,12 +2332,11 @@ _func_enter_;
                        rtw_indicate_sta_assoc_event(adapter, psta);
 #endif //!CONFIG_IOCTL_CFG80211
 #endif //!CONFIG_AUTO_AP_MODE
+
+#ifdef CONFIG_BEAMFORMING
+                       beamforming_wk_cmd(adapter, BEAMFORMING_CTRL_ENTER, (u8 *)psta, sizeof(struct sta_info), 0);
+#endif
                }               
-               if (adapter->stapriv.asoc_sta_count > 1) {
-                       DBG_871X("%s asoc_sta_count: %d\n", __func__,
-                                       adapter->stapriv.asoc_sta_count);
-                       rtw_ap_connection_lock_suspend();
-               }
                goto exit;
        }       
 #endif //defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
@@ -2438,11 +2449,6 @@ _func_enter_;
                rtw_cfg80211_indicate_sta_disassoc(adapter, pstadel->macaddr, *(u16*)pstadel->rsvd);
                #endif //(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)
 #endif //CONFIG_IOCTL_CFG80211
-               DBG_871X("%s asoc_sta_count: %d\n", __func__,
-                               adapter->stapriv.asoc_sta_count);
-               if (adapter->stapriv.asoc_sta_count == 2) {
-                       rtw_ap_connection_unlock_suspend();
-               }
 
                return;
        }
@@ -2487,6 +2493,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 +2516,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)
                { 
@@ -2583,6 +2590,17 @@ _func_exit_;
 
 }
 
+
+void rtw_wmm_event_callback(PADAPTER padapter, u8 *pbuf)
+{
+_func_enter_;
+
+       WMMOnAssocRsp(padapter);
+
+_func_exit_;
+
+}
+
 /*
 * _rtw_join_timeout_handler - Timeout/faliure handler for CMD JoinBss
 * @adapter: pointer to _adapter structure
@@ -2706,6 +2724,8 @@ void rtw_scan_timeout_handler (_adapter *adapter)
 void rtw_mlme_reset_auto_scan_int(_adapter *adapter)
 {
        struct mlme_priv *mlme = &adapter->mlmepriv;
+       struct mlme_ext_priv    *pmlmeext = &adapter->mlmeextpriv;
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
 
 #ifdef CONFIG_P2P
        if(!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE)) {
@@ -2713,8 +2733,11 @@ void rtw_mlme_reset_auto_scan_int(_adapter *adapter)
                goto exit;
        }
 #endif 
-
-       if(adapter->registrypriv.wifi_spec) {
+       if(pmlmeinfo->VHT_enable) //disable auto scan when connect to 11AC AP
+       {
+               mlme->auto_scan_int_ms = 0;
+       }
+       else if(adapter->registrypriv.wifi_spec && is_client_associated_to_ap(adapter) == _TRUE) {
                mlme->auto_scan_int_ms = 60*1000;
 #ifdef CONFIG_LAYER2_ROAMING
        } else if(rtw_chk_roam_flags(adapter, RTW_ROAM_ACTIVE)) {
@@ -2822,7 +2845,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)
@@ -3490,22 +3513,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);
 }
 
@@ -3565,14 +3633,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_;
@@ -3696,17 +3763,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;
 
@@ -3730,9 +3790,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
 
 }
 
@@ -3831,6 +3891,7 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui
        struct registry_priv *pregistrypriv = &padapter->registrypriv;
        struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
        struct ht_priv          *phtpriv = &pmlmepriv->htpriv;
+       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
 
        phtpriv->ht_option = _FALSE;
 
@@ -3904,17 +3965,21 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui
                }
        }
 
+       //fill default supported_mcs_set
+       _rtw_memcpy(ht_capie.supp_mcs_set, pmlmeext->default_supported_mcs_set, 16);
+
+       //update default supported_mcs_set
        rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
-#ifdef RTL8192C_RECONFIG_TO_1T1R
-       rf_type = RF_1T1R;
-#endif
-       switch (rf_type) {
+
+       switch(rf_type)
+       {
        case RF_1T1R:
+               
                if (stbc_rx_enable)
                        ht_capie.cap_info |= IEEE80211_HT_CAP_RX_STBC_1R;//RX STBC One spatial stream
 
-               _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16);
-               break;
+                       set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_1R);                       
+                       break;
 
        case RF_2T2R:
        case RF_1T2R:
@@ -3925,11 +3990,11 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui
 
                #ifdef CONFIG_DISABLE_MCS13TO15
                if(((cbw40_enable == 1) && (operation_bw == CHANNEL_WIDTH_40)) && (pregistrypriv->wifi_spec!=1))
-                       _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R_MCS13TO15_OFF, 16);
+                               set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R_13TO15_OFF);    
                else
-                       _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16);
+                               set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R);       
                #else //CONFIG_DISABLE_MCS13TO15
-               _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16);
+                       set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R);       
                #endif //CONFIG_DISABLE_MCS13TO15
                break;
        }
@@ -3956,14 +4021,25 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui
        #endif
        */
 
-       rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);
+       if(padapter->driver_rx_ampdu_factor != 0xFF)
+               max_rx_ampdu_factor = (HT_CAP_AMPDU_FACTOR)padapter->driver_rx_ampdu_factor;
+       else
+               rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);
+                               
+       //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;
 
@@ -4039,7 +4115,9 @@ void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel)
        {
                if(pregistrypriv->wifi_spec==1)
                {
-                       phtpriv->ampdu_enable = _FALSE;
+                       //remove this part because testbed AP should disable RX AMPDU
+                       //phtpriv->ampdu_enable = _FALSE;
+                       phtpriv->ampdu_enable = _TRUE;
                }
                else
                {
@@ -4048,7 +4126,8 @@ void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel)
        }
        else if(pregistrypriv->ampdu_enable==2)
        {
-               phtpriv->ampdu_enable = _TRUE;
+               //remove this part because testbed AP should disable RX AMPDU
+               //phtpriv->ampdu_enable = _TRUE;
        }
 
        
@@ -4091,34 +4170,31 @@ void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel)
                int i;
                u8      rf_type;
 
-               padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
+               rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
 
-               //update the MCS rates
+               //update the MCS set
                for (i = 0; i < 16; i++)
+                       pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= pmlmeext->default_supported_mcs_set[i];
+
+               //update the MCS rates
+               switch(rf_type)
                {
-                       if((rf_type == RF_1T1R) || (rf_type == RF_1T2R))
-                       {
-                               pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
-                       }
-                       else
-                       {
-                               #ifdef CONFIG_DISABLE_MCS13TO15
-                               if(pmlmeext->cur_bwmode == CHANNEL_WIDTH_40 && pregistrypriv->wifi_spec != 1 )
-                               {
-                                       pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R_MCS13TO15_OFF[i];
-                               }
+                       case RF_1T1R:
+                       case RF_1T2R:
+                               set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_1R);                                                        
+                               break;
+                       case RF_2T2R:                   
+                       default:
+#ifdef CONFIG_DISABLE_MCS13TO15
+                               if(pmlmeext->cur_bwmode == CHANNEL_WIDTH_40 && pregistrypriv->wifi_spec != 1 )                          
+                                       set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R_13TO15_OFF);                             
                                else
-                                       pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
-                               #else
-                               pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
-                               #endif //CONFIG_DISABLE_MCS13TO15
-                       }
-                       #ifdef RTL8192C_RECONFIG_TO_1T1R
-                       {
-                               pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
-                       }
-                       #endif
+                                       set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R);
+#else //CONFIG_DISABLE_MCS13TO15
+                               set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R);
+#endif //CONFIG_DISABLE_MCS13TO15
                }
+
                //switch to the 40M Hz mode accoring to the AP
                //pmlmeext->cur_bwmode = CHANNEL_WIDTH_40;
                switch ((pmlmeinfo->HT_info.infos[0] & 0x3))
old mode 100644 (file)
new mode 100755 (executable)
index 99e5512..16b6801
@@ -113,16 +113,6 @@ unsigned char RSN_TKIP_CIPHER[4] = {0x00, 0x0f, 0xac, 0x02};
 
 extern unsigned char REALTEK_96B_IE[];
 
-/********************************************************
-MCS rate definitions
-*********************************************************/
-#ifdef CONFIG_DISABLE_MCS13TO15
-unsigned char  MCS_rate_2R_MCS13TO15_OFF[16] = {0xff, 0x1f, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
-unsigned char  MCS_rate_2R[16] = {0xff, 0xff, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
-#else //CONFIG_DISABLE_MCS13TO15
-unsigned char  MCS_rate_2R[16] = {0xff, 0xff, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
-#endif //CONFIG_DISABLE_MCS13TO15
-unsigned char  MCS_rate_1R[16] = {0xff, 0x00, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
 
 /********************************************************
 ChannelPlan definitions
@@ -181,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
@@ -191,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] = {
@@ -244,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,
@@ -256,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,
@@ -278,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
@@ -286,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
@@ -345,18 +345,24 @@ int init_hw_mlme_ext(_adapter *padapter)
        return _SUCCESS;
 }
 
-static void init_mlme_ext_priv_value(_adapter* padapter)
+void init_mlme_default_rate_set(_adapter* padapter)
 {
-       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-
-#ifdef CONFIG_TDLS
-       u8 i;
-#endif
+       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
 
-       //unsigned char default_channel_set[MAX_CHANNEL_NUM] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0};
        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, 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);
+
+       _rtw_memcpy(pmlmeext->default_supported_mcs_set, supported_mcs_set, sizeof(pmlmeext->default_supported_mcs_set));
+}
+
+static void init_mlme_ext_priv_value(_adapter* padapter)
+{
+       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
 
        ATOMIC_SET(&pmlmeext->event_seq, 0);
        pmlmeext->mgnt_seq = 0;//reset to zero when disconnect at client mode
@@ -373,10 +379,7 @@ static void init_mlme_ext_priv_value(_adapter* padapter)
 
        pmlmeext->cur_wireless_mode = padapter->registrypriv.wireless_mode;
 
-       //_rtw_memcpy(pmlmeext->channel_set, DefaultChannelPlan[padapter->mlmepriv.ChannelPlan].Channel, DefaultChannelPlan[padapter->mlmepriv.ChannelPlan].Len);
-       //_rtw_memcpy(pmlmeext->channel_set, default_channel_set, MAX_CHANNEL_NUM);
-       _rtw_memcpy(pmlmeext->datarate, mixed_datarate, NumRates);
-       _rtw_memcpy(pmlmeext->basicrate, mixed_basicrate, NumRates);
+       init_mlme_default_rate_set(padapter);
 
        if(pmlmeext->cur_channel > 14)
                pmlmeext->tx_rate = IEEE80211_OFDM_RATE_6MB;
@@ -487,14 +490,13 @@ static u8 init_channel_set(_adapter* padapter, u8 ChannelPlan, RT_CHANNEL_INFO *
        u8      b5GBand = _FALSE, b2_4GBand = _FALSE;
        u8      Index2G = 0, Index5G=0;
 
-       _rtw_memset(channel_set, 0, sizeof(RT_CHANNEL_INFO)*MAX_CHANNEL_NUM);
-
-       if(ChannelPlan >= RT_CHANNEL_DOMAIN_MAX && ChannelPlan != RT_CHANNEL_DOMAIN_REALTEK_DEFINE)
-       {
+       if (!rtw_is_channel_plan_valid(ChannelPlan)) {
                DBG_871X("ChannelPlan ID %x error !!!!!\n",ChannelPlan);
                return chanset_size;
        }
 
+       _rtw_memset(channel_set, 0, sizeof(RT_CHANNEL_INFO)*MAX_CHANNEL_NUM);
+
        if(IsSupported24G(padapter->registrypriv.wireless_mode))
        {
                b2_4GBand = _TRUE;
@@ -579,6 +581,8 @@ static u8 init_channel_set(_adapter* padapter, u8 ChannelPlan, RT_CHANNEL_INFO *
                }
        }
 
+       Hal_ChannelPlanToRegulation(padapter, ChannelPlan);
+
        DBG_871X("%s ChannelPlan ID %x Chan num:%d  \n",__FUNCTION__,ChannelPlan,chanset_size);
        return chanset_size;
 }
@@ -918,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 )
                {
@@ -1290,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));
                        }
@@ -1953,17 +1973,12 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame)
        p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _SUPPORTEDRATES_IE_, &ie_len, pkt_len - WLAN_HDR_A3_LEN - ie_offset);
        if (p == NULL) {
                DBG_871X("Rx a sta assoc-req which supported rate is empty!\n");
-#ifdef CONFIG_SOFTAP_NO_CHECK_SUPPORT_RATE
-               supportRateNum = rtw_get_rateset_len(cur->SupportedRates);
-               _rtw_memcpy(supportRate, cur->SupportedRates, supportRateNum);
-#else
                // use our own rate set as statoin used
                //_rtw_memcpy(supportRate, AP_BSSRATE, AP_BSSRATE_LEN);
                //supportRateNum = AP_BSSRATE_LEN;
                
                status = _STATS_FAILURE_;
                goto OnAssocReqFail;
-#endif
        }
        else {
                _rtw_memcpy(supportRate, p+2, ie_len);
@@ -2243,6 +2258,10 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame)
                if (elems.vht_op_mode_notify && elems.vht_op_mode_notify_len == 1) {
                        _rtw_memcpy(&pstat->vhtpriv.vht_op_mode_notify, elems.vht_op_mode_notify, 1);
                }
+               else // for Frame without Operating Mode notify ie; default: 80M
+               {
+                       pstat->vhtpriv.vht_op_mode_notify = CHANNEL_WIDTH_80;
+               }
        }
        else {
                pstat->flags &= ~WLAN_STA_VHT;
@@ -3190,7 +3209,7 @@ void issue_p2p_GO_request(_adapter *padapter, u8* raddr)
 
        //      Value:
        //      Todo the tie breaker bit.
-       p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) | BIT(0) );
+       p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) &  0xFE );
 
        //      Configuration Timeout
        //      Type:
@@ -5825,8 +5844,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame)
                                result = process_p2p_group_negotation_req( pwdinfo, frame_body, len );
                                issue_p2p_GO_response( padapter, GetAddr2Ptr(pframe), frame_body, len, result );
 #ifdef CONFIG_INTEL_WIDI
-                               if( (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) && (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_WFD_CONNECTION) )
-                               {
+                               if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) {
                                        padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION;
                                        _cancel_timer_ex(&(padapter->mlmepriv.listen_timer));
                                        intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL, 0);
@@ -6075,8 +6093,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame)
                                        _set_timer( &pwdinfo->restore_p2p_state_timer, 3000 );
                                }
 #ifdef CONFIG_INTEL_WIDI
-                               if( (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) && (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_WFD_CONNECTION) )
-                               {
+                               if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) {
                                        padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION;
                                        _cancel_timer_ex(&(padapter->mlmepriv.listen_timer));
                                        intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL, 0);
@@ -6161,8 +6178,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame)
                                rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ);
                                _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT );
 #ifdef CONFIG_INTEL_WIDI
-                               if( (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) && (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_WFD_CONNECTION) )
-                               {
+                               if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) {
                                        padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION;
                                        _cancel_timer_ex(&(padapter->mlmepriv.listen_timer));
                                        intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL, 0);
@@ -6394,7 +6410,7 @@ unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame)
        u8 *pframe = precv_frame->u.hdr.rx_data;
        uint len = precv_frame->u.hdr.len;
        struct  wifidirect_info *pwdinfo = &( padapter->wdinfo );
-       
+
        //check RA matches or not
        if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))//for if1, sta/ap mode
                return _SUCCESS;
@@ -6545,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;
 
@@ -6577,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;
 
 }
 
@@ -6736,7 +6753,11 @@ void issue_beacon(_adapter *padapter, int timeout_ms)
 
        //DBG_871X("%s\n", __FUNCTION__);
 
+#ifdef CONFIG_BCN_ICF
+       if ((pmgntframe = rtw_alloc_bcnxmitframe(pxmitpriv)) == NULL)
+#else
        if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
+#endif
        {
                DBG_871X("%s, alloc mgnt frame fail\n", __FUNCTION__);
                return;
@@ -6748,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;
@@ -8448,7 +8469,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;
@@ -8462,7 +8483,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;
 }
@@ -8874,6 +8895,7 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act
        u16     BA_timeout_value;
        u16     BA_starting_seqctrl;
        HT_CAP_AMPDU_FACTOR max_rx_ampdu_factor;
+       u8 ba_rxbuf_sz;
        struct xmit_frame               *pmgntframe;
        struct pkt_attrib               *pattrib;
        u8                                      *pframe;
@@ -8887,7 +8909,6 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act
        struct registry_priv            *pregpriv = &padapter->registrypriv;
 
 #ifdef CONFIG_80211N_HT
-       DBG_871X("%s, category=%d, action=%d, status=%d\n", __FUNCTION__, category, action, status);
 
        if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
        {
@@ -8934,28 +8955,12 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act
                                } while (pmlmeinfo->dialogToken == 0);
                                pframe = rtw_set_fixed_ie(pframe, 1, &(pmlmeinfo->dialogToken), &(pattrib->pktlen));
 
-#ifdef CONFIG_BT_COEXIST
-                               if (rtw_btcoex_IsBTCoexCtrlAMPDUSize(padapter) == _TRUE)
-                               {
-                                       // A-MSDU NOT Supported
-                                       BA_para_set = 0;
-                                       // immediate Block Ack
-                                       BA_para_set |= (1 << 1) & IEEE80211_ADDBA_PARAM_POLICY_MASK;
-                                       // TID
-                                       BA_para_set |= (status << 2) & IEEE80211_ADDBA_PARAM_TID_MASK;
-                                       // max buffer size is 8 MSDU
-                                       BA_para_set |= (8 << 6) & RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK;
-                               }
-                               else
-#endif
-                               {
-                                       #if defined(CONFIG_RTL8188E) && defined(CONFIG_SDIO_HCI)
-                                       BA_para_set = (0x0802 | ((status & 0xf) << 2)); //immediate ack & 16 buffer size
-                                       #else
-                                       BA_para_set = (0x1002 | ((status & 0xf) << 2)); //immediate ack & 64 buffer size
-                                       #endif
-                               }
-                               //sys_mib.BA_para_set = 0x0802; //immediate ack & 32 buffer size
+                               #if defined(CONFIG_RTL8188E) && defined(CONFIG_SDIO_HCI)
+                               BA_para_set = (0x0802 | ((status & 0xf) << 2)); //immediate ack & 16 buffer size
+                               #else
+                               BA_para_set = (0x1002 | ((status & 0xf) << 2)); //immediate ack & 64 buffer size
+                               #endif
+
                                BA_para_set = cpu_to_le16(BA_para_set);
                                pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen));
 
@@ -8978,49 +8983,57 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act
                                
                                BA_starting_seqctrl = cpu_to_le16(BA_starting_seqctrl);
                                pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_starting_seqctrl)), &(pattrib->pktlen));
+                               DBG_871X("%s, category=%d, action=%d, status=%d\n", __FUNCTION__, category, action, status);
                                break;
 
                        case 1: //ADDBA rsp
                                pframe = rtw_set_fixed_ie(pframe, 1, &(pmlmeinfo->ADDBA_req.dialog_token), &(pattrib->pktlen));
                                pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&status), &(pattrib->pktlen));
-                               /*
-                               //BA_para_set = cpu_to_le16((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); //64 buffer size
-                               #if defined(CONFIG_RTL8188E )&& defined (CONFIG_SDIO_HCI)
-                               BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x0800); //32buffer size
-                               #else
-                               BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); //64 buffer size
-                               #endif
-                               */
-                               rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);
+
+                               BA_para_set = le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set);
+
+                               if(padapter->driver_rx_ampdu_factor != 0xFF)
+                                       max_rx_ampdu_factor = (HT_CAP_AMPDU_FACTOR)padapter->driver_rx_ampdu_factor;
+                               else
+                                       rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);
+                               
                                if(MAX_AMPDU_FACTOR_64K == max_rx_ampdu_factor)
-                                       BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); //64 buffer size
+                                       ba_rxbuf_sz = 64;
                                else if(MAX_AMPDU_FACTOR_32K == max_rx_ampdu_factor)
-                                       BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x0800); //32 buffer size
+                                       ba_rxbuf_sz = 32;
                                else if(MAX_AMPDU_FACTOR_16K == max_rx_ampdu_factor)
-                                       BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x0400); //16 buffer size
+                                       ba_rxbuf_sz = 16;
                                else if(MAX_AMPDU_FACTOR_8K == max_rx_ampdu_factor)
-                                       BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x0200); //8 buffer size
+                                       ba_rxbuf_sz = 8;
                                else
-                                       BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); //64 buffer size       
+                                       ba_rxbuf_sz = 64;
 
-#ifdef CONFIG_BT_COEXIST
+                               #ifdef CONFIG_BT_COEXIST
                                if (rtw_btcoex_IsBTCoexCtrlAMPDUSize(padapter) == _TRUE)
-                               {
-                                       // max buffer size is 8 MSDU
-                                       BA_para_set &= ~RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK;
-                                       BA_para_set |= (8 << 6) & RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK;
+                                       ba_rxbuf_sz = rtw_btcoex_GetAMPDUSize(padapter);
+                               #endif
+
+                               if (padapter->fix_ba_rxbuf_bz != 0xFF)
+                                       ba_rxbuf_sz = padapter->fix_ba_rxbuf_bz;
+
+                               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;
+
+                               if (!padapter->registrypriv.wifi_spec) {
+                                       if(pregpriv->ampdu_amsdu==0)//disabled
+                                               BA_para_set &= ~BIT(0);
+                                       else if(pregpriv->ampdu_amsdu==1)//enabled
+                                               BA_para_set |= BIT(0);
                                }
-#endif
 
-                               if(pregpriv->ampdu_amsdu==0)//disabled
-                                       BA_para_set = cpu_to_le16(BA_para_set & ~BIT(0));
-                               else if(pregpriv->ampdu_amsdu==1)//enabled
-                                       BA_para_set = cpu_to_le16(BA_para_set | BIT(0));
-                               else //auto
-                                       BA_para_set = cpu_to_le16(BA_para_set);
-                               
+                               BA_para_set = cpu_to_le16(BA_para_set);
+
                                pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen));
                                pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(pmlmeinfo->ADDBA_req.BA_timeout_value)), &(pattrib->pktlen));
+                               DBG_871X("%s, category=%d, action=%d, status=%d, rxbuf_sz=%u\n", __FUNCTION__, category, action, status, ba_rxbuf_sz);
                                break;
                        case 2://DELBA
                                BA_para_set = (status & 0x1F) << 3;
@@ -9030,6 +9043,7 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act
                                reason_code = 37;//Requested from peer STA as it does not want to use the mechanism
                                reason_code = cpu_to_le16(reason_code);
                                pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(reason_code)), &(pattrib->pktlen));
+                               DBG_871X("%s, category=%d, action=%d, status=%d\n", __FUNCTION__, category, action, status);
                                break;
                        default:
                                break;
@@ -9200,6 +9214,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;
@@ -9271,13 +9419,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)
@@ -9352,6 +9503,7 @@ void site_survey(_adapter *padapter)
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
        u32 initialgain = 0;
+       u32 channel_scan_time_ms = 0,val32 = 0;
 
 #ifdef CONFIG_P2P
 
@@ -9526,28 +9678,43 @@ void site_survey(_adapter *padapter)
                                }
                        }
                }
+
 #if  defined(CONFIG_ATMEL_RC_PATCH)
                // treat wlan0 & p2p0 in same way, may be changed in near feature.
                // assume home channel is 6, channel switch sequence will be 
                //      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 )
-                       set_survey_timer(pmlmeext, pmlmeext->chan_scan_time * RTW_STAY_AP_CH_MILLISECOND );
+               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)
-                               set_survey_timer(pmlmeext, 20);
+                               channel_scan_time_ms = 20;
                        else
-                               set_survey_timer(pmlmeext, 40);
+                               channel_scan_time_ms = 40
                }
 #elif defined(CONFIG_STA_MODE_SCAN_UNDER_AP_MODE)
                if( stay_buddy_ch == 1 )
-                       set_survey_timer(pmlmeext, pmlmeext->chan_scan_time * RTW_STAY_AP_CH_MILLISECOND );
-               else
-                       set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
+                       channel_scan_time_ms = pmlmeext->chan_scan_time * RTW_STAY_AP_CH_MILLISECOND ;
+               else            
+                       channel_scan_time_ms = pmlmeext->chan_scan_time;
 #else
-                       set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
+                       channel_scan_time_ms = pmlmeext->chan_scan_time;
 #endif
+
+               set_survey_timer(pmlmeext, channel_scan_time_ms);
+#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+               {
+                       struct noise_info info;
+                       info.bPauseDIG = _FALSE;
+                       info.IGIValue = 0;
+                       info.max_time = channel_scan_time_ms/2;//ms
+                       info.chan = survey_channel;
+                       rtw_hal_set_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&info, _FALSE);     
+               }
+#endif
+
        }
        else
        {
@@ -9607,12 +9774,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
@@ -9687,11 +9855,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)
                        {
@@ -10072,6 +10242,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);
@@ -10079,6 +10250,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);
@@ -10693,6 +10870,52 @@ void report_join_res(_adapter *padapter, int res)
 
 }
 
+void report_wmm_edca_update(_adapter *padapter)
+{
+       struct cmd_obj *pcmd_obj;
+       u8      *pevtcmd;
+       u32 cmdsz;
+       struct wmm_event                *pwmm_event;
+       struct C2HEvent_Header  *pc2h_evt_hdr;
+       struct mlme_ext_priv            *pmlmeext = &padapter->mlmeextpriv;
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
+
+       if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)
+       {
+               return;
+       }
+
+       cmdsz = (sizeof(struct wmm_event) + sizeof(struct C2HEvent_Header));
+       if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL)
+       {
+               rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj));
+               return;
+       }
+
+       _rtw_init_listhead(&pcmd_obj->list);
+
+       pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT);
+       pcmd_obj->cmdsz = cmdsz;
+       pcmd_obj->parmbuf = pevtcmd;
+
+       pcmd_obj->rsp = NULL;
+       pcmd_obj->rspsz  = 0;
+
+       pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd);
+       pc2h_evt_hdr->len = sizeof(struct wmm_event);
+       pc2h_evt_hdr->ID = GEN_EVT_CODE(_WMM);
+       pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq);
+
+       pwmm_event = (struct wmm_event*)(pevtcmd + sizeof(struct C2HEvent_Header));
+       pwmm_event->wmm =0;
+       
+       rtw_enqueue_cmd(pcmdpriv, pcmd_obj);
+
+       return;
+
+}
+
 void report_del_sta_event(_adapter *padapter, unsigned char* MacAddr, unsigned short reason)
 {
        struct cmd_obj *pcmd_obj;
@@ -10915,6 +11138,8 @@ void update_sta_info(_adapter *padapter, struct sta_info *psta)
 
                psta->htpriv.ampdu_enable = pmlmepriv->htpriv.ampdu_enable;
 
+               psta->htpriv.rx_ampdu_min_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para&IEEE80211_HT_CAP_AMPDU_DENSITY)>>2;
+
                if (support_short_GI(padapter, &(pmlmeinfo->HT_caps), CHANNEL_WIDTH_20))
                        psta->htpriv.sgi_20m = _TRUE;
 
@@ -10974,16 +11199,39 @@ static void rtw_mlmeext_disconnect(_adapter *padapter)
        struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
        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);
 
+#if 1
+       /*
+        * For safety, prevent from keeping macid sleep.
+        * If we can sure all power mode enter/leave are paired,
+        * this check can be removed.
+        * Lucas@20131113
+        */
+       /* wakeup macid after disconnect. */
+       {
+               struct sta_info *psta;
+               psta = rtw_get_stainfo(&padapter->stapriv, get_my_bssid(pnetwork));
+               if (psta)
+                       rtw_hal_macid_wakeup(padapter, psta->mac_id);
+       }
+#endif 
+
        rtw_hal_set_hwreg(padapter, HW_VAR_MLME_DISCONNECT, 0);
        rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, null_addr);
 
        //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)
@@ -11115,6 +11363,10 @@ void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res)
                set_sta_rate(padapter, psta);
                
                rtw_sta_media_status_rpt(padapter, psta, 1);
+
+               /* wakeup macid after join bss successfully to ensure 
+                       the subsequent data frames can be sent out normally */
+               rtw_hal_macid_wakeup(padapter, psta->mac_id);
        }
 
        if (rtw_port_switch_chk(padapter) == _TRUE)
@@ -11234,10 +11486,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){
 
@@ -11272,13 +11524,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);
@@ -11442,7 +11694,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;
@@ -11469,10 +11722,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.
@@ -11536,9 +11799,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);
                                }
                        }
 
@@ -11762,7 +12025,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;
@@ -12053,14 +12316,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);
 
@@ -12100,48 +12363,6 @@ u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf)
        //u32   acparm;
        u8 ch, bw, offset;
 
-#if 1
-       /*
-        * For safety, prevent from keeping macid sleep.
-        * If we can sure all power mode enter/leave are paired,
-        * this check can be removed.
-        * Lucas@20131113
-        */
-       {
-       struct sta_info *psta;
-       psta = rtw_get_stainfo(&padapter->stapriv, get_my_bssid(pnetwork));
-       if (psta)
-               rtw_hal_macid_wakeup(padapter, psta->mac_id);
-       }
-#endif
-
-#ifdef CONFIG_BT_COEXIST
-{
-       static u8 bw_mode = 0;
-
-       if (0 == bw_mode)
-       {
-               bw_mode = pregpriv->bw_mode; // keep original bw_mode
-               DBG_871X(FUNC_ADPT_FMT ": [BTCOEX] Save bw_mode(0x%02x)\n",
-                       FUNC_ADPT_ARG(padapter), pregpriv->bw_mode);
-       }
-
-       if ((rtw_btcoex_1Ant(padapter) == _TRUE)
-               && (rtw_btcoex_IsBtLinkExist(padapter) == _TRUE))
-       {
-               pregpriv->bw_mode = 0x00;
-               DBG_871X(FUNC_ADPT_FMT ": [BTCOEX] Change bw_mode to 20MHz(0x%02x)\n",
-                       FUNC_ADPT_ARG(padapter), pregpriv->bw_mode);
-       }
-       else
-       {
-               pregpriv->bw_mode = bw_mode;
-               DBG_871X(FUNC_ADPT_FMT ": [BTCOEX] Restore bw_mode(0x%02x)\n",
-                       FUNC_ADPT_ARG(padapter), pregpriv->bw_mode);
-       }
-}
-#endif // CONFIG_BT_COEXIST
-
        //check already connecting to AP or not
        if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)
        {
@@ -12357,22 +12578,6 @@ u8 disconnect_hdl(_adapter *padapter, unsigned char *pbuf)
        WLAN_BSSID_EX           *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));
        u8 val8;
 
-
-#if 1
-       /*
-        * For safety, prevent from keeping macid sleep.
-        * If we can sure all power mode enter/leave are paired,
-        * this check can be removed.
-        * Lucas@20131113
-        */
-       {
-       struct sta_info *psta;
-       psta = rtw_get_stainfo(&padapter->stapriv, get_my_bssid(pnetwork));
-       if (psta)
-               rtw_hal_macid_wakeup(padapter, psta->mac_id);
-       }
-#endif
-
        if (is_client_associated_to_ap(padapter))
        {
 #ifdef CONFIG_DFS
@@ -12622,10 +12827,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
@@ -12640,6 +12841,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_);
@@ -12674,7 +12879,6 @@ u8 setkey_hdl(_adapter *padapter, u8 *pbuf)
 {
        u16     ctrl = 0;
        s16 cam_id = 0;
-
        struct setkey_parm              *pparm = (struct setkey_parm *)pbuf;
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
@@ -12684,7 +12888,7 @@ u8 setkey_hdl(_adapter *padapter, u8 *pbuf)
        //main tx key for wep.
        if(pparm->set_tx)
                pmlmeinfo->key_index = pparm->keyid;
-       
+
        cam_id = rtw_camid_alloc(padapter, NULL, pparm->keyid);
 
        if (cam_id < 0){
@@ -12694,17 +12898,17 @@ u8 setkey_hdl(_adapter *padapter, u8 *pbuf)
                else
                        addr = null_addr;
                
-               ctrl = BIT(15) | BIT6 | ((pparm->algorithm) << 2) | pparm->keyid;
+               ctrl = BIT(15) | BIT6 |((pparm->algorithm) << 2) | pparm->keyid;
                write_cam(padapter, cam_id, ctrl, addr, pparm->key);
                DBG_871X_LEVEL(_drv_always_, "set group key camid:%d, addr:"MAC_FMT", kid:%d, type:%s\n"
                        ,cam_id, MAC_ARG(addr), pparm->keyid, security_type_str(pparm->algorithm));
        }
 
-#ifdef DYNAMIC_CAMID_ALLOC
+       #ifdef DYNAMIC_CAMID_ALLOC
        if (cam_id >=0 && cam_id <=3)
                rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_TRUE);
-#endif
-       
+       #endif
+
        //allow multicast packets to driver
        padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_ON_RCR_AM, null_addr);
 
@@ -12713,8 +12917,8 @@ u8 setkey_hdl(_adapter *padapter, u8 *pbuf)
 
 u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf)
 {
-       u16 ctrl=0;
-       s16 cam_id = 0;//cam_entry
+       u16 ctrl = 0;
+       s16 cam_id = 0;
        u8 ret = H2C_SUCCESS;
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
@@ -12755,8 +12959,7 @@ write_to_cam:
        }
        ret = H2C_SUCCESS_RSP;
 
-exit:  
-
+exit:
        return ret;
 }
 
@@ -12990,7 +13193,8 @@ u8 chk_bmc_sleepq_hdl(_adapter *padapter, unsigned char *pbuf)
 
                        pxmitframe->attrib.triggered=1;
 
-                       pxmitframe->attrib.qsel = 0x11;//HIQ
+                       if (xmitframe_hiq_filter(pxmitframe) == _TRUE)
+                               pxmitframe->attrib.qsel = QSLT_HIGH;//HIQ
 
                        #if 0
                        _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
@@ -13006,10 +13210,10 @@ u8 chk_bmc_sleepq_hdl(_adapter *padapter, unsigned char *pbuf)
                //_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
                _exit_critical_bh(&pxmitpriv->lock, &irqL);
 
-               //#if defined(CONFIG_PCI_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
-               #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
-               rtw_chk_hi_queue_cmd(padapter);
-               #endif
+               if (padapter->interface_type != RTW_PCIE) {
+                       /* check hi queue and bmc_sleepq */
+                       rtw_chk_hi_queue_cmd(padapter);
+               }
        }
 #endif
 
@@ -14190,23 +14394,27 @@ u8 set_ch_hdl(_adapter *padapter, u8 *pbuf)
 u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf)
 {
        struct SetChannelPlan_param *setChannelPlan_param;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+       struct mlme_priv *mlme = &padapter->mlmepriv;
+       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
 
        if(!pbuf)
                return H2C_PARAMETERS_ERROR;
 
        setChannelPlan_param = (struct SetChannelPlan_param *)pbuf;
 
+       if(!rtw_is_channel_plan_valid(setChannelPlan_param->channel_plan)) {
+               return H2C_PARAMETERS_ERROR;
+       }
+
+       mlme->ChannelPlan = setChannelPlan_param->channel_plan;
+
        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;
@@ -14472,3 +14680,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 484b520acd8fe7dd3e87d5fa442b42534545d654..772633e1111e7e4e8fcadf8c03f0a3d0eca49514 100644 (file)
@@ -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=300;
+       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
@@ -550,7 +546,7 @@ MPT_InitializeAdapter(
        
        PHY_LCCalibrate(pAdapter);
        PHY_IQCalibrate(pAdapter, _FALSE);
-       dm_CheckTXPowerTracking(&pHalData->odmpriv);    //trigger thermal meter
+       //dm_CheckTXPowerTracking(&pHalData->odmpriv);  //trigger thermal meter
        
        PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); //default use Main
        
@@ -568,9 +564,6 @@ MPT_InitializeAdapter(
        rtw_write16(pAdapter, 0x870, 0x300);
        rtw_write16(pAdapter, 0x860, 0x110);
 
-       if (pAdapter->registrypriv.mp_mode == 1)
-               pmlmepriv->fw_state = WIFI_MP_STATE;
-
        return  rtStatus;
 }
 
@@ -681,9 +674,9 @@ static void disable_dm(PADAPTER padapter)
 #endif
        Switch_DM_Func(padapter, DYNAMIC_RF_CALIBRATION, _TRUE);
 
-#ifdef CONFIG_BT_COEXIST
-       rtw_btcoex_Switch(padapter, 0);
-#endif
+//#ifdef CONFIG_BT_COEXIST
+//     rtw_btcoex_Switch(padapter, 0); //remove for BT MP Down.
+//#endif
 }
 
 
@@ -693,7 +686,6 @@ void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart)
        struct dm_priv  *pdmpriv = &pHalData->dmpriv;
        PDM_ODM_T               pDM_Odm = &pHalData->odmpriv;
 
-       //Switch_DM_Func(padapter, DYNAMIC_RF_CALIBRATION, bstart);
        if (bstart==1){
                DBG_871X("in MPT_PwrCtlDM start \n");           
                Switch_DM_Func(padapter, DYNAMIC_RF_TX_PWR_TRACK, _TRUE);
@@ -702,6 +694,9 @@ void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart)
                pdmpriv->TxPowerTrackControl = _TRUE;
                pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;
                padapter->mppriv.mp_dm =1;
+               odm_TXPowerTrackingInit(pDM_Odm);
+               ODM_ClearTxPowerTrackingState(pDM_Odm);
+               
        }else{
                DBG_871X("in MPT_PwrCtlDM stop \n");
                disable_dm(padapter);
@@ -709,6 +704,15 @@ void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart)
                pdmpriv->TxPowerTrackControl = _FALSE;
                pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE;
                padapter->mppriv.mp_dm = 0;
+               {
+                       TXPWRTRACK_CFG  c;
+                       u1Byte  chnl =0 ;
+               
+                       ConfigureTxpowerTrack(pDM_Odm, &c);
+                       ODM_ClearTxPowerTrackingState(pDM_Odm);
+                       (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, ODM_RF_PATH_A, chnl);
+                       (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, ODM_RF_PATH_B, chnl);
+               }
        }
                
 }
@@ -726,9 +730,7 @@ u32 mp_join(PADAPTER padapter,u8 mode)
        struct mp_priv *pmppriv = &padapter->mppriv;
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct wlan_network *tgt_network = &pmlmepriv->cur_network;
-       _adapter                                *pbuddyadapter = padapter->pbuddy_adapter;
-       struct mlme_priv *pbuddymlmepriv = &pbuddyadapter->mlmepriv;
-       
+
        // 1. initialize a new WLAN_BSSID_EX
        _rtw_memset(&bssid, 0, sizeof(WLAN_BSSID_EX));
        DBG_8192C("%s ,pmppriv->network_macaddr=%x %x %x %x %x %x \n",__func__,
@@ -759,21 +761,18 @@ u32 mp_join(PADAPTER padapter,u8 mode)
 
        _enter_critical_bh(&pmlmepriv->lock, &irqL);
 
-       //if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)
-       //              goto end_of_mp_start_test;
-#if 0
+       if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)
+               goto end_of_mp_start_test;
+
        //init mp_start_test status
        if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
-                       rtw_disassoc_cmd(padapter, 0, _TRUE);
+               rtw_disassoc_cmd(padapter, 500, _TRUE);
                rtw_indicate_disconnect(padapter);
                rtw_free_assoc_resources(padapter, 1);
        }
-       rtw_msleep_os(500);
-
        pmppriv->prev_fw_state = get_fwstate(pmlmepriv);
-       if (padapter->registrypriv.mp_mode == 1)
-               pmlmepriv->fw_state = WIFI_MP_STATE;
-
+       pmlmepriv->fw_state = WIFI_MP_STATE;
+#if 0
        if (pmppriv->mode == _LOOPBOOK_MODE_) {
                set_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); //append txdesc
                RT_TRACE(_module_mp_, _drv_notice_, ("+start mp in Lookback mode\n"));
@@ -781,11 +780,8 @@ u32 mp_join(PADAPTER padapter,u8 mode)
                RT_TRACE(_module_mp_, _drv_notice_, ("+start mp in normal mode\n"));
        }
 #endif
-
        set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
-       set_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
 
-       #if 1
        //3 2. create a new psta for mp driver
        //clear psta in the cur_network, if any
        psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress);
@@ -798,7 +794,7 @@ u32 mp_join(PADAPTER padapter,u8 mode)
                res = _FAIL;
                goto end_of_mp_start_test;
        }
-       #endif  
+       set_fwstate(pmlmepriv,WIFI_ADHOC_MASTER_STATE);
        //3 3. join psudo AdHoc
        tgt_network->join_res = 1;
        tgt_network->aid = psta->aid = 1;
@@ -806,31 +802,32 @@ u32 mp_join(PADAPTER padapter,u8 mode)
 
        rtw_indicate_connect(padapter);
        _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
+       set_fwstate(pmlmepriv,_FW_LINKED);
 
 end_of_mp_start_test:
 
        _exit_critical_bh(&pmlmepriv->lock, &irqL);
 
-               if(1) //(res == _SUCCESS)
+       if(1) //(res == _SUCCESS)
        {
                // set MSR to WIFI_FW_ADHOC_STATE
-                       if( mode==WIFI_FW_ADHOC_STATE ){
+               if( mode==WIFI_FW_ADHOC_STATE ){
 
-               val8 = rtw_read8(padapter, MSR) & 0xFC; // 0x0102
-               val8 |= WIFI_FW_ADHOC_STATE;
-               rtw_write8(padapter, MSR, val8); // Link in ad hoc network
-                       
-                       else {
-                               Set_MSR(padapter, WIFI_FW_STATION_STATE);
+                       val8 = rtw_read8(padapter, MSR) & 0xFC; // 0x0102
+                       val8 |= WIFI_FW_ADHOC_STATE;
+                       rtw_write8(padapter, MSR, val8); // Link in ad hoc network
+               } 
+               else {
+                       Set_MSR(padapter, WIFI_FW_STATION_STATE);
 
-                               DBG_8192C("%s , pmppriv->network_macaddr =%x %x %x %x %x %x\n",__func__,
-                                                               pmppriv->network_macaddr[0],pmppriv->network_macaddr[1],pmppriv->network_macaddr[2],pmppriv->network_macaddr[3],pmppriv->network_macaddr[4],pmppriv->network_macaddr[5]);
+                       DBG_8192C("%s , pmppriv->network_macaddr =%x %x %x %x %x %x\n",__func__,
+                                               pmppriv->network_macaddr[0],pmppriv->network_macaddr[1],pmppriv->network_macaddr[2],pmppriv->network_macaddr[3],pmppriv->network_macaddr[4],pmppriv->network_macaddr[5]);
 
-                               rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmppriv->network_macaddr);
-                       }
+                       rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmppriv->network_macaddr);
                }
-               pmlmepriv->fw_state = WIFI_MP_STATE;
-                       return res;
+       }
+
+       return res;
 }
 //This function initializes the DUT to the MP test mode
 s32 mp_start_test(PADAPTER padapter)
@@ -1268,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;
                        }
                }
@@ -1276,7 +1273,7 @@ static thread_return mp_xmit_packet_thread(thread_context context)
                _rtw_memcpy(&(pxmitframe->attrib), &(pmptx->attrib), sizeof(struct pkt_attrib));
 
                
-               rtw_udelay_os(padapter->mppriv.pktInterval);
+               rtw_usleep_os(padapter->mppriv.pktInterval);
                dump_mpframe(padapter, pxmitframe);
                
                pmptx->sended++;
@@ -1357,7 +1354,7 @@ void fill_tx_desc_8188e(PADAPTER padapter)
        u32     pkt_size = pattrib->last_txcmdsz;
        s32 bmcast = IS_MCAST(pattrib->ra);
 // offset 0
-#if !defined(CONFIG_RTL8188E_SDIO)
+#if !defined(CONFIG_RTL8188E_SDIO) && !defined(CONFIG_PCI_HCI)
        desc->txdw0 |= cpu_to_le32(OWN | FSG | LSG);
        desc->txdw0 |= cpu_to_le32(pkt_size & 0x0000FFFF); // packet size
        desc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00FF0000); //32 bytes for TX Desc
@@ -1468,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);
@@ -1483,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);
        }
@@ -1507,48 +1512,47 @@ 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);
-       PTXDESC_8723B ptxdesc = (PTXDESC_8723B)&(pmp_priv->tx.desc);
-       u8 descRate;
-       
-       ptxdesc->bk = 1;
-       ptxdesc->macid = pattrib->mac_id;
-       ptxdesc->qsel = pattrib->qsel;
+       u8 *ptxdesc = pmp_priv->tx.desc;
 
-       ptxdesc->rate_id = pattrib->raid;
-       ptxdesc->seq = pattrib->seqnum;
-       ptxdesc->en_hwseq = 1;
-       ptxdesc->userate = 1;
-       ptxdesc->disdatafb = 1;
+       SET_TX_DESC_AGG_BREAK_8723B(ptxdesc, 1);
+       SET_TX_DESC_MACID_8723B(ptxdesc, pattrib->mac_id);
+       SET_TX_DESC_QUEUE_SEL_8723B(ptxdesc, pattrib->qsel);
 
-       if( pmp_priv->preamble ){
-               if (pmp_priv->rateidx <=  MPT_RATE_54M)
-                       ptxdesc->data_short = 1;
-       }
-       if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)
-               ptxdesc->data_bw = 1;
+       SET_TX_DESC_RATE_ID_8723B(ptxdesc, pattrib->raid);
+       SET_TX_DESC_SEQ_8723B(ptxdesc, pattrib->seqnum);
+       SET_TX_DESC_HWSEQ_EN_8723B(ptxdesc, 1);
+       SET_TX_DESC_USE_RATE_8723B(ptxdesc, 1);
+       SET_TX_DESC_DISABLE_FB_8723B(ptxdesc, 1);
+
+       if (pmp_priv->preamble)
+               if (pmp_priv->rateidx <=  MPT_RATE_54M) {
+                       SET_TX_DESC_DATA_SHORT_8723B(ptxdesc, 1);
+               }
 
-       ptxdesc->datarate = pmp_priv->rateidx;
+       if (pmp_priv->bandwidth == CHANNEL_WIDTH_40) {
+               SET_TX_DESC_DATA_BW_8723B(ptxdesc, 1);
+       }
 
-       ptxdesc->data_ratefb_lmt = 0x1F;
-       ptxdesc->rts_ratefb_lmt = 0xF;
+       SET_TX_DESC_TX_RATE_8723B(ptxdesc, pmp_priv->rateidx);
 
+       SET_TX_DESC_DATA_RATE_FB_LIMIT_8723B(ptxdesc, 0x1F);
+       SET_TX_DESC_RTS_RATE_FB_LIMIT_8723B(ptxdesc, 0xF);
 }
 #endif
 
 static void Rtw_MPSetMacTxEDCA(PADAPTER padapter)
 {
 
-       rtw_write32(padapter, 0x508 , 0x00a43f); //Disable EDCA BE Txop for MP pkt tx adjust Packet interval
+       rtw_write32(padapter, 0x508 , 0x00a422); //Disable EDCA BE Txop for MP pkt tx adjust Packet interval
        //DBG_871X("%s:write 0x508~~~~~~ 0x%x\n", __func__,rtw_read32(padapter, 0x508));
        PHY_SetMacReg(padapter, 0x458 ,bMaskDWord , 0x0);
        //DBG_8192C("%s()!!!!! 0x460 = 0x%x\n" ,__func__,PHY_QueryBBReg(padapter, 0x460, bMaskDWord));
        PHY_SetMacReg(padapter, 0x460 ,bMaskLWord , 0x0);//fast EDCA queue packet interval & time out vaule
-       PHY_SetMacReg(padapter, ODM_EDCA_VO_PARAM ,bMaskLWord , 0x431C);
-       PHY_SetMacReg(padapter, ODM_EDCA_BE_PARAM ,bMaskLWord , 0x431C);
-       PHY_SetMacReg(padapter, ODM_EDCA_BK_PARAM ,bMaskLWord , 0x431C);
+       //PHY_SetMacReg(padapter, ODM_EDCA_VO_PARAM ,bMaskLWord , 0x431C);
+       //PHY_SetMacReg(padapter, ODM_EDCA_BE_PARAM ,bMaskLWord , 0x431C);
+       //PHY_SetMacReg(padapter, ODM_EDCA_BK_PARAM ,bMaskLWord , 0x431C);
        DBG_8192C("%s()!!!!! 0x460 = 0x%x\n" ,__func__,PHY_QueryBBReg(padapter, 0x460, bMaskDWord));
 
 }
@@ -1665,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");
@@ -1694,7 +1700,8 @@ void SetPacketTx(PADAPTER padapter)
 #endif
 
        Rtw_MPSetMacTxEDCA(padapter);
-
+exit:
+       return;
 }
 
 void SetPacketRx(PADAPTER pAdapter, u8 bStartRx)
@@ -1795,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;
        
@@ -1881,7 +1888,7 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data)
 }
 
 
-
+#if 0
 void _rtw_mp_xmit_priv (struct xmit_priv *pxmitpriv)
 {
           int i,res;
@@ -1948,7 +1955,7 @@ void _rtw_mp_xmit_priv (struct xmit_priv *pxmitpriv)
                pxmitbuf->padapter = padapter;
                pxmitbuf->buf_tag = XMITBUF_MGNT;
 
-               if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,max_xmit_extbuf_size + XMITBUF_ALIGN_SZ, _FALSE)) == _FAIL) {
+               if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,max_xmit_extbuf_size + XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
                        res= _FAIL;
                        goto exit;
                }
@@ -1973,7 +1980,7 @@ void _rtw_mp_xmit_priv (struct xmit_priv *pxmitpriv)
 exit:
        ;
 }
-
+#endif
 
 
 ULONG getPowerDiffByRate8188E(
@@ -2195,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];  
        }
@@ -2240,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;
        }
@@ -2272,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(
@@ -2442,8 +2516,5 @@ void Hal_ProSetCrystalCap (PADAPTER pAdapter , u32 CrystalCap)
                PHY_SetBBReg(pAdapter, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6)));   
        }
 }
-
-
-
 #endif
 
index b2c5a28aeb1ca9b5a5dc56046536377d1a5c38c9..2b4c94fbc18f803596bad92de26f9a9e39b12f60 100644 (file)
@@ -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 75beea8a2178570fc09ad133aa8144e8fcfddc9f..05063bfdf990fb70f860265c637999f28ec7ce8b 100644 (file)
@@ -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",
@@ -132,7 +132,7 @@ void rtw_odm_dbg_level_msg(void *sel, _adapter *adapter)
        int i;
 
        rtw_hal_get_def_var(adapter, HW_DEF_ODM_DBG_LEVEL, &dbg_level);
-       DBG_871X_SEL_NL(sel, "odm.DebugDebugLevel = %u\n", dbg_level);
+       DBG_871X_SEL_NL(sel, "odm.DebugLevel = %u\n", dbg_level);
        for (i=0;i<RTW_ODM_DBG_LEVEL_NUM;i++) {
                if (odm_dbg_level_str[i])
                        DBG_871X_SEL_NL(sel, "%u %s\n", i, odm_dbg_level_str[i]);
@@ -166,11 +166,102 @@ 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
+
+void rtw_odm_adaptivity_en_msg(void *sel, _adapter *adapter)
+{
+       struct registry_priv *regsty = &adapter->registrypriv;
+       struct mlme_priv *mlme = &adapter->mlmepriv;
+       HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
+       DM_ODM_T *odm = &hal_data->odmpriv;
+
+       DBG_871X_SEL_NL(sel, "RTW_ADAPTIVITY_EN_");
+
+       if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_DISABLE) {
+               DBG_871X_SEL(sel, "DISABLE\n");
+       } else if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_ENABLE) {
+               DBG_871X_SEL(sel, "ENABLE\n");
+       } else if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_AUTO) {
+               DBG_871X_SEL(sel, "AUTO, chplan:0x%02x, Regulation:%u,%u\n"
+                       , mlme->ChannelPlan, odm->odm_Regulation2_4G, odm->odm_Regulation5G);
+       } else {
+               DBG_871X_SEL(sel, "INVALID\n");
+       }
+}
+
+#define RTW_ADAPTIVITY_MODE_NORMAL 0
+#define RTW_ADAPTIVITY_MODE_CARRIER_SENSE 1
+
+void rtw_odm_adaptivity_mode_msg(void *sel, _adapter *adapter)
+{
+       struct registry_priv *regsty = &adapter->registrypriv;
+
+       DBG_871X_SEL_NL(sel, "RTW_ADAPTIVITY_MODE_");
+
+       if (regsty->adaptivity_mode == RTW_ADAPTIVITY_MODE_NORMAL) {
+               DBG_871X_SEL(sel, "NORMAL\n");
+       } else if (regsty->adaptivity_mode == RTW_ADAPTIVITY_MODE_CARRIER_SENSE) {
+               DBG_871X_SEL(sel, "CARRIER_SENSE\n");
+       } else {
+               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;
+       struct mlme_priv *mlme = &adapter->mlmepriv;
+       bool ret = _FALSE;
+
+       if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_ENABLE
+               || regsty->adaptivity_en == RTW_ADAPTIVITY_EN_AUTO)
+               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;
+}
+
 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");
        DBG_871X_SEL_NL(sel, "0x%-8x %-16d 0x%-6x %-10d %-11u %-14u\n"
@@ -181,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,
@@ -204,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 f1bed6f86fc71a833c5c0bb00d92831bf4747124..5f2f99c0a2cd1e01424a4329ac301582cecd59b5 100644 (file)
@@ -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,6 +3626,9 @@ _func_enter_;
        pcfg80211_wdinfo->is_ro_ch = _FALSE;
        pcfg80211_wdinfo->last_ro_ch_time = rtw_get_current_time();
 
+       if (pcfg80211_wdinfo->not_indic_ro_ch_exp == _TRUE)
+               return;
+
        DBG_871X("cfg80211_remain_on_channel_expired, ch=%d, bw=%d, offset=%d\n", 
                rtw_get_oper_ch(padapter), rtw_get_oper_bw(padapter), rtw_get_oper_choffset(padapter));
 
@@ -5277,10 +5294,6 @@ int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role)
                        adapter_wdev_data(padapter)->p2p_enabled = _FALSE;
 #endif //CONFIG_IOCTL_CFG80211
 
-               if (_FAIL == rtw_pwr_wakeup(padapter)) {
-                       ret = _FAIL;
-                       goto exit;
-               }
 
                //Disable P2P function
                if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
@@ -5299,6 +5312,10 @@ int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role)
                        rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_NONE);
                        rtw_p2p_set_role(pwdinfo, P2P_ROLE_DISABLE);
                        _rtw_memset(&pwdinfo->rx_prov_disc_info, 0x00, sizeof(struct rx_provdisc_req_info));
+
+                       /* Remove profiles in wifidirect_info structure. */
+                       _rtw_memset( &pwdinfo->profileinfo[ 0 ], 0x00, sizeof( struct profile_info ) * P2P_MAX_PERSISTENT_GROUP_NUM );
+                       pwdinfo->profileindex = 0;
                }
 
                rtw_hal_set_odm_var(padapter,HAL_ODM_P2P_STATE,NULL,_FALSE);
@@ -5306,6 +5323,11 @@ int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role)
                rtw_hal_set_odm_var(padapter,HAL_ODM_WIFI_DISPLAY_STATE,NULL,_FALSE);
                #endif
 
+               if (_FAIL == rtw_pwr_wakeup(padapter)) {
+                       ret = _FAIL;
+                       goto exit;
+               }
+
                //Restore to initial setting.
                update_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode);
 
index 7ca5f4357a4b234eee5b74945fa649a132168629..0a16ad5c2e3b576846d589561f43630936cb938b 100644 (file)
@@ -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,10 +2310,15 @@ _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;
        pwrctrlpriv->pscan_info = NULL;
        pwrctrlpriv->pno_ssid_list = NULL;
+       pwrctrlpriv->pno_in_resume = _TRUE;
 #endif
 
 _func_exit_;
@@ -2232,6 +2388,7 @@ void rtw_resume_in_workqueue(struct pwrctrl_priv *pwrpriv)
 {
        // accquire system's suspend lock preventing from falliing asleep while resume in workqueue
        //rtw_lock_suspend();
+
        rtw_resume_lock_suspend();
        
        #if 1
index 186a50e0028d81cdc55fea21c4d7ff051cac2f6e..a5e4e2d4a333cdf625c19570a23a2352163d5d6f 100644 (file)
@@ -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);
 
@@ -606,8 +610,11 @@ union recv_frame * decryptor(_adapter *padapter,union recv_frame *precv_frame)
        struct security_priv *psecuritypriv=&padapter->securitypriv;
        union recv_frame *return_packet=precv_frame;
        u32      res=_SUCCESS;
+
 _func_enter_;
 
+       DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt);
+
        RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("prxstat->decrypted=%x prxattrib->encrypt = 0x%03x\n",prxattrib->bdecrypted,prxattrib->encrypt));
 
        if(prxattrib->encrypt>0)
@@ -653,16 +660,20 @@ _func_enter_;
                switch(prxattrib->encrypt){
                case _WEP40_:
                case _WEP104_:
+                       DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_wep);
                        rtw_wep_decrypt(padapter, (u8 *)precv_frame);
                        break;
                case _TKIP_:
+                       DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_tkip);
                        res = rtw_tkip_decrypt(padapter, (u8 *)precv_frame);
                        break;
                case _AES_:
+                       DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_aes);
                        res = rtw_aes_decrypt(padapter, (u8 * )precv_frame);
                        break;
 #ifdef CONFIG_WAPI_SUPPORT
                case _SMS4_:
+                       DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_wapi);
                        rtw_sms4_decrypt(padapter, (u8 * )precv_frame);
                        break;
 #endif
@@ -690,6 +701,8 @@ _func_enter_;
                else
 #endif
                {
+                       DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_hw);
+
                        psecuritypriv->hw_decrypted=_TRUE;
                        #ifdef DBG_RX_DECRYPTOR
                        DBG_871X("[%s] %d:prxstat->bdecrypted:%d,  prxattrib->encrypt:%d,  Setting psecuritypriv->hw_decrypted = %d\n",
@@ -700,10 +713,10 @@ _func_enter_;
                                psecuritypriv->hw_decrypted);
 
                        #endif
-
                }
        }
        else {
+               DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_unknown);
                #ifdef DBG_RX_DECRYPTOR
                DBG_871X("[%s] %d:prxstat->bdecrypted:%d,  prxattrib->encrypt:%d,  Setting psecuritypriv->hw_decrypted = %d\n",
                        __FUNCTION__,
@@ -1488,9 +1501,20 @@ _func_enter_;
                        *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get sta_info
                        if (*psta == NULL)
                        {
-                               DBG_871X("issue_deauth to the ap=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->bssid));
        
-                               issue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
+                               //for AP multicast issue , modify by yiwei 
+                               static u32 send_issue_deauth_time=0;
+                       
+                               //DBG_871X("After send deauth , %u ms has elapsed.\n", rtw_get_passing_time_ms(send_issue_deauth_time));
+                               
+                               if(rtw_get_passing_time_ms(send_issue_deauth_time) > 10000 || send_issue_deauth_time == 0 )
+                               {
+                                       send_issue_deauth_time = rtw_get_current_time(); 
+                                       
+                                       DBG_871X("issue_deauth to the ap=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->bssid));
+                                       
+                                       issue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
+                               }
                        }
                }       
        
@@ -1560,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)) {
@@ -1725,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
                                        {
@@ -2066,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);
@@ -2083,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);
@@ -2110,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
@@ -2133,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;
                        }
                }
@@ -2148,6 +2203,17 @@ validate_80211w_fail:
 }
 #endif //CONFIG_IEEE80211W
 
+static inline void dump_rx_packet(u8 *ptr)
+{
+       int i;
+
+       DBG_871X("############################# \n");
+       for(i=0; i<64;i=i+8)
+               DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i),
+               *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));
+       DBG_871X("############################# \n");
+}
+
 sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame);
 sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame)
 {
@@ -2180,7 +2246,6 @@ sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame)
 
 _func_enter_;
 
-
 #ifdef CONFIG_FIND_BEST_CHANNEL
        if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) {
                int ch_set_idx = rtw_ch_set_search_ch(pmlmeext->channel_set, rtw_get_oper_ch(adapter));
@@ -2214,6 +2279,7 @@ _func_enter_;
        if(ver!=0){
                RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail! (ver!=0)\n"));
                retval= _FAIL;
+               DBG_COUNTER(adapter->rx_logs.core_rx_pre_ver_err);
                goto exit;
        }
 
@@ -2238,46 +2304,23 @@ _func_enter_;
 {
        u8 bDumpRxPkt;
        rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt));
-       if(bDumpRxPkt ==1){//dump all rx packets
-               int i;
-               DBG_871X("############################# \n");
-               
-               for(i=0; i<64;i=i+8)
-                       DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i),
-                       *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));
-               DBG_871X("############################# \n");
-       }
-       else if(bDumpRxPkt ==2){
-               if(type== WIFI_MGT_TYPE){
-                       int i;
-                       DBG_871X("############################# \n");
-
-                       for(i=0; i<64;i=i+8)
-                               DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i),
-                               *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));
-                       DBG_871X("############################# \n");
-               }
-       }
-       else if(bDumpRxPkt ==3){
-               if(type== WIFI_DATA_TYPE){
-                       int i;
-                       DBG_871X("############################# \n");
-                       
-                       for(i=0; i<64;i=i+8)
-                               DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i),
-                               *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));
-                       DBG_871X("############################# \n");
-               }
-       }
+       if (bDumpRxPkt == 1) //dump all rx packets
+               dump_rx_packet(ptr);
+       else if ((bDumpRxPkt == 2) && (type == WIFI_MGT_TYPE))
+               dump_rx_packet(ptr);
+       else if ((bDumpRxPkt == 3) && (type == WIFI_DATA_TYPE))
+               dump_rx_packet(ptr);
 }
 #endif
        switch (type)
        {
                case WIFI_MGT_TYPE: //mgnt
+                       DBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt);
 #ifdef CONFIG_IEEE80211W
                        if(validate_80211w_mgmt(adapter, precv_frame) == _FAIL)
                        {
                                retval = _FAIL;
+                               DBG_COUNTER(padapter->rx_logs.core_rx_pre_mgmt_err_80211w);
                                break;
                        }
 #endif //CONFIG_IEEE80211W
@@ -2286,18 +2329,22 @@ _func_enter_;
                        if (retval == _FAIL)
                        {
                                RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_mgnt_frame fail\n"));
+                               DBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt_err);
                        }
                        retval = _FAIL; // only data frame return _SUCCESS
                        break;
                case WIFI_CTRL_TYPE: //ctrl
+                       DBG_COUNTER(adapter->rx_logs.core_rx_pre_ctrl);
                        retval = validate_recv_ctrl_frame(adapter, precv_frame);
                        if (retval == _FAIL)
                        {
                                RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_ctrl_frame fail\n"));
+                               DBG_COUNTER(adapter->rx_logs.core_rx_pre_ctrl_err);
                        }
                        retval = _FAIL; // only data frame return _SUCCESS
                        break;
                case WIFI_DATA_TYPE: //data
+                       DBG_COUNTER(adapter->rx_logs.core_rx_pre_data);
 #ifdef CONFIG_WAPI_SUPPORT
                        if(pattrib->qos)
                                external_len = 2;
@@ -2316,6 +2363,7 @@ _func_enter_;
                                else
                                {
                                        retval = _FAIL;
+                                       DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_wapi_seq_err);
                                        break;
                                }
                        }
@@ -2324,6 +2372,7 @@ _func_enter_;
                                        if(rtw_wapi_drop_for_key_absent(adapter,GetAddr2Ptr(ptr))){
                                                retval=_FAIL;
                                                WAPI_TRACE(WAPI_RX,"drop for key absent for rx \n");
+                                               DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_wapi_key_err);
                                                break;
                                        }
                        }
@@ -2337,9 +2386,30 @@ _func_enter_;
                                struct recv_priv *precvpriv = &adapter->recvpriv;
                                //RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail\n"));
                                precvpriv->rx_drop++;
+                               DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_err);
+                       }
+                       else if (retval == _SUCCESS)
+                       {
+#ifdef DBG_RX_DUMP_EAP
+                               u8 bDumpRxPkt;
+                               u16 eth_type;
+
+                               // dump eapol
+                               rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt));
+                               // get ether_type
+                               _rtw_memcpy(&eth_type, ptr + pattrib->hdrlen + pattrib->iv_len + LLC_HEADER_SIZE, 2);
+                               eth_type = ntohs((unsigned short) eth_type);
+                               if ((bDumpRxPkt == 4) && (eth_type == 0x888e))
+                                       dump_rx_packet(ptr);
+#endif
+                       }
+                       else
+                       {
+                               DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_handled);
                        }
                        break;
                default:
+                       DBG_COUNTER(adapter->rx_logs.core_rx_pre_unknown);
                        RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail! type=0x%x\n", type));
                        #ifdef DBG_RX_DROP_FRAME
                        DBG_871X("DBG_RX_DROP_FRAME validate_recv_data_frame fail! type=0x%x\n", type);
@@ -2451,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;
 
@@ -3103,10 +3184,11 @@ int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, union rec
 
 void recv_indicatepkts_pkt_loss_cnt(struct debug_priv *pdbgpriv, u64 prev_seq, u64 current_seq);
 void recv_indicatepkts_pkt_loss_cnt(struct debug_priv *pdbgpriv, u64 prev_seq, u64 current_seq)
-{\r
+{
        if(current_seq < prev_seq)
        {
-               pdbgpriv->dbg_rx_ampdu_loss_count+= (4096 + current_seq - prev_seq);\r\r
+               pdbgpriv->dbg_rx_ampdu_loss_count+= (4096 + current_seq - prev_seq);
+
        }
        else
        {
@@ -3128,6 +3210,8 @@ int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *pre
        struct dvobj_priv *psdpriv = padapter->dvobj;
        struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
 
+       DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_in_oder);
+
        //DbgPrint("+recv_indicatepkts_in_order\n");
 
        //_enter_critical_ex(&ppending_recvframe_queue->lock, &irql);
@@ -3299,10 +3383,20 @@ int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe)
        struct dvobj_priv *psdpriv = padapter->dvobj;
        struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
 
+       DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_reoder);
+
        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))
@@ -3504,6 +3598,8 @@ int process_recv_indicatepkts(_adapter *padapter, union recv_frame *prframe)
 #ifdef CONFIG_80211N_HT
 
        struct ht_priv  *phtpriv = &pmlmepriv->htpriv;
+       
+       DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate);
 
 #ifdef CONFIG_TDLS
        if( (phtpriv->ht_option==_TRUE) ||
@@ -3601,19 +3697,98 @@ 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;
        struct rx_pkt_attrib *pattrib = &rframe->u.hdr.attrib;
        struct recv_priv *precvpriv = &padapter->recvpriv;
        _queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
-       
 #ifdef CONFIG_MP_INCLUDED
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+       struct mp_priv *pmppriv = &padapter->mppriv;
+#endif //CONFIG_MP_INCLUDED
+       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++;
@@ -3625,15 +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) {
+                                       //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;
 
-                       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;
+                       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
@@ -3656,12 +3941,11 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
        struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
        struct recv_priv *precvpriv = &padapter->recvpriv;
        _queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
-       
-
 #ifdef CONFIG_TDLS
        u8 *psnap_type, *pcategory;
 #endif //CONFIG_TDLS
 
+       DBG_COUNTER(padapter->rx_logs.core_rx_post);
 
        // DATA FRAME
        rtw_led_control(padapter, LED_CTL_RX);
@@ -3673,6 +3957,7 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
                DBG_871X("DBG_RX_DROP_FRAME %s decryptor: drop pkt\n", __FUNCTION__);
                #endif
                ret = _FAIL;
+               DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_err);
                goto _recv_data_drop;
        }
 
@@ -3712,6 +3997,7 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
                #ifdef DBG_RX_DROP_FRAME
                DBG_871X("DBG_RX_DROP_FRAME %s recvframe_chk_defrag: drop pkt\n", __FUNCTION__);
                #endif
+               DBG_COUNTER(padapter->rx_logs.core_rx_post_defrag_err);
                goto _recv_data_drop;           
        }
 
@@ -3722,6 +4008,7 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
                DBG_871X("DBG_RX_DROP_FRAME %s portctrl: drop pkt\n", __FUNCTION__);
                #endif
                ret = _FAIL;
+               DBG_COUNTER(padapter->rx_logs.core_rx_post_portctrl_err);
                goto _recv_data_drop;
        }
 
@@ -3740,6 +4027,7 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
                DBG_871X("DBG_RX_DROP_FRAME %s process_recv_indicatepkts fail!\n", __FUNCTION__);
                #endif
                rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame
+               DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_err);
                goto _recv_data_drop;
        }
 #else // CONFIG_80211N_HT
@@ -3830,6 +4118,7 @@ int recv_func(_adapter *padapter, union recv_frame *rframe)
 
                while((pending_frame=rtw_alloc_recvframe(&padapter->recvpriv.uc_swdec_pending_queue))) {
                        cnt++;
+                       DBG_COUNTER(padapter->rx_logs.core_rx_dequeue);
                        recv_func_posthandle(padapter, pending_frame);
                }
 
@@ -3838,6 +4127,7 @@ int recv_func(_adapter *padapter, union recv_frame *rframe)
                                FUNC_ADPT_ARG(padapter), cnt);
        }
 
+       DBG_COUNTER(padapter->rx_logs.core_rx);
        ret = recv_func_prehandle(padapter, rframe);
 
        if(ret == _SUCCESS) {
@@ -3849,6 +4139,7 @@ int recv_func(_adapter *padapter, union recv_frame *rframe)
                        psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPAPSK &&
                        !psecuritypriv->busetkipkey)
                {
+                       DBG_COUNTER(padapter->rx_logs.core_rx_enqueue);
                        rtw_enqueue_recvframe(rframe, &padapter->recvpriv.uc_swdec_pending_queue);
                        //DBG_871X("%s: no key, enqueue uc_swdec_pending_queue\n", __func__);
 
index 9605a984557f3ed9e670f1ae77adff53930b7344..9841568494ecf248916e632c668c841a517f57d6 100644 (file)
@@ -307,9 +307,9 @@ _func_enter_;
 
                        }
                        
-               }
-               
-               WEP_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);                                 
+               }               
+
+               WEP_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);
        }
        
 _func_exit_;                                           
@@ -360,7 +360,6 @@ _func_enter_;
                }
 
                WEP_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);
-
        }
        
 _func_exit_;           
@@ -1764,7 +1763,7 @@ _func_enter_;
 
                                }
                        }
-                       
+
                        AES_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);
                }
 /*
@@ -1773,7 +1772,7 @@ _func_enter_;
                        DBG_871X("%s, psta==NUL\n", __func__);
                        res=_FAIL;
                }
-*/                                             
+*/
        }
 
 
@@ -2089,7 +2088,7 @@ _func_enter_;
                                static u32 start = 0;
                                static u32 no_gkey_bc_cnt = 0;
                                static u32 no_gkey_mc_cnt = 0;
-               
+
                                //DBG_871X("rx bc/mc packets, to perform sw rtw_aes_decrypt\n");
                                //prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey;
                                if(psecuritypriv->binstallGrpkey==_FALSE)
@@ -2166,7 +2165,6 @@ _func_enter_;
                        res= aes_decipher(prwskey,prxattrib->hdrlen,pframe, length);
 
                        AES_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);
-
                }
                else{
                        RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_decrypt: stainfo==NULL!!!\n"));
index 62a8adf7239d1e7665148a1a10d9892cccdcec16..c7066f8fb9eb34d9493d0af611b8f29053661fc5 100644 (file)
@@ -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
@@ -331,10 +329,10 @@ void sreset_reset(_adapter *padapter)
 \r
        psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;\r
 \r
-       \r
-#ifdef CONFIG_POWER_SAVING\r
+\r
+#ifdef CONFIG_LPS\r
        rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "SRESET");\r
-#endif\r
+#endif//#ifdef CONFIG_LPS\r
        \r
        _enter_pwrlock(&pwrpriv->lock);\r
 \r
index f03f727d9ee6e8e59e1ac9d19013e98d67302577..f17b2a2dc475e6e22e3ef859f71f741537f14bfe 100644 (file)
@@ -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 59c41adc2054254eed4aa1b9ce6415f37e2aa560..21f9fcc8342b9269398afb27a9b260f65308fea0 100644 (file)
@@ -22,8 +22,6 @@
 #include <drv_types.h>\r
 \r
 #ifdef CONFIG_TDLS\r
-extern unsigned char MCS_rate_2R[16];\r
-extern unsigned char MCS_rate_1R[16];\r
 extern void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame);\r
 \r
 void rtw_reset_tdls_info(_adapter* padapter)\r
index 1d752711e4f770caf7abb97f969e6bef482146bd..ce971d5a5ed335b0fc23c8f61bfb4b38cf7c860e 100644 (file)
@@ -281,8 +281,9 @@ void        update_sta_vht_info_apmode(_adapter *padapter, PVOID sta)
        }
 
        bw_mode = GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(&pvhtpriv_sta->vht_op_mode_notify);
-       if (bw_mode > psta->bw_mode)
-               psta->bw_mode = bw_mode;
+       
+       //if (bw_mode > psta->bw_mode)
+       psta->bw_mode = bw_mode;
 
        // B4 Rx LDPC
        if (TEST_FLAG(pvhtpriv_ap->ldpc_cap, LDPC_VHT_ENABLE_TX) && 
index 009f01cf46fa3c8dc6ec59fc4d82d3f64b4d8fdd..1047712d9f62a50dd0885162cbb7f6f1539a94f9 100644 (file)
@@ -41,11 +41,6 @@ unsigned char TPLINK_745N_OUI[] = {0x00, 0x0a, 0xeb};
 
 unsigned char REALTEK_96B_IE[] = {0x00, 0xe0, 0x4c, 0x02, 0x01, 0x20};
 
-extern unsigned char   MCS_rate_2R[16];
-#ifdef CONFIG_DISABLE_MCS13TO15
-extern unsigned char   MCS_rate_2R_MCS13TO15_OFF[16];
-#endif //CONFIG_DISABLE_MCS13TO15
-extern unsigned char   MCS_rate_1R[16];
 extern unsigned char RTW_WPA_OUI[];
 extern unsigned char WPA_TKIP_CIPHER[4];
 extern unsigned char RSN_TKIP_CIPHER[4];
@@ -55,6 +50,7 @@ extern unsigned char RSN_TKIP_CIPHER[4];
 //#define WAIT_FOR_BCN_TO_MIN  (3000)
 #define WAIT_FOR_BCN_TO_MIN    (6000)
 #define WAIT_FOR_BCN_TO_MAX    (20000)
+
 #define DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS 1000
 #define DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD 3
 
@@ -75,6 +71,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)
 {
@@ -396,6 +393,19 @@ void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len)
        _rtw_memcpy(pbssrate, supportedrates, *bssrate_len);
 }
 
+void set_mcs_rate_by_mask(u8 *mcs_set, u32 mask)
+{
+       u8 mcs_rate_1r = (u8)(mask&0xff);
+       u8 mcs_rate_2r = (u8)((mask>>8)&0xff);
+       u8 mcs_rate_3r = (u8)((mask>>16)&0xff);
+       u8 mcs_rate_4r = (u8)((mask>>24)&0xff);
+
+       mcs_set[0] &= mcs_rate_1r;
+       mcs_set[1] &= mcs_rate_2r;
+       mcs_set[2] &= mcs_rate_3r;
+       mcs_set[3] &= mcs_rate_4r;
+}
+
 void UpdateBrateTbl(
        IN PADAPTER             Adapter,
        IN u8                   *mBratesOS
@@ -892,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)
@@ -968,9 +1004,11 @@ void write_cam_cache(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key)
        _irqL irqL;
 
        _enter_critical_bh(&cam_ctl->lock, &irqL);
+
        dvobj->cam_cache[id].ctrl = ctrl;
        _rtw_memcpy(dvobj->cam_cache[id].mac, mac, ETH_ALEN);
        _rtw_memcpy(dvobj->cam_cache[id].key, key, 16);
+
        _exit_critical_bh(&cam_ctl->lock, &irqL);
 }
 
@@ -1041,7 +1079,7 @@ bool _rtw_camid_is_gk(_adapter *adapter, u8 cam_id)
 
        if (!(cam_ctl->bitmap & BIT(cam_id)))
                goto exit;
-
+       
        ret = (dvobj->cam_cache[cam_id].ctrl&BIT6)?_TRUE:_FALSE;
 
 exit:
@@ -1066,7 +1104,6 @@ s16 _rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid)
 {
        struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
        struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
-       _irqL irqL;
        int i;
        s16 cam_id = -1;
 
@@ -1145,15 +1182,11 @@ s16 rtw_camid_alloc(_adapter *adapter, struct sta_info *sta, u8 kid)
                        }
 
                        if ((i = _rtw_camid_search(adapter, addr, kid)) >= 0) {
-                               /* 
-                                * Fix issue that pairwise and group key have same key id. Pairwise key first,
-                                * group key can overwirte group only(ex: rekey) 
-                                */
+                               /* Fix issue that pairwise and group key have same key id. Pairwise key first, group key can overwirte group only(ex: rekey) */
                                if (sta || _rtw_camid_is_gk(adapter, i) == _TRUE)
                                        cam_id = i;
                                else
-                                       DBG_871X_LEVEL(_drv_always_,
-                                               FUNC_ADPT_FMT" group key id:%u the same key id as pairwise key\n"
+                                       DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" group key id:%u the same key id as pairwise key\n"
                                                , FUNC_ADPT_ARG(adapter), kid);
                                goto bitmap_handle;
                        }
@@ -1224,58 +1257,58 @@ int allocate_fw_sta_entry(_adapter *padapter)
 
 void flush_all_cam_entry(_adapter *padapter)
 {
-       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
+       struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
        struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
 
 #ifdef CONFIG_CONCURRENT_MODE
-               if(check_buddy_fwstate(padapter, _FW_LINKED) == _TRUE)
+       if(check_buddy_fwstate(padapter, _FW_LINKED) == _TRUE)
+       {
+               if(check_fwstate(pmlmepriv, WIFI_STATION_STATE))
                {
-                       if(check_fwstate(pmlmepriv, WIFI_STATION_STATE))
-                       {
-                               struct sta_priv *pstapriv = &padapter->stapriv;
-                               struct sta_info *psta;
-       
-                               psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress);
-                               if(psta) {
-                                       if(psta->state & WIFI_AP_STATE)
-                                       {}       //clear cam when ap free per sta_info            
-                                       else {
-                                               rtw_clearstakey_cmd(padapter, psta, _FALSE);
-                                       }
+                       struct sta_priv *pstapriv = &padapter->stapriv;
+                       struct sta_info *psta;
+
+                       psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress);
+                       if(psta) {
+                               if(psta->state & WIFI_AP_STATE)
+                               {}   //clear cam when ap free per sta_info        
+                               else {
+                                       rtw_clearstakey_cmd(padapter, psta, _FALSE);
                                }
                        }
-                       else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
-                       {
-                               /* clear default key */
-                               int i, cam_id;
-                               u8 null_addr[ETH_ALEN]= {0,0,0,0,0,0};
-       
-                               for (i=0;i<4;i++) {
-                                       cam_id = rtw_camid_search(padapter, null_addr, i);
-                                       if (cam_id >= 0) {
-                                               clear_cam_entry(padapter, cam_id);
-                                               rtw_camid_free(padapter, cam_id);
-                                       }
+               }
+               else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
+               {
+                       /* clear default key */
+                       int i, cam_id;
+                       u8 null_addr[ETH_ALEN]= {0,0,0,0,0,0};
+
+                       for (i=0;i<4;i++) {
+                               cam_id = rtw_camid_search(padapter, null_addr, i);
+                               if (cam_id >= 0) {
+                                       clear_cam_entry(padapter, cam_id);
+                                       rtw_camid_free(padapter, cam_id);
                                }
-       
-                               /* clear default key related key search setting */
+                       }
+
+                       /* clear default key related key search setting */
                        #ifdef DYNAMIC_CAMID_ALLOC
-                               rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_FALSE);
+                       rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_FALSE);
                        #endif
-       
-                               /* leave pairwise key when ap free per sta_info */
-                       }
+
+                       /* leave pairwise key when ap free per sta_info */
                }
-               else
+       }
+       else
 #endif //CONFIG_CONCURRENT_MODE
-               {
-                       invalidate_cam_all(padapter);
-                       /* clear default key related key search setting */
+       {
+               invalidate_cam_all(padapter);
+               /* clear default key related key search setting */
                #ifdef DYNAMIC_CAMID_ALLOC
-                       rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_FALSE);
+               rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_FALSE);
                #endif
-               }
+       }
 
        _rtw_memset((u8 *)(pmlmeinfo->FW_sta_info), 0, sizeof(pmlmeinfo->FW_sta_info));
        
@@ -1327,11 +1360,18 @@ int WMM_param_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs     pIE)
        if(pmlmepriv->qospriv.qos_option==0)
        {
                pmlmeinfo->WMM_enable = 0;
-               return _FAIL;
+               return _FALSE;
        }       
-
+       
+       if(_rtw_memcmp(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element)))
+       {
+               return _FALSE;
+       }
+       else
+       {
+               _rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element));
+       }
        pmlmeinfo->WMM_enable = 1;
-       _rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element));
        return _TRUE;
 
        /*if (pregpriv->wifi_spec == 1)
@@ -1644,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);
@@ -1653,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);
@@ -1675,34 +1718,33 @@ void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
 
        rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
 
-       //update the MCS rates
+
+       //update the MCS set
        for (i = 0; i < 16; i++)
+               pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= pmlmeext->default_supported_mcs_set[i];
+                       
+       //update the MCS rates
+       switch(rf_type)
        {
-               if((rf_type == RF_1T1R) || (rf_type == RF_1T2R))
-               {
-                       pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
-               }
-               else
-               {
-                       #ifdef CONFIG_DISABLE_MCS13TO15
-                       if(pmlmeext->cur_bwmode == CHANNEL_WIDTH_40 && (pregistrypriv->wifi_spec!=1))
-                               pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R_MCS13TO15_OFF[i];
+               case RF_1T1R:
+               case RF_1T2R:
+                       set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_1R);                                                        
+                       break;
+               case RF_2T2R:           
+               default:
+#ifdef CONFIG_DISABLE_MCS13TO15
+                       if(pmlmeext->cur_bwmode == CHANNEL_WIDTH_40 && pregistrypriv->wifi_spec != 1 )                          
+                               set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R_13TO15_OFF);                             
                        else
-                       pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
-                       #else
-                       pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
-                       #endif //CONFIG_DISABLE_MCS13TO15
-               }
-               #ifdef RTL8192C_RECONFIG_TO_1T1R
-               {
-                       pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
-               }
-               #endif
+                               set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R);
+#else //CONFIG_DISABLE_MCS13TO15
+                       set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R);
+#endif //CONFIG_DISABLE_MCS13TO15
        }
 
        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");
@@ -1729,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");
@@ -1737,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");
@@ -1765,7 +1807,6 @@ void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
        }
 
 #endif //CONFIG_80211N_HT
-       return;
 }
 
 void HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
@@ -1984,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;
@@ -2005,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;
@@ -2023,16 +2178,86 @@ 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__);
                return _TRUE;
        }
 
-       if ((pmlmepriv->timeBcnInfoChkStart != 0) &&
-               (rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart) >
-               DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS)) {
-
+       if ((pmlmepriv->timeBcnInfoChkStart != 0) && (rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart) > DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS))
+       {
                pmlmepriv->timeBcnInfoChkStart = 0;
                pmlmepriv->NumOfBcnInfoChkFail = 0;
        }
@@ -2068,9 +2293,9 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
        if (ht_cap_info != cur_network->BcnInfo.ht_cap_info ||
                ((ht_info_infos_0&0x03) != (cur_network->BcnInfo.ht_info_infos_0&0x03))) {
                        DBG_871X("%s bcn now: ht_cap_info:%x ht_info_infos_0:%x\n", __func__,
-                                                       ht_cap_info, ht_info_infos_0);
+                                                       ht_cap_info, ht_info_infos_0);
                        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);
+                                                       cur_network->BcnInfo.ht_cap_info, cur_network->BcnInfo.ht_info_infos_0);
                        DBG_871X("%s bw mode change\n", __func__);
                        {       
                                //bcn_info_update
@@ -2184,12 +2409,9 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
                RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,
                                ("%s cur_network->group_cipher is %d: %d\n",__func__, cur_network->BcnInfo.group_cipher, group_cipher));
                if (pairwise_cipher != cur_network->BcnInfo.pairwise_cipher || group_cipher != cur_network->BcnInfo.group_cipher) {
-                       DBG_871X("%s pairwise_cipher(%x:%x) or group_cipher(%x:%x) is not match\n",
-                                       __func__,
-                                       pairwise_cipher,
-                                       cur_network->BcnInfo.pairwise_cipher,
-                                       group_cipher,
-                                       cur_network->BcnInfo.group_cipher);
+                       DBG_871X("%s pairwise_cipher(%x:%x) or group_cipher(%x:%x) is not match\n",__func__,
+                                       pairwise_cipher, cur_network->BcnInfo.pairwise_cipher,
+                                       group_cipher, cur_network->BcnInfo.group_cipher);
                        goto _mismatch;
                }
 
@@ -2206,29 +2428,25 @@ _mismatch:
        rtw_mfree((u8 *)bssid, sizeof(WLAN_BSSID_EX));
 
        if (pmlmepriv->NumOfBcnInfoChkFail == 0)
+       {
                pmlmepriv->timeBcnInfoChkStart = rtw_get_current_time();
+       }
 
        pmlmepriv->NumOfBcnInfoChkFail++;
+       DBG_871X("%s by "ADPT_FMT" - NumOfChkFail = %d (SeqNum of this Beacon frame = %d).\n", __func__, ADPT_ARG(Adapter), pmlmepriv->NumOfBcnInfoChkFail, GetSequence(pframe));
 
-       DBG_871X("%s by "ADPT_FMT" - NumOfChkFail = %d (SeqNum of this Beacon frame = %d).\n",
-                       __func__, ADPT_ARG(Adapter),
-                       pmlmepriv->NumOfBcnInfoChkFail, GetSequence(pframe));
-       if ((pmlmepriv->timeBcnInfoChkStart != 0) &&
-               (rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart)
-                <= DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS) &&
-               (pmlmepriv->NumOfBcnInfoChkFail >=
-               DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD)) {
-               DBG_871X("%s by "ADPT_FMT" - NumOfChkFail = %d >= threshold : %d(in %d ms), return FAIL.\n",
-                               __func__,
-                               ADPT_ARG(Adapter),
-                               pmlmepriv->NumOfBcnInfoChkFail,
-                               DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD,
-                               rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart));
+       if ((pmlmepriv->timeBcnInfoChkStart != 0) && (rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart) <= DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS) 
+               && (pmlmepriv->NumOfBcnInfoChkFail >= DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD))
+       {
+               DBG_871X("%s by "ADPT_FMT" - NumOfChkFail = %d >= threshold : %d (in %d ms), return FAIL.\n", __func__, ADPT_ARG(Adapter), pmlmepriv->NumOfBcnInfoChkFail, 
+                       DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD, rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart));
                pmlmepriv->timeBcnInfoChkStart = 0;
                pmlmepriv->NumOfBcnInfoChkFail = 0;
                return _FAIL;
        }
+
        return _SUCCESS;
+#endif
 }
 
 void update_beacon_info(_adapter *padapter, u8 *pframe, uint pkt_len, struct sta_info *psta)
@@ -2250,15 +2468,14 @@ void update_beacon_info(_adapter *padapter, u8 *pframe, uint pkt_len, struct sta
                
                switch (pIE->ElementID)
                {
-#if 0                  
                        case _VENDOR_SPECIFIC_IE_:              
-                               //todo: to update WMM paramter set while receiving beacon                       
-                               if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6))    //WMM
+                               //to update WMM paramter set while receiving beacon
+                               if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6) && pIE->Length == WLAN_WMM_LEN)     //WMM
                                {
-                                       (WMM_param_handler(padapter, pIE))? WMMOnAssocRsp(padapter): 0;
-                               }                               
+                                       (WMM_param_handler(padapter, pIE))? report_wmm_edca_update(padapter): 0;
+                               }
+
                                break;
-#endif
 
                        case _HT_EXTRA_INFO_IE_:        //HT info                               
                                //HT_info_handler(padapter, pIE);
@@ -3134,8 +3351,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];
@@ -3143,13 +3360,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
@@ -3171,99 +3388,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)
 {
@@ -3479,157 +3875,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.
- *
- * Output:
- * NONE
- *
- * Auther: Isaac.Li
- */
-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)
@@ -3836,9 +4082,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]
@@ -3888,6 +4138,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;
 }
@@ -3954,9 +4205,12 @@ int rtw_dev_pno_set(struct net_device *net, pno_ssid_t* ssid, int num,
                pwrctl->pscan_info == NULL ||
                pwrctl->pno_ssid_list == NULL){
                DBG_871X("%s, ERROR: alloc nlo_info, ssid_list, scan_info fail\n", __func__);
-               return -1;
+               goto failing;
        }
 
+       pwrctl->pno_in_resume = _FALSE;
+
+       pwrctl->pno_inited = _TRUE;
        /* NLO Info */
        ret = rtw_dev_nlo_info_set(pwrctl->pnlo_info, ssid, num,
                        pno_time, pno_repeat, pno_freq_expo_max);
@@ -3972,6 +4226,22 @@ int rtw_dev_pno_set(struct net_device *net, pno_ssid_t* ssid, int num,
                 __func__, num, pno_time, pno_repeat, pno_freq_expo_max);
 
        return 0;
+
+failing:
+       if (pwrctl->pnlo_info) {
+               rtw_mfree((u8 *)pwrctl->pnlo_info, sizeof(pno_nlo_info_t));
+               pwrctl->pnlo_info = NULL;
+       }
+       if (pwrctl->pno_ssid_list) {
+               rtw_mfree((u8 *)pwrctl->pno_ssid_list, sizeof(pno_ssid_list_t));
+               pwrctl->pno_ssid_list = NULL;
+       }
+       if (pwrctl->pscan_info) {
+               rtw_mfree((u8 *)pwrctl->pscan_info, sizeof(pno_scan_info_t));
+               pwrctl->pscan_info = NULL;
+       }
+
+       return -1;
 }
 
 #ifdef CONFIG_PNO_SET_DEBUG
old mode 100644 (file)
new mode 100755 (executable)
index 6dc6217..5811139
@@ -68,9 +68,7 @@ s32   _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter)
        struct xmit_buf *pxmitbuf;
        struct xmit_frame *pxframe;
        sint    res=_SUCCESS;   
-       u32 max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;
-       u32 num_xmit_extbuf = NR_XMIT_EXTBUFF;
-
+       
 _func_enter_;          
 
        // We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc().
@@ -201,7 +199,7 @@ _func_enter_;
        /* init xframe_ext queue,  the same count as extbuf  */
        _rtw_init_queue(&pxmitpriv->free_xframe_ext_queue);
        
-       pxmitpriv->xframe_ext_alloc_addr = rtw_zvmalloc(num_xmit_extbuf * sizeof(struct xmit_frame) + 4);
+       pxmitpriv->xframe_ext_alloc_addr = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4);
        
        if (pxmitpriv->xframe_ext_alloc_addr  == NULL){
                pxmitpriv->xframe_ext = NULL;
@@ -212,7 +210,7 @@ _func_enter_;
        pxmitpriv->xframe_ext = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->xframe_ext_alloc_addr), 4);
        pxframe = (struct xmit_frame*)pxmitpriv->xframe_ext;
 
-       for (i = 0; i < num_xmit_extbuf; i++) {
+       for (i = 0; i < NR_XMIT_EXTBUFF; i++) {
                _rtw_init_listhead(&(pxframe->list));
 
                pxframe->padapter = padapter;
@@ -229,12 +227,12 @@ _func_enter_;
 
                pxframe++;
        }
-       pxmitpriv->free_xframe_ext_cnt = num_xmit_extbuf;
+       pxmitpriv->free_xframe_ext_cnt = NR_XMIT_EXTBUFF;
 
        // Init xmit extension buff
        _rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue);
 
-       pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(num_xmit_extbuf * sizeof(struct xmit_buf) + 4);
+       pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4);
        
        if (pxmitpriv->pallocated_xmit_extbuf  == NULL){
                RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_extbuf fail!\n"));
@@ -246,7 +244,7 @@ _func_enter_;
 
        pxmitbuf = (struct xmit_buf*)pxmitpriv->pxmit_extbuf;
 
-       for (i = 0; i < num_xmit_extbuf; i++)
+       for (i = 0; i < NR_XMIT_EXTBUFF; i++)
        {
                _rtw_init_listhead(&pxmitbuf->list);
 
@@ -254,14 +252,14 @@ _func_enter_;
                pxmitbuf->padapter = padapter;
                pxmitbuf->buf_tag = XMITBUF_MGNT;
 
-               if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,max_xmit_extbuf_size + XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
+               if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
                        res= _FAIL;
                        goto exit;
                }
                
 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
                pxmitbuf->phead = pxmitbuf->pbuf;
-               pxmitbuf->pend = pxmitbuf->pbuf + max_xmit_extbuf_size;
+               pxmitbuf->pend = pxmitbuf->pbuf + MAX_XMIT_EXTBUF_SZ;
                pxmitbuf->len = 0;
                pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
 #endif
@@ -274,29 +272,30 @@ _func_enter_;
                
        }
 
-       pxmitpriv->free_xmit_extbuf_cnt = num_xmit_extbuf;
+       pxmitpriv->free_xmit_extbuf_cnt = NR_XMIT_EXTBUFF;
 
+       for (i = 0; i<CMDBUF_MAX; i++) {
+               pxmitbuf = &pxmitpriv->pcmd_xmitbuf[i];
+               if (pxmitbuf) {
+                       _rtw_init_listhead(&pxmitbuf->list);
 
-       pxmitbuf = &pxmitpriv->pcmd_xmitbuf;
-       if (pxmitbuf) {
-               _rtw_init_listhead(&pxmitbuf->list);
-
-               pxmitbuf->priv_data = NULL;
-               pxmitbuf->padapter = padapter;
-               pxmitbuf->buf_tag = XMITBUF_CMD;
+                       pxmitbuf->priv_data = NULL;
+                       pxmitbuf->padapter = padapter;
+                       pxmitbuf->buf_tag = XMITBUF_CMD;
 
-               if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
-                       res= _FAIL;
-                       goto exit;
-               }
+                       if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
+                               res= _FAIL;
+                               goto exit;
+                       }
 
 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
-               pxmitbuf->phead = pxmitbuf->pbuf;
-               pxmitbuf->pend = pxmitbuf->pbuf + MAX_CMDBUF_SZ;
-               pxmitbuf->len = 0;
-               pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
+                       pxmitbuf->phead = pxmitbuf->pbuf;
+                       pxmitbuf->pend = pxmitbuf->pbuf + MAX_CMDBUF_SZ;
+                       pxmitbuf->len = 0;
+                       pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
 #endif
-               pxmitbuf->alloc_sz = MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ;
+                       pxmitbuf->alloc_sz = MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ;
+               }
        }
 
        rtw_alloc_hwxmits(padapter);
@@ -363,15 +362,7 @@ void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv)
       _adapter *padapter = pxmitpriv->adapter;
        struct xmit_frame       *pxmitframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf;
        struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;
-       u32 max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;
-       u32 num_xmit_extbuf = NR_XMIT_EXTBUFF;
-#if defined(CONFIG_MP_INCLUDED) && (defined(CONFIG_RTL8723A) ||defined(CONFIG_RTL8723B))
-       if (padapter->registrypriv.mp_mode) {
-               max_xmit_extbuf_size = 20000;
-               num_xmit_extbuf = 1;
-       }
-#endif
-
+       
  _func_enter_;   
 
        rtw_hal_free_xmit_priv(padapter);
@@ -406,33 +397,35 @@ void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv)
 
        /* free xframe_ext queue,  the same count as extbuf  */
        if ((pxmitframe = (struct xmit_frame*)pxmitpriv->xframe_ext)) {
-               for (i=0; i<num_xmit_extbuf; i++) {
+               for (i=0; i<NR_XMIT_EXTBUFF; i++) {
                        rtw_os_xmit_complete(padapter, pxmitframe);
                        pxmitframe++;
                }
        }
        if (pxmitpriv->xframe_ext_alloc_addr)
-               rtw_vmfree(pxmitpriv->xframe_ext_alloc_addr, num_xmit_extbuf * sizeof(struct xmit_frame) + 4);
+               rtw_vmfree(pxmitpriv->xframe_ext_alloc_addr, NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4);
        _rtw_spinlock_free(&pxmitpriv->free_xframe_ext_queue.lock);
 
        // free xmit extension buff
        _rtw_spinlock_free(&pxmitpriv->free_xmit_extbuf_queue.lock);
 
        pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;
-       for(i=0; i<num_xmit_extbuf; i++)
+       for(i=0; i<NR_XMIT_EXTBUFF; i++)
        {
-               rtw_os_xmit_resource_free(padapter, pxmitbuf,(max_xmit_extbuf_size + XMITBUF_ALIGN_SZ), _TRUE);
+               rtw_os_xmit_resource_free(padapter, pxmitbuf,(MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE);
                
                pxmitbuf++;
        }
 
        if(pxmitpriv->pallocated_xmit_extbuf) {
-               rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, num_xmit_extbuf * sizeof(struct xmit_buf) + 4);
+               rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4);
        }
 
-       pxmitbuf = &pxmitpriv->pcmd_xmitbuf;
-       if(pxmitbuf!=NULL)
-               rtw_os_xmit_resource_free(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ , _TRUE);
+       for (i=0; i<CMDBUF_MAX; i++) {
+               pxmitbuf = &pxmitpriv->pcmd_xmitbuf[i];
+               if(pxmitbuf!=NULL)
+                       rtw_os_xmit_resource_free(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ , _TRUE);
+       }
 
        rtw_free_hwxmits(padapter);
 
@@ -455,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;
@@ -612,18 +604,28 @@ static void update_attrib_vcs_info(_adapter *padapter, struct xmit_frame *pxmitf
                        break;
                }
        }
+
+       //for debug : force driver control vrtl_carrier_sense.
+       if(padapter->driver_vcs_en==1)
+       {
+               //u8 driver_vcs_en; //Enable=1, Disable=0 driver control vrtl_carrier_sense.
+               //u8 driver_vcs_type;//force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1.
+               pattrib->vcs_mode = padapter->driver_vcs_type;
+       }       
+       
 }
 
 static void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta)
 {
        struct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv;
-       
+
        pattrib->rtsen = psta->rtsen;
        pattrib->cts2self = psta->cts2self;
        
        pattrib->mdata = 0;
        pattrib->eosp = 0;
        pattrib->triggered=0;
+       pattrib->ampdu_spacing = 0;
        
        //qos_en, ht_en, init rate, ,bw, ch_offset, sgi
        pattrib->qos_en = psta->qos_option;
@@ -644,6 +646,11 @@ static void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattri
        pattrib->ht_en = psta->htpriv.ht_option;
        pattrib->ch_offset = psta->htpriv.ch_offset;
        pattrib->ampdu_en = _FALSE;
+
+       if(padapter->driver_ampdu_spacing != 0xFF) //driver control AMPDU Density for peer sta's rx
+               pattrib->ampdu_spacing = padapter->driver_ampdu_spacing;
+       else
+               pattrib->ampdu_spacing = psta->htpriv.rx_ampdu_min_spacing;
 #endif //CONFIG_80211N_HT
        //if(pattrib->ht_en && psta->htpriv.ampdu_enable)
        //{
@@ -956,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;
@@ -966,12 +985,15 @@ 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_;
 
+       DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib);
+
        _rtw_open_pktfile(pkt, &pktfile);
        i = _rtw_pktfile_read(&pktfile, (u8*)&etherhdr, ETH_HLEN);
 
@@ -985,16 +1007,21 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
        if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||
                (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
                _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
-               _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
+               _rtw_memcpy(pattrib->ta, myid(&padapter->eeprompriv), ETH_ALEN);
+               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_adhoc);
        }
        else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
                _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
-               _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
+               _rtw_memcpy(pattrib->ta, myid(&padapter->eeprompriv), ETH_ALEN);
+               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_sta);
        }
        else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
                _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
                _rtw_memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN);
-       }
+               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_ap);
+       } 
+       else
+               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_unknown);
 
 #ifdef CONFIG_TDLS
        rtw_check_tdls_established(padapter, pattrib);
@@ -1029,6 +1056,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
                                        //      pTcb->DataRate = Adapter->MgntInfo.LowestBasicRate; 
                                        //RTPRINT(FDM, WA_IOT, ("DHCP TranslateHeader(), pTcb->DataRate = 0x%x\n", pTcb->DataRate)); 
                                        pattrib->dhcp_pkt = 1;
+                                       DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_dhcp);
                                }
                        }
                }
@@ -1039,7 +1067,10 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
 
                        pattrib->icmp_pkt = 0;  
                        if(piphdr->protocol == 0x1) // protocol type in ip header 0x1 is ICMP                   
+                       {
                                pattrib->icmp_pkt = 1;
+                               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_icmp);
+                       }
                }       
 
                
@@ -1069,6 +1100,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
 #endif 
 #endif
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_active);
                rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SPECIAL_PACKET, 1);
        }
 #endif //CONFIG_LPS
@@ -1080,7 +1112,8 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
                psta = rtw_get_bcmc_stainfo(padapter);
        } else {
                psta = rtw_get_stainfo(pstapriv, pattrib->ra);
-               if (psta == NULL)       { // if we cannot get psta => drrp the pkt
+               if (psta == NULL)       { // if we cannot get psta => drop the pkt
+                       DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_sta);
                        RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT"\n", MAC_ARG(pattrib->ra)));
                        #ifdef DBG_TX_DROP_FRAME
                        DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra));
@@ -1090,6 +1123,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
                }
                else if((check_fwstate(pmlmepriv, WIFI_AP_STATE)==_TRUE)&&(!(psta->state & _FW_LINKED)))
                {
+                       DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_ap_link);
                        res =_FAIL;
                        goto exit;
                }
@@ -1097,6 +1131,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
 
        if(psta == NULL)
        {               // if we cannot get psta => drop the pkt
+               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sta);
                RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT "\n", MAC_ARG(pattrib->ra)));
                #ifdef DBG_TX_DROP_FRAME
                DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra));
@@ -1107,6 +1142,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
 
        if(!(psta->state &_FW_LINKED))
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_link);
                DBG_871X("%s, psta("MAC_FMT")->state(0x%x) != _FW_LINKED\n", __func__, MAC_ARG(psta->hwaddr), psta->state);
                return _FAIL;
        }
@@ -1116,6 +1152,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
        //TODO:_lock
        if(update_attrib_sec_info(padapter, pattrib, psta) == _FAIL)
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sec);
                res = _FAIL;
                goto exit;
        }
@@ -1156,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:
@@ -1409,8 +1446,6 @@ _func_enter_;
        if (pattrib->subtype & WIFI_DATA_TYPE)
        {
                if ((check_fwstate(pmlmepriv,  WIFI_STATION_STATE) == _TRUE)) {
-                       //to_ds = 1, fr_ds = 0;
-
 #ifdef CONFIG_TDLS
                        if(pattrib->direct_link == _TRUE){
                                //TDLS data transfer, ToDS=0, FrDs=0
@@ -1421,11 +1456,12 @@ _func_enter_;
                        else
 #endif //CONFIG_TDLS
                        {
+                               //to_ds = 1, fr_ds = 0;
                                // 1.Data transfer to AP
                                // 2.Arp pkt will relayed by AP
                                SetToDs(fctrl);                                                 
                                _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
-                               _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
+                               _rtw_memcpy(pwlanhdr->addr2, pattrib->ta, ETH_ALEN);
                                _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
                        } 
 
@@ -1446,7 +1482,7 @@ _func_enter_;
                else if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||
                (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
                        _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
-                       _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
+                       _rtw_memcpy(pwlanhdr->addr2, pattrib->ta, ETH_ALEN);
                        _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
 
                        if(pattrib->qos_en)
@@ -2218,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)
@@ -2530,13 +2566,14 @@ void rtw_count_tx_stats(PADAPTER padapter, struct xmit_frame *pxmitframe, int sz
        }
 }
 
-struct xmit_buf *rtw_alloc_cmd_xmitbuf(struct xmit_priv *pxmitpriv)
+static struct xmit_buf *__rtw_alloc_cmd_xmitbuf(struct xmit_priv *pxmitpriv,
+               enum cmdbuf_type buf_type)
 {
        struct xmit_buf *pxmitbuf =  NULL;
 
 _func_enter_;
 
-       pxmitbuf = &pxmitpriv->pcmd_xmitbuf;
+       pxmitbuf = &pxmitpriv->pcmd_xmitbuf[buf_type];
        if (pxmitbuf !=  NULL) {
                pxmitbuf->priv_data = NULL;
 
@@ -2548,6 +2585,7 @@ _func_enter_;
 #endif
 #ifdef CONFIG_PCI_HCI
                pxmitbuf->len = 0;
+               pxmitbuf->desc = NULL;
 #endif
 
                if (pxmitbuf->sctx) {
@@ -2565,27 +2603,8 @@ _func_exit_;
        return pxmitbuf;
 }
 
-s32    rtw_free_cmd_xmitbuf(struct xmit_priv *pxmitpriv)
-{
-       struct xmit_buf *pxmitbuf =  NULL;
-
-_func_enter_;
-
-       pxmitbuf = &pxmitpriv->pcmd_xmitbuf;
-       if (pxmitbuf==NULL) {
-               DBG_871X("%s fail, no xmitbuf available !!!\n", __func__);
-               return _FAIL;
-       } else {
-               rtw_os_xmit_resource_free(pxmitbuf->padapter, pxmitbuf, pxmitbuf->alloc_sz, _FALSE);
-               pxmitbuf->pallocated_buf = NULL;
-       }
-
-_func_exit_;
-
-       return _SUCCESS;
-}
-
-struct xmit_frame *rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv)
+struct xmit_frame *__rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv,
+               enum cmdbuf_type buf_type)
 {
        struct xmit_frame               *pcmdframe;
        struct xmit_buf         *pxmitbuf;
@@ -2596,7 +2615,7 @@ struct xmit_frame *rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv)
                return NULL;
        }
 
-       if ((pxmitbuf = rtw_alloc_cmd_xmitbuf(pxmitpriv)) == NULL) {
+       if ((pxmitbuf = __rtw_alloc_cmd_xmitbuf(pxmitpriv, buf_type)) == NULL) {
                DBG_871X("%s, alloc xmitbuf fail\n", __FUNCTION__);
                rtw_free_xmitframe(pxmitpriv, pcmdframe);
                return NULL;
@@ -2655,6 +2674,7 @@ _func_enter_;
 #endif
 #ifdef CONFIG_PCI_HCI
                pxmitbuf->len = 0;
+               pxmitbuf->desc = NULL;
 #endif
 
                if (pxmitbuf->sctx) {
@@ -2744,6 +2764,7 @@ _func_enter_;
 #endif
 #ifdef CONFIG_PCI_HCI
                pxmitbuf->len = 0;
+               pxmitbuf->desc = NULL;
 #endif
 
                if (pxmitbuf->sctx) {
@@ -2992,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);
 
@@ -3051,6 +3072,7 @@ _func_exit_;
 
 s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe)
 {
+       DBG_COUNTER(padapter->tx_logs.core_tx_enqueue);
        if (rtw_xmit_classifier(padapter, pxmitframe) == _FAIL)
        {
                RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,
@@ -3098,7 +3120,7 @@ static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv, str
 
                break;          
 
-               pxmitframe = NULL;
+               //pxmitframe = NULL;
 
        }
 
@@ -3317,6 +3339,8 @@ s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe)
 
 _func_enter_;
 
+       DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class);
+
 /*
        if (pattrib->psta) {
                psta = pattrib->psta;           
@@ -3329,11 +3353,13 @@ _func_enter_;
        psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
        if(pattrib->psta != psta)
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_sta);
                DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
                return _FAIL;
        }
 
        if (psta == NULL) {
+               DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_nosta);
                res = _FAIL;
                DBG_8192C("rtw_xmit_classifier: psta == NULL\n");
                RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("rtw_xmit_classifier: psta == NULL\n"));
@@ -3342,6 +3368,7 @@ _func_enter_;
 
        if(!(psta->state &_FW_LINKED))
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_fwlink);
                DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
                return _FAIL;
        }
@@ -3727,6 +3754,8 @@ s32 rtw_xmit(_adapter *padapter, _pkt **ppkt)
 
        s32 res;
 
+       DBG_COUNTER(padapter->tx_logs.core_tx);
+
        if (start == 0)
                start = rtw_get_current_time();
 
@@ -3742,6 +3771,7 @@ s32 rtw_xmit(_adapter *padapter, _pkt **ppkt)
        if (pxmitframe == NULL) {
                drop_cnt ++;
                RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: no more pxmitframe\n"));
+               DBG_COUNTER(padapter->tx_logs.core_tx_err_pxmitframe);
                return -1;
        }
 
@@ -3761,6 +3791,7 @@ s32 rtw_xmit(_adapter *padapter, _pkt **ppkt)
                if (res == -1)
                {
                        rtw_free_xmitframe(pxmitpriv, pxmitframe);
+                       DBG_COUNTER(padapter->tx_logs.core_tx_err_brtx);
                        return -1;
                }
        }       
@@ -3798,11 +3829,13 @@ s32 rtw_xmit(_adapter *padapter, _pkt **ppkt)
        if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe) == _TRUE)
        {
                _exit_critical_bh(&pxmitpriv->lock, &irqL0);
+               DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue);
                return 1;               
        }
        _exit_critical_bh(&pxmitpriv->lock, &irqL0);
 #endif
 
+       //pre_xmitframe
        if (rtw_hal_xmit(padapter, pxmitframe) == _FALSE)
                return 1;
 
@@ -3884,6 +3917,47 @@ sint xmitframe_enqueue_for_tdls_sleeping_sta(_adapter *padapter, struct xmit_fra
 }
 #endif //CONFIG_TDLS
 
+#define RTW_HIQ_FILTER_ALLOW_ALL 0
+#define RTW_HIQ_FILTER_ALLOW_SPECIAL 1
+#define RTW_HIQ_FILTER_DENY_ALL 2
+
+inline bool xmitframe_hiq_filter(struct xmit_frame *xmitframe)
+{
+       bool allow = _FALSE;
+       _adapter *adapter = xmitframe->padapter;
+       struct registry_priv *registry = &adapter->registrypriv;
+
+if (adapter->interface_type != RTW_PCIE) {
+
+       if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_SPECIAL) {
+       
+               struct pkt_attrib *attrib = &xmitframe->attrib;
+
+               if (attrib->ether_type == 0x0806
+                       || attrib->ether_type == 0x888e
+                       #ifdef CONFIG_WAPI_SUPPORT
+                       || attrib->ether_type == 0x88B4
+                       #endif
+                       || attrib->dhcp_pkt
+               ) {
+                       if (0)
+                       DBG_871X(FUNC_ADPT_FMT" ether_type:0x%04x%s\n", FUNC_ADPT_ARG(xmitframe->padapter)
+                               , attrib->ether_type, attrib->dhcp_pkt?" DHCP":"");
+                       allow = _TRUE;
+               }
+       }
+       else if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_ALL) {
+               allow = _TRUE;
+       }
+       else if (registry->hiq_filter == RTW_HIQ_FILTER_DENY_ALL) {
+       }
+       else {
+               rtw_warn_on(1);
+       }
+}
+       return allow;
+}
+
 #if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)
 
 sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe)
@@ -3905,7 +3979,10 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
 #endif //CONFIG_TDLS
 
        if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _FALSE)
+       {
+               DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_fwstate);
            return ret;
+       }
 /*
        if(pattrib->psta)
        {
@@ -3920,31 +3997,33 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
        psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
        if(pattrib->psta != psta)
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_sta);
                DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
                return _FALSE;
        }
 
        if(psta==NULL)
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_nosta);
                DBG_871X("%s, psta==NUL\n", __func__);
                return _FALSE;
        }
 
        if(!(psta->state &_FW_LINKED))
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_link);
                DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
                return _FALSE;
        }
 
        if(pattrib->triggered==1)
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_trigger);
                //DBG_871X("directly xmit pspoll_triggered packet\n");
 
                //pattrib->triggered=0;
-
-               if(bmcst)
-                       pattrib->qsel = 0x11;//HIQ
-               
+               if (bmcst && xmitframe_hiq_filter(pxmitframe) == _TRUE)
+                       pattrib->qsel = QSLT_HIGH;//HIQ
 
                return ret;
        }
@@ -3956,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);
                        
@@ -3975,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);
                        }
@@ -3983,6 +4065,8 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
                        //_exit_critical_bh(&psta->sleep_q.lock, &irqL);                                
                        
                        ret = _TRUE;                    
+
+                       DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_mcast);
                        
                }
                
@@ -4046,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");
                                }
                        }
 
@@ -4059,6 +4143,7 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
 
                        ret = _TRUE;
 
+                       DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_ucast);
                }
 
        }
@@ -4086,14 +4171,16 @@ static void dequeue_xmitframes_to_sleeping_queue(_adapter *padapter, struct sta_
        {                       
                pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
 
-               plist = get_next(plist);        
+               plist = get_next(plist);
                
+               pattrib = &pxmitframe->attrib;
+
+               pattrib->triggered = 0;
+               
                ret = xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe); 
 
                if(_TRUE == ret)
                {
-                       pattrib = &pxmitframe->attrib;
-
                        ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));
 
                        ptxservq->qcnt--;
@@ -4255,6 +4342,41 @@ void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta)
 
        }
 
+       if(psta->sleepq_len==0)
+       {
+#ifdef CONFIG_TDLS
+               if( psta->tdls_sta_state & TDLS_LINKED_STATE )
+               {
+                       if(psta->state&WIFI_SLEEP_STATE)
+                               psta->state ^= WIFI_SLEEP_STATE;
+
+                       _exit_critical_bh(&pxmitpriv->lock, &irqL);
+                       return;
+               }
+#endif //CONFIG_TDLS
+
+               if (pstapriv->tim_bitmap & BIT(psta->aid)) {
+                       //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
+                       //upate BCN for TIM IE
+                       //update_BCNTIM(padapter);
+                       update_mask = BIT(0);
+               }
+
+               pstapriv->tim_bitmap &= ~BIT(psta->aid);
+
+               if(psta->state&WIFI_SLEEP_STATE)
+                       psta->state ^= WIFI_SLEEP_STATE;
+
+               if(psta->state & WIFI_STA_ALIVE_CHK_STATE)
+               {
+                       DBG_871X("%s alive check\n", __func__);
+                       psta->expire_to = pstapriv->expire_to;
+                       psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
+               }
+
+               pstapriv->sta_dz_bitmap &= ~BIT(psta->aid);
+       }
+
        //for BC/MC Frames
        if(!psta_bmc)
                goto _exit;
@@ -4307,41 +4429,6 @@ void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta)
 
        }       
 
-       if(psta->sleepq_len==0)
-       {
-#ifdef CONFIG_TDLS
-               if( psta->tdls_sta_state & TDLS_LINKED_STATE )
-               {
-                       if(psta->state&WIFI_SLEEP_STATE)
-                               psta->state ^= WIFI_SLEEP_STATE;
-
-                       _exit_critical_bh(&pxmitpriv->lock, &irqL);
-                       return;
-               }
-#endif //CONFIG_TDLS
-
-               if (pstapriv->tim_bitmap & BIT(psta->aid)) {
-                       //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
-                       //upate BCN for TIM IE
-                       //update_BCNTIM(padapter);
-                       update_mask = BIT(0);
-               }
-
-               pstapriv->tim_bitmap &= ~BIT(psta->aid);
-
-               if(psta->state&WIFI_SLEEP_STATE)
-                       psta->state ^= WIFI_SLEEP_STATE;
-
-               if(psta->state & WIFI_STA_ALIVE_CHK_STATE)
-               {
-                       DBG_871X("%s alive check\n", __func__);
-                       psta->expire_to = pstapriv->expire_to;
-                       psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
-       }
-
-               pstapriv->sta_dz_bitmap &= ~BIT(psta->aid);
-       }
-
 _exit:
 
        //_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);    
@@ -4350,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");
        }
        
 }
@@ -4615,6 +4706,7 @@ thread_return rtw_xmit_thread(thread_context context)
        } while (_SUCCESS == err);
 
        _rtw_up_sema(&padapter->xmitpriv.terminate_xmitthread_sema);
+
        thread_exit();
 }
 #endif
index 425fbefc8b68c57924431517e5bc96b23a61737c..972a3d893fa652ce3c99b798db95d96915c17c3b 100644 (file)
@@ -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 65cf94e1769ff820ccee76bcfec64d8a28985c37..6e9454ca5ccad201b7f70fab7da6392d267906ce 100644 (file)
@@ -1724,9 +1724,17 @@ halbtc8188c2ant_ActionPanA2dp(
 // extern function start with EXhalbtc8188c2ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8188c2ant_InitHwConfig(\r
+EXhalbtc8188c2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
+{\r
+}\r
+\r
+VOID\r
+EXhalbtc8188c2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
 {\r
        u1Byte  u1Tmp=0;\r
 \r
@@ -1766,22 +1774,10 @@ 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
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);      \r
@@ -1796,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
-       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
        if(pStackInfo->bProfileNotified)\r
index 086a87927bf0176347d05da820ad070a84c1efc2..ce7ec564414fc5cbde4b88f71d3d447103c50aa7 100644 (file)
@@ -87,10 +87,15 @@ typedef struct _COEX_STA_8188C_2ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8188c2ant_InitHwConfig(\r
+EXhalbtc8188c2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8188c2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8188c2ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
index 0a3f310005240a039d503fe085105ff81693350e..cb60379c9a866a95ef5471af5207c180b55f14f7 100644 (file)
@@ -1713,9 +1713,17 @@ halbtc8192d2ant_IsBtCoexistEnter(
 // extern function start with EXhalbtc8192d2ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8192d2ant_InitHwConfig(\r
+EXhalbtc8192d2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
+{\r
+}\r
+\r
+VOID\r
+EXhalbtc8192d2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
 {\r
        u1Byte  u1Tmp=0;\r
 \r
@@ -1772,22 +1780,10 @@ 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
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);      \r
@@ -1802,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
+       // 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
        if(pStackInfo->bProfileNotified)\r
index 4d3b83879081bff1656f9d4be4cf280ac5b84833..85fd6742ca2f6d63ea14cb843c31251aba30cbfd 100644 (file)
@@ -108,10 +108,15 @@ typedef struct _COEX_STA_8192D_2ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8192d2ant_InitHwConfig(\r
+EXhalbtc8192d2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8192d2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8192d2ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
index a9b90c6acd63f6e505239316461463256c7c4f61..12dfe4b210eb3974bfb7f4b9d2ac7ead61b9163b 100644 (file)
@@ -2437,9 +2437,17 @@ halbtc8192e1ant_InitCoexDm(
 // extern function start with EXhalbtc8192e1ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8192e1ant_InitHwConfig(\r
+EXhalbtc8192e1ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
+{\r
+}\r
+\r
+VOID\r
+EXhalbtc8192e1ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
 {\r
        u4Byte  u4Tmp=0;\r
        u2Byte  u2Tmp=0;\r
@@ -2511,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
@@ -2536,13 +2539,6 @@ EXhalbtc8192e1ant_DisplayCoexInfo(
                CL_PRINTF(cliBuf);\r
        }\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);      \r
@@ -2557,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
@@ -2619,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
@@ -2637,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
@@ -2664,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 7a1ce5ae1b1df70419a281bd42f4a34d7bc1978e..8792ec8d381caac737828f429c8a46a6c8105f58 100644 (file)
@@ -140,10 +140,15 @@ typedef struct _COEX_STA_8192E_1ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8192e1ant_InitHwConfig(\r
+EXhalbtc8192e1ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8192e1ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8192e1ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
index a1b8f274e670a24477ee1f7e4137130b4e5deedd..8bde294c93f23a3e6e024fe7d1ab41b14f423312 100644 (file)
@@ -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
@@ -3791,9 +3793,17 @@ halbtc8192e2ant_InitHwConfig(
 // extern function start with EXhalbtc8192e2ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8192e2ant_InitHwConfig(\r
+EXhalbtc8192e2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
+{\r
+}\r
+\r
+VOID\r
+EXhalbtc8192e2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
 {\r
        halbtc8192e2ant_InitHwConfig(pBtCoexist, TRUE);\r
 }\r
@@ -3819,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
@@ -3837,13 +3843,6 @@ EXhalbtc8192e2ant_DisplayCoexInfo(
                CL_PRINTF(cliBuf);\r
        }\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);\r
@@ -3858,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
+       // 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
@@ -3922,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 dc94c73b3f3a43ed16d869c84eac8bc470b5091d..58cddce87a412c4b5987d53ae09ae2264d4fb96b 100644 (file)
@@ -143,10 +143,15 @@ typedef struct _COEX_STA_8192E_2ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8192e2ant_InitHwConfig(\r
+EXhalbtc8192e2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8192e2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8192e2ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
index d2476cda62e568b0548485e3f84a9d11d6446056..8ea08e87d3de1cb38066226680b3ac3cc8cb2e38 100644 (file)
@@ -1068,22 +1068,10 @@ 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
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);      \r
@@ -1098,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
+       // 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
@@ -1258,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 2b72397b5285d8b7600687bf864f602089e7381c..ffe117596f5b981a1a6de7adfa3ac313511a3c4f 100644 (file)
@@ -58,6 +58,31 @@ halbtc8723a2ant_IsWifiIdle(
        return TRUE;\r
 }\r
 \r
+BOOLEAN\r
+halbtc8723a2ant_IsWifiConnectedIdle(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       BOOLEAN         bWifiConnected=FALSE, bScan=FALSE, bLink=FALSE, bRoam=FALSE, bWifiBusy=FALSE;\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &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
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
+\r
+       if(bScan)\r
+               return FALSE;\r
+       if(bLink)\r
+               return FALSE;\r
+       if(bRoam)\r
+               return FALSE;\r
+       if(bWifiConnected && !bWifiBusy)\r
+               return TRUE;\r
+       else \r
+               return FALSE;\r
+}\r
+\r
 u1Byte\r
 halbtc8723a2ant_BtRssiState(\r
        u1Byte                  levelNum,\r
@@ -629,6 +654,9 @@ halbtc8723a2ant_NeedToDecBtPwr(
        BOOLEAN         bRet=FALSE;\r
        BOOLEAN         bBtHsOn=FALSE, bWifiConnected=FALSE;\r
        s4Byte          btHsRssi=0;\r
+       u1Byte          btRssiState=BTC_RSSI_STATE_HIGH;\r
+\r
+       btRssiState = halbtc8723a2ant_BtRssiState(2, 42, 0);\r
 \r
        if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn))\r
                return FALSE;\r
@@ -636,6 +664,8 @@ halbtc8723a2ant_NeedToDecBtPwr(
                return FALSE;\r
        if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi))\r
                return FALSE;\r
+       if(BTC_RSSI_LOW(btRssiState))\r
+               return FALSE;\r
 \r
        if(bWifiConnected)\r
        {\r
@@ -1546,6 +1576,26 @@ halbtc8723a2ant_IsCommonAction(
                \r
                bCommon = TRUE;\r
        }\r
+       else if(halbtc8723a2ant_IsWifiConnectedIdle(pBtCoexist) && \r
+                       (BT_8723A_2ANT_BT_STATUS_NON_IDLE == pCoexDm->btStatus) )\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected-idle + BT non-idle!!\n"));\r
+\r
+               halbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE);\r
+               halbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, TRUE);\r
+               halbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\r
+\r
+               halbtc8723a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+               halbtc8723a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0x20);\r
+               halbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+               halbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\r
+               \r
+               bCommon = TRUE;\r
+       }\r
        else\r
        {\r
                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non-idle + BT non-idle!!\n"));\r
@@ -3332,9 +3382,17 @@ wa_halbtc8723a2ant_MonitorC2h(
 // extern function start with EXhalbtc8723a2ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8723a2ant_InitHwConfig(\r
+EXhalbtc8723a2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
+{\r
+}\r
+\r
+VOID\r
+EXhalbtc8723a2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
 {\r
        u4Byte  u4Tmp=0;\r
        u1Byte  u1Tmp=0;\r
@@ -3371,22 +3429,10 @@ 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
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);      \r
@@ -3401,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
@@ -3564,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 c2733d89cea5040d42b5d15f9b8b5a5b0bfe58c9..f0cc8b546972c0856621c13fcb697e258fed4ee1 100644 (file)
@@ -116,10 +116,15 @@ typedef struct _COEX_STA_8723A_2ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8723a2ant_InitHwConfig(\r
+EXhalbtc8723a2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8723a2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8723a2ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
index 6105afcc025c5eac7c011f8a45af96e0cc5b6d8d..ed9941fd0ec1af01e732eb1ebcf0aeaed1249643 100644 (file)
@@ -27,8 +27,8 @@ const char *const GLBtInfoSrc8723b1Ant[]={
        "BT Info[bt auto report]",\r
 };\r
 \r
-u4Byte GLCoexVerDate8723b1Ant=20140110;\r
-u4Byte GLCoexVer8723b1Ant=0x49;\r
+u4Byte GLCoexVerDate8723b1Ant=20140725;\r
+u4Byte GLCoexVer8723b1Ant=0x53;\r
 \r
 //============================================================\r
 // local function proto type if needed\r
@@ -411,6 +411,23 @@ halbtc8723b1ant_LimitedRx(
 \r
 }\r
 \r
+VOID\r
+halbtc8723b1ant_QueryBtInfo(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[1] ={0};\r
+\r
+       pCoexSta->bC2hBtInfoReqSent = TRUE;\r
+\r
+       H2C_Parameter[0] |= BIT0;       // trigger\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", \r
+               H2C_Parameter[0]));\r
+\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);\r
+}\r
+\r
 VOID\r
 halbtc8723b1ant_MonitorBtCtr(\r
        IN      PBTC_COEXIST            pBtCoexist\r
@@ -420,7 +437,20 @@ halbtc8723b1ant_MonitorBtCtr(
        u4Byte                  regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\r
        u1Byte                  u1Tmp, u1Tmp1;\r
        s4Byte                  wifiRssi;\r
+       static u1Byte           NumOfBtCounterChk = 0;\r
        \r
+       //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
@@ -437,25 +467,122 @@ halbtc8723b1ant_MonitorBtCtr(
        pCoexSta->lowPriorityTx = regLPTx;\r
        pCoexSta->lowPriorityRx = regLPRx;\r
 \r
+       if( (pCoexSta->lowPriorityTx > 1150)  && (!pCoexSta->bC2hBtInquiryPage))\r
+               pCoexSta->popEventCnt++;\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\n",\r
+               regHPRx, regHPTx, regLPRx, regLPTx));\r
+\r
        // reset counter\r
        pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);\r
+\r
+       if ((regHPTx == 0) && (regHPRx ==0) && (regLPTx == 0) && (regLPRx == 0))\r
+       {\r
+               NumOfBtCounterChk++;\r
+               if (NumOfBtCounterChk >= 3)\r
+{\r
+                       halbtc8723b1ant_QueryBtInfo(pBtCoexist);\r
+                       NumOfBtCounterChk = 0;\r
+               }\r
+       }\r
 }\r
 \r
+\r
 VOID\r
-halbtc8723b1ant_QueryBtInfo(\r
+halbtc8723b1ant_MonitorWiFiCtr(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       u1Byte                  H2C_Parameter[1] ={0};\r
+       u4Byte  u4Tmp;\r
+       u2Byte  u2Tmp[3];\r
+       s4Byte  wifiRssi=0;\r
+       BOOLEAN bWifiBusy = FALSE, bWifiUnderBMode = FALSE;\r
+       static u1Byte nCCKLockCounter = 0;\r
 \r
-       pCoexSta->bC2hBtInfoReqSent = TRUE;\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\r
 \r
-       H2C_Parameter[0] |= BIT0;       // trigger\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
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", \r
-               H2C_Parameter[0]));\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
+\r
+       //reset counter\r
+       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x1);\r
+       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x0);\r
+\r
+       if ( (bWifiBusy) && (wifiRssi >= 30) && (!bWifiUnderBMode))\r
+       {\r
+               if ( (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) ||\r
+                       (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) ||\r
+                       (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_SCO_BUSY) )\r
+               {\r
+                       if (pCoexSta->nCRCOK_CCK >(pCoexSta->nCRCOK_11g + pCoexSta->nCRCOK_11n + \r
+                               pCoexSta->nCRCOK_11nAgg) )\r
+                       {\r
+                               if (nCCKLockCounter < 5)\r
+                                nCCKLockCounter++;\r
+                       }\r
+                       else\r
+                       {\r
+                               if (nCCKLockCounter > 0)\r
+                                nCCKLockCounter--;\r
+                       }\r
+\r
+               }\r
+               else\r
+               {\r
+                       if (nCCKLockCounter > 0)\r
+                         nCCKLockCounter--;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               if (nCCKLockCounter > 0)\r
+                       nCCKLockCounter--;\r
+       }\r
+\r
+       if (!pCoexSta->bPreCCKLock)\r
+       {\r
+\r
+               if (nCCKLockCounter >= 5)\r
+                pCoexSta->bCCKLock = TRUE;\r
+               else\r
+                pCoexSta->bCCKLock = FALSE;                    \r
+       }\r
+       else\r
+       {\r
+               if (nCCKLockCounter == 0)\r
+                pCoexSta->bCCKLock = FALSE;\r
+               else\r
+                pCoexSta->bCCKLock = TRUE;             \r
+       }\r
+\r
+       pCoexSta->bPreCCKLock =  pCoexSta->bCCKLock;    \r
+               \r
 \r
-       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);\r
 }\r
 \r
 BOOLEAN\r
@@ -509,6 +636,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
@@ -920,9 +1048,9 @@ halbtc8723b1ant_CoexTableWithType(
        IN      u1Byte                          type\r
        )\r
 {\r
-\r
-       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], ********** CoexTable(%d) **********\n", \r
-                               type));\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** CoexTable(%d) **********\n", type));\r
+       \r
+       pCoexSta->nCoexTableType = type;\r
        \r
        switch(type)\r
        {\r
@@ -936,16 +1064,19 @@ halbtc8723b1ant_CoexTableWithType(
                        halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3);\r
                        break;\r
                case 3:\r
-                       halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaaaaaaaa, 0xffffff, 0x3);\r
+                       halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3);\r
                        break;\r
                case 4:\r
-                       halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);\r
+                       if(pCoexSta->nScanAPNum > 5)\r
+                               halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3);\r
+                       else\r
+                               halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);\r
                        break;\r
                case 5:\r
-                       halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaaaa5a5a, 0xffffff, 0x3);\r
+                       halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaa5a5a5a, 0xffffff, 0x3);\r
                        break;\r
                case 6:\r
-                       halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3);\r
+                       halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);\r
                        break;\r
                case 7:\r
                        halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3);\r
@@ -998,54 +1129,6 @@ halbtc8723b1ant_IgnoreWlanAct(
        pCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;\r
 }\r
 \r
-VOID\r
-halbtc8723b1ant_SetFwPstdma(\r
-       IN      PBTC_COEXIST            pBtCoexist,\r
-       IN      u1Byte                  byte1,\r
-       IN      u1Byte                  byte2,\r
-       IN      u1Byte                  byte3,\r
-       IN      u1Byte                  byte4,\r
-       IN      u1Byte                  byte5\r
-       )\r
-{\r
-       u1Byte                  H2C_Parameter[5] ={0};\r
-       u1Byte                  realByte1=byte1, realByte5=byte5;\r
-       BOOLEAN                 bApEnable=FALSE;\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\r
-\r
-       if(bApEnable)\r
-       {\r
-               if(byte1&BIT4 && !(byte1&BIT5))\r
-               {                       \r
-                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], FW for 1Ant AP mode\n"));\r
-                       realByte1 &= ~BIT4;\r
-                       realByte1 |= BIT5;\r
-\r
-                       realByte5 |= BIT5;\r
-                       realByte5 &= ~BIT6;\r
-               }\r
-       }\r
-\r
-       H2C_Parameter[0] = realByte1;   \r
-       H2C_Parameter[1] = byte2;       \r
-       H2C_Parameter[2] = byte3;\r
-       H2C_Parameter[3] = byte4;\r
-       H2C_Parameter[4] = realByte5;\r
-\r
-       pCoexDm->psTdmaPara[0] = realByte1;\r
-       pCoexDm->psTdmaPara[1] = byte2;\r
-       pCoexDm->psTdmaPara[2] = byte3;\r
-       pCoexDm->psTdmaPara[3] = byte4;\r
-       pCoexDm->psTdmaPara[4] = realByte5;\r
-       \r
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n", \r
-               H2C_Parameter[0], \r
-               H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));\r
-\r
-       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);\r
-}\r
-\r
 VOID\r
 halbtc8723b1ant_SetLpsRpwm(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
@@ -1111,44 +1194,71 @@ 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
 {\r
        PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;\r
-       u4Byte                  fwVer=0, u4Tmp=0;\r
+       u4Byte                  fwVer=0, u4Tmp=0, cntBtCalChk=0;\r
        BOOLEAN                 bPgExtSwitch=FALSE;\r
        BOOLEAN                 bUseExtSwitch=FALSE;\r
-       u1Byte                  H2C_Parameter[2] ={0};\r
-       PADAPTER padapter=pBtCoexist->Adapter;\r
+       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
-\r
-       if((fwVer<0xc0000) || bPgExtSwitch)\r
+       if((fwVer>0 && fwVer<0xc0000) || bPgExtSwitch)\r
                bUseExtSwitch = TRUE;\r
 \r
        if(bInitHwCfg)\r
        {\r
-               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi\r
-               \r
-               //Force GNT_BT to Normal\r
-               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x0); \r
+               pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); //WiFi 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
+               /* Use H2C to set GNT_BT to HIGH */\r
+               H2C_Parameter[0] = 1;\r
+               pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\r
+               }\r
+               else\r
+               {\r
+                       // set grant_bt to high\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18); \r
+               }\r
                //set wlan_act control by PTA\r
-               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); \r
+               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); \r
+\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x0); //BT select s0/s1 is controlled by BT\r
 \r
-               //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); \r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x39, 0x8, 0x1);\r
+               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x974, 0xff);\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3);\r
+               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x930, 0x77);\r
        }\r
        else if(bWifiOff)\r
        {\r
-       //Force GNT_BT to High\r
-               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x3);\r
-               \r
+               if(fwVer >= 0x180000)\r
+               {\r
+               /* Use H2C to set GNT_BT to HIGH */\r
+               H2C_Parameter[0] = 1;\r
+               pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\r
+               }\r
+               else\r
+               {\r
+                       // set grant_bt to high\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18); \r
+               }\r
                //set wlan_act to always low\r
                pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\r
                \r
-               if(padapter->registrypriv.mp_mode ==0)  \r
+               pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE, &bIsInMpMode);\r
+               if(!bIsInMpMode)        \r
                        pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x0); //BT select s0/s1 is controlled by BT\r
                else\r
                        pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi\r
@@ -1159,6 +1269,48 @@ halbtc8723b1ant_SetAntPath(
                u4Tmp &= ~BIT24;\r
                pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
        }\r
+       else\r
+       {                       \r
+               /* Use H2C to set GNT_BT to LOW */\r
+               if(fwVer >= 0x180000)\r
+               {\r
+               if (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765) != 0)\r
+               {               \r
+                       H2C_Parameter[0] = 0;\r
+                       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\r
+               }\r
+               }\r
+               else\r
+               {\r
+                       // BT calibration check\r
+                       while(cntBtCalChk <= 20)\r
+                       {\r
+                               u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x49d);\r
+                               cntBtCalChk++;\r
+                               if(u1Tmp & BIT0)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\n", cntBtCalChk));\r
+                                       delay_ms(50);\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\n", cntBtCalChk));\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       // set grant_bt to PTA\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x0);\r
+               }\r
+\r
+               if (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) != 0xc)\r
+               {\r
+                       //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
        {\r
@@ -1170,10 +1322,10 @@ halbtc8723b1ant_SetAntPath(
                        u4Tmp |= BIT24;\r
                        pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
 \r
+                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT\r
+\r
                        if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
                        {\r
-                               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x1); //Main Ant to  BT for IPS case 0x4c[23]=1\r
-       \r
                                //tell firmware "no antenna inverse"\r
                                H2C_Parameter[0] = 0;\r
                                H2C_Parameter[1] = 1;  //ext switch type\r
@@ -1181,8 +1333,6 @@ halbtc8723b1ant_SetAntPath(
                        }\r
                        else\r
                        {\r
-                               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //Aux Ant to  BT for IPS case 0x4c[23]=1\r
-               \r
                                //tell firmware "antenna inverse"\r
                                H2C_Parameter[0] = 1;\r
                                H2C_Parameter[1] = 1;  //ext switch type\r
@@ -1190,36 +1340,32 @@ halbtc8723b1ant_SetAntPath(
                        }\r
                }\r
                \r
-               // fixed internal switch first\r
-               if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
-                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT\r
-               else\r
-                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280); // fixed internal switch S0->WiFi, S1->BT\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
@@ -1231,9 +1377,11 @@ halbtc8723b1ant_SetAntPath(
                        u4Tmp &=~BIT24;       \r
                        pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
 \r
+                       //Fix Ext switch Main->S1, Aux->S0\r
+                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); \r
+\r
                        if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
                        {\r
-                               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //Main Ant to  WiFi for IPS case 0x4c[23]=1\r
        \r
                                //tell firmware "no antenna inverse"\r
                                H2C_Parameter[0] = 0;\r
@@ -1242,7 +1390,6 @@ halbtc8723b1ant_SetAntPath(
                        }\r
                        else\r
                        {\r
-                               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x1); //Aux Ant to  BT for IPS case 0x4c[23]=1\r
                \r
                                //tell firmware "antenna inverse"\r
                                H2C_Parameter[0] = 1;\r
@@ -1251,38 +1398,120 @@ halbtc8723b1ant_SetAntPath(
                        }\r
                }\r
        \r
-               // fixed external switch first\r
-               if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
-                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1); //Main->WiFi, Aux->BT\r
-               else\r
-                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2); //Main->BT, Aux->WiFi\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
+halbtc8723b1ant_SetAntPathDCut(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bAntennaAux,    //For 1-Ant--> 1: Antenna at S0, 0: Antenna at S1. Set 0 for 2-Ant\r
+       IN      BOOLEAN                         bExtSwitch,             // 1: Ext Switch (SPDT) exist on module, 0: no Ext Switch (SPDT) exist on module\r
+       IN      BOOLEAN                         bTwoAntenna,    // 1: 2-Antenna, 0:1-Antenna\r
+       IN      u1Byte                          antennaPos,             //Set Antenna Pos, For 1-Ant: BTC_ANT_PATH_WIFI, BTC_ANT_PATH_BT, BTC_ANT_PATH_PTA, For 2-Ant:BTC_ANT_WIFI_AT_MAIN, BTC_ANT_WIFI_AT_Aux\r
+       IN      u1Byte                          wifiState               //BTC_WIFI_STAT_INIT, BTC_WIFI_STAT_IQK, BTC_WIFI_STAT_NORMAL_OFF, BTC_WIFI_STAT_MP_OFF, BTC_WIFI_STAT_NORMAL, BTC_WIFI_STAT_ANT_DIV\r
+       )\r
+{\r
+       u1Byte  dataLen=5;\r
+       u1Byte  buf[6] = {0};\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set BT Ant, bAntennaAux/bExtSwitch/bTwoAntenna/antennaPos/wifiState=%d/%d/%d/%d/%d\n",\r
+               bAntennaAux, bExtSwitch, bTwoAntenna, antennaPos, wifiState));\r
+\r
+       buf[0] = dataLen; \r
+       \r
+       if(bAntennaAux)\r
+               buf[1] = 0x1;\r
+       \r
+       if(bExtSwitch)\r
+               buf[2] = 0x1;                   \r
+       \r
+       if(bTwoAntenna)\r
+               buf[3] = 0x1;\r
+\r
+       buf[4] = antennaPos;\r
+\r
+       buf[5] = wifiState;\r
+       \r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_8723B_ANT, (PVOID)&buf[0]);    \r
+}\r
+\r
+VOID\r
+halbtc8723b1ant_SetFwPstdma(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  byte1,\r
+       IN      u1Byte                  byte2,\r
+       IN      u1Byte                  byte3,\r
+       IN      u1Byte                  byte4,\r
+       IN      u1Byte                  byte5\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[5] ={0};\r
+       u1Byte                  realByte1=byte1, realByte5=byte5;\r
+       BOOLEAN                 bApEnable=FALSE;\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\r
+\r
+       if(bApEnable)\r
+       {\r
+               if(byte1&BIT4 && !(byte1&BIT5))\r
+               {                       \r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], FW for 1Ant AP mode\n"));\r
+                       realByte1 &= ~BIT4;\r
+                       realByte1 |= BIT5;\r
+\r
+                       realByte5 |= BIT5;\r
+                       realByte5 &= ~BIT6;\r
+               }\r
+       }\r
+\r
+       H2C_Parameter[0] = realByte1;   \r
+       H2C_Parameter[1] = byte2;       \r
+       H2C_Parameter[2] = byte3;\r
+       H2C_Parameter[3] = byte4;\r
+       H2C_Parameter[4] = realByte5;\r
+\r
+       pCoexDm->psTdmaPara[0] = realByte1;\r
+       pCoexDm->psTdmaPara[1] = byte2;\r
+       pCoexDm->psTdmaPara[2] = byte3;\r
+       pCoexDm->psTdmaPara[3] = byte4;\r
+       pCoexDm->psTdmaPara[4] = realByte5;\r
+       \r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n", \r
+               H2C_Parameter[0], \r
+               H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));\r
+\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);\r
+}\r
+\r
+\r
 VOID\r
 halbtc8723b1ant_PsTdma(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
@@ -1292,9 +1521,12 @@ halbtc8723b1ant_PsTdma(
        )\r
 {\r
        PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;\r
-       BOOLEAN                 bTurnOnByCnt=FALSE, bWifiBusy=FALSE;\r
+       PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
+       BOOLEAN                 bTurnOnByCnt=FALSE, bWifiBusy=FALSE, bWiFiNoisy=FALSE;\r
        u1Byte                  psTdmaTypeByCnt=0, rssiAdjustVal=0;\r
-       //u4Byte                        fwVer=0;\r
+       u1Byte                  psTdmaByte4Val = 0x50, psTdmaByte0Val = 0x51, psTdmaByte3Val =  0x10;\r
+       s1Byte                  nWiFiDurationAdjust = 0x0;\r
+       static BOOLEAN   bPreWifiBusy=FALSE;\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
@@ -1303,14 +1535,20 @@ halbtc8723b1ant_PsTdma(
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);      \r
 \r
+       if (bWifiBusy != bPreWifiBusy)\r
+       {\r
+               bForceExec = TRUE;      \r
+               bPreWifiBusy = bWifiBusy;\r
+       }\r
+\r
        if (pCoexDm->bCurPsTdmaOn)\r
        {\r
-               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], ********** TDMA(on, %d) **********\n", \r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** TDMA(on, %d) **********\n", \r
                                pCoexDm->curPsTdma));\r
        }\r
        else\r
        {\r
-               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], ********** TDMA(off, %d) **********\n", \r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** TDMA(off, %d) **********\n", \r
                                pCoexDm->curPsTdma));\r
        }\r
                        \r
@@ -1320,40 +1558,57 @@ halbtc8723b1ant_PsTdma(
                        (pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\r
                        return;\r
        }\r
-       if(bTurnOn)\r
+\r
+       if (pCoexSta->nScanAPNum <= 5)\r
+               nWiFiDurationAdjust = 5;\r
+               //nWiFiDurationAdjust = 2;\r
+       else if  (pCoexSta->nScanAPNum >= 40)\r
+               nWiFiDurationAdjust = -15;      \r
+       else if  (pCoexSta->nScanAPNum >= 20)\r
+               nWiFiDurationAdjust = -10;      \r
+       \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
        {\r
+               psTdmaByte4Val = psTdmaByte4Val & 0xbf;  //no dynamic slot for multi-profile\r
+       \r
+               if (!bWifiBusy)\r
+                       psTdmaByte4Val = psTdmaByte4Val | 0x1;  //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)\r
+               }\r
+                \r
+       if (pBtLinkInfo->bSlaveRole == TRUE)\r
+               psTdmaByte4Val = psTdmaByte4Val | 0x1;  //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)\r
+               \r
+       if(bTurnOn)\r
+       {        \r
                switch(type)\r
                {\r
                        default:\r
-                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1a, 0x1a, 0x0, 0x50);\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1a, 0x1a, 0x0, psTdmaByte4Val);\r
                                break;\r
                        case 1:\r
-                               //if(bWifiBusy)\r
-                                       halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x3a, 0x03, 0x10, 0x50);\r
-                               //else\r
-                               //      halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x3a, 0x03, 0x10, 0x51);\r
-                               \r
-                               rssiAdjustVal = 11;\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);                                                                \r
                                break;\r
                        case 2:\r
-                               //if(bWifiBusy)\r
-                                       halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x2b, 0x03, 0x10, 0x50);\r
-                               //else\r
-                               //      halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x2b, 0x03, 0x10, 0x51);\r
-                               rssiAdjustVal = 14;\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x2d+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);                                                        \r
                                break;\r
                        case 3:\r
-                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, 0x52);\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, psTdmaByte4Val);\r
                                break;\r
                        case 4:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0);\r
-                               rssiAdjustVal = 17;\r
                                break;\r
                        case 5:\r
-                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x3, 0x11, 0x10);\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x3, 0x11, 0x11);\r
                                break;\r
                        case 6:\r
-                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x3, 0x11, 0x13);\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x3, 0x11, 0x11);\r
                                break;\r
                        case 7:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0);\r
@@ -1362,45 +1617,34 @@ halbtc8723b1ant_PsTdma(
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0);\r
                                break;\r
                        case 9: \r
-                               //if(bWifiBusy)\r
-                                       halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, 0x50);\r
-                               //else\r
-                               //      halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, 0x50);\r
-                               rssiAdjustVal = 18;\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val);                             \r
                                break;\r
                        case 10:        \r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0xa, 0x0, 0x40);\r
                                break;\r
                        case 11:        \r
-                               //if(bWifiBusy)\r
-                                       halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x15, 0x03, 0x10, 0x50);\r
-                               //else\r
-                               //      halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x15, 0x03, 0x10, 0x50);\r
-                               rssiAdjustVal = 20;\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x03, psTdmaByte3Val, psTdmaByte4Val);                    \r
                                break;\r
                        case 12:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50);\r
                                break;\r
                        case 13:\r
-                               //halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x15, 0x15, 0x0, 0x50);\r
-                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, 0x50);\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, psTdmaByte4Val);\r
                                break;\r
                        case 14:\r
-                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, 0x52);\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, psTdmaByte4Val);\r
                                break;\r
                        case 15:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x8, 0x0);\r
                                break;\r
                        case 16:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x10, 0x0);\r
-                               rssiAdjustVal = 18;\r
                                break;\r
                        case 18:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0);\r
-                               rssiAdjustVal = 14;\r
                                break;                  \r
                        case 20:\r
-                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x03, 0x11, 0x10);\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x3f, 0x03, 0x11, 0x10);\r
                                break;\r
                        case 21:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x11);\r
@@ -1410,23 +1654,18 @@ halbtc8723b1ant_PsTdma(
                                break;\r
                        case 23:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x18);\r
-                               rssiAdjustVal = 22;\r
                                break;\r
                        case 24:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x3, 0x31, 0x18);\r
-                               rssiAdjustVal = 22;\r
                                break;\r
                        case 25:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);\r
-                               rssiAdjustVal = 22;\r
                                break;\r
                        case 26:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);\r
-                               rssiAdjustVal = 22;\r
                                break;\r
                        case 27:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x98);\r
-                               rssiAdjustVal = 22;\r
                                break;\r
                        case 28:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x69, 0x25, 0x3, 0x31, 0x0);\r
@@ -1441,7 +1680,6 @@ halbtc8723b1ant_PsTdma(
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0, 0x58);\r
                                break;\r
                        case 32:\r
-                               //halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0xa, 0x3, 0x10, 0x0);\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x3, 0x11, 0x11);\r
                                break;\r
                        case 33:\r
@@ -1464,34 +1702,42 @@ halbtc8723b1ant_PsTdma(
        }\r
        else\r
        {               \r
-               //pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);      // [31:16]=fw ver, [15:0]=fw sub ver\r
 \r
                // disable PS tdma\r
                switch(type)\r
                {\r
                        case 8: //PTA Control\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0);\r
-                               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FALSE, FALSE);\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
                                break;\r
                        case 0:\r
                        default:  //Software control, Antenna at BT side\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);\r
-                               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, FALSE);\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
                                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
+\r
        // update pre state\r
        pCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;\r
        pCoexDm->prePsTdma = pCoexDm->curPsTdma;\r
 }\r
-\r
+#if 0\r
 VOID\r
 halbtc8723b1ant_CoexAllOff(\r
        IN      PBTC_COEXIST            pBtCoexist\r
@@ -1501,9 +1747,9 @@ halbtc8723b1ant_CoexAllOff(
        halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
 \r
        // hw all off\r
-       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
+       halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\r
 }\r
-\r
+#endif\r
 BOOLEAN\r
 halbtc8723b1ant_IsCommonAction(\r
        IN      PBTC_COEXIST            pBtCoexist\r
@@ -1519,7 +1765,7 @@ halbtc8723b1ant_IsCommonAction(
        {\r
                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n"));\r
                \r
-               halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
+               //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
 \r
                bCommon = TRUE;\r
        }\r
@@ -1528,7 +1774,7 @@ halbtc8723b1ant_IsCommonAction(
        {\r
                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT non connected-idle!!\n"));\r
 \r
-               halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
+               //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
 \r
                bCommon = TRUE;\r
        }\r
@@ -1537,7 +1783,7 @@ halbtc8723b1ant_IsCommonAction(
        {\r
                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT connected-idle!!\n"));\r
 \r
-               halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
+               //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
 \r
                bCommon = TRUE;\r
        }\r
@@ -1546,7 +1792,7 @@ halbtc8723b1ant_IsCommonAction(
        {\r
                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT connected-idle!!\n"));\r
 \r
-               halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
+               //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
 \r
                bCommon = TRUE;\r
        }\r
@@ -1555,7 +1801,7 @@ halbtc8723b1ant_IsCommonAction(
        {\r
                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT Busy!!\n"));\r
 \r
-               halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
+               //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
                \r
                bCommon = TRUE;\r
        }\r
@@ -1641,6 +1887,10 @@ halbtc8723b1ant_TdmaDurationAdjustForAcl(
                //BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount));\r
                //BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", \r
                //      up, dn, m, n, WaitCount));\r
+\r
+               if ( (pCoexSta->lowPriorityTx) > 1150 ||  (pCoexSta->lowPriorityRx) > 1250 )\r
+                       retryCount++;   \r
+               \r
                result = 0;\r
                WaitCount++; \r
                  \r
@@ -1798,7 +2048,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
@@ -1806,7 +2056,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
@@ -1832,6 +2082,7 @@ halbtc8723b1ant_PowerSaveState(
                        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
                        halbtc8723b1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE);\r
@@ -1841,10 +2092,12 @@ halbtc8723b1ant_PowerSaveState(
                        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
                        halbtc8723b1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE);\r
                        pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\r
+                       pCoexSta->bForceLpsOn = FALSE;\r
                        break;\r
                default:\r
                        break;\r
@@ -1856,8 +2109,9 @@ halbtc8723b1ant_ActionWifiOnly(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
-       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);      \r
+       halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\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
@@ -1929,6 +2183,8 @@ halbtc8723b1ant_MonitorBtEnableDisable(
 //=============================================\r
 \r
 // SCO only or SCO+PAN(HS)\r
+\r
+/*\r
 VOID\r
 halbtc8723b1ant_ActionSco(\r
        IN      PBTC_COEXIST            pBtCoexist\r
@@ -2014,11 +2270,25 @@ halbtc8723b1ant_ActionHidA2dp(
        halbtc8723b1ant_SwMechanism(pBtCoexist, TRUE);\r
 }\r
 \r
+*/\r
+\r
 //=============================================\r
 //\r
 //     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
@@ -2027,6 +2297,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
@@ -2052,39 +2323,43 @@ halbtc8723b1ant_ActionBtInquiry(
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
        pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\r
 \r
-\r
        if ( (!bWifiConnected) && (!pCoexSta->bWiFiIsHighPriTask) )\r
        {\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) ||\r
-                       (pBtLinkInfo->bHidExist) )\r
+       else if( (pBtLinkInfo->bScoExist) ||    (pBtLinkInfo->bHidExist) ||     (pBtLinkInfo->bA2dpExist)  )\r
        {\r
-               // SCO/HID-only busy\r
+               // SCO/HID/A2DP busy\r
                halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
                \r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);          \r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
        }\r
-       else if ( (pBtLinkInfo->bA2dpExist) ||  (pBtLinkInfo->bPanExist) ||  (bWifiBusy) )\r
+       else if ( (pBtLinkInfo->bPanExist) || (bWifiBusy) )\r
        {\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
 \r
 VOID\r
@@ -2104,35 +2379,13 @@ halbtc8723b1ant_ActionBtScoHidOnlyBusy(
        if(pBtLinkInfo->bScoExist)\r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\r
        }\r
        else //HID\r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
                halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\r
        }\r
-/*\r
-       if(pBtLinkInfo->bScoExist || pBtLinkInfo->bHidExist)\r
-       {\r
-               if(bWifiConnected)\r
-               {\r
-                       wifiRssiState = halbtc8723b1ant_WifiRssiState(pBtCoexist, 0, 2, 30, 0);\r
-                       if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
-                               (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
-                       {\r
-                               halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 2, 1, 1, 1);\r
-                       }\r
-                       else\r
-                       {\r
-                               halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 1, 1);\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
-               }\r
-       }\r
-*/\r
 }\r
 \r
 VOID\r
@@ -2146,6 +2399,15 @@ halbtc8723b1ant_ActionWifiConnectedBtAclBusy(
        PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
        btRssiState = halbtc8723b1ant_BtRssiState(2, 28, 0);    \r
 \r
+       if ( (pCoexSta->lowPriorityRx >= 950)  && (!pCoexSta->bUnderIps) )\r
+       {\r
+               pBtLinkInfo->bSlaveRole = TRUE;\r
+       }\r
+       else\r
+       {\r
+               pBtLinkInfo->bSlaveRole = FALSE;\r
+       }\r
+\r
        if(pBtLinkInfo->bHidOnly)  //HID\r
        {\r
                halbtc8723b1ant_ActionBtScoHidOnlyBusy(pBtCoexist, wifiStatus);\r
@@ -2156,58 +2418,42 @@ halbtc8723b1ant_ActionWifiConnectedBtAclBusy(
        {\r
                if(BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifiStatus)\r
                {\r
-                       //halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
-                       //halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
                        halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
-                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
                        pCoexDm->bAutoTdmaAdjust = FALSE;\r
                }\r
-               else if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
-                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )     \r
+               else\r
                {\r
                        halbtc8723b1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus);\r
-                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-               }\r
-               else //for low BT RSSI\r
-               {\r
-                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
-                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-                       pCoexDm->bAutoTdmaAdjust = FALSE;\r
+                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+                       pCoexDm->bAutoTdmaAdjust = TRUE;\r
                }\r
        }\r
+       else if ( ((pBtLinkInfo->bA2dpExist) && (pBtLinkInfo->bPanExist)) ||\r
+                      (pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist&&pBtLinkInfo->bPanExist) ) //A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP)\r
+       {\r
+               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               pCoexDm->bAutoTdmaAdjust = FALSE;\r
+       }\r
        else if(pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist)  //HID+A2DP\r
        {\r
-               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
-                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )     \r
-               {\r
-                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
-                       pCoexDm->bAutoTdmaAdjust = FALSE;\r
-               }\r
-               else //for low BT RSSI\r
-               {\r
-                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
-                       pCoexDm->bAutoTdmaAdjust = FALSE;\r
-               }                       \r
+               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+               pCoexDm->bAutoTdmaAdjust = FALSE;\r
 \r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 6);\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);\r
        }\r
        else if( (pBtLinkInfo->bPanOnly) || (pBtLinkInfo->bHidExist&&pBtLinkInfo->bPanExist) ) //PAN(OPP,FTP), HID+PAN(OPP,FTP)                 \r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 6);\r
-               pCoexDm->bAutoTdmaAdjust = FALSE;\r
-       }\r
-       else if ( ((pBtLinkInfo->bA2dpExist) && (pBtLinkInfo->bPanExist)) ||\r
-                      (pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist&&pBtLinkInfo->bPanExist) ) //A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP)\r
-       {\r
-               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
                pCoexDm->bAutoTdmaAdjust = FALSE;\r
        }\r
        else\r
        {               \r
-               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               //BT no-profile busy (0x9)\r
+               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);      \r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
                pCoexDm->bAutoTdmaAdjust = FALSE;\r
        }       \r
 }\r
@@ -2221,7 +2467,8 @@ halbtc8723b1ant_ActionWifiNotConnected(
        halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
 \r
        // tdma and coex table\r
-       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\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
@@ -2233,25 +2480,24 @@ halbtc8723b1ant_ActionWifiNotConnectedScan(
        PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
        \r
        halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
-       halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\r
 \r
        // tdma and coex table\r
        if(BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\r
        {\r
-               if(pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\r
-               {\r
+               if (pBtLinkInfo->bA2dpExist)\r
+               {\r
+                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
+               else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\r
+               {\r
                        halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\r
-                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-               }\r
-               else if(pBtLinkInfo->bPanOnly)\r
-               {\r
-                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
-               }\r
+                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
                else\r
                {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);                  \r
                }\r
        }\r
        else if( (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\r
@@ -2262,11 +2508,9 @@ halbtc8723b1ant_ActionWifiNotConnectedScan(
        }\r
        else\r
        {\r
-               //halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               //halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-\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
@@ -2281,22 +2525,22 @@ halbtc8723b1ant_ActionWifiNotConnectedAssoAuth(
        halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
 \r
        // tdma and coex table\r
-       if( (pBtLinkInfo->bScoExist)  || (pBtLinkInfo->bHidExist) )\r
+       if( (pBtLinkInfo->bScoExist)  || (pBtLinkInfo->bHidExist) ||  (pBtLinkInfo->bA2dpExist) )\r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);          \r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4);           \r
        }\r
-       else if( (pBtLinkInfo->bA2dpExist)  || (pBtLinkInfo->bPanExist) )                       \r
+       else if (pBtLinkInfo->bPanExist)                        \r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4);           \r
        }\r
        else\r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 2);\r
        }\r
-\r
 }\r
 \r
 VOID\r
@@ -2311,20 +2555,20 @@ halbtc8723b1ant_ActionWifiConnectedScan(
        // tdma and coex table\r
        if(BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\r
        {\r
-               if(pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\r
-               {\r
-                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\r
-                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-               }\r
-               else if(pBtLinkInfo->bPanOnly)\r
-               {\r
-                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
-               }\r
+               if (pBtLinkInfo->bA2dpExist)\r
+               {\r
+                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
+               else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\r
+               {\r
+                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\r
+                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
                else\r
                {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
        }\r
        }\r
        else if( (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\r
@@ -2335,11 +2579,9 @@ halbtc8723b1ant_ActionWifiConnectedScan(
        }\r
        else\r
        {\r
-               //halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               //halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-\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
@@ -2354,12 +2596,12 @@ halbtc8723b1ant_ActionWifiConnectedSpecialPacket(
        halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
 \r
        // tdma and coex table\r
-       if( (pBtLinkInfo->bScoExist)  || (pBtLinkInfo->bHidExist) )\r
+       if( (pBtLinkInfo->bScoExist)  || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist) )\r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);          \r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
        }\r
-       else if( (pBtLinkInfo->bA2dpExist)  || (pBtLinkInfo->bPanExist) )                       \r
+       else if(pBtLinkInfo->bPanExist)\r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
                halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
@@ -2367,6 +2609,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
@@ -2406,11 +2649,28 @@ halbtc8723b1ant_ActionWifiConnected(
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
+       \r
        // power save state\r
        if(!bApEnable && BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly)\r
        {\r
-               if(!bWifiBusy && pBtCoexist->btLinkInfo.bA2dpOnly)      //A2DP\r
+               if(pBtCoexist->btLinkInfo.bA2dpOnly)    //A2DP\r
+                       {                       \r
+                       if(!bWifiBusy)\r
+                               halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);                               \r
+                       else //busy\r
+                       {\r
+                               if  (pCoexSta->nScanAPNum >= BT_8723B_1ANT_WIFI_NOISY_THRESH)  //no force LPS, no PS-TDMA, use pure TDMA\r
+                               {\r
                        halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+                               }\r
+                               else\r
+                               {\r
+                                       halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);                                   \r
+                               }\r
+                       }\r
+               }\r
+               else if ((pCoexSta->bPanExist == FALSE) && (pCoexSta->bA2dpExist == FALSE) && (pCoexSta->bHidExist == FALSE))\r
+                       halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
                else\r
                        halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\r
        }\r
@@ -2434,7 +2694,11 @@ halbtc8723b1ant_ActionWifiConnected(
                else\r
                {\r
                        halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\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
+                               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);           \r
                }\r
        }\r
        else\r
@@ -2453,7 +2717,11 @@ halbtc8723b1ant_ActionWifiConnected(
                else \r
                {\r
                        halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\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
+                               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); \r
                }\r
        }\r
 }\r
@@ -2478,43 +2746,43 @@ halbtc8723b1ant_RunSwCoexistMechanism(
                {\r
                        case BT_8723B_1ANT_COEX_ALGO_SCO:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = SCO.\n"));\r
-                               halbtc8723b1ant_ActionSco(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionSco(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_HID:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID.\n"));\r
-                               halbtc8723b1ant_ActionHid(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionHid(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_A2DP:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = A2DP.\n"));\r
-                               halbtc8723b1ant_ActionA2dp(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionA2dp(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_A2DP_PANHS:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = A2DP+PAN(HS).\n"));\r
-                               halbtc8723b1ant_ActionA2dpPanHs(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionA2dpPanHs(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_PANEDR:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN(EDR).\n"));\r
-                               halbtc8723b1ant_ActionPanEdr(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionPanEdr(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_PANHS:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HS mode.\n"));\r
-                               halbtc8723b1ant_ActionPanHs(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionPanHs(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_PANEDR_A2DP:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN+A2DP.\n"));\r
-                               halbtc8723b1ant_ActionPanEdrA2dp(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionPanEdrA2dp(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_PANEDR_HID:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN(EDR)+HID.\n"));\r
-                               halbtc8723b1ant_ActionPanEdrHid(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionPanEdrHid(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_HID_A2DP_PANEDR:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID+A2DP+PAN.\n"));\r
-                               halbtc8723b1ant_ActionHidA2dpPanEdr(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionHidA2dpPanEdr(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_HID_A2DP:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID+A2DP.\n"));\r
-                               halbtc8723b1ant_ActionHidA2dp(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionHidA2dp(pBtCoexist);\r
                                break;\r
                        default:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = coexist All Off!!\n"));\r
@@ -2534,10 +2802,11 @@ halbtc8723b1ant_RunCoexistMechanism(
        BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE;\r
        BOOLEAN bIncreaseScanDevNum=FALSE;\r
        BOOLEAN bBtCtrlAggBufSize=FALSE;\r
+       BOOLEAN bMiracastPlusBt=FALSE;\r
        u1Byte  aggBufSize=5;\r
        u1Byte  wifiRssiState=BTC_RSSI_STATE_HIGH;\r
        u4Byte  wifiLinkStatus=0;\r
-       u4Byte  numOfWifiLink=0;\r
+       u4Byte  numOfWifiLink=0, wifiBw;\r
 \r
        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism()===>\n"));\r
 \r
@@ -2559,6 +2828,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
@@ -2571,62 +2847,79 @@ halbtc8723b1ant_RunCoexistMechanism(
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
        numOfWifiLink = wifiLinkStatus>>16;\r
-       if(numOfWifiLink >= 2)\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
+                       halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1);\r
+                       bMiracastPlusBt = TRUE;\r
+               }\r
+               else\r
+               {\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
                halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\r
+\r
+               if ( (pBtLinkInfo->bA2dpExist) && (pCoexSta->bC2hBtInquiryPage) )\r
+               {\r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex],  BT Is Inquirying \n") );   \r
+                       halbtc8723b1ant_ActionBtInquiry(pBtCoexist);\r
+               }\r
+               else\r
                halbtc8723b1ant_ActionWifiMultiPort(pBtCoexist);\r
+               \r
                return;\r
        }\r
-\r
-       if(!pBtLinkInfo->bScoExist && !pBtLinkInfo->bHidExist)\r
+       else\r
        {\r
-               halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
+               bMiracastPlusBt = FALSE;\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\r
        }\r
-       else\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if ( (pBtLinkInfo->bBtLinkExist) && (bWifiConnected) )\r
        {\r
-               if(bWifiConnected)\r
-               {\r
-                       wifiRssiState = halbtc8723b1ant_WifiRssiState(pBtCoexist, 1, 2, 30, 0);\r
-                       if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
-                               (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
-                       {\r
-                               halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 1, 1);\r
-                       }\r
-                       else\r
-                       {\r
-                               halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 1, 1);\r
-                       }\r
-               }\r
+               halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1); \r
+\r
+               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
-                       halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\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
                }\r
+               */\r
 \r
+               halbtc8723b1ant_SwMechanism(pBtCoexist, TRUE);\r
+               halbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist);  //just print debug message\r
        }\r
-\r
-       if(pBtLinkInfo->bScoExist)\r
-       {\r
-               bBtCtrlAggBufSize = TRUE;\r
-               aggBufSize = 0x3;\r
-       }\r
-       else if(pBtLinkInfo->bHidExist)\r
-       {\r
-               bBtCtrlAggBufSize = TRUE;\r
-               aggBufSize = 0x5;\r
-       }\r
-       else if(pBtLinkInfo->bA2dpExist || pBtLinkInfo->bPanExist)\r
+       else\r
        {\r
-               bBtCtrlAggBufSize = TRUE;\r
-               aggBufSize = 0x8;\r
-       }\r
-       halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\r
+               halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
 \r
-       halbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist);\r
+               halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5);\r
+\r
+               halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
+               halbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist); ////just print debug message\r
+       }\r
        \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
        if(pCoexSta->bC2hBtInquiryPage)\r
        {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex],  BT Is Inquirying \n") );           \r
                halbtc8723b1ant_ActionBtInquiry(pBtCoexist);\r
                return;\r
        }\r
@@ -2674,24 +2967,26 @@ 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
 \r
 VOID\r
 halbtc8723b1ant_InitHwConfig(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
-       IN      BOOLEAN                         bBackUp\r
+       IN      BOOLEAN                         bBackUp,\r
+       IN      BOOLEAN                         bWifiOnly\r
        )\r
 {\r
        PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
        u4Byte                          u4Tmp=0;//, fwVer;\r
        u2Byte                          u2Tmp=0;\r
-       u1Byte                          u1Tmp=0;\r
+       u1Byte                          u1Tmp=0, u1Tmpa=0, u1Tmpb=0;\r
        u1Byte                          H2C_Parameter[2] ={0};\r
-       u4Byte                          cntBtCalChk=0;\r
 \r
        BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 1Ant Init HW Config!!\n"));\r
-\r
+#if 0//move to BTC_MEDIA_CONNECT\r
        if(bBackUp)\r
        {\r
                pCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\r
@@ -2699,60 +2994,61 @@ halbtc8723b1ant_InitHwConfig(
                pCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\r
                pCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\r
        }\r
+#endif\r
+       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x550, 0x8, 0x1);  //enable TBTT nterrupt\r
+\r
+       // 0x790[5:0]=0x5       \r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, 0x5);\r
        \r
-       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); //WiFi goto standby while GNT_BT 0-->1\r
-       //pBtCoexist->fBtcSetBtReg(pBtCoexist, 0, 0x3c, 0x15); //BT goto standby while GNT_BT 1-->0\r
+       // Enable counter statistics\r
+       //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x1);\r
+       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);\r
 \r
-       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x974, 0xff);\r
-       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3);\r
-       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x930, 0x77);\r
 \r
        //pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi\r
 \r
-       // BT calibration check\r
-       while(cntBtCalChk <= 20)\r
+       halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\r
+       \r
+       //Antenna config\r
+       if(bWifiOnly)\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FORCE_EXEC, TRUE, FALSE);\r
+       else\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, TRUE, FALSE);\r
+\r
+#if 0\r
+       if(bWifiOnly)\r
        {\r
-               u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x49d);\r
-               cntBtCalChk++;\r
-               if(u4Tmp & BIT0)\r
-               {\r
-                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ########### BT calibration(cnt=%d) ###########\n", cntBtCalChk));\r
-                       delay_ms(50);\r
-               }\r
-               else\r
-               {\r
-                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ********** BT NOT calibration (cnt=%d)**********\n", cntBtCalChk));\r
-                       break;\r
-               }\r
+               halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_WIFI, BTC_WIFI_STAT_INIT);\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
+#endif\r
 \r
-       // 0x790[5:0]=0x5\r
-       u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790);\r
-       u1Tmp &= 0xc0;\r
-       u1Tmp |= 0x5;\r
-       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp);\r
-       \r
-       // Enable counter statistics\r
-       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA\r
-       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x1);\r
-       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1); \r
 \r
-       //Antenna config\r
-       //halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, TRUE, FALSE);\r
-       halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, TRUE, FALSE);\r
 \r
        // PTA parameter\r
        halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\r
+\r
+       u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\r
+       u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\r
+       u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);\r
+\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",\r
+                       u4Tmp,  u1Tmpa, u1Tmpb));\r
 }\r
 \r
+/*\r
 VOID\r
 halbtc8723b1ant_WifiOffHwCfg(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
        // set wlan_act to low\r
-       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\r
+       //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\r
 }\r
+*/\r
 \r
 //============================================================\r
 // work around function start with wa_halbtc8723b1ant_\r
@@ -2761,11 +3057,87 @@ halbtc8723b1ant_WifiOffHwCfg(
 // extern function start with EXhalbtc8723b1ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8723b1ant_InitHwConfig(\r
+EXhalbtc8723b1ant_PowerOnSetting(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
+       u1Byte u1Tmp=0x0;\r
+       u2Byte u2Tmp=0x0;\r
+\r
+       pBtCoexist->bStopCoexDm = TRUE;\r
+\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x67, 0x20);\r
+\r
+       // enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly.\r
+       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
+\r
+       // \r
+       // S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info)\r
+       // Local setting bit define\r
+       //      BIT0: "0" for no antenna inverse; "1" for antenna inverse \r
+       //      BIT1: "0" for internal switch; "1" for external switch\r
+       //      BIT2: "0" for one antenna; "1" for two antenna\r
+       // NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0\r
+       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
+               {       \r
+                       pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x384, u1Tmp);\r
+               }\r
+               else if(pBtCoexist->chipInterface == BTC_INTF_SDIO)\r
+               {\r
+                       pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp);\r
+               }                       \r
+       }\r
+}\r
+\r
+VOID\r
+EXhalbtc8723b1ant_PreLoadFirmware(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       halbtc8723b1ant_InitHwConfig(pBtCoexist, TRUE);\r
+}\r
+\r
+VOID\r
+EXhalbtc8723b1ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
+{\r
+       halbtc8723b1ant_InitHwConfig(pBtCoexist, TRUE, bWifiOnly);\r
+       pBtCoexist->bStopCoexDm = FALSE;\r
 }\r
 \r
 VOID\r
@@ -2794,12 +3166,9 @@ 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;\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
+       static u1Byte                   PopReportIn10s = 0;     \r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
        CL_PRINTF(cliBuf);\r
@@ -2819,13 +3188,6 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
                CL_PRINTF(cliBuf);\r
        }\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d", "Ant PG Num/ Ant Mech/ Ant Pos:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos);\r
        CL_PRINTF(cliBuf);      \r
@@ -2840,59 +3202,50 @@ 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, 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_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s", "Wifi bHi-Pri/ Wifi CCK locked", \\r
+               (pCoexSta->bWiFiIsHighPriTask? "Yes":"No"),\r
+               (pCoexSta->bCCKLock? "Lock":"noLock") );\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
+       // 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
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \\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
                (  (BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy")))),\r
-               pCoexSta->btRssi, pCoexSta->btRetryCnt);\r
+               pCoexSta->btRssi, pCoexSta->btRetryCnt, pCoexSta->popEventCnt);\r
        CL_PRINTF(cliBuf);\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
+       if (PopReportIn10s >= 5)\r
+       {\r
+               pCoexSta->popEventCnt = 0;      \r
+               PopReportIn10s = 0;\r
+       }\r
+       \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
+       {\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
@@ -2911,13 +3264,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
@@ -2948,13 +3294,19 @@ EXhalbtc8723b1ant_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", "IgnWlanAct", \\r
                        pCoexDm->bCurIgnoreWlanAct);\r
                CL_PRINTF(cliBuf);\r
        \r
+               /*\r
                CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "Latest error condition(should be 0)", \\r
                        pCoexDm->errorCondition);\r
                CL_PRINTF(cliBuf);\r
+               */\r
        }\r
 \r
        // Hw setting           \r
@@ -2982,9 +3334,10 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
 \r
        u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\r
        u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);\r
-       u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x948/ 0x67[5] / 0x765", \\r
-               u4Tmp[0], ((u1Tmp[0]&0x20)>> 5), u1Tmp[1]);\r
+       u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x764);\r
+       u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0x948/ 0x67[5] / 0x764 / 0x76e", \\r
+               u4Tmp[0], ((u1Tmp[0]&0x20)>> 5), (u4Tmp[1] & 0xffff), u1Tmp[1]);\r
        CL_PRINTF(cliBuf);\r
 \r
        u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x92c);\r
@@ -3030,6 +3383,15 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
                u4Tmp[0]&0xffff, faOfdm, faCck);\r
        CL_PRINTF(cliBuf);\r
 \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
@@ -3044,7 +3406,7 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
                pCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\r
        CL_PRINTF(cliBuf);\r
 #if(BT_AUTO_REPORT_ONLY_8723B_1ANT == 1)\r
-       halbtc8723b1ant_MonitorBtCtr(pBtCoexist);\r
+       //halbtc8723b1ant_MonitorBtCtr(pBtCoexist);\r
 #endif\r
        pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\r
 }\r
@@ -3065,21 +3427,21 @@ EXhalbtc8723b1ant_IpsNotify(
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n"));\r
                pCoexSta->bUnderIps = TRUE;\r
-               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, 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_WifiOffHwCfg(pBtCoexist);\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
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n"));\r
-               pCoexSta->bUnderIps = FALSE;\r
-               //halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, TRUE, FALSE);\r
-               //halbtc8723b1ant_RunCoexistMechanism(pBtCoexist);\r
 \r
-               halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE);\r
+               halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\r
                halbtc8723b1ant_InitCoexDm(pBtCoexist);\r
                halbtc8723b1ant_QueryBtInfo(pBtCoexist);\r
+\r
+               pCoexSta->bUnderIps = FALSE;\r
        }\r
 }\r
 \r
@@ -3116,25 +3478,42 @@ EXhalbtc8723b1ant_ScanNotify(
        BOOLEAN bBtCtrlAggBufSize=FALSE;\r
        u1Byte  aggBufSize=5;\r
 \r
+       u1Byte u1Tmpa, u1Tmpb;\r
+       u4Byte u4Tmp;\r
+\r
        if(pBtCoexist->bManualControl ||\r
-               pBtCoexist->bStopCoexDm ||\r
-               pBtCoexist->btInfo.bBtDisabled )\r
+               pBtCoexist->bStopCoexDm )\r
                return;\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
-\r
        if(BTC_SCAN_START == type)\r
        {\r
                pCoexSta->bWiFiIsHighPriTask = TRUE;\r
                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
+          \r
+          \r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",\r
+                       u4Tmp,  u1Tmpa, u1Tmpb));\r
        }\r
        else\r
        {\r
                pCoexSta->bWiFiIsHighPriTask = FALSE;   \r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));\r
+\r
+               pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &pCoexSta->nScanAPNum);              \r
        }\r
 \r
+       if(pBtCoexist->btInfo.bBtDisabled)\r
+               return;\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
+\r
        halbtc8723b1ant_QueryBtInfo(pBtCoexist);\r
        \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
@@ -3204,12 +3583,16 @@ EXhalbtc8723b1ant_ConnectNotify(
        if(BTC_ASSOCIATE_START == type)\r
        {\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
        else\r
        {\r
                pCoexSta->bWiFiIsHighPriTask = FALSE;   \r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));       \r
+               //pCoexDm->nArpCnt = 0;\r
        }\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
@@ -3264,6 +3647,7 @@ EXhalbtc8723b1ant_MediaStatusNotify(
        u1Byte                  H2C_Parameter[3] ={0};\r
        u4Byte                  wifiBw;\r
        u1Byte                  wifiCentralChnl;\r
+       BOOLEAN                 bWifiUnderBMode = FALSE;\r
 \r
        if(pBtCoexist->bManualControl ||\r
                pBtCoexist->bStopCoexDm ||\r
@@ -3273,10 +3657,34 @@ EXhalbtc8723b1ant_MediaStatusNotify(
        if(BTC_MEDIA_CONNECT == type)\r
        {\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
+               if (bWifiUnderBMode)\r
+               {\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x00); //CCK Tx\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x00); //CCK Rx\r
+               }\r
+               else\r
+               {\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x10); //CCK Tx\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x10); //CCK Rx\r
+               }\r
+               \r
+               pCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\r
+               pCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);\r
+               pCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\r
+               pCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\r
        }\r
        else\r
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n"));\r
+               pCoexDm->nArpCnt = 0;\r
+\r
+               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x0); //CCK Tx\r
+               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x0); //CCK Rx\r
        }\r
 \r
        // only 2.4G we need to inform bt the chnl mask\r
@@ -3321,16 +3729,29 @@ EXhalbtc8723b1ant_SpecialPacketNotify(
                pBtCoexist->btInfo.bBtDisabled )\r
                return;\r
 \r
-       if( BTC_PACKET_DHCP == type ||   BTC_PACKET_EAPOL == type ||BTC_PACKET_ARP == type)\r
+       if( BTC_PACKET_DHCP == type || \r
+               BTC_PACKET_EAPOL == type ||\r
+               BTC_PACKET_ARP == type )\r
        {\r
-               pCoexSta->bWiFiIsHighPriTask = TRUE;\r
-\r
                if (BTC_PACKET_ARP == type)\r
                {\r
                        BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet ARP notify\n"));            \r
+\r
+                       pCoexDm->nArpCnt++;\r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], ARP Packet Count = %d\n", pCoexDm->nArpCnt));\r
+                       \r
+                       if(pCoexDm->nArpCnt >= 10) // if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist) \r
+                       {\r
+                               pCoexSta->bWiFiIsHighPriTask = FALSE;                                   \r
+                       }                       \r
+                       else\r
+                       {\r
+                               pCoexSta->bWiFiIsHighPriTask = TRUE;\r
+                       }\r
                }\r
                else\r
                {\r
+                       pCoexSta->bWiFiIsHighPriTask = TRUE;\r
                        BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet DHCP or EAPOL notify\n"));          \r
                }\r
        } \r
@@ -3365,9 +3786,9 @@ EXhalbtc8723b1ant_SpecialPacketNotify(
        }\r
 \r
        if( BTC_PACKET_DHCP == type ||\r
-               BTC_PACKET_EAPOL == type  || BTC_PACKET_ARP == type)\r
-       {\r
-               //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet(%d) notify\n", type));\r
+               BTC_PACKET_EAPOL == type || \r
+               ( (BTC_PACKET_ARP == type ) && (pCoexSta->bWiFiIsHighPriTask) ) )\r
+               {\r
                halbtc8723b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\r
        }\r
 }\r
@@ -3398,7 +3819,6 @@ EXhalbtc8723b1ant_BtInfoNotify(
                pCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];\r
                if(i == 1)\r
                        btInfo = tmpBuf[i];\r
-               \r
                if(i == length-1)\r
                {\r
                        BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i]));\r
@@ -3407,30 +3827,41 @@ EXhalbtc8723b1ant_BtInfoNotify(
                {\r
                        BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i]));\r
                }\r
-                       \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
                        pCoexSta->btInfoC2h[rspSource][2]&0xf;\r
 \r
+               if (pCoexSta->btRetryCnt >= 1)\r
+                       pCoexSta->popEventCnt++;\r
+\r
                if (pCoexSta->btInfoC2h[rspSource][2]&0x20)\r
                        pCoexSta->bC2hBtPage = TRUE;\r
                else\r
                        pCoexSta->bC2hBtPage = FALSE;                   \r
 \r
                pCoexSta->btRssi =\r
-                       pCoexSta->btInfoC2h[rspSource][3]*2+10;\r
+                       pCoexSta->btInfoC2h[rspSource][3]*2-90;\r
+                       //pCoexSta->btInfoC2h[rspSource][3]*2+10;\r
 \r
                pCoexSta->btInfoExt = \r
                        pCoexSta->btInfoC2h[rspSource][4];\r
                \r
-               if (!(pCoexSta->btInfoC2h[rspSource][2] & 0x40))\r
+               pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);\r
+               if(!pCoexSta->bBtTxRxMask)\r
                {\r
-                       /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch GNT_BT */                         \r
-                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch GNT_BT since BT RF REG 0x3C != 0x15\n"));\r
-                       pBtCoexist->fBtcSetBtReg(pBtCoexist, 0, 0x3c, 0x15);\r
+                       /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */                            \r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n"));\r
+                       pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15);\r
                }\r
                \r
                // Here we need to resend some wifi info to BT\r
@@ -3487,6 +3918,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
@@ -3507,10 +3940,16 @@ EXhalbtc8723b1ant_BtInfoNotify(
                        pCoexSta->bScoExist = TRUE;\r
                else\r
                        pCoexSta->bScoExist = FALSE;\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->bBtHiPriLinkExist = TRUE;\r
        }\r
 \r
        halbtc8723b1ant_UpdateBtLinkInfo(pBtCoexist);\r
        \r
+       btInfo = btInfo & 0x1f;  //mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41)\r
+       \r
        if(!(btInfo&BT_INFO_8723B_1ANT_B_CONNECTION))\r
        {\r
                pCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE;\r
@@ -3551,6 +3990,46 @@ EXhalbtc8723b1ant_BtInfoNotify(
        halbtc8723b1ant_RunCoexistMechanism(pBtCoexist);\r
 }\r
 \r
+VOID\r
+EXhalbtc8723b1ant_RfStatusNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                                  type\r
+       )\r
+{\r
+       u4Byte  u4Tmp;\r
+       u1Byte  u1Tmpa,u1Tmpb, u1Tmpc;\r
+       \r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], RF Status notify\n"));\r
+\r
+       if(BTC_RF_ON == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], RF is turned ON!!\n"));\r
+               pBtCoexist->bStopCoexDm = FALSE;\r
+       }\r
+       else if(BTC_RF_OFF == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], RF is turned OFF!!\n"));\r
+               \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, 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
+               pBtCoexist->bStopCoexDm = TRUE;\r
+\r
+               u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\r
+               u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\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
+\r
+       }\r
+}\r
+\r
 VOID\r
 EXhalbtc8723b1ant_HaltNotify(\r
        IN      PBTC_COEXIST                    pBtCoexist\r
@@ -3560,16 +4039,16 @@ EXhalbtc8723b1ant_HaltNotify(
        \r
        BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n"));\r
 \r
-       pBtCoexist->bStopCoexDm = TRUE;\r
-\r
-       halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
-       halbtc8723b1ant_WifiOffHwCfg(pBtCoexist);\r
-       halbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
-\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, 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
 \r
        EXhalbtc8723b1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\r
+\r
+       pBtCoexist->bStopCoexDm = TRUE; \r
 }\r
 \r
 VOID\r
@@ -3583,24 +4062,20 @@ EXhalbtc8723b1ant_PnpNotify(
        if(BTC_WIFI_PNP_SLEEP == pnpState)\r
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n"));\r
-               pBtCoexist->bStopCoexDm = TRUE;\r
-               /*\r
-               halbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
-               halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
-               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);      \r
-               */\r
 \r
-               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\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_WifiOffHwCfg(pBtCoexist);\r
+               //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\r
+\r
+               pBtCoexist->bStopCoexDm = TRUE;\r
        }\r
        else if(BTC_WIFI_PNP_WAKE_UP == pnpState)\r
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n"));\r
                pBtCoexist->bStopCoexDm = FALSE;\r
-               halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE);\r
+               halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\r
                halbtc8723b1ant_InitCoexDm(pBtCoexist);\r
                halbtc8723b1ant_QueryBtInfo(pBtCoexist);\r
        }\r
@@ -3613,9 +4088,9 @@ EXhalbtc8723b1ant_CoexDmReset(
 {\r
        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], *****************Coex DM Reset*****************\n"));\r
 \r
-       halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE);\r
-       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
-       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x2, 0xfffff, 0x0);\r
+       halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\r
+       //pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
+       //pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x2, 0xfffff, 0x0);\r
        halbtc8723b1ant_InitCoexDm(pBtCoexist);\r
 }\r
 \r
@@ -3648,16 +4123,16 @@ EXhalbtc8723b1ant_Periodical(
 \r
 #if(BT_AUTO_REPORT_ONLY_8723B_1ANT == 0)\r
        halbtc8723b1ant_QueryBtInfo(pBtCoexist);\r
-       halbtc8723b1ant_MonitorBtCtr(pBtCoexist);\r
        halbtc8723b1ant_MonitorBtEnableDisable(pBtCoexist);\r
 #else\r
+       halbtc8723b1ant_MonitorBtCtr(pBtCoexist);\r
+       halbtc8723b1ant_MonitorWiFiCtr(pBtCoexist);\r
+\r
        if( halbtc8723b1ant_IsWifiStatusChanged(pBtCoexist) ||\r
                pCoexDm->bAutoTdmaAdjust )\r
        {\r
-               //if(pCoexSta->specialPktPeriodCnt > 2)\r
-               //{\r
-                       halbtc8723b1ant_RunCoexistMechanism(pBtCoexist);        \r
-               //}\r
+\r
+               halbtc8723b1ant_RunCoexistMechanism(pBtCoexist);        \r
        }\r
 \r
        pCoexSta->specialPktPeriodCnt++;\r
index f6db10a686753d6f8f649e6a484a1384caf876c5..f7ebc96e8bd9f11066a5a87ab9faeef0edb0ca84 100644 (file)
@@ -17,6 +17,8 @@
 \r
 #define        BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT             2\r
 \r
+#define  BT_8723B_1ANT_WIFI_NOISY_THRESH                                                               30   //max: 255\r
+\r
 typedef enum _BT_INFO_SRC_8723B_1ANT{\r
        BT_INFO_SRC_8723B_1ANT_WIFI_FW                  = 0x0,\r
        BT_INFO_SRC_8723B_1ANT_BT_RSP                           = 0x1,\r
@@ -60,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
@@ -109,6 +114,7 @@ typedef struct _COEX_DM_8723B_1ANT{
        u1Byte          curRetryLimitType;\r
        u1Byte          preAmpduTimeType;\r
        u1Byte          curAmpduTimeType;\r
+       u4Byte          nArpCnt;\r
 \r
        u1Byte          errorCondition;\r
 } COEX_DM_8723B_1ANT, *PCOEX_DM_8723B_1ANT;\r
@@ -119,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
@@ -127,27 +134,56 @@ typedef struct _COEX_STA_8723B_1ANT{
        u4Byte                                  highPriorityRx;\r
        u4Byte                                  lowPriorityTx;\r
        u4Byte                                  lowPriorityRx;\r
-       u1Byte                                  btRssi;\r
+       s1Byte                                  btRssi;\r
+       BOOLEAN                                 bBtTxRxMask;\r
        u1Byte                                  preBtRssiState;\r
        u1Byte                                  preWifiRssiState[4];\r
        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
        u1Byte                                  btRetryCnt;\r
        u1Byte                                  btInfoExt;\r
-       BOOLEAN                                 bWiFiIsHighPriTask;\r
-       BOOLEAN                                 bC2hBtPage;\r
+       u4Byte                                  popEventCnt;\r
+       u1Byte                                  nScanAPNum;\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
+       BOOLEAN                                 bCCKLock;\r
+       BOOLEAN                                 bPreCCKLock;\r
+       u1Byte                                  nCoexTableType;\r
+\r
+       BOOLEAN                                 bForceLpsOn;\r
 }COEX_STA_8723B_1ANT, *PCOEX_STA_8723B_1ANT;\r
 \r
 //===========================================\r
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8723b1ant_InitHwConfig(\r
+EXhalbtc8723b1ant_PowerOnSetting(\r
+       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
+       );\r
+VOID\r
 EXhalbtc8723b1ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
@@ -188,6 +224,11 @@ EXhalbtc8723b1ant_BtInfoNotify(
        IN      u1Byte                  length\r
        );\r
 VOID\r
+EXhalbtc8723b1ant_RfStatusNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                                  type\r
+       );\r
+VOID\r
 EXhalbtc8723b1ant_HaltNotify(\r
        IN      PBTC_COEXIST                    pBtCoexist\r
        );\r
index dc29ba287a3a7e322a10da7e425568307f253cf6..096b30da729d5f7a4d4541897e058d96c7b39029 100644 (file)
@@ -27,8 +27,8 @@ const char *const GLBtInfoSrc8723b2Ant[]={
        "BT Info[bt auto report]",\r
 };\r
 \r
-u4Byte GLCoexVerDate8723b2Ant=20131113;\r
-u4Byte GLCoexVer8723b2Ant=0x3f;\r
+u4Byte GLCoexVerDate8723b2Ant=20140730;\r
+u4Byte GLCoexVer8723b2Ant=0x42;\r
 \r
 //============================================================\r
 // local function proto type if needed\r
@@ -303,6 +303,31 @@ halbtc8723b2ant_MonitorBtEnableDisable(
        }\r
 }\r
 \r
+VOID\r
+halbtc8723b2ant_LimitedRx(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bForceExec,\r
+       IN      BOOLEAN                         bRejApAggPkt,\r
+       IN      BOOLEAN                         bBtCtrlAggBufSize,\r
+       IN      u1Byte                          aggBufSize\r
+       )\r
+{\r
+       BOOLEAN bRejectRxAgg=bRejApAggPkt;\r
+       BOOLEAN bBtCtrlRxAggSize=bBtCtrlAggBufSize;\r
+       u1Byte  rxAggSize=aggBufSize;\r
+\r
+       //============================================\r
+       //      Rx Aggregation related setting\r
+       //============================================\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg);\r
+       // decide BT control aggregation buf size or not\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize);\r
+       // aggregation buf size, only work when BT control Rx aggregation size.\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);\r
+       // real update aggregation setting\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);\r
+}\r
+\r
 VOID\r
 halbtc8723b2ant_MonitorBtCtr(\r
        IN      PBTC_COEXIST            pBtCoexist\r
@@ -337,6 +362,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
@@ -362,6 +429,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
@@ -385,6 +454,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
@@ -685,50 +763,6 @@ halbtc8723b2ant_ActionAlgorithm(
        return algorithm;\r
 }\r
 \r
-BOOLEAN\r
-halbtc8723b2ant_NeedToDecBtPwr(\r
-       IN      PBTC_COEXIST            pBtCoexist\r
-       )\r
-{\r
-       BOOLEAN         bRet=FALSE;\r
-       BOOLEAN         bBtHsOn=FALSE, bWifiConnected=FALSE;\r
-       s4Byte          btHsRssi=0;\r
-       u1Byte          btRssiState;\r
-\r
-       if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn))\r
-               return FALSE;\r
-       if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected))\r
-               return FALSE;\r
-       if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi))\r
-               return FALSE;\r
-\r
-       btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
-\r
-       if(bWifiConnected)\r
-       {\r
-               if(bBtHsOn)\r
-               {\r
-                       if(btHsRssi > 37)\r
-                       {\r
-                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for HS mode!!\n"));\r
-                               bRet = TRUE;\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
-                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
-                       {\r
-               \r
-                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for Wifi is connected!!\n"));\r
-                               bRet = TRUE;\r
-                       }\r
-               }\r
-       }\r
-       \r
-       return bRet;\r
-}\r
-\r
 VOID\r
 halbtc8723b2ant_SetFwDacSwingLevel(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
@@ -750,20 +784,15 @@ halbtc8723b2ant_SetFwDacSwingLevel(
 VOID\r
 halbtc8723b2ant_SetFwDecBtPwr(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
-       IN      BOOLEAN                 bDecBtPwr\r
+       IN      u1Byte                          decBtPwrLvl\r
        )\r
 {\r
        u1Byte                  H2C_Parameter[1] ={0};\r
        \r
-       H2C_Parameter[0] = 0;\r
+       H2C_Parameter[0] = decBtPwrLvl;\r
 \r
-       if(bDecBtPwr)\r
-       {\r
-               H2C_Parameter[0] |= BIT1;\r
-       }\r
-\r
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], decrease Bt Power : %s, FW write 0x62=0x%x\n", \r
-               (bDecBtPwr? "Yes!!":"No!!"), H2C_Parameter[0]));\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], decrease Bt Power level = %d, FW write 0x62=0x%x\n", \r
+               decBtPwrLvl, H2C_Parameter[0]));\r
 \r
        pBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, H2C_Parameter);    \r
 }\r
@@ -772,24 +801,24 @@ VOID
 halbtc8723b2ant_DecBtPwr(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
        IN      BOOLEAN                 bForceExec,\r
-       IN      BOOLEAN                 bDecBtPwr\r
+       IN      u1Byte                          decBtPwrLvl\r
        )\r
 {\r
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s Dec BT power = %s\n",  \r
-               (bForceExec? "force to":""), ((bDecBtPwr)? "ON":"OFF")));\r
-       pCoexDm->bCurDecBtPwr = bDecBtPwr;\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s Dec BT power level = %d\n",  \r
+               (bForceExec? "force to":""), decBtPwrLvl));\r
+       pCoexDm->curBtDecPwrLvl = decBtPwrLvl;\r
 \r
        if(!bForceExec)\r
        {\r
-               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreDecBtPwr=%d, bCurDecBtPwr=%d\n", \r
-                       pCoexDm->bPreDecBtPwr, pCoexDm->bCurDecBtPwr));\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preBtDecPwrLvl=%d, curBtDecPwrLvl=%d\n", \r
+                       pCoexDm->preBtDecPwrLvl, pCoexDm->curBtDecPwrLvl));\r
 \r
-               if(pCoexDm->bPreDecBtPwr == pCoexDm->bCurDecBtPwr\r
+               if(pCoexDm->preBtDecPwrLvl == pCoexDm->curBtDecPwrLvl\r
                        return;\r
        }\r
-       halbtc8723b2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->bCurDecBtPwr);\r
+       halbtc8723b2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->curBtDecPwrLvl);\r
 \r
-       pCoexDm->bPreDecBtPwr = pCoexDm->bCurDecBtPwr;\r
+       pCoexDm->preBtDecPwrLvl = pCoexDm->curBtDecPwrLvl;\r
 }\r
 \r
 VOID\r
@@ -1225,46 +1254,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, 0x5afa5afa, 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
@@ -1290,6 +1330,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
@@ -1366,7 +1455,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
@@ -1379,9 +1468,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
@@ -1401,26 +1490,34 @@ halbtc8723b2ant_SetAntPath(
        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
-       if((fwVer<0xc0000) || bPgExtSwitch)\r
+       if((fwVer>0 && fwVer<0xc0000) || bPgExtSwitch)\r
                bUseExtSwitch = TRUE;\r
 \r
        if(bInitHwCfg)\r
        {\r
-               // 0x4c[23]=0, 0x4c[24]=1  Antenna control by WL/BT\r
-               u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\r
-               u4Tmp &=~BIT23;\r
-               u4Tmp |= BIT24;\r
-               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
-\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x39, 0x8, 0x1);\r
                pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x974, 0xff);\r
                pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3);\r
                pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x930, 0x77);\r
                pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1);\r
 \r
-               //Force GNT_BT to low\r
-               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x0);\r
+               if(fwVer >= 0x180000)\r
+               {\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, 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
+               //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
                        //tell firmware "no antenna inverse"\r
@@ -1444,11 +1541,32 @@ halbtc8723b2ant_SetAntPath(
                }\r
                pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\r
        }\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
        {\r
+               if (bInitHwCfg)\r
+               {\r
+                       // 0x4c[23]=0, 0x4c[24]=1  Antenna control by WL/BT\r
+                       u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\r
+                       u4Tmp &=~BIT23;\r
+                       u4Tmp |= BIT24;\r
+                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
+               }\r
+               \r
                pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT\r
                switch(antPosType)\r
                {\r
@@ -1462,8 +1580,16 @@ halbtc8723b2ant_SetAntPath(
        }\r
        else    // internal switch\r
        {\r
-               // fixed ext switch\r
-               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1);\r
+               if (bInitHwCfg)\r
+               {\r
+                       // 0x4c[23]=0, 0x4c[24]=1  Antenna control by WL/BT\r
+                       u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\r
+                       u4Tmp |= BIT23;\r
+                       u4Tmp &=~BIT24;\r
+                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
+               }\r
+               \r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //fixed external switch S1->Main, S0->Aux\r
                switch(antPosType)\r
                {\r
                        case BTC_ANT_WIFI_AT_MAIN:\r
@@ -1486,6 +1612,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
@@ -1509,10 +1645,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
@@ -1521,10 +1659,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
@@ -1533,28 +1673,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
@@ -1572,7 +1720,47 @@ 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, 0x21, 0x03, 0x70, 0x50);\r
+                               break;          \r
+                       case 104:\r
+                       case 108:\r
+                       case 112:\r
+                       case 116:       \r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x21, 0x03, 0x70, 0x50);\r
+                               break;  \r
+                       case 109:\r
+                               //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\r
+                               halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90);\r
+                               break;\r
+                       case 113:       \r
+                               //halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);\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
@@ -1598,15 +1786,92 @@ 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, FALSE);\r
+       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
        // sw all off\r
        halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
@@ -1623,10 +1888,12 @@ 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, FALSE);\r
+       halbtc8723b2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, 0);\r
 \r
        halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
        halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
@@ -1637,38 +1904,88 @@ 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
+               halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\r
        }       \r
+       \r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);\r
-       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\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_IsCommonAction(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
+       u1Byte                  btRssiState=BTC_RSSI_STATE_HIGH;\r
        BOOLEAN                 bCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;\r
        BOOLEAN                 bBtHsOn=FALSE, bLowPwrDisable=FALSE;\r
 \r
@@ -1680,14 +1997,17 @@ halbtc8723b2ant_IsCommonAction(
        {\r
                bLowPwrDisable = FALSE;\r
                pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+               halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
 \r
                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non-connected idle!!\n"));\r
 \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, FALSE);\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
@@ -1700,14 +2020,17 @@ halbtc8723b2ant_IsCommonAction(
                {\r
                        bLowPwrDisable = FALSE;\r
                        pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+                       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
 \r
                        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT non connected-idle!!\n"));\r
 \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, FALSE);\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
@@ -1722,12 +2045,15 @@ halbtc8723b2ant_IsCommonAction(
                        if(bBtHsOn)\r
                                return FALSE;\r
                        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT connected-idle!!\n"));\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, 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, FALSE);\r
+                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
                        halbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
                        halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
@@ -1746,22 +2072,31 @@ halbtc8723b2ant_IsCommonAction(
                        }\r
                        else\r
                        {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n"));\r
+                               bCommon = FALSE;\r
+                       \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, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 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
+                               \r
+                               halbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);                                                       \r
                                halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 21);\r
                                halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);\r
-                               if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-                                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+                               if(BTC_RSSI_HIGH(btRssiState))\r
+                                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
                                else    \r
-                                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\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
+                               */\r
                        }\r
                }       \r
        }\r
@@ -2685,19 +3020,22 @@ halbtc8723b2ant_ActionSco(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       u1Byte  wifiRssiState;\r
+       u1Byte  wifiRssiState, btRssiState;\r
        u4Byte  wifiBw;\r
 \r
        wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 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
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
+       \r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 4);\r
 \r
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
        \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
 \r
@@ -2710,6 +3048,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
@@ -2753,16 +3092,18 @@ 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
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
+       \r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
 \r
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
 \r
@@ -2775,6 +3116,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
@@ -2827,19 +3170,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, FALSE);\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
@@ -2855,18 +3204,31 @@ 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
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
 \r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
 \r
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\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
@@ -2915,21 +3277,34 @@ halbtc8723b2ant_ActionA2dpPanHs(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       u1Byte          wifiRssiState;\r
+       u1Byte          wifiRssiState, wifiRssiState1, btRssiState;\r
        u4Byte          wifiBw;\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->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
+       \r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
 \r
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\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
@@ -2970,22 +3345,34 @@ 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
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
+\r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
 \r
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\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
@@ -3036,27 +3423,27 @@ halbtc8723b2ant_ActionPanHs(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       u1Byte          wifiRssiState;\r
+       u1Byte          wifiRssiState, wifiRssiState1, btRssiState;\r
        u4Byte          wifiBw;\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->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
+\r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
 \r
-       if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
-               (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
-       {\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
-       }\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else\r
-       {\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
-       }\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
        \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
@@ -3096,20 +3483,28 @@ 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
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
+\r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
 \r
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\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
@@ -3117,6 +3512,7 @@ halbtc8723b2ant_ActionPanEdrA2dp(
                (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
@@ -3124,7 +3520,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
@@ -3164,17 +3560,31 @@ 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
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
+\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\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
@@ -3182,13 +3592,13 @@ halbtc8723b2ant_ActionPanEdrHid(
                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
@@ -3196,7 +3606,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
@@ -3238,24 +3648,36 @@ 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
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
+\r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
 \r
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\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
@@ -3306,33 +3728,67 @@ 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(2, 29, 0);\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
-       halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x5);\r
 \r
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
-       else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+       halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+       if(BTC_WIFI_BW_LEGACY == wifiBw)\r
+       {\r
+               if(BTC_RSSI_HIGH(btRssiState))\r
+                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
+               else if(BTC_RSSI_MEDIUM(btRssiState))\r
+                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
+       else    \r
+                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
+       }\r
+       else    \r
+       {       // only 802.11N mode we have to dec bt power to 4 degree\r
+               if(BTC_RSSI_HIGH(btRssiState))\r
+               {\r
+                       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\r
+                       // need to check ap Number of Not\r
+                       if(apNum < 10)\r
+                               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\r
+                       else\r
+                               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
+               }\r
+               else if(BTC_RSSI_MEDIUM(btRssiState))\r
+                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
+               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, 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
@@ -3366,6 +3822,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
@@ -3374,6 +3867,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
@@ -3389,6 +3887,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
@@ -3398,11 +3903,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
@@ -3477,29 +4024,37 @@ halbtc8723b2ant_WifiOffHwCfg(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       PADAPTER padapter=pBtCoexist->Adapter;\r
+       BOOLEAN bIsInMpMode = FALSE;\r
+       u1Byte H2C_Parameter[2] ={0};\r
+       u4Byte fwVer=0;\r
+\r
        // set wlan_act to low\r
        pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\r
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); //WiFi goto standby while GNT_BT 0-->1\r
-        \r
-       //Force GNT_BT to High\r
-       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x3);\r
-       if(padapter->registrypriv.mp_mode ==0)  \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\r
+       if(fwVer >= 0x180000)\r
+       {\r
+       /* Use H2C to set GNT_BT to HIGH */\r
+       H2C_Parameter[0] = 1;\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\r
+       }\r
+       else\r
+       {\r
+               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);\r
+       }\r
+       \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE, &bIsInMpMode);\r
+       if(!bIsInMpMode)\r
                pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x0); //BT select s0/s1 is controlled by BT\r
        else\r
                pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi\r
 }\r
 \r
-//============================================================\r
-// work around function start with wa_halbtc8723b2ant_\r
-//============================================================\r
-//============================================================\r
-// extern function start with EXhalbtc8723b2ant_\r
-//============================================================\r
 VOID\r
-EXhalbtc8723b2ant_InitHwConfig(\r
-       IN      PBTC_COEXIST            pBtCoexist\r
+halbtc8723b2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bBackUp\r
        )\r
 {\r
        PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
@@ -3511,9 +4066,6 @@ EXhalbtc8723b2ant_InitHwConfig(
 \r
        BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n"));\r
 \r
-       //pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); //WiFi goto standby while GNT_BT 0-->1\r
-       //pBtCoexist->fBtcSetBtReg(pBtCoexist, 0, 0x3c, 0x1); //BT goto standby while GNT_BT 1-->0\r
-\r
        // backup rf 0x1e value\r
        pCoexDm->btRf0x1eBackup = \r
                pBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff);  \r
@@ -3526,16 +4078,111 @@ EXhalbtc8723b2ant_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
 \r
-       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); //WiFi goto standby while GNT_BT 0-->1\r
+//============================================================\r
+// work around function start with wa_halbtc8723b2ant_\r
+//============================================================\r
+//============================================================\r
+// extern function start with EXhalbtc8723b2ant_\r
+//============================================================\r
+VOID\r
+EXhalbtc8723b2ant_PowerOnSetting(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
+       u2Byte u2Tmp=0x0;\r
+\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x67, 0x20);\r
+\r
+       // enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly.\r
+       u2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x2);\r
+       pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x2, u2Tmp|BIT0|BIT1);\r
+\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
+       // Local setting bit define\r
+       //      BIT0: "0" for no antenna inverse; "1" for antenna inverse \r
+       //      BIT1: "0" for internal switch; "1" for external switch\r
+       //      BIT2: "0" for one antenna; "1" for two antenna\r
+       // NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0\r
+       if(pBtCoexist->chipInterface == BTC_INTF_USB)\r
+       {\r
+               // fixed at S0 for USB interface\r
+               u1Tmp |= 0x1;   // antenna inverse\r
+               pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp);\r
+       }\r
+       else\r
+       {\r
+               // for PCIE and SDIO interface, we check efuse 0xc3[6]\r
+               if(pBoardInfo->singleAntPath == 0)\r
+               {\r
+               }\r
+               else if(pBoardInfo->singleAntPath == 1)\r
+               {\r
+                       // set to S0\r
+                       u1Tmp |= 0x1;   // antenna inverse\r
+               }\r
+\r
+               if(pBtCoexist->chipInterface == BTC_INTF_PCI)\r
+               {       \r
+                       pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x384, u1Tmp);\r
+               }\r
+               else if(pBtCoexist->chipInterface == BTC_INTF_SDIO)\r
+               {\r
+                       pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp);\r
+               }                       \r
+       }\r
+}\r
+\r
+VOID\r
+EXhalbtc8723b2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
+{\r
+       halbtc8723b2ant_InitHwConfig(pBtCoexist, TRUE);\r
 }\r
 \r
 VOID\r
@@ -3559,13 +4206,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
@@ -3578,13 +4220,6 @@ EXhalbtc8723b2ant_DisplayCoexInfo(
                CL_PRINTF(cliBuf);\r
        }\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);\r
@@ -3599,46 +4234,23 @@ 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_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
+       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
@@ -3664,12 +4276,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
@@ -3691,8 +4297,12 @@ 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->bCurDecBtPwr, pCoexDm->bCurIgnoreWlanAct);\r
+               pCoexDm->curBtDecPwrLvl, pCoexDm->bCurIgnoreWlanAct);\r
        CL_PRINTF(cliBuf);\r
 \r
        // Hw setting           \r
@@ -3761,6 +4371,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
@@ -3776,7 +4394,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
@@ -3800,7 +4418,7 @@ EXhalbtc8723b2ant_IpsNotify(
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n"));\r
                pCoexSta->bUnderIps = FALSE;\r
-               EXhalbtc8723b2ant_InitHwConfig(pBtCoexist);\r
+               halbtc8723b2ant_InitHwConfig(pBtCoexist, FALSE);\r
                halbtc8723b2ant_InitCoexDm(pBtCoexist);\r
                halbtc8723b2ant_QueryBtInfo(pBtCoexist);\r
        }\r
@@ -3830,6 +4448,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
@@ -3838,6 +4465,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
@@ -3865,6 +4495,7 @@ EXhalbtc8723b2ant_MediaStatusNotify(
        u1Byte                  H2C_Parameter[3] ={0};\r
        u4Byte                  wifiBw;\r
        u1Byte                  wifiCentralChnl;\r
+       u1Byte                  apNum=0;\r
 \r
        if(BTC_MEDIA_CONNECT == type)\r
        {\r
@@ -3886,7 +4517,13 @@ EXhalbtc8723b2ant_MediaStatusNotify(
                if(BTC_WIFI_BW_HT40 == wifiBw)\r
                        H2C_Parameter[2] = 0x30;\r
                else\r
-                       H2C_Parameter[2] = 0x20;\r
+               {\r
+                       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\r
+                       if(apNum < 10)\r
+                               H2C_Parameter[2] = 0x30;\r
+                       else\r
+                               H2C_Parameter[2] = 0x20;\r
+       }\r
        }\r
        \r
        pCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];\r
@@ -3955,6 +4592,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
@@ -3966,11 +4609,13 @@ EXhalbtc8723b2ant_BtInfoNotify(
                pCoexSta->btInfoExt = \r
                        pCoexSta->btInfoC2h[rspSource][4];\r
 \r
-               if (pCoexSta->btInfoC2h[rspSource][2] & 0x40)\r
+               pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);\r
+               if (pCoexSta->bBtTxRxMask)\r
                {\r
-                       /* BT into is responded by BT FW and BT RF REG 0x3C != 0x01 => Need to switch GNT_BT */                         \r
-                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch GNT_BT since BT RF REG 0x3C != 0x01\n"));\r
-                       pBtCoexist->fBtcSetBtReg(pBtCoexist, 0, 0x3c, 0x01);\r
+                       /* BT into is responded by BT FW and BT RF REG 0x3C != 0x01 => Need to switch BT TRx Mask */                            \r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x01\n"));\r
+                       pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01);\r
                }\r
 \r
                // Here we need to resend some wifi info to BT\r
@@ -4104,27 +4749,49 @@ EXhalbtc8723b2ant_HaltNotify(
        BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n"));\r
 \r
        halbtc8723b2ant_WifiOffHwCfg(pBtCoexist);\r
-       pBtCoexist->fBtcSetBtReg(pBtCoexist, 0, 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
 }\r
 \r
+VOID\r
+EXhalbtc8723b2ant_PnpNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          pnpState\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n"));\r
+\r
+       if(BTC_WIFI_PNP_SLEEP == pnpState)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n"));\r
+       }\r
+       else if(BTC_WIFI_PNP_WAKE_UP == pnpState)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n"));\r
+               halbtc8723b2ant_InitHwConfig(pBtCoexist, FALSE);\r
+               halbtc8723b2ant_InitCoexDm(pBtCoexist);\r
+               halbtc8723b2ant_QueryBtInfo(pBtCoexist);\r
+       }\r
+}\r
+\r
 VOID\r
 EXhalbtc8723b2ant_Periodical(\r
        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
@@ -4135,13 +4802,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 b894db023e8467bd16b4c9ddcbe1f1c369468b6d..2c049f9fcebfd2116296ac191c8e845f08a084e6 100644 (file)
 \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
@@ -49,8 +53,8 @@ typedef enum _BT_8723B_2ANT_COEX_ALGO{
 \r
 typedef struct _COEX_DM_8723B_2ANT{\r
        // fw mechanism\r
-       BOOLEAN         bPreDecBtPwr;\r
-       BOOLEAN         bCurDecBtPwr;\r
+       u1Byte          preBtDecPwrLvl;\r
+       u1Byte          curBtDecPwrLvl;\r
        u1Byte          preFwDacSwingLvl;\r
        u1Byte          curFwDacSwingLvl;\r
        BOOLEAN         bCurIgnoreWlanAct;\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
@@ -114,24 +123,50 @@ typedef struct _COEX_STA_8723B_2ANT{
        u4Byte                                  lowPriorityTx;\r
        u4Byte                                  lowPriorityRx;\r
        u1Byte                                  btRssi;\r
+       BOOLEAN                         bBtTxRxMask;\r
        u1Byte                                  preBtRssiState;\r
        u1Byte                                  preWifiRssiState[4];\r
        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
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8723b2ant_InitHwConfig(\r
+EXhalbtc8723b2ant_PowerOnSetting(\r
        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
+       );\r
+VOID\r
 EXhalbtc8723b2ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
@@ -176,6 +211,11 @@ EXhalbtc8723b2ant_HaltNotify(
        IN      PBTC_COEXIST                    pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8723b2ant_PnpNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          pnpState\r
+       );\r
+VOID\r
 EXhalbtc8723b2ant_Periodical(\r
        IN      PBTC_COEXIST                    pBtCoexist\r
        );\r
index 9f4e49ad6f8b962aad3353cd461ee335cce03fc9..d081053b8c5c0c733edd816004a61d84f0e79b62 100644 (file)
@@ -2092,9 +2092,17 @@ halbtc8812a1ant_InitCoexDm(
 // extern function start with EXhalbtc8812a1ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8812a1ant_InitHwConfig(\r
+EXhalbtc8812a1ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
+{\r
+}\r
+\r
+VOID\r
+EXhalbtc8812a1ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
 {\r
        u4Byte  u4Tmp=0;\r
        u2Byte  u2Tmp=0;\r
@@ -2160,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
@@ -2185,13 +2188,6 @@ EXhalbtc8812a1ant_DisplayCoexInfo(
                CL_PRINTF(cliBuf);\r
        }\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);      \r
@@ -2206,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
@@ -2268,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 652e723ebea1ea8fbddbbaac3eafa33c240e9c34..4f2df7a6033d662217ec23e934c384f777aa1d5b 100644 (file)
@@ -132,10 +132,15 @@ typedef struct _COEX_STA_8812A_1ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8812a1ant_InitHwConfig(\r
+EXhalbtc8812a1ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8812a1ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8812a1ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
index c7add94066cc3fb238fcd090c74ca26c70725c13..82029305e9b1858164cdec9c07a67ceacc06de13 100644 (file)
@@ -4126,9 +4126,17 @@ halbtc8812a2ant_InitHwConfig(
 // extern function start with EXhalbtc8812a2ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8812a2ant_InitHwConfig(\r
+EXhalbtc8812a2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
+{\r
+}      \r
+\r
+VOID\r
+EXhalbtc8812a2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
 {\r
        halbtc8812a2ant_InitHwConfig(pBtCoexist, TRUE);\r
 }\r
@@ -4155,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
@@ -4173,13 +4176,6 @@ EXhalbtc8812a2ant_DisplayCoexInfo(
                CL_PRINTF(cliBuf);\r
        }\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);      \r
@@ -4194,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
-       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
                ((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
@@ -4258,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 31c78d324e6302fe543a9264bf62d6890adf234f..4f6f5d1210c7ed3d1f876ab0388415eda1a04ecd 100644 (file)
@@ -148,10 +148,15 @@ typedef struct _COEX_STA_8812A_2ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8812a2ant_InitHwConfig(\r
+EXhalbtc8812a2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8812a2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8812a2ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
index 8728a47db5c9660df67c976b4d06c11cd67e7a90..c05c7668623d8646aaa5231ad0ead788cc52fd6c 100644 (file)
@@ -1,7 +1,7 @@
 //============================================================\r
 // Description:\r
 //\r
-// This file is for RTL8821A Co-exist mechanism\r
+// This file is for 8821A_1ANT Co-exist mechanism\r
 //\r
 // History\r
 // 2012/11/15 Cosa first check in.\r
@@ -27,8 +27,8 @@ const char *const GLBtInfoSrc8821a1Ant[]={
        "BT Info[bt auto report]",\r
 };\r
 \r
-u4Byte GLCoexVerDate8821a1Ant=20130816;\r
-u4Byte GLCoexVer8821a1Ant=0x41;\r
+u4Byte GLCoexVerDate8821a1Ant=20140306;\r
+u4Byte GLCoexVer8821a1Ant=0x4b;\r
 \r
 //============================================================\r
 // local function proto type if needed\r
@@ -420,7 +420,17 @@ halbtc8821a1ant_MonitorBtCtr(
        u4Byte                  regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\r
        u1Byte                  u1Tmp, u1Tmp1;\r
        s4Byte                  wifiRssi;\r
-       \r
+#if 0\r
+       //to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS\r
+       if (! (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) & 0x8) ) \r
+       {\r
+               pCoexSta->highPriorityTx = 65535;\r
+               pCoexSta->highPriorityRx = 65535;\r
+               pCoexSta->lowPriorityTx = 65535;\r
+               pCoexSta->lowPriorityRx = 65535;\r
+               return;\r
+       }\r
+#endif \r
        regHPTxRx = 0x770;\r
        regLPTxRx = 0x774;\r
 \r
@@ -915,6 +925,8 @@ halbtc8821a1ant_CoexTableWithType(
        IN      u1Byte                          type\r
        )\r
 {\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** CoexTable(%d) **********\n", type));\r
+       \r
        switch(type)\r
        {\r
                case 0:\r
@@ -927,19 +939,19 @@ halbtc8821a1ant_CoexTableWithType(
                        halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3);\r
                        break;\r
                case 3:\r
-                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);\r
+                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaaaaaaaa, 0xffffff, 0x3);\r
                        break;\r
                case 4:\r
-                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0xffffffff, 0xffffff, 0x3);\r
+                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);\r
                        break;\r
                case 5:\r
-                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5fff5fff, 0xffffff, 0x3);\r
+                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaaaa5a5a, 0xffffff, 0x3);\r
                        break;\r
                case 6:\r
-                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5a5a5a, 0xffffff, 0x3);\r
+                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3);\r
                        break;\r
                case 7:\r
-                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5afa5afa, 0x5afa5afa, 0xffffff, 0x3);\r
+                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3);\r
                        break;\r
                default:\r
                        break;\r
@@ -1000,18 +1012,35 @@ halbtc8821a1ant_SetFwPstdma(
        )\r
 {\r
        u1Byte                  H2C_Parameter[5] ={0};\r
+       u1Byte                  realByte1=byte1, realByte5=byte5;\r
+       BOOLEAN                 bApEnable=FALSE;\r
 \r
-       H2C_Parameter[0] = byte1;       \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\r
+\r
+       if(bApEnable)\r
+       {\r
+               if(byte1&BIT4 && !(byte1&BIT5))\r
+               {                       \r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], FW for 1Ant AP mode\n"));\r
+                       realByte1 &= ~BIT4;\r
+                       realByte1 |= BIT5;\r
+\r
+                       realByte5 |= BIT5;\r
+                       realByte5 &= ~BIT6;\r
+               }\r
+       }\r
+\r
+       H2C_Parameter[0] = realByte1;   \r
        H2C_Parameter[1] = byte2;       \r
        H2C_Parameter[2] = byte3;\r
        H2C_Parameter[3] = byte4;\r
-       H2C_Parameter[4] = byte5;\r
+       H2C_Parameter[4] = realByte5;\r
 \r
-       pCoexDm->psTdmaPara[0] = byte1;\r
+       pCoexDm->psTdmaPara[0] = realByte1;\r
        pCoexDm->psTdmaPara[1] = byte2;\r
        pCoexDm->psTdmaPara[2] = byte3;\r
        pCoexDm->psTdmaPara[3] = byte4;\r
-       pCoexDm->psTdmaPara[4] = byte5;\r
+       pCoexDm->psTdmaPara[4] = realByte5;\r
        \r
        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n", \r
                H2C_Parameter[0], \r
@@ -1075,7 +1104,8 @@ halbtc8821a1ant_SwMechanism(
        IN      BOOLEAN         bLowPenaltyRA\r
        ) \r
 {\r
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], SM[LpRA] = %d \n", bLowPenaltyRA));\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], SM[LpRA] = %d\n", \r
+               bLowPenaltyRA));\r
        \r
        halbtc8821a1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);\r
 }\r
@@ -1100,8 +1130,8 @@ halbtc8821a1ant_SetAntPath(
                u4Tmp |= BIT24;\r
                pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
 \r
-               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x975, 0x3, 0x3);\r
-               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x77);\r
+               //0x765 = 0x18\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x3);        \r
 \r
                if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) \r
                {\r
@@ -1110,7 +1140,7 @@ halbtc8821a1ant_SetAntPath(
                        H2C_Parameter[1] = 1;\r
                        pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\r
 \r
-                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x1); //Main Ant to  BT for IPS case 0x4c[23]=1\r
+                       //pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x1); //Main Ant to  BT for IPS case 0x4c[23]=1\r
                }\r
                else\r
                {\r
@@ -1119,7 +1149,7 @@ halbtc8821a1ant_SetAntPath(
                        H2C_Parameter[1] = 1;\r
                        pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\r
 \r
-                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //Aux Ant to  BT for IPS case 0x4c[23]=1\r
+                       //pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //Aux Ant to  BT for IPS case 0x4c[23]=1\r
                }\r
        }\r
        else if(bWifiOff)\r
@@ -1129,18 +1159,28 @@ halbtc8821a1ant_SetAntPath(
                u4Tmp &= ~BIT23;\r
                u4Tmp &= ~BIT24;\r
                pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
+\r
+               //0x765 = 0x18\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x3); \r
+       }\r
+       else\r
+       {\r
+               //0x765 = 0x0\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x0); \r
        }\r
        \r
        // ext switch setting\r
        switch(antPosType)\r
        {\r
                case BTC_ANT_PATH_WIFI:\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x77);\r
                        if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
                                pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x1);\r
                        else\r
                                pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x2);\r
                        break;\r
                case BTC_ANT_PATH_BT:\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x77);\r
                        if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
                                pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x2);\r
                        else\r
@@ -1148,6 +1188,7 @@ halbtc8821a1ant_SetAntPath(
                        break;\r
                default:\r
                case BTC_ANT_PATH_PTA:\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x66);\r
                        if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
                                pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x1);\r
                        else\r
@@ -1167,25 +1208,24 @@ halbtc8821a1ant_PsTdma(
        PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;\r
        BOOLEAN                 bTurnOnByCnt=FALSE;\r
        u1Byte                  psTdmaTypeByCnt=0, rssiAdjustVal=0;\r
-       u4Byte                  fwVer=0;\r
+       //u4Byte                        fwVer=0;\r
 \r
        pCoexDm->bCurPsTdmaOn = bTurnOn;\r
        pCoexDm->curPsTdma = type;\r
 \r
-       if(!bForceExec)\r
+       if (pCoexDm->bCurPsTdmaOn)\r
        {\r
-               if (pCoexDm->bCurPsTdmaOn)\r
-               {\r
-                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], ********** TDMA(on, %d) **********\n", \r
-                               pCoexDm->curPsTdma));\r
-               }\r
-               else\r
-               {\r
-                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], ********** TDMA(off, %d) **********\n", \r
-                               pCoexDm->curPsTdma));\r
-               }\r
-                       \r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** TDMA(on, %d) **********\n", \r
+                       pCoexDm->curPsTdma));\r
+       }\r
+       else\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** TDMA(off, %d) **********\n", \r
+                       pCoexDm->curPsTdma));\r
+       }\r
 \r
+       if(!bForceExec)\r
+       {\r
                if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\r
                        (pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\r
                        return;\r
@@ -1206,7 +1246,7 @@ halbtc8821a1ant_PsTdma(
                                rssiAdjustVal = 14;\r
                                break;\r
                        case 3:\r
-                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, 0x10);\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, 0x52);\r
                                break;\r
                        case 4:\r
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0);\r
@@ -1216,7 +1256,7 @@ halbtc8821a1ant_PsTdma(
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x3, 0x11, 0x10);\r
                                break;\r
                        case 6:\r
-                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x0, 0x0);\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x3, 0x11, 0x13);\r
                                break;\r
                        case 7:\r
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0);\r
@@ -1232,17 +1272,17 @@ halbtc8821a1ant_PsTdma(
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0xa, 0x0, 0x40);\r
                                break;\r
                        case 11:        \r
-                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x14, 0x03, 0x10, 0x10);\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x15, 0x03, 0x10, 0x50);\r
                                rssiAdjustVal = 20;\r
                                break;\r
                        case 12:\r
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50);\r
                                break;\r
                        case 13:\r
-                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x18, 0x18, 0x0, 0x10);\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, 0x50);\r
                                break;\r
                        case 14:\r
-                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, 0x10);\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, 0x52);\r
                                break;\r
                        case 15:\r
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x8, 0x0);\r
@@ -1259,7 +1299,7 @@ halbtc8821a1ant_PsTdma(
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x03, 0x11, 0x10);\r
                                break;\r
                        case 21:\r
-                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x03, 0x11, 0x10);\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x11);\r
                                break;\r
                        case 22:\r
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x10);\r
@@ -1291,13 +1331,13 @@ halbtc8821a1ant_PsTdma(
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xab, 0x1a, 0x1a, 0x1, 0x10);\r
                                break;\r
                        case 30:\r
-                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x14, 0x3, 0x10, 0x50);\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x30, 0x3, 0x10, 0x10);\r
                                break;\r
                        case 31:\r
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0, 0x58);\r
                                break;\r
                        case 32:\r
-                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0xa, 0x3, 0x10, 0x0);\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x3, 0x11, 0x11);\r
                                break;\r
                        case 33:\r
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xa3, 0x25, 0x3, 0x30, 0x90);\r
@@ -1311,6 +1351,10 @@ halbtc8821a1ant_PsTdma(
                        case 36:\r
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x12, 0x3, 0x14, 0x50);\r
                                break;\r
+                       case 40: // SoftAP only with no sta associated,BT disable ,TDMA mode for power saving\r
+                               /* here softap mode screen off will cost 70-80mA for phone */\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x23, 0x18, 0x00, 0x10, 0x24);\r
+                               break;  \r
                }\r
        }\r
        else\r
@@ -1702,29 +1746,6 @@ halbtc8821a1ant_CoexUnder5G(
        halbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 5);\r
 }\r
 \r
-#define WIFI_ONLY_CHECK_UNDER_5G\r
-#ifdef WIFI_ONLY_CHECK_UNDER_5G\r
-VOID\r
-halbtc8821a1ant_ActionWifiOnly(\r
-       IN      PBTC_COEXIST            pBtCoexist\r
-       )\r
-{\r
-       BOOLEAN  bWifiUnder5G=FALSE;\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
-\r
-       if (bWifiUnder5G)\r
-       {\r
-               halbtc8821a1ant_CoexUnder5G(pBtCoexist);\r
-               return;\r
-       }\r
-       else\r
-       {\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
-               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);\r
-       }\r
-}\r
-#else\r
 VOID\r
 halbtc8821a1ant_ActionWifiOnly(\r
        IN      PBTC_COEXIST            pBtCoexist\r
@@ -1733,7 +1754,6 @@ halbtc8821a1ant_ActionWifiOnly(
        halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
        halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);      \r
 }\r
-#endif\r
 \r
 VOID\r
 halbtc8821a1ant_MonitorBtEnableDisable(\r
@@ -1893,6 +1913,16 @@ halbtc8821a1ant_ActionHidA2dp(
 //     Non-Software Coex Mechanism start\r
 //\r
 //=============================================\r
+VOID\r
+halbtc8821a1ant_ActionWifiMultiPort(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+       \r
+       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+}\r
 \r
 VOID\r
 halbtc8821a1ant_ActionHs(\r
@@ -1900,38 +1930,50 @@ halbtc8821a1ant_ActionHs(
        )\r
 {\r
        halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
-       halbtc8821a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 2);\r
+       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
 }\r
 \r
 VOID\r
 halbtc8821a1ant_ActionBtInquiry(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
-{\r
+{      \r
        PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
-       BOOLEAN                 bWifiConnected=FALSE;\r
-       \r
+       BOOLEAN                 bWifiConnected=FALSE, bApEnable=FALSE, bWifiBusy=FALSE, bBtBusy=FALSE;\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\r
 \r
-       if(!bWifiConnected)\r
+       if((!bWifiConnected) && (!pCoexSta->bWiFiIsHighPriTask))\r
        {\r
                halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
-               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);          \r
        }\r
-       else if( (pBtLinkInfo->bScoExist) ||\r
-                       (pBtLinkInfo->bHidOnly) )\r
+       else if((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist))\r
        {\r
-               // SCO/HID-only busy\r
+               // SCO/HID/A2DP  busy\r
                halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
                halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
+       }\r
+       else if ((pBtLinkInfo->bPanExist) || (bWifiBusy))\r
+       {\r
+               halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);              \r
+               \r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
        }\r
        else\r
        {\r
-               halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\r
-               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 30);\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
        }\r
 }\r
 \r
@@ -1941,13 +1983,24 @@ halbtc8821a1ant_ActionBtScoHidOnlyBusy(
        IN      u1Byte                          wifiStatus\r
        )\r
 {\r
+       PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
+       BOOLEAN bWifiConnected=FALSE;\r
+       u1Byte  wifiRssiState=BTC_RSSI_STATE_HIGH;\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
+\r
        // tdma and coex table\r
-       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
 \r
-       if(BT_8821A_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus)\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);          \r
-       else\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+       if(pBtLinkInfo->bScoExist)\r
+       {\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+       }\r
+       else //HID\r
+       {\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\r
+       }\r
 }\r
 \r
 VOID\r
@@ -1969,18 +2022,26 @@ halbtc8821a1ant_ActionWifiConnectedBtAclBusy(
        }\r
        else if(pBtLinkInfo->bA2dpOnly)  //A2DP         \r
        {\r
-               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+               if(BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifiStatus)\r
+               {\r
+                       //halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+                       //halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+                       pCoexDm->bAutoTdmaAdjust = FALSE;\r
+               }\r
+               else if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
                        (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )     \r
                {\r
-                        halbtc8821a1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus);\r
+                       halbtc8821a1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
                }\r
                else //for low BT RSSI\r
                {\r
                        halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
                        pCoexDm->bAutoTdmaAdjust = FALSE;\r
-               }                       \r
-\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               }\r
        }\r
        else if(pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist)  //HID+A2DP\r
        {\r
@@ -1992,16 +2053,16 @@ halbtc8821a1ant_ActionWifiConnectedBtAclBusy(
                }\r
                else //for low BT RSSI\r
                {\r
-                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
                        pCoexDm->bAutoTdmaAdjust = FALSE;\r
                }                       \r
 \r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 6);\r
        }\r
        else if( (pBtLinkInfo->bPanOnly) || (pBtLinkInfo->bHidExist&&pBtLinkInfo->bPanExist) ) //PAN(OPP,FTP), HID+PAN(OPP,FTP)                 \r
        {\r
                halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 6);\r
                pCoexDm->bAutoTdmaAdjust = FALSE;\r
        }\r
        else if ( ((pBtLinkInfo->bA2dpExist) && (pBtLinkInfo->bPanExist)) ||\r
@@ -2028,20 +2089,80 @@ halbtc8821a1ant_ActionWifiNotConnected(
        halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
 \r
        // tdma and coex table  \r
-       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+       halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\r
        halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
 }\r
 \r
 VOID\r
-halbtc8821a1ant_ActionWifiNotConnectedAssoAuthScan(\r
+halbtc8821a1ant_ActionWifiNotConnectedScan(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
+       PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
+       \r
        halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+       \r
+       // tdma and coex table\r
+       if(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\r
+       {\r
+               if (pBtLinkInfo->bA2dpExist)\r
+               {\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
+               else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\r
+        {\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
+       }\r
+       else if( (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\r
+                       (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\r
+       {\r
+               halbtc8821a1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\r
+                       BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);\r
+       }\r
+       else\r
+       {\r
+               //halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
+               //halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+\r
+               //Bryant Add\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+       }\r
+}\r
 \r
+VOID\r
+halbtc8821a1ant_ActionWifiNotConnectedAssoAuth(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
+       \r
+       halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
 \r
-       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\r
-       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+       // tdma and coex table\r
+       if( (pBtLinkInfo->bScoExist)  || (pBtLinkInfo->bHidExist) )\r
+       {\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
+       }\r
+       else if( (pBtLinkInfo->bA2dpExist)  || (pBtLinkInfo->bPanExist) )                       \r
+       {\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
+       }\r
+       else    \r
+       {               \r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+       }\r
 }\r
 \r
 VOID\r
@@ -2051,22 +2172,26 @@ halbtc8821a1ant_ActionWifiConnectedScan(
 {\r
        PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
        \r
-       // power save state\r
        halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
 \r
        // tdma and coex table\r
        if(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\r
        {\r
-               if(pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\r
+               if (pBtLinkInfo->bA2dpExist)\r
+               {\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
+               else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\r
                {\r
                        halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\r
-                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
                }\r
                else\r
                {\r
-               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-       }\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
        }\r
        else if( (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\r
                        (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\r
@@ -2076,8 +2201,12 @@ halbtc8821a1ant_ActionWifiConnectedScan(
        }\r
        else\r
        {\r
-               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               //halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
+               //halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+\r
+               //Bryant Add\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
        }\r
 }\r
 \r
@@ -2086,31 +2215,25 @@ halbtc8821a1ant_ActionWifiConnectedSpecialPacket(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       BOOLEAN                 bHsConnecting=FALSE;\r
        PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_CONNECTING, &bHsConnecting);\r
-\r
        halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
 \r
        // tdma and coex table\r
-       if(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\r
+       if((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist))\r
        {\r
-               if(pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\r
-               {\r
-                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\r
-                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-               }\r
-               else\r
-               {\r
-                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-               }\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
        }\r
-       else\r
+       else if(pBtLinkInfo->bPanExist) \r
        {\r
                halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
+       }\r
+       else    \r
+       {               \r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
        }\r
 }\r
 \r
@@ -2121,7 +2244,7 @@ halbtc8821a1ant_ActionWifiConnected(
 {\r
        BOOLEAN         bWifiBusy=FALSE;\r
        BOOLEAN         bScan=FALSE, bLink=FALSE, bRoam=FALSE;\r
-       BOOLEAN         bUnder4way=FALSE;\r
+       BOOLEAN         bUnder4way=FALSE, bApEnable=FALSE;\r
        u4Byte          wifiBw;\r
 \r
        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect()===>\n"));\r
@@ -2139,19 +2262,28 @@ halbtc8821a1ant_ActionWifiConnected(
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
        if(bScan || bLink || bRoam)\r
        {\r
-               halbtc8821a1ant_ActionWifiConnectedScan(pBtCoexist);\r
+               if(bScan)       \r
+                       halbtc8821a1ant_ActionWifiConnectedScan(pBtCoexist);\r
+               else\r
+                       halbtc8821a1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\r
                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n"));\r
                return;\r
        }\r
 \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
        // power save state\r
-       if(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly)\r
-               halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\r
+       if(!bApEnable && BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly)\r
+       {\r
+               if(!bWifiBusy && pBtCoexist->btLinkInfo.bA2dpOnly)      //A2DP\r
+                       halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+               else\r
+                       halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\r
+       }\r
        else\r
                halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
 \r
        // tdma and coex table\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);      \r
        if(!bWifiBusy)\r
        {\r
                if(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\r
@@ -2167,7 +2299,7 @@ halbtc8821a1ant_ActionWifiConnected(
                }\r
                else\r
                {\r
-                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
                        halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
                }\r
        }\r
@@ -2186,7 +2318,7 @@ halbtc8821a1ant_ActionWifiConnected(
                }\r
                else \r
                {\r
-                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
                        halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
                }\r
        }\r
@@ -2270,6 +2402,8 @@ halbtc8821a1ant_RunCoexistMechanism(
        BOOLEAN bBtCtrlAggBufSize=FALSE;\r
        u1Byte  aggBufSize=5;\r
        u1Byte  wifiRssiState=BTC_RSSI_STATE_HIGH;\r
+       u4Byte  wifiLinkStatus=0;\r
+       u4Byte  numOfWifiLink=0;\r
        BOOLEAN bWifiUnder5G=FALSE;\r
 \r
        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism()===>\n"));\r
@@ -2308,9 +2442,18 @@ halbtc8821a1ant_RunCoexistMechanism(
        }\r
 \r
        pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_INC_SCAN_DEV_NUM, &bIncreaseScanDevNum);\r
-\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
 \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
+       numOfWifiLink = wifiLinkStatus>>16;\r
+       if((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED))\r
+       {\r
+               halbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
+               halbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\r
+               halbtc8821a1ant_ActionWifiMultiPort(pBtCoexist);\r
+               return;\r
+       }\r
+\r
        if(!pBtLinkInfo->bScoExist && !pBtLinkInfo->bHidExist)\r
        {\r
                halbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
@@ -2380,7 +2523,12 @@ halbtc8821a1ant_RunCoexistMechanism(
                pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
 \r
                if(bScan || bLink || bRoam)\r
-                       halbtc8821a1ant_ActionWifiNotConnectedAssoAuthScan(pBtCoexist);\r
+               {\r
+                        if (bScan)     \r
+                               halbtc8821a1ant_ActionWifiNotConnectedScan(pBtCoexist); \r
+                        else\r
+                               halbtc8821a1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);     \r
+               }\r
                else\r
                        halbtc8821a1ant_ActionWifiNotConnected(pBtCoexist);\r
        }\r
@@ -2399,14 +2547,15 @@ halbtc8821a1ant_InitCoexDm(
        // sw all off\r
        halbtc8821a1ant_SwMechanism(pBtCoexist, FALSE);\r
 \r
-       halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\r
+       //halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\r
        halbtc8821a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\r
 }\r
 \r
 VOID\r
 halbtc8821a1ant_InitHwConfig(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
-       IN      BOOLEAN                         bBackUp\r
+       IN      BOOLEAN                         bBackUp,\r
+       IN      BOOLEAN                         bWifiOnly\r
        )\r
 {\r
        PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
@@ -2416,9 +2565,12 @@ halbtc8821a1ant_InitHwConfig(
        u1Byte                          H2C_Parameter[2] ={0};\r
        BOOLEAN                 bWifiUnder5G=FALSE;\r
                \r
-\r
+       \r
        BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 1Ant Init HW Config!!\n"));\r
 \r
+       if(bWifiOnly)\r
+               return;\r
+       \r
        if(bBackUp)\r
        {\r
                pCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\r
@@ -2440,6 +2592,7 @@ halbtc8821a1ant_InitHwConfig(
                halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, TRUE, FALSE);\r
        else\r
                halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, TRUE, FALSE);\r
+\r
        // PTA parameter\r
        halbtc8821a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\r
 \r
@@ -2456,11 +2609,19 @@ halbtc8821a1ant_InitHwConfig(
 // extern function start with EXhalbtc8821a1ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8821a1ant_InitHwConfig(\r
+EXhalbtc8821a1ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       halbtc8821a1ant_InitHwConfig(pBtCoexist, TRUE);\r
+}\r
+\r
+VOID\r
+EXhalbtc8821a1ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
+{\r
+       halbtc8821a1ant_InitHwConfig(pBtCoexist, TRUE, bWifiOnly);\r
 }\r
 \r
 VOID\r
@@ -2489,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;\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
@@ -2514,13 +2671,6 @@ EXhalbtc8821a1ant_DisplayCoexInfo(
                CL_PRINTF(cliBuf);\r
        }\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d", "Ant PG Num/ Ant Mech/ Ant Pos:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos);\r
        CL_PRINTF(cliBuf);      \r
@@ -2535,40 +2685,19 @@ 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
-       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
                ((pBtCoexist->btInfo.bBtDisabled)? ("disabled"):        ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? "non-connected idle":\r
                (  (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy")))),\r
@@ -2597,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
@@ -2634,13 +2756,13 @@ EXhalbtc8821a1ant_DisplayCoexInfo(
                        pCoexDm->psTdmaPara[4], psTdmaCase, pCoexDm->bAutoTdmaAdjust);\r
                CL_PRINTF(cliBuf);\r
        \r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "Latest error condition(should be 0)", \\r
-                       pCoexDm->errorCondition);\r
-               CL_PRINTF(cliBuf);\r
-               \r
                CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ", "IgnWlanAct", \\r
                        pCoexDm->bCurIgnoreWlanAct);\r
                CL_PRINTF(cliBuf);\r
+       \r
+               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "Latest error condition(should be 0)", \\r
+                       pCoexDm->errorCondition);\r
+               CL_PRINTF(cliBuf);\r
        }\r
 \r
        // Hw setting           \r
@@ -2705,9 +2827,8 @@ EXhalbtc8821a1ant_DisplayCoexInfo(
        u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\r
        u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\r
        u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\r
-       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)", \\r
-               u4Tmp[0], u4Tmp[1], u4Tmp[2], u1Tmp[0]);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x6c0/0x6c4/0x6c8(coexTable)", \\r
+               u4Tmp[0], u4Tmp[1], u4Tmp[2]);\r
        CL_PRINTF(cliBuf);\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "0x770(high-pri rx/tx)", \\r
@@ -2738,17 +2859,20 @@ EXhalbtc8821a1ant_IpsNotify(
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n"));\r
                pCoexSta->bUnderIps = TRUE;\r
-               halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
-               //set PTA control\r
-               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+               \r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\r
                halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
+               halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);   \r
+               //halbtc8821a1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\r
        }\r
        else if(BTC_IPS_LEAVE == type)\r
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n"));\r
                pCoexSta->bUnderIps = FALSE;\r
 \r
-               halbtc8821a1ant_RunCoexistMechanism(pBtCoexist);\r
+               halbtc8821a1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\r
+               halbtc8821a1ant_InitCoexDm(pBtCoexist);\r
+               halbtc8821a1ant_QueryBtInfo(pBtCoexist);\r
        }\r
 }\r
 \r
@@ -2780,10 +2904,29 @@ EXhalbtc8821a1ant_ScanNotify(
        )\r
 {\r
        BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE;    \r
+       u4Byte  wifiLinkStatus=0;\r
+       u4Byte  numOfWifiLink=0;\r
+       BOOLEAN bBtCtrlAggBufSize=FALSE;\r
+       u1Byte  aggBufSize=5;\r
 \r
        if(pBtCoexist->bManualControl ||\r
-               pBtCoexist->bStopCoexDm ||\r
-               pBtCoexist->btInfo.bBtDisabled )\r
+               pBtCoexist->bStopCoexDm )\r
+               return;\r
+\r
+       if(BTC_SCAN_START == type)\r
+       {\r
+               pCoexSta->bWiFiIsHighPriTask = TRUE;\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));\r
+\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);  //Force antenna setup for no scan result issue\r
+       }\r
+       else\r
+       {\r
+               pCoexSta->bWiFiIsHighPriTask = FALSE;   \r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));\r
+       }       \r
+\r
+       if(pBtCoexist->btInfo.bBtDisabled)\r
                return;\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
@@ -2791,6 +2934,16 @@ EXhalbtc8821a1ant_ScanNotify(
 \r
        halbtc8821a1ant_QueryBtInfo(pBtCoexist);\r
        \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
+       numOfWifiLink = wifiLinkStatus>>16;\r
+       if(numOfWifiLink >= 2)\r
+       {\r
+               halbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
+               halbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\r
+               halbtc8821a1ant_ActionWifiMultiPort(pBtCoexist);\r
+               return;\r
+       }\r
+       \r
        if(pCoexSta->bC2hBtInquiryPage)\r
        {\r
                halbtc8821a1ant_ActionBtInquiry(pBtCoexist);\r
@@ -2804,10 +2957,10 @@ EXhalbtc8821a1ant_ScanNotify(
 \r
        if(BTC_SCAN_START == type)\r
        {\r
-               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));\r
+               //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));\r
                if(!bWifiConnected)     // non-connected scan\r
                {\r
-                       halbtc8821a1ant_ActionWifiNotConnectedAssoAuthScan(pBtCoexist);\r
+                       halbtc8821a1ant_ActionWifiNotConnectedScan(pBtCoexist);\r
                }\r
                else    // wifi is connected\r
                {\r
@@ -2816,7 +2969,7 @@ EXhalbtc8821a1ant_ScanNotify(
        }\r
        else if(BTC_SCAN_FINISH == type)\r
        {\r
-               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));\r
+               //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));\r
                if(!bWifiConnected)     // non-connected scan\r
                {\r
                        halbtc8821a1ant_ActionWifiNotConnected(pBtCoexist);\r
@@ -2835,12 +2988,39 @@ EXhalbtc8821a1ant_ConnectNotify(
        )\r
 {\r
        BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE;    \r
+       u4Byte  wifiLinkStatus=0;\r
+       u4Byte  numOfWifiLink=0;\r
+       BOOLEAN bBtCtrlAggBufSize=FALSE;\r
+       u1Byte  aggBufSize=5;\r
 \r
        if(pBtCoexist->bManualControl ||\r
                pBtCoexist->bStopCoexDm ||\r
                pBtCoexist->btInfo.bBtDisabled )\r
                return;\r
 \r
+       if(BTC_ASSOCIATE_START == type)\r
+       {\r
+        pCoexSta->bWiFiIsHighPriTask = TRUE;\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));        \r
+               pCoexDm->nArpCnt = 0;\r
+       }\r
+       else\r
+       {\r
+               pCoexSta->bWiFiIsHighPriTask = FALSE;   \r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));       \r
+               pCoexDm->nArpCnt = 0;\r
+       }\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
+       numOfWifiLink = wifiLinkStatus>>16;\r
+       if(numOfWifiLink >= 2)\r
+       {\r
+               halbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
+               halbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\r
+               halbtc8821a1ant_ActionWifiMultiPort(pBtCoexist);\r
+               return;\r
+       }\r
+\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
        if(pCoexSta->bC2hBtInquiryPage)\r
        {\r
@@ -2855,12 +3035,12 @@ EXhalbtc8821a1ant_ConnectNotify(
 \r
        if(BTC_ASSOCIATE_START == type)\r
        {\r
-               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));\r
-               halbtc8821a1ant_ActionWifiNotConnectedAssoAuthScan(pBtCoexist);\r
+               //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));              \r
+               halbtc8821a1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);\r
        }\r
        else if(BTC_ASSOCIATE_FINISH == type)\r
        {\r
-               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));\r
+               //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));\r
                \r
                pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
                if(!bWifiConnected) // non-connected scan\r
@@ -2896,6 +3076,7 @@ EXhalbtc8821a1ant_MediaStatusNotify(
        else\r
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n"));\r
+               pCoexDm->nArpCnt = 0;\r
        }\r
 \r
        // only 2.4G we need to inform bt the chnl mask\r
@@ -2930,14 +3111,49 @@ EXhalbtc8821a1ant_SpecialPacketNotify(
        )\r
 {\r
        BOOLEAN bBtHsOn=FALSE;\r
+       u4Byte  wifiLinkStatus=0;\r
+       u4Byte  numOfWifiLink=0;\r
+       BOOLEAN bBtCtrlAggBufSize=FALSE;\r
+       u1Byte  aggBufSize=5;\r
        \r
        if(pBtCoexist->bManualControl ||\r
                pBtCoexist->bStopCoexDm ||\r
                pBtCoexist->btInfo.bBtDisabled )\r
                return;\r
 \r
+       if( BTC_PACKET_DHCP == type || \r
+               BTC_PACKET_EAPOL == type ||\r
+               BTC_PACKET_ARP == type )\r
+       {\r
+               pCoexSta->bWiFiIsHighPriTask = TRUE;\r
+\r
+               if(BTC_PACKET_ARP == type)\r
+               {\r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet ARP notify\n"));            \r
+               }\r
+               else\r
+               {\r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet DHCP or EAPOL notify\n"));          \r
+               }\r
+       }\r
+       else\r
+       {\r
+               pCoexSta->bWiFiIsHighPriTask = FALSE;   \r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet [Type = %d] notify\n", type));\r
+       }\r
+\r
        pCoexSta->specialPktPeriodCnt = 0;\r
 \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
+       numOfWifiLink = wifiLinkStatus>>16;\r
+       if(numOfWifiLink >= 2)\r
+       {\r
+               halbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
+               halbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\r
+               halbtc8821a1ant_ActionWifiMultiPort(pBtCoexist);\r
+               return;\r
+       }\r
+\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
        if(pCoexSta->bC2hBtInquiryPage)\r
        {\r
@@ -2951,9 +3167,18 @@ EXhalbtc8821a1ant_SpecialPacketNotify(
        }\r
 \r
        if( BTC_PACKET_DHCP == type ||\r
-               BTC_PACKET_EAPOL == type )\r
+               BTC_PACKET_EAPOL == type || \r
+               BTC_PACKET_ARP == type )\r
        {\r
-               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet(%d) notify\n", type));\r
+               //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet(%d) notify\n", type));\r
+               if(BTC_PACKET_ARP == type)\r
+               {\r
+                       pCoexDm->nArpCnt++;\r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], ARP Packet Count = %d\n", pCoexDm->nArpCnt));\r
+                       if(pCoexDm->nArpCnt >= 10) // if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist) \r
+                               return; \r
+               }\r
+               \r
                halbtc8821a1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\r
        }\r
 }\r
@@ -3002,12 +3227,26 @@ EXhalbtc8821a1ant_BtInfoNotify(
                pCoexSta->btRetryCnt =  // [3:0]\r
                        pCoexSta->btInfoC2h[rspSource][2]&0xf;\r
 \r
+               if (pCoexSta->btInfoC2h[rspSource][2]&0x20)\r
+                       pCoexSta->bC2hBtPage = TRUE;\r
+               else\r
+                       pCoexSta->bC2hBtPage = FALSE;                   \r
+\r
                pCoexSta->btRssi =\r
                        pCoexSta->btInfoC2h[rspSource][3]*2+10;\r
 \r
                pCoexSta->btInfoExt = \r
                        pCoexSta->btInfoC2h[rspSource][4];\r
 \r
+               pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);\r
+               if(!pCoexSta->bBtTxRxMask)\r
+               {\r
+                       /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */                            \r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n"));\r
+                       pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15);\r
+               }\r
+               \r
                // Here we need to resend some wifi info to BT\r
                // because bt is reset and loss of the info.\r
                if(pCoexSta->btInfoExt & BIT1)\r
@@ -3043,7 +3282,6 @@ EXhalbtc8821a1ant_BtInfoNotify(
                }\r
                else\r
                {\r
-                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit4 check, set BT to enable Auto Report!!\n"));\r
                        halbtc8821a1ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE);\r
                }\r
 #endif\r
@@ -3087,6 +3325,8 @@ EXhalbtc8821a1ant_BtInfoNotify(
 \r
        halbtc8821a1ant_UpdateBtLinkInfo(pBtCoexist);\r
                \r
+       btInfo = btInfo & 0x1f;  //mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41)\r
+       \r
        if(!(btInfo&BT_INFO_8821A_1ANT_B_CONNECTION))\r
        {\r
                pCoexDm->btStatus = BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE;\r
@@ -3136,15 +3376,16 @@ EXhalbtc8821a1ant_HaltNotify(
        \r
        BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n"));\r
 \r
-       pBtCoexist->bStopCoexDm = TRUE;\r
-\r
-       halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
-       halbtc8821a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
-\r
        halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
        halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\r
+       halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
+       //halbtc8821a1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\r
+\r
+       halbtc8821a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
 \r
        EXhalbtc8821a1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\r
+\r
+       pBtCoexist->bStopCoexDm = TRUE; \r
 }\r
 \r
 VOID\r
@@ -3158,16 +3399,20 @@ EXhalbtc8821a1ant_PnpNotify(
        if(BTC_WIFI_PNP_SLEEP == pnpState)\r
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n"));\r
-               pBtCoexist->bStopCoexDm = TRUE;\r
-               halbtc8821a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
+\r
                halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
-               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);      \r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+               halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
+               //halbtc8821a1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\r
+\r
+               pBtCoexist->bStopCoexDm = TRUE;\r
        }\r
        else if(BTC_WIFI_PNP_WAKE_UP == pnpState)\r
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n"));\r
                pBtCoexist->bStopCoexDm = FALSE;\r
-               halbtc8821a1ant_InitHwConfig(pBtCoexist, FALSE);\r
+               halbtc8821a1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\r
                halbtc8821a1ant_InitCoexDm(pBtCoexist);\r
                halbtc8821a1ant_QueryBtInfo(pBtCoexist);\r
        }\r
@@ -3208,10 +3453,10 @@ EXhalbtc8821a1ant_Periodical(
        if( halbtc8821a1ant_IsWifiStatusChanged(pBtCoexist) ||\r
                pCoexDm->bAutoTdmaAdjust )\r
        {\r
-               if(pCoexSta->specialPktPeriodCnt > 2)\r
-               {\r
+               //if(pCoexSta->specialPktPeriodCnt > 2)\r
+               //{\r
                        halbtc8821a1ant_RunCoexistMechanism(pBtCoexist);        \r
-               }\r
+               //}\r
        }\r
 \r
        pCoexSta->specialPktPeriodCnt++;\r
index a9656abc2e298399e58de9ac0885e6a16a30e033..4c7469ef67c82159d4c36e51c489d2af54517d95 100644 (file)
@@ -1,7 +1,7 @@
 //===========================================\r
 // The following is for 8821A 1ANT BT Co-exist definition\r
 //===========================================\r
-#define        BT_AUTO_REPORT_ONLY_8821A_1ANT                          0\r
+#define        BT_AUTO_REPORT_ONLY_8821A_1ANT                          1\r
 \r
 #define        BT_INFO_8821A_1ANT_B_FTP                                                BIT7\r
 #define        BT_INFO_8821A_1ANT_B_A2DP                                       BIT6\r
@@ -108,6 +108,7 @@ typedef struct _COEX_DM_8821A_1ANT{
        u1Byte          curRetryLimitType;\r
        u1Byte          preAmpduTimeType;\r
        u1Byte          curAmpduTimeType;\r
+       u4Byte          nArpCnt;\r
 \r
        u1Byte          errorCondition;\r
 } COEX_DM_8821A_1ANT, *PCOEX_DM_8821A_1ANT;\r
@@ -127,12 +128,15 @@ typedef struct _COEX_STA_8821A_1ANT{
        u4Byte                                  lowPriorityTx;\r
        u4Byte                                  lowPriorityRx;\r
        u1Byte                                  btRssi;\r
+       BOOLEAN                                 bBtTxRxMask;\r
        u1Byte                                  preBtRssiState;\r
        u1Byte                                  preWifiRssiState[4];\r
        BOOLEAN                                 bC2hBtInfoReqSent;\r
        u1Byte                                  btInfoC2h[BT_INFO_SRC_8821A_1ANT_MAX][10];\r
        u4Byte                                  btInfoC2hCnt[BT_INFO_SRC_8821A_1ANT_MAX];\r
        BOOLEAN                                 bC2hBtInquiryPage;\r
+       BOOLEAN                                 bC2hBtPage;                             //Add for win8.1 page out issue\r
+       BOOLEAN                                 bWiFiIsHighPriTask;             //Add for win8.1 page out issue\r
        u1Byte                                  btRetryCnt;\r
        u1Byte                                  btInfoExt;\r
 }COEX_STA_8821A_1ANT, *PCOEX_STA_8821A_1ANT;\r
@@ -141,10 +145,15 @@ typedef struct _COEX_STA_8821A_1ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8821a1ant_InitHwConfig(\r
+EXhalbtc8821a1ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8821a1ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8821a1ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
@@ -201,10 +210,4 @@ VOID
 EXhalbtc8821a1ant_DisplayCoexInfo(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
-VOID\r
-EXhalbtc8821a1ant_DbgControl(\r
-       IN      PBTC_COEXIST                    pBtCoexist,\r
-       IN      u1Byte                          opCode,\r
-       IN      u1Byte                          opLen,\r
-       IN      pu1Byte                         pData\r
-       );\r
+\r
index 0d513790a4053add38acbc0a5b75106223e2019d..14ad651a9eb36c2fce7cf09045a4fe8b8dd1a732 100644 (file)
@@ -686,97 +686,6 @@ halbtc8821a2ant_DecBtPwr(
        pCoexDm->bPreDecBtPwr = pCoexDm->bCurDecBtPwr;\r
 }\r
 \r
-VOID\r
-halbtc8821a2ant_SetFwBtLnaConstrain(\r
-       IN      PBTC_COEXIST            pBtCoexist,\r
-       IN      BOOLEAN                 bBtLnaConsOn\r
-       )\r
-{\r
-       u1Byte                  H2C_Parameter[2] ={0};\r
-       \r
-       H2C_Parameter[0] = 0x3; // opCode, 0x3=BT_SET_LNA_CONSTRAIN\r
-\r
-       if(bBtLnaConsOn)\r
-       {\r
-               H2C_Parameter[1] |= BIT0;\r
-       }\r
-\r
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set BT LNA Constrain: %s, FW write 0x69=0x%x\n", \r
-               (bBtLnaConsOn? "ON!!":"OFF!!"), \r
-               H2C_Parameter[0]<<8|H2C_Parameter[1]));\r
-\r
-       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 2, H2C_Parameter);    \r
-}\r
-\r
-VOID\r
-halbtc8821a2ant_SetBtLnaConstrain(\r
-       IN      PBTC_COEXIST            pBtCoexist,\r
-       IN      BOOLEAN                 bForceExec,\r
-       IN      BOOLEAN                 bBtLnaConsOn\r
-       )\r
-{\r
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT Constrain = %s\n",  \r
-               (bForceExec? "force":""), ((bBtLnaConsOn)? "ON":"OFF")));\r
-       pCoexDm->bCurBtLnaConstrain = bBtLnaConsOn;\r
-\r
-       if(!bForceExec)\r
-       {\r
-               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtLnaConstrain=%d, bCurBtLnaConstrain=%d\n", \r
-                       pCoexDm->bPreBtLnaConstrain, pCoexDm->bCurBtLnaConstrain));\r
-\r
-               if(pCoexDm->bPreBtLnaConstrain == pCoexDm->bCurBtLnaConstrain) \r
-                       return;\r
-       }\r
-       halbtc8821a2ant_SetFwBtLnaConstrain(pBtCoexist, pCoexDm->bCurBtLnaConstrain);\r
-\r
-       pCoexDm->bPreBtLnaConstrain = pCoexDm->bCurBtLnaConstrain;\r
-}\r
-\r
-VOID\r
-halbtc8821a2ant_SetFwBtPsdMode(\r
-       IN      PBTC_COEXIST            pBtCoexist,\r
-       IN      u1Byte                  btPsdMode\r
-       )\r
-{\r
-       u1Byte                  H2C_Parameter[2] ={0};\r
-       \r
-       H2C_Parameter[0] = 0x2; // opCode, 0x2=BT_SET_PSD_MODE\r
-\r
-       H2C_Parameter[1] = btPsdMode;\r
-\r
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set BT PSD mode=0x%x, FW write 0x69=0x%x\n", \r
-               H2C_Parameter[1], \r
-               H2C_Parameter[0]<<8|H2C_Parameter[1]));\r
-\r
-       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 2, H2C_Parameter);    \r
-}\r
-\r
-\r
-VOID\r
-halbtc8821a2ant_SetBtPsdMode(\r
-       IN      PBTC_COEXIST            pBtCoexist,\r
-       IN      BOOLEAN                 bForceExec,\r
-       IN      u1Byte                  btPsdMode\r
-       )\r
-{\r
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT PSD mode = 0x%x\n",  \r
-               (bForceExec? "force":""), btPsdMode));\r
-       pCoexDm->bCurBtPsdMode = btPsdMode;\r
-\r
-       if(!bForceExec)\r
-       {\r
-               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtPsdMode=0x%x, bCurBtPsdMode=0x%x\n", \r
-                       pCoexDm->bPreBtPsdMode, pCoexDm->bCurBtPsdMode));\r
-\r
-               if(pCoexDm->bPreBtPsdMode == pCoexDm->bCurBtPsdMode) \r
-                       return;\r
-       }\r
-       halbtc8821a2ant_SetFwBtPsdMode(pBtCoexist, pCoexDm->bCurBtPsdMode);\r
-\r
-       pCoexDm->bPreBtPsdMode = pCoexDm->bCurBtPsdMode;\r
-}\r
-\r
-\r
 VOID\r
 halbtc8821a2ant_SetBtAutoReport(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
@@ -1470,6 +1379,8 @@ halbtc8821a2ant_CoexUnder5G(
        )\r
 {\r
        halbtc8821a2ant_CoexAllOff(pBtCoexist);\r
+\r
+       halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, TRUE);\r
 }\r
 \r
 VOID\r
@@ -3598,9 +3509,17 @@ halbtc8821a2ant_RunCoexistMechanism(
 // extern function start with EXhalbtc8821a2ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8821a2ant_InitHwConfig(\r
+EXhalbtc8821a2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
+{\r
+}\r
+\r
+VOID\r
+EXhalbtc8821a2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
 {\r
        PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
        u4Byte  u4Tmp=0;\r
@@ -3653,23 +3572,11 @@ 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
        CL_PRINTF(cliBuf);\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);      \r
@@ -3690,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
@@ -3757,17 +3642,11 @@ 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
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d ", "SM1[ShRf/ LpRA/ LimDig/ btLna]", \\r
-               pCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig, pCoexDm->bCurBtLnaConstrain);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "SM1[ShRf/ LpRA/ LimDig]", \\r
+               pCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig);\r
        CL_PRINTF(cliBuf);\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d(0x%x) ", "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]", \\r
                pCoexDm->bCurAgcTableEn, pCoexDm->bCurAdcBackOff, pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl);\r
@@ -3856,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
@@ -4000,11 +3873,11 @@ EXhalbtc8821a2ant_BtInfoNotify(
 {\r
        u1Byte                  btInfo=0;\r
        u1Byte                  i, rspSource=0;\r
-       static u4Byte           setBtLnaCnt=0, setBtPsdMode=0;\r
        BOOLEAN                 bBtBusy=FALSE, bLimitedDig=FALSE;\r
-       BOOLEAN                 bWifiConnected=FALSE, bBtHsOn=FALSE;\r
+       BOOLEAN                 bWifiConnected=FALSE, bBtHsOn=FALSE, bWifiUnder5G=FALSE;\r
 \r
        pCoexSta->bC2hBtInfoReqSent = FALSE;\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
 \r
        rspSource = tmpBuf[0]&0xf;\r
        if(rspSource >= BT_INFO_SRC_8821A_2ANT_MAX)\r
@@ -4027,6 +3900,7 @@ EXhalbtc8821a2ant_BtInfoNotify(
                }\r
        }\r
 \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
        if(BT_INFO_SRC_8821A_2ANT_WIFI_FW != rspSource)\r
        {\r
                pCoexSta->btRetryCnt =  // [3:0]\r
@@ -4037,12 +3911,12 @@ EXhalbtc8821a2ant_BtInfoNotify(
 \r
                pCoexSta->btInfoExt = \r
                        pCoexSta->btInfoC2h[rspSource][4];\r
-\r
+               \r
                // Here we need to resend some wifi info to BT\r
                // because bt is reset and loss of the info.\r
                if( (pCoexSta->btInfoExt & BIT1) )\r
                {                       \r
-                       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
+                       \r
                        if(bWifiConnected)\r
                        {\r
                                EXhalbtc8821a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);\r
@@ -4051,42 +3925,28 @@ EXhalbtc8821a2ant_BtInfoNotify(
                        {\r
                                EXhalbtc8821a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\r
                        }\r
-\r
-                       setBtPsdMode = 0;\r
                }\r
-               if(setBtPsdMode <= 3)\r
-               {\r\r
-                       halbtc8821a2ant_SetBtPsdMode(pBtCoexist, FORCE_EXEC, 0x0); //fix CH-BW mode \r
-                       setBtPsdMode++;\r
-               }\r
-               \r
-               if(pCoexDm->bCurBtLnaConstrain)\r
+\r
+               if(!pBtCoexist->bManualControl && !bWifiUnder5G)\r
                {\r
-                       if( (pCoexSta->btInfoExt & BIT2) )\r
+                       if( (pCoexSta->btInfoExt&BIT3) )\r
                        {\r
+                               if(bWifiConnected)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n"));\r
+                                       halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\r
+                               }\r
                        }\r
                        else\r
                        {\r
-                               if(setBtLnaCnt <= 3)\r
+                               // BT already NOT ignore Wlan active, do nothing here.\r
+                               if(!bWifiConnected)\r
                                {\r
-                                       halbtc8821a2ant_SetBtLnaConstrain(pBtCoexist, FORCE_EXEC, TRUE);\r
-                                       setBtLnaCnt++;\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT to ignore Wlan active!!\n"));\r
+                                       halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
                                }\r
                        }\r
                }\r
-               else\r
-               {\r
-                       setBtLnaCnt = 0;\r
-               }\r
-\r
-               if( (pCoexSta->btInfoExt & BIT3) )\r
-               {\r
-                       halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\r
-               }\r
-               else\r
-               {\r
-                       // BT already NOT ignore Wlan active, do nothing here.\r
-               }\r
 \r
                if( (pCoexSta->btInfoExt & BIT4) )\r
                {\r
@@ -4185,6 +4045,25 @@ EXhalbtc8821a2ant_HaltNotify(
        EXhalbtc8821a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\r
 }\r
 \r
+VOID\r
+EXhalbtc8821a2ant_PnpNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          pnpState\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n"));\r
+\r
+       if(BTC_WIFI_PNP_SLEEP == pnpState)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n"));\r
+               halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
+       }\r
+       else if(BTC_WIFI_PNP_WAKE_UP == pnpState)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n"));\r
+       }\r
+}\r
+\r
 VOID\r
 EXhalbtc8821a2ant_Periodical(\r
        IN      PBTC_COEXIST                    pBtCoexist\r
index 95266a122e8d3d4e52f65f709ff9426ce7b9ac6f..3da55176f5bac976d9226766a51e2581467094f3 100644 (file)
@@ -45,10 +45,6 @@ typedef struct _COEX_DM_8821A_2ANT{
        // fw mechanism\r
        BOOLEAN         bPreDecBtPwr;\r
        BOOLEAN         bCurDecBtPwr;\r
-       BOOLEAN         bPreBtLnaConstrain;\r
-       BOOLEAN         bCurBtLnaConstrain;\r
-       u1Byte          bPreBtPsdMode;\r
-       u1Byte          bCurBtPsdMode;\r
        u1Byte          preFwDacSwingLvl;\r
        u1Byte          curFwDacSwingLvl;\r
        BOOLEAN         bCurIgnoreWlanAct;\r
@@ -122,10 +118,15 @@ typedef struct _COEX_STA_8821A_2ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8821a2ant_InitHwConfig(\r
+EXhalbtc8821a2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8821a2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8821a2ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
@@ -170,6 +171,11 @@ EXhalbtc8821a2ant_HaltNotify(
        IN      PBTC_COEXIST                    pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8821a2ant_PnpNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          pnpState\r
+       );\r
+VOID\r
 EXhalbtc8821a2ant_Periodical(\r
        IN      PBTC_COEXIST                    pBtCoexist\r
        );\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.c
new file mode 100644 (file)
index 0000000..824b8fb
--- /dev/null
@@ -0,0 +1,4398 @@
+//============================================================\r
+// Description:\r
+//\r
+// This file is for RTL8821A_CSR Co-exist mechanism\r
+//\r
+// History\r
+// 2012/08/22 Cosa first check in.\r
+// 2012/11/14 Cosa Revise for 8821A_CSR 2Ant out sourcing.\r
+//\r
+//============================================================\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+#include "Mp_Precomp.h"\r
+\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
+//============================================================\r
+static COEX_DM_8821A_CSR_2ANT  GLCoexDm8821aCsr2Ant;\r
+static PCOEX_DM_8821A_CSR_2ANT         pCoexDm=&GLCoexDm8821aCsr2Ant;\r
+static COEX_STA_8821A_CSR_2ANT GLCoexSta8821aCsr2Ant;\r
+static PCOEX_STA_8821A_CSR_2ANT        pCoexSta=&GLCoexSta8821aCsr2Ant;\r
+\r
+const char *const GLBtInfoSrc8821aCsr2Ant[]={\r
+       "BT Info[wifi fw]",\r
+       "BT Info[bt rsp]",\r
+       "BT Info[bt auto report]",\r
+};\r
+\r
+u4Byte GLCoexVerDate8821aCsr2Ant=20130618;\r
+u4Byte GLCoexVer8821aCsr2Ant=0x5050;\r
+\r
+//============================================================\r
+// local function proto type if needed\r
+//============================================================\r
+//============================================================\r
+// local function start with halbtc8821aCsr2ant_\r
+//============================================================\r
+u1Byte\r
+halbtc8821aCsr2ant_BtRssiState(\r
+       u1Byte                  levelNum,\r
+       u1Byte                  rssiThresh,\r
+       u1Byte                  rssiThresh1\r
+       )\r
+{\r
+       s4Byte                  btRssi=0;\r
+       u1Byte                  btRssiState=pCoexSta->preBtRssiState;\r
+\r
+       btRssi = pCoexSta->btRssi;\r
+\r
+       if(levelNum == 2)\r
+       {                       \r
+               if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\r
+                       (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\r
+               {\r
+                       if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_HIGH;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_STAY_LOW;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n"));\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(btRssi < rssiThresh)\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_LOW;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_STAY_HIGH;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n"));\r
+                       }\r
+               }\r
+       }\r
+       else if(levelNum == 3)\r
+       {\r
+               if(rssiThresh > rssiThresh1)\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi thresh error!!\n"));\r
+                       return pCoexSta->preBtRssiState;\r
+               }\r
+               \r
+               if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\r
+                       (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\r
+               {\r
+                       if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_MEDIUM;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_STAY_LOW;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n"));\r
+                       }\r
+               }\r
+               else if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||\r
+                       (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM))\r
+               {\r
+                       if(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_HIGH;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n"));\r
+                       }\r
+                       else if(btRssi < rssiThresh)\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_LOW;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Medium\n"));\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(btRssi < rssiThresh1)\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_MEDIUM;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_STAY_HIGH;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n"));\r
+                       }\r
+               }\r
+       }\r
+               \r
+       pCoexSta->preBtRssiState = btRssiState;\r
+\r
+       return btRssiState;\r
+}\r
+\r
+u1Byte\r
+halbtc8821aCsr2ant_WifiRssiState(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  index,\r
+       IN      u1Byte                  levelNum,\r
+       IN      u1Byte                  rssiThresh,\r
+       IN      u1Byte                  rssiThresh1\r
+       )\r
+{\r
+       s4Byte                  wifiRssi=0;\r
+       u1Byte                  wifiRssiState=pCoexSta->preWifiRssiState[index];\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
+       \r
+       if(levelNum == 2)\r
+       {\r
+               if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\r
+                       (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\r
+               {\r
+                       if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_HIGH;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_STAY_LOW;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n"));\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(wifiRssi < rssiThresh)\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_LOW;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n"));\r
+                       }\r
+               }\r
+       }\r
+       else if(levelNum == 3)\r
+       {\r
+               if(rssiThresh > rssiThresh1)\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n"));\r
+                       return pCoexSta->preWifiRssiState[index];\r
+               }\r
+               \r
+               if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\r
+                       (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\r
+               {\r
+                       if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_MEDIUM;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_STAY_LOW;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n"));\r
+                       }\r
+               }\r
+               else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||\r
+                       (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM))\r
+               {\r
+                       if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_HIGH;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n"));\r
+                       }\r
+                       else if(wifiRssi < rssiThresh)\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_LOW;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n"));\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(wifiRssi < rssiThresh1)\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_MEDIUM;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n"));\r
+                       }\r
+               }\r
+       }\r
+               \r
+       pCoexSta->preWifiRssiState[index] = wifiRssiState;\r
+\r
+       return wifiRssiState;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_MonitorBtEnableDisable(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       static BOOLEAN  bPreBtDisabled=FALSE;\r
+       static u4Byte   btDisableCnt=0;\r
+       BOOLEAN                 bBtActive=TRUE, bBtDisabled=FALSE;\r
+\r
+       // This function check if bt is disabled\r
+\r
+       if(     pCoexSta->highPriorityTx == 0 &&\r
+               pCoexSta->highPriorityRx == 0 &&\r
+               pCoexSta->lowPriorityTx == 0 &&\r
+               pCoexSta->lowPriorityRx == 0)\r
+       {\r
+               bBtActive = FALSE;\r
+       }\r
+       if(     pCoexSta->highPriorityTx == 0xffff &&\r
+               pCoexSta->highPriorityRx == 0xffff &&\r
+               pCoexSta->lowPriorityTx == 0xffff &&\r
+               pCoexSta->lowPriorityRx == 0xffff)\r
+       {\r
+               bBtActive = FALSE;\r
+       }\r
+       if(bBtActive)\r
+       {\r
+               btDisableCnt = 0;\r
+               bBtDisabled = FALSE;\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is enabled !!\n"));\r
+       }\r
+       else\r
+       {\r
+               btDisableCnt++;\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], bt all counters=0, %d times!!\n", \r
+                               btDisableCnt));\r
+               if(btDisableCnt >= 2)\r
+               {\r
+                       bBtDisabled = TRUE;\r
+                       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is disabled !!\n"));\r
+               }\r
+       }\r
+       if(bPreBtDisabled != bBtDisabled)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is from %s to %s!!\n", \r
+                       (bPreBtDisabled ? "disabled":"enabled"), \r
+                       (bBtDisabled ? "disabled":"enabled")));\r
+               bPreBtDisabled = bBtDisabled;\r
+               if(!bBtDisabled)\r
+               {\r
+               }\r
+               else\r
+               {\r
+               }\r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_MonitorBtCtr(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u4Byte                  regHPTxRx, regLPTxRx, u4Tmp;\r
+       u4Byte                  regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\r
+       u1Byte                  u1Tmp;\r
+       \r
+       regHPTxRx = 0x770;\r
+       regLPTxRx = 0x774;\r
+\r
+       u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);\r
+       regHPTx = u4Tmp & bMaskLWord;\r
+       regHPRx = (u4Tmp & bMaskHWord)>>16;\r
+\r
+       u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);\r
+       regLPTx = u4Tmp & bMaskLWord;\r
+       regLPRx = (u4Tmp & bMaskHWord)>>16;\r
+               \r
+       pCoexSta->highPriorityTx = regHPTx;\r
+       pCoexSta->highPriorityRx = regHPRx;\r
+       pCoexSta->lowPriorityTx = regLPTx;\r
+       pCoexSta->lowPriorityRx = regLPRx;\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
+               regLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx));\r
+\r
+       // reset counter\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x5d);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_UpdateRaMask(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bForceExec,\r
+       IN      u4Byte                          disRateMask\r
+       )\r
+{\r
+       pCoexDm->curRaMask = disRateMask;\r
+       \r
+       if( bForceExec || (pCoexDm->preRaMask != pCoexDm->curRaMask))\r
+       {\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_UPDATE_RAMASK, &pCoexDm->curRaMask);\r
+       }\r
+       pCoexDm->preRaMask = pCoexDm->curRaMask;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_AutoRateFallbackRetry(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bForceExec,\r
+       IN      u1Byte                          type\r
+       )\r
+{\r
+       BOOLEAN bWifiUnderBMode=FALSE;\r
+       \r
+       pCoexDm->curArfrType = type;\r
+\r
+       if( bForceExec || (pCoexDm->preArfrType != pCoexDm->curArfrType))\r
+       {\r
+               switch(pCoexDm->curArfrType)\r
+               {\r
+                       case 0: // normal mode\r
+                               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, pCoexDm->backupArfrCnt1);\r
+                               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, pCoexDm->backupArfrCnt2);\r
+                               break;\r
+                       case 1: \r
+                               pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\r
+                               if(bWifiUnderBMode)\r
+                               {\r
+                                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\r
+                                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x01010101);\r
+                               }\r
+                               else\r
+                               {\r
+                                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\r
+                                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x04030201);\r
+                               }\r
+                               break;\r
+                       default:\r
+                               break;\r
+               }\r
+       }\r
+\r
+       pCoexDm->preArfrType = pCoexDm->curArfrType;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_RetryLimit(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bForceExec,\r
+       IN      u1Byte                          type\r
+       )\r
+{\r
+       pCoexDm->curRetryLimitType = type;\r
+\r
+       if( bForceExec || (pCoexDm->preRetryLimitType != pCoexDm->curRetryLimitType))\r
+       {\r
+               switch(pCoexDm->curRetryLimitType)\r
+               {\r
+                       case 0: // normal mode\r
+                               pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, pCoexDm->backupRetryLimit);\r
+                               break;\r
+                       case 1: // retry limit=8\r
+                               pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, 0x0808);\r
+                               break;\r
+                       default:\r
+                               break;\r
+               }\r
+       }\r
+\r
+       pCoexDm->preRetryLimitType = pCoexDm->curRetryLimitType;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_AmpduMaxTime(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bForceExec,\r
+       IN      u1Byte                          type\r
+       )\r
+{\r
+       pCoexDm->curAmpduTimeType = type;\r
+\r
+       if( bForceExec || (pCoexDm->preAmpduTimeType != pCoexDm->curAmpduTimeType))\r
+       {\r
+               switch(pCoexDm->curAmpduTimeType)\r
+               {\r
+                       case 0: // normal mode\r
+                               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, pCoexDm->backupAmpduMaxTime);\r
+                               break;\r
+                       case 1: // AMPDU timw = 0x38 * 32us\r
+                               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, 0x38);\r
+                               break;\r
+                       case 2: \r
+                               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, 0x17);\r
+                               break;\r
+                       default:\r
+                               break;\r
+               }\r
+       }\r
+\r
+       pCoexDm->preAmpduTimeType = pCoexDm->curAmpduTimeType;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2Ant_AmpduMaxNum(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bForceExec,\r
+       IN      u1Byte                          type\r
+       )\r
+{\r
+       pCoexDm->curAmpduNumType = type;\r
+\r
+       if( bForceExec || (pCoexDm->preAmpduNumType != pCoexDm->curAmpduNumType))\r
+       {\r
+               switch(pCoexDm->curAmpduNumType)\r
+               {\r
+                       case 0: // normal mode\r
+                               pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x4ca, pCoexDm->backupAmpduMaxNum);\r
+                               break;\r
+                       case 1:\r
+                               pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x4ca, 0x0808);\r
+                               break;\r
+                       case 2: \r
+                               pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x4ca, 0x1f1f);\r
+                               break;\r
+                       default:\r
+                               break;\r
+               }\r
+       }\r
+\r
+       pCoexDm->preAmpduNumType = pCoexDm->curAmpduNumType;\r
+\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_LimitedTx(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bForceExec,\r
+       IN      u1Byte                          raMaskType,\r
+       IN      u1Byte                          arfrType,\r
+       IN      u1Byte                          retryLimitType,\r
+       IN      u1Byte                          ampduTimeType,\r
+       IN      u1Byte                          ampduNumType\r
+       )\r
+{\r
+       switch(raMaskType)\r
+       {\r
+               case 0: // normal mode\r
+                       halbtc8821aCsr2ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0);\r
+                       break;\r
+               case 1: // disable cck 1/2\r
+                       halbtc8821aCsr2ant_UpdateRaMask(pBtCoexist, bForceExec, 0x00000003);\r
+                       break;\r
+               case 2: // disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4\r
+                       halbtc8821aCsr2ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0001f1f7);\r
+                       break;\r
+               default:\r
+                       break;\r
+       }\r
+\r
+       halbtc8821aCsr2ant_AutoRateFallbackRetry(pBtCoexist, bForceExec, arfrType);\r
+       halbtc8821aCsr2ant_RetryLimit(pBtCoexist, bForceExec, retryLimitType);\r
+       halbtc8821aCsr2ant_AmpduMaxTime(pBtCoexist, bForceExec, ampduTimeType);\r
+       halbtc8821aCsr2Ant_AmpduMaxNum(pBtCoexist, bForceExec, ampduNumType);\r
+}\r
+\r
+\r
+\r
+VOID\r
+halbtc8821aCsr2ant_LimitedRx(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bForceExec,\r
+       IN      BOOLEAN                         bRejApAggPkt,\r
+       IN      BOOLEAN                         bBtCtrlAggBufSize,\r
+       IN      u1Byte                          aggBufSize\r
+       )\r
+{\r
+       BOOLEAN bRejectRxAgg=bRejApAggPkt;\r
+       BOOLEAN bBtCtrlRxAggSize=bBtCtrlAggBufSize;\r
+       u1Byte  rxAggSize=aggBufSize;\r
+\r
+       //============================================\r
+       //      Rx Aggregation related setting\r
+       //============================================\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg);\r
+       // decide BT control aggregation buf size or not\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize);\r
+       // aggregation buf size, only work when BT control Rx aggregation size.\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);\r
+       // real update aggregation setting\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_QueryBtInfo(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[1] ={0};\r
+\r
+       pCoexSta->bC2hBtInfoReqSent = TRUE;\r
+\r
+       H2C_Parameter[0] |= BIT0;       // trigger\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", \r
+               H2C_Parameter[0]));\r
+\r
+       rtw_warn_on(_BTCOEX_CSR);\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);\r
+}\r
+\r
+u1Byte\r
+halbtc8821aCsr2ant_ActionAlgorithm(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       PBTC_STACK_INFO         pStackInfo=&pBtCoexist->stackInfo;\r
+       BOOLEAN                         bBtHsOn=FALSE;\r
+       u1Byte                          algorithm=BT_8821A_CSR_2ANT_COEX_ALGO_UNDEFINED;\r
+       u1Byte                          numOfDiffProfile=0;\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
+\r
+       //sync StackInfo with BT firmware and stack\r
+       pStackInfo->bHidExist = pCoexSta->bHidExist;\r
+       pStackInfo->bBtLinkExist = pCoexSta->bBtLinkExist;\r
+       pStackInfo->bScoExist = pCoexSta->bScoExist;\r
+       pStackInfo->bPanExist = pCoexSta->bPanExist;\r
+       pStackInfo->bA2dpExist = pCoexSta->bA2dpExist;\r
+\r
+       if(!pStackInfo->bBtLinkExist)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No profile exists!!!\n"));\r
+               return algorithm;\r
+       }\r
+\r
+       if(pStackInfo->bScoExist)\r
+               numOfDiffProfile++;\r
+       if(pStackInfo->bHidExist)\r
+               numOfDiffProfile++;\r
+       if(pStackInfo->bPanExist)\r
+               numOfDiffProfile++;\r
+       if(pStackInfo->bA2dpExist)\r
+               numOfDiffProfile++;\r
+       \r
+       if(numOfDiffProfile == 1)\r
+       {\r
+               if(pStackInfo->bScoExist)\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO only\n"));\r
+                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_SCO;\r
+               }\r
+               else\r
+               {\r
+                       if(pStackInfo->bHidExist)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID only\n"));\r
+                               algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID;\r
+                       }\r
+                       else if(pStackInfo->bA2dpExist)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP only\n"));\r
+                               algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_A2DP;\r
+                       }\r
+                       else if(pStackInfo->bPanExist)\r
+                       {\r
+                               if(bBtHsOn)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(HS) only\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANHS;\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(EDR) only\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       else if(numOfDiffProfile == 2)\r
+       {\r
+               if(pStackInfo->bScoExist)\r
+               {\r
+                       if(pStackInfo->bHidExist)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID\n"));\r
+                               algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                       }\r
+                       else if(pStackInfo->bA2dpExist)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP ==> SCO\n"));\r
+                               algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                       }\r
+                       else if(pStackInfo->bPanExist)\r
+                       {\r
+                               if(bBtHsOn)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(HS)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_SCO;\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(EDR)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if( pStackInfo->bHidExist &&\r
+                               pStackInfo->bA2dpExist )\r
+                       {\r
+                               if(pStackInfo->numOfHid >= 2)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID*2 + A2DP\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR;\r
+                               }\r
+                               else\r
+                               {                       \r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP;\r
+                               }\r
+                       }\r
+                       else if( pStackInfo->bHidExist &&\r
+                               pStackInfo->bPanExist )\r
+                       {\r
+                               if(bBtHsOn)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(HS)\n"));\r
+                                       algorithm =  BT_8821A_CSR_2ANT_COEX_ALGO_HID;\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(EDR)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                               }\r
+                       }\r
+                       else if( pStackInfo->bPanExist &&\r
+                               pStackInfo->bA2dpExist )\r
+                       {\r
+                               if(bBtHsOn)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(HS)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_A2DP_PANHS;\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_A2DP;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       else if(numOfDiffProfile == 3)\r
+       {\r
+               if(pStackInfo->bScoExist)\r
+               {\r
+                       if( pStackInfo->bHidExist &&\r
+                               pStackInfo->bA2dpExist )\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP ==> HID\n"));\r
+                               algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                       }\r
+                       else if( pStackInfo->bHidExist &&\r
+                               pStackInfo->bPanExist )\r
+                       {\r
+                               if(bBtHsOn)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(HS)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(EDR)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                               }\r
+                       }\r
+                       else if( pStackInfo->bPanExist &&\r
+                               pStackInfo->bA2dpExist )\r
+                       {\r
+                               if(bBtHsOn)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(HS)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if( pStackInfo->bHidExist &&\r
+                               pStackInfo->bPanExist &&\r
+                               pStackInfo->bA2dpExist )\r
+                       {\r
+                               if(bBtHsOn)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP;\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       else if(numOfDiffProfile >= 3)\r
+       {\r
+               if(pStackInfo->bScoExist)\r
+               {\r
+                       if( pStackInfo->bHidExist &&\r
+                               pStackInfo->bPanExist &&\r
+                               pStackInfo->bA2dpExist )\r
+                       {\r
+                               if(bBtHsOn)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n"));\r
+\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return algorithm;\r
+}\r
+\r
+BOOLEAN\r
+halbtc8821aCsr2ant_NeedToDecBtPwr(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       BOOLEAN         bRet=FALSE;\r
+       BOOLEAN         bBtHsOn=FALSE, bWifiConnected=FALSE;\r
+       s4Byte          btHsRssi=0;\r
+       u1Byte          btRssiState;\r
+\r
+       if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn))\r
+               return FALSE;\r
+       if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected))\r
+               return FALSE;\r
+       if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi))\r
+               return FALSE;\r
+\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       if(bWifiConnected)\r
+       {\r
+               if(bBtHsOn)\r
+               {\r
+                       if(btHsRssi > 37)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for HS mode!!\n"));\r
+                               bRet = TRUE;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+                       {\r
+               \r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for Wifi is connected!!\n"));\r
+                               bRet = TRUE;\r
+                       }\r
+               }\r
+       }\r
+       \r
+       return bRet;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetFwDacSwingLevel(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  dacSwingLvl\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[1] ={0};\r
+\r
+       // There are several type of dacswing\r
+       // 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6\r
+       H2C_Parameter[0] = dacSwingLvl;\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl));\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x64=0x%x\n", H2C_Parameter[0]));\r
+\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x64, 1, H2C_Parameter);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetFwDecBtPwr(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bDecBtPwr\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[1] ={0};\r
+       \r
+       H2C_Parameter[0] = 0;\r
+\r
+       if(bDecBtPwr)\r
+       {\r
+               H2C_Parameter[0] |= BIT1;\r
+       }\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], decrease Bt Power : %s, FW write 0x62=0x%x\n", \r
+               (bDecBtPwr? "Yes!!":"No!!"), H2C_Parameter[0]));\r
+\r
+       rtw_warn_on(_BTCOEX_CSR);\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, H2C_Parameter);    \r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_DecBtPwr(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bDecBtPwr\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s Dec BT power = %s\n",  \r
+               (bForceExec? "force to":""), ((bDecBtPwr)? "ON":"OFF")));\r
+       pCoexDm->bCurDecBtPwr = bDecBtPwr;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreDecBtPwr=%d, bCurDecBtPwr=%d\n", \r
+                       pCoexDm->bPreDecBtPwr, pCoexDm->bCurDecBtPwr));\r
+\r
+               if(pCoexDm->bPreDecBtPwr == pCoexDm->bCurDecBtPwr) \r
+                       return;\r
+       }\r
+\r
+       /* TODO: may CSR consider to decrease BT power? */\r
+       //halbtc8821aCsr2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->bCurDecBtPwr);\r
+\r
+       pCoexDm->bPreDecBtPwr = pCoexDm->bCurDecBtPwr;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetBtAutoReport(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bEnableAutoReport\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[1] ={0};\r
+       \r
+       H2C_Parameter[0] = 0;\r
+\r
+       if(bEnableAutoReport)\r
+       {\r
+               H2C_Parameter[0] |= BIT0;\r
+       }\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n", \r
+               (bEnableAutoReport? "Enabled!!":"Disabled!!"), H2C_Parameter[0]));\r
+\r
+       rtw_warn_on(_BTCOEX_CSR);\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter);    \r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_BtAutoReport(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bEnableAutoReport\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT Auto report = %s\n",  \r
+               (bForceExec? "force to":""), ((bEnableAutoReport)? "Enabled":"Disabled")));\r
+       pCoexDm->bCurBtAutoReport = bEnableAutoReport;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtAutoReport=%d, bCurBtAutoReport=%d\n", \r
+                       pCoexDm->bPreBtAutoReport, pCoexDm->bCurBtAutoReport));\r
+\r
+               if(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) \r
+                       return;\r
+       }\r
+       //halbtc8821aCsr2ant_SetBtAutoReport(pBtCoexist, pCoexDm->bCurBtAutoReport);\r
+\r
+       pCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_FwDacSwingLvl(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      u1Byte                  fwDacSwingLvl\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set FW Dac Swing level = %d\n",  \r
+               (bForceExec? "force to":""), fwDacSwingLvl));\r
+       pCoexDm->curFwDacSwingLvl = fwDacSwingLvl;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n", \r
+                       pCoexDm->preFwDacSwingLvl, pCoexDm->curFwDacSwingLvl));\r
+\r
+               if(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl) \r
+                       return;\r
+       }\r
+\r
+       halbtc8821aCsr2ant_SetFwDacSwingLevel(pBtCoexist, pCoexDm->curFwDacSwingLvl);\r
+\r
+       pCoexDm->preFwDacSwingLvl = pCoexDm->curFwDacSwingLvl;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetSwRfRxLpfCorner(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bRxRfShrinkOn\r
+       )\r
+{\r
+       if(bRxRfShrinkOn)\r
+       {\r
+               //Shrink RF Rx LPF corner\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Shrink RF Rx LPF corner!!\n"));\r
+               pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xffffc);\r
+       }\r
+       else\r
+       {\r
+               //Resume RF Rx LPF corner\r
+               // After initialized, we can use pCoexDm->btRf0x1eBackup\r
+               if(pBtCoexist->bInitilized)\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Resume RF Rx LPF corner!!\n"));\r
+                       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup);\r
+               }\r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_RfShrink(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bRxRfShrinkOn\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn Rx RF Shrink = %s\n",  \r
+               (bForceExec? "force to":""), ((bRxRfShrinkOn)? "ON":"OFF")));\r
+       pCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n", \r
+                       pCoexDm->bPreRfRxLpfShrink, pCoexDm->bCurRfRxLpfShrink));\r
+\r
+               if(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) \r
+                       return;\r
+       }\r
+       halbtc8821aCsr2ant_SetSwRfRxLpfCorner(pBtCoexist, pCoexDm->bCurRfRxLpfShrink);\r
+\r
+       pCoexDm->bPreRfRxLpfShrink = pCoexDm->bCurRfRxLpfShrink;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetSwPenaltyTxRateAdaptive(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bLowPenaltyRa\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[6] ={0};\r
+       \r
+       H2C_Parameter[0] = 0x6; // opCode, 0x6= Retry_Penalty\r
+\r
+       if(bLowPenaltyRa)\r
+       {\r
+               H2C_Parameter[1] |= BIT0;\r
+               H2C_Parameter[2] = 0x00;  //normal rate except MCS7/6/5, OFDM54/48/36\r
+               H2C_Parameter[3] = 0xf7;  //MCS7 or OFDM54\r
+               H2C_Parameter[4] = 0xf8;  //MCS6 or OFDM48\r
+               H2C_Parameter[5] = 0xf9;        //MCS5 or OFDM36        \r
+       }\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set WiFi Low-Penalty Retry: %s", \r
+               (bLowPenaltyRa? "ON!!":"OFF!!") ));\r
+\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_LowPenaltyRa(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bLowPenaltyRa\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn LowPenaltyRA = %s\n",  \r
+               (bForceExec? "force to":""), ((bLowPenaltyRa)? "ON":"OFF")));\r
+       pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n", \r
+                       pCoexDm->bPreLowPenaltyRa, pCoexDm->bCurLowPenaltyRa));\r
+\r
+               if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) \r
+                       return;\r
+       }\r
+       halbtc8821aCsr2ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);\r
+\r
+       pCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetDacSwingReg(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u4Byte                  level\r
+       )\r
+{\r
+       u1Byte  val=(u1Byte)level;\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Write SwDacSwing = 0x%x\n", level));\r
+       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc5b, 0x3e, val);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetSwFullTimeDacSwing(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bSwDacSwingOn,\r
+       IN      u4Byte                  swDacSwingLvl\r
+       )\r
+{\r
+       if(bSwDacSwingOn)\r
+       {\r
+               halbtc8821aCsr2ant_SetDacSwingReg(pBtCoexist, swDacSwingLvl);\r
+       }\r
+       else\r
+       {\r
+               halbtc8821aCsr2ant_SetDacSwingReg(pBtCoexist, 0x18);\r
+       }\r
+}\r
+\r
+\r
+VOID\r
+halbtc8821aCsr2ant_DacSwing(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bDacSwingOn,\r
+       IN      u4Byte                  dacSwingLvl\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n",  \r
+               (bForceExec? "force to":""), ((bDacSwingOn)? "ON":"OFF"), dacSwingLvl));\r
+       pCoexDm->bCurDacSwingOn = bDacSwingOn;\r
+       pCoexDm->curDacSwingLvl = dacSwingLvl;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n", \r
+                       pCoexDm->bPreDacSwingOn, pCoexDm->preDacSwingLvl,\r
+                       pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl));\r
+\r
+               if( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) &&\r
+                       (pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) )\r
+                       return;\r
+       }\r
+       delay_ms(30);\r
+       halbtc8821aCsr2ant_SetSwFullTimeDacSwing(pBtCoexist, bDacSwingOn, dacSwingLvl);\r
+\r
+       pCoexDm->bPreDacSwingOn = pCoexDm->bCurDacSwingOn;\r
+       pCoexDm->preDacSwingLvl = pCoexDm->curDacSwingLvl;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetAdcBackOff(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bAdcBackOff\r
+       )\r
+{\r
+       if(bAdcBackOff)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level On!\n"));\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x3);\r
+       }\r
+       else\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level Off!\n"));\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x1);\r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_AdcBackOff(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bAdcBackOff\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn AdcBackOff = %s\n",  \r
+               (bForceExec? "force to":""), ((bAdcBackOff)? "ON":"OFF")));\r
+       pCoexDm->bCurAdcBackOff = bAdcBackOff;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n", \r
+                       pCoexDm->bPreAdcBackOff, pCoexDm->bCurAdcBackOff));\r
+\r
+               if(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) \r
+                       return;\r
+       }\r
+       halbtc8821aCsr2ant_SetAdcBackOff(pBtCoexist, pCoexDm->bCurAdcBackOff);\r
+\r
+       pCoexDm->bPreAdcBackOff = pCoexDm->bCurAdcBackOff;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetAgcTable(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bAgcTableEn\r
+       )\r
+{\r
+       u1Byte          rssiAdjustVal=0;\r
+\r
+       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000);\r
+       if(bAgcTableEn)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n"));\r
+               pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff,  0x28F4B);\r
+               pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff,  0x10AB2);\r
+               rssiAdjustVal = 8;\r
+       }\r
+       else\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n"));\r
+               pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x2884B);\r
+               pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x104B2);\r
+       }\r
+       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x0);\r
+\r
+       // set rssiAdjustVal for wifi module.\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON, &rssiAdjustVal);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_AgcTable(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bAgcTableEn\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s %s Agc Table\n",  \r
+               (bForceExec? "force to":""), ((bAgcTableEn)? "Enable":"Disable")));\r
+       pCoexDm->bCurAgcTableEn = bAgcTableEn;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n", \r
+                       pCoexDm->bPreAgcTableEn, pCoexDm->bCurAgcTableEn));\r
+\r
+               if(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) \r
+                       return;\r
+       }\r
+       halbtc8821aCsr2ant_SetAgcTable(pBtCoexist, bAgcTableEn);\r
+\r
+       pCoexDm->bPreAgcTableEn = pCoexDm->bCurAgcTableEn;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetCoexTable(\r
+       IN      PBTC_COEXIST    pBtCoexist,\r
+       IN      u4Byte          val0x6c0,\r
+       IN      u4Byte          val0x6c4,\r
+       IN      u4Byte          val0x6c8,\r
+       IN      u1Byte          val0x6cc\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0));\r
+       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4));\r
+       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8));\r
+       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc));\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_CoexTable(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      u4Byte                  val0x6c0,\r
+       IN      u4Byte                  val0x6c4,\r
+       IN      u4Byte                  val0x6c8,\r
+       IN      u1Byte                  val0x6cc\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", \r
+               (bForceExec? "force to":""), val0x6c0, val0x6c4, val0x6c8, val0x6cc));\r
+       pCoexDm->curVal0x6c0 = val0x6c0;\r
+       pCoexDm->curVal0x6c4 = val0x6c4;\r
+       pCoexDm->curVal0x6c8 = val0x6c8;\r
+       pCoexDm->curVal0x6cc = val0x6cc;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], preVal0x6c0=0x%x, preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n", \r
+                       pCoexDm->preVal0x6c0, pCoexDm->preVal0x6c4, pCoexDm->preVal0x6c8, pCoexDm->preVal0x6cc));\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], curVal0x6c0=0x%x, curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n", \r
+                       pCoexDm->curVal0x6c0, pCoexDm->curVal0x6c4, pCoexDm->curVal0x6c8, pCoexDm->curVal0x6cc));\r
+       \r
+               if( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&\r
+                       (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&\r
+                       (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&\r
+                       (pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )\r
+                       return;\r
+       }\r
+       halbtc8821aCsr2ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc);\r
+\r
+       pCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;\r
+       pCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;\r
+       pCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;\r
+       pCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetFwIgnoreWlanAct(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bEnable\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[1] ={0};\r
+               \r
+       if(bEnable)\r
+       {\r
+               H2C_Parameter[0] |= BIT0;               // function enable\r
+       }\r
+       \r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n", \r
+               H2C_Parameter[0]));\r
+\r
+       rtw_warn_on(_BTCOEX_CSR);\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_IgnoreWlanAct(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bEnable\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn Ignore WlanAct %s\n", \r
+               (bForceExec? "force to":""), (bEnable? "ON":"OFF")));\r
+       pCoexDm->bCurIgnoreWlanAct = bEnable;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n", \r
+                       pCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct));\r
+\r
+               if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)\r
+                       return;\r
+       }\r
+       //halbtc8821aCsr2ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);\r
+\r
+       pCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetFwPstdma(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  byte1,\r
+       IN      u1Byte                  byte2,\r
+       IN      u1Byte                  byte3,\r
+       IN      u1Byte                  byte4,\r
+       IN      u1Byte                  byte5\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[6] ={0};\r
+\r
+       H2C_Parameter[0] = byte1;       \r
+       H2C_Parameter[1] = byte2;       \r
+       H2C_Parameter[2] = byte3;\r
+       H2C_Parameter[3] = byte4;\r
+       H2C_Parameter[4] = byte5;\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] = 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
+               H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4], H2C_Parameter[5]));\r
+\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 6, H2C_Parameter);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SwMechanism1(\r
+       IN      PBTC_COEXIST    pBtCoexist,     \r
+       IN      BOOLEAN         bShrinkRxLPF,\r
+       IN      BOOLEAN         bLowPenaltyRA,\r
+       IN      BOOLEAN         bLimitedDIG, \r
+       IN      BOOLEAN         bBTLNAConstrain\r
+       ) \r
+{\r
+       u4Byte  wifiBw;\r
+       \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+       \r
+       if(BTC_WIFI_BW_HT40 != wifiBw)  //only shrink RF Rx LPF for HT40\r
+       {\r
+               if (bShrinkRxLPF)\r
+                       bShrinkRxLPF = FALSE;\r
+       }\r
+               \r
+        halbtc8821aCsr2ant_RfShrink(pBtCoexist, NORMAL_EXEC, bShrinkRxLPF);\r
+       halbtc8821aCsr2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);\r
+\r
+       //no limited DIG\r
+       //halbtc8821aCsr2ant_SetBtLnaConstrain(pBtCoexist, NORMAL_EXEC, bBTLNAConstrain);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SwMechanism2(\r
+       IN      PBTC_COEXIST    pBtCoexist,     \r
+       IN      BOOLEAN         bAGCTableShift,\r
+       IN      BOOLEAN         bADCBackOff,\r
+       IN      BOOLEAN         bSWDACSwing,\r
+       IN      u4Byte          dacSwingLvl\r
+       ) \r
+{\r
+       //halbtc8821aCsr2ant_AgcTable(pBtCoexist, NORMAL_EXEC, bAGCTableShift);\r
+       halbtc8821aCsr2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, bADCBackOff);\r
+       halbtc8821aCsr2ant_DacSwing(pBtCoexist, NORMAL_EXEC, bSWDACSwing, dacSwingLvl);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetAntPath(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                          antPosType,\r
+       IN      BOOLEAN                         bInitHwCfg,\r
+       IN      BOOLEAN                         bWifiOff\r
+       )\r
+{\r
+       PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
+       u4Byte                          u4Tmp=0;\r
+       u1Byte                          H2C_Parameter[2] ={0};\r
+       \r
+       if(bInitHwCfg)\r
+       {\r
+               // 0x4c[23]=0, 0x4c[24]=1  Antenna control by WL/BT\r
+               u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\r
+               u4Tmp &=~BIT23;\r
+               u4Tmp |= BIT24;\r
+               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
+\r
+               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x974, 0x3ff);\r
+               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x77);\r
+\r
+               if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) \r
+               {\r
+                       //tell firmware "antenna inverse"  ==> WRONG firmware antenna control code.==>need fw to fix\r
+                       H2C_Parameter[0] = 1;\r
+                       H2C_Parameter[1] = 1;\r
+                       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\r
+               }\r
+               else\r
+               {\r
+                       //tell firmware "no antenna inverse" ==> WRONG firmware antenna control code.==>need fw to fix\r
+                       H2C_Parameter[0] = 0;\r
+                       H2C_Parameter[1] = 1;\r
+                       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\r
+               }\r
+       }\r
+       \r
+       // ext switch setting\r
+       switch(antPosType)\r
+       {\r
+               case BTC_ANT_WIFI_AT_MAIN:\r
+                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x1);\r
+                       break;\r
+               case BTC_ANT_WIFI_AT_AUX:\r
+                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x2);\r
+                       break;\r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_PsTdma(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bTurnOn,\r
+       IN      u1Byte                  type\r
+       )\r
+{\r
+       BOOLEAN                 bTurnOnByCnt=FALSE;\r
+       u1Byte                  psTdmaTypeByCnt=0;\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
+       pCoexDm->bCurPsTdmaOn = bTurnOn;\r
+       pCoexDm->curPsTdma = type;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n", \r
+                       pCoexDm->bPrePsTdmaOn, pCoexDm->bCurPsTdmaOn));\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n", \r
+                       pCoexDm->prePsTdma, pCoexDm->curPsTdma));\r
+\r
+               if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\r
+                       (pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\r
+                       return;\r
+       }       \r
+       if(bTurnOn)\r
+       {\r
+               switch(type)\r
+               {\r
+                       case 1:\r
+                       default:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\r
+                               break;\r
+                       case 2:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);\r
+                               break;\r
+                       case 3:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90);\r
+                               break;\r
+                       case 4:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x03, 0xf1, 0x90);\r
+                               break;\r
+                       case 5:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);\r
+                               break;\r
+                       case 6:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);\r
+                               break;\r
+                       case 7:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90);\r
+                               break;\r
+                       case 8: \r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x10, 0x3, 0x70, 0x90);\r
+                               break;\r
+                       case 9: \r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\r
+                               break;\r
+                       case 10:        \r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);\r
+                               break;\r
+                       case 11:        \r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0xe1, 0x90);\r
+                               break;\r
+                       case 12:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);\r
+                               break;\r
+                       case 13:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);\r
+                               break;\r
+                       case 14:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);\r
+                               break;\r
+                       case 15:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0x60, 0x90);\r
+                               break;\r
+                       case 16:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0x60, 0x90);\r
+                               break;\r
+                       case 17:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x2f, 0x2f, 0x60, 0x90);\r
+                               break;\r
+                       case 18:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);\r
+                               break;                  \r
+                       case 19:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0xe1, 0x90);\r
+                               break;\r
+                       case 20:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0x60, 0x90);\r
+                               break;\r
+                       case 21:        \r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90);\r
+                               break;\r
+                       case 22:        //ad2dp master\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
+                               break;\r
+                       case 71:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\r
+                               break;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               // disable PS tdma\r
+               switch(type)\r
+               {\r
+                       case 0:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);\r
+                               break;\r
+                       case 1:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x48, 0x0);\r
+                               break;\r
+                       default:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);\r
+                               break;\r
+               }\r
+       }\r
+\r
+       // update pre state\r
+       pCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;\r
+       pCoexDm->prePsTdma = pCoexDm->curPsTdma;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_CoexAllOff(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       // fw all off\r
+       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+       halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       // sw all off\r
+       halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+       halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+\r
+       // hw all off\r
+       halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_CoexUnder5G(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       halbtc8821aCsr2ant_CoexAllOff(pBtCoexist);\r
+\r
+       halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, TRUE);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_InitCoexDm(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{      \r
+       // force to reset coex mechanism\r
+       halbtc8821aCsr2ant_CoexTable(pBtCoexist, FORCE_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);\r
+\r
+       halbtc8821aCsr2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);\r
+       halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, FALSE);\r
+\r
+       halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+       halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_BtInquiryPage(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       BOOLEAN bLowPwrDisable=TRUE;\r
+       \r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+\r
+       halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);\r
+       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+}\r
+BOOLEAN\r
+halbtc8821aCsr2ant_IsCommonAction(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       BOOLEAN                 bCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;\r
+       BOOLEAN                 bLowPwrDisable=FALSE;\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
+\r
+       if(!bWifiConnected && \r
+               BT_8821A_CSR_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus)\r
+       {\r
+               bLowPwrDisable = FALSE;\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi IPS + BT IPS!!\n"));  \r
+\r
+               \r
+               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               \r
+               halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+               halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               halbtc8821aCsr2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0, 0);\r
+               halbtc8821aCsr2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, 0, 0, 0);\r
+\r
+               bCommon = TRUE;\r
+       }\r
+       else if(bWifiConnected && \r
+                       (BT_8821A_CSR_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus) )\r
+       {               \r
+               bLowPwrDisable = FALSE;\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+\r
+               if(bWifiBusy)\r
+               {       \r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Busy + BT IPS!!\n"));\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               }\r
+               else\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi LPS + BT IPS!!\n"));\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               }\r
+               \r
+               halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+               halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+               halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               halbtc8821aCsr2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0, 0);\r
+               halbtc8821aCsr2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, 0, 0, 0);\r
+\r
+               bCommon = TRUE;\r
+       }\r
+       else if(!bWifiConnected && \r
+               (BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\r
+       {\r
+               bLowPwrDisable = TRUE;\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi IPS + BT LPS!!\n"));          \r
+\r
+               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+               halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+               halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               halbtc8821aCsr2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0, 0);\r
+               halbtc8821aCsr2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, 0, 0, 0);\r
+\r
+               bCommon = TRUE;\r
+       }\r
+       else if(bWifiConnected && \r
+               (BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\r
+       {\r
+               bLowPwrDisable = TRUE;\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+               \r
+               if(bWifiBusy)\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Busy + BT LPS!!\n"));\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               }\r
+               else\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi LPS + BT LPS!!\n"));\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               }\r
+               \r
+               halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+               halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,TRUE,TRUE);\r
+               halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               halbtc8821aCsr2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0, 0);\r
+               halbtc8821aCsr2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, 0, 0, 0);\r
+\r
+               bCommon = TRUE;\r
+       }\r
+       else if(!bWifiConnected && \r
+                       (BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE == pCoexDm->btStatus) )\r
+       {\r
+               bLowPwrDisable = FALSE;\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi IPS + BT Busy!!\n")); \r
+\r
+               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+               halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+               halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               halbtc8821aCsr2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0, 0);\r
+               halbtc8821aCsr2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, 0, 0, 0);\r
+               \r
+               bCommon = TRUE;\r
+       }\r
+       else\r
+       {\r
+               bLowPwrDisable = TRUE;\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+\r
+               if(bWifiBusy)\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Busy + BT Busy!!\n"));\r
+                       bCommon = FALSE;\r
+               }\r
+               else\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi LPS + BT Busy!!\n"));\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 21);\r
+\r
+                       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+                               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+                       else    \r
+                               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+                       \r
+                       bCommon = TRUE;\r
+               }\r
+\r
+               halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,TRUE,TRUE);\r
+       }\r
+\r
+       if (bCommon == TRUE)\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);\r
+\r
+       return bCommon;\r
+}\r
+VOID\r
+halbtc8821aCsr2ant_TdmaDurationAdjust(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bScoHid,\r
+       IN      BOOLEAN                 bTxPause,\r
+       IN      u1Byte                  maxInterval\r
+       )\r
+{\r
+       static s4Byte           up,dn,m,n,WaitCount;\r
+       s4Byte                  result;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration\r
+       u1Byte                  retryCount=0;\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], TdmaDurationAdjust()\n"));\r
+\r
+       if(pCoexDm->bResetTdmaAdjust)\r
+       {\r
+               pCoexDm->bResetTdmaAdjust = FALSE;\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], first run TdmaDurationAdjust()!!\n"));\r
+               {\r
+                       if(bScoHid)\r
+                       {\r
+                               if(bTxPause)\r
+                               {\r
+                                       if(maxInterval == 1)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\r
+                                               pCoexDm->psTdmaDuAdjType = 13;  \r
+                                       }\r
+                                       else if(maxInterval == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                               pCoexDm->psTdmaDuAdjType = 14;  \r
+                                       }\r
+                                       else if(maxInterval == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;  \r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       if(maxInterval == 1)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\r
+                                               pCoexDm->psTdmaDuAdjType = 9;   \r
+                                       }\r
+                                       else if(maxInterval == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                               pCoexDm->psTdmaDuAdjType = 10;  \r
+                                       }\r
+                                       else if(maxInterval == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if(bTxPause)\r
+                               {\r
+                                       if(maxInterval == 1)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+                                               pCoexDm->psTdmaDuAdjType = 5;   \r
+                                       }\r
+                                       else if(maxInterval == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                               pCoexDm->psTdmaDuAdjType = 6;   \r
+                                       }\r
+                                       else if(maxInterval == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       if(maxInterval == 1)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\r
+                                               pCoexDm->psTdmaDuAdjType = 1;   \r
+                                       }\r
+                                       else if(maxInterval == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                               pCoexDm->psTdmaDuAdjType = 2;   \r
+                                       }\r
+                                       else if(maxInterval == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               //============\r
+               up = 0;\r
+               dn = 0;\r
+               m = 1;\r
+               n= 3;\r
+               result = 0;\r
+               WaitCount = 0;\r
+       }\r
+       else\r
+       {\r
+               //accquire the BT TRx retry count from BT_Info byte2\r
+               retryCount = pCoexSta->btRetryCnt;\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount));\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", \r
+                       up, dn, m, n, WaitCount));\r
+               result = 0;\r
+               WaitCount++; \r
+                 \r
+               if(retryCount == 0)  // no retry in the last 2-second duration\r
+               {\r
+                       up++;\r
+                       dn--;\r
+\r
+                       if (dn <= 0)\r
+                               dn = 0;                          \r
+\r
+                       if(up >= n)     // if ³sÄò n ­Ó2¬í retry count¬°0, «h½Õ¼eWiFi duration\r
+                       {\r
+                               WaitCount = 0; \r
+                               n = 3;\r
+                               up = 0;\r
+                               dn = 0;\r
+                               result = 1; \r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Increase wifi duration!!\n"));\r
+                       }\r
+               }\r
+               else if (retryCount <= 3)       // <=3 retry in the last 2-second duration\r
+               {\r
+                       up--; \r
+                       dn++;\r
+\r
+                       if (up <= 0)\r
+                               up = 0;\r
+\r
+                       if (dn == 2)    // if ³sÄò 2 ­Ó2¬í retry count< 3, «h½Õ¯¶WiFi duration\r
+                       {\r
+                               if (WaitCount <= 2)\r
+                                       m++; // Á×§K¤@ª½¦b¨â­Ólevel¤¤¨Ó¦^\r
+                               else\r
+                                       m = 1;\r
+\r
+                               if ( m >= 20) //m ³Ì¤j­È = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration.\r
+                                       m = 20;\r
+\r
+                               n = 3*m;\r
+                               up = 0;\r
+                               dn = 0;\r
+                               WaitCount = 0;\r
+                               result = -1; \r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n"));\r
+                       }\r
+               }\r
+               else  //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration\r
+               {\r
+                       if (WaitCount == 1)\r
+                               m++; // Á×§K¤@ª½¦b¨â­Ólevel¤¤¨Ó¦^\r
+                       else\r
+                               m = 1;\r
+\r
+                       if ( m >= 20) //m ³Ì¤j­È = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration.\r
+                               m = 20;\r
+\r
+                       n = 3*m;\r
+                       up = 0;\r
+                       dn = 0;\r
+                       WaitCount = 0; \r
+                       result = -1;\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n"));\r
+               }\r
+\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], max Interval = %d\n", maxInterval));\r
+               if(maxInterval == 1)\r
+               {\r
+                       if(bTxPause)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n"));\r
+\r
+                               if(pCoexDm->curPsTdma == 71)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+                                       pCoexDm->psTdmaDuAdjType = 5;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 1)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+                                       pCoexDm->psTdmaDuAdjType = 5;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 2)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                       pCoexDm->psTdmaDuAdjType = 6;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 3)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                       pCoexDm->psTdmaDuAdjType = 7;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 4)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\r
+                                       pCoexDm->psTdmaDuAdjType = 8;\r
+                               }\r
+                               if(pCoexDm->curPsTdma == 9)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\r
+                                       pCoexDm->psTdmaDuAdjType = 13;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 10)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                       pCoexDm->psTdmaDuAdjType = 14;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 11)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                       pCoexDm->psTdmaDuAdjType = 15;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 12)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\r
+                                       pCoexDm->psTdmaDuAdjType = 16;\r
+                               }\r
+                               \r
+                               if(result == -1)\r
+                               {                                       \r
+                                       if(pCoexDm->curPsTdma == 5)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                               pCoexDm->psTdmaDuAdjType = 6;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 6)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 7)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\r
+                                               pCoexDm->psTdmaDuAdjType = 8;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 13)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                               pCoexDm->psTdmaDuAdjType = 14;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 14)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 15)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\r
+                                               pCoexDm->psTdmaDuAdjType = 16;\r
+                                       }\r
+                               } \r
+                               else if (result == 1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 8)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 7)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                               pCoexDm->psTdmaDuAdjType = 6;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 6)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+                                               pCoexDm->psTdmaDuAdjType = 5;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 16)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 15)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                               pCoexDm->psTdmaDuAdjType = 14;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 14)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\r
+                                               pCoexDm->psTdmaDuAdjType = 13;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n"));\r
+                               if(pCoexDm->curPsTdma == 5)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71);\r
+                                       pCoexDm->psTdmaDuAdjType = 71;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 6)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                       pCoexDm->psTdmaDuAdjType = 2;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 7)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                       pCoexDm->psTdmaDuAdjType = 3;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 8)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\r
+                                       pCoexDm->psTdmaDuAdjType = 4;\r
+                               }\r
+                               if(pCoexDm->curPsTdma == 13)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\r
+                                       pCoexDm->psTdmaDuAdjType = 9;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 14)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                       pCoexDm->psTdmaDuAdjType = 10;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 15)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                       pCoexDm->psTdmaDuAdjType = 11;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 16)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\r
+                                       pCoexDm->psTdmaDuAdjType = 12;\r
+                               }\r
+                               \r
+                               if(result == -1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 71)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\r
+                                               pCoexDm->psTdmaDuAdjType = 1;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 1)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                               pCoexDm->psTdmaDuAdjType = 2;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\r
+                                               pCoexDm->psTdmaDuAdjType = 4;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 9)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                               pCoexDm->psTdmaDuAdjType = 10;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 10)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 11)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\r
+                                               pCoexDm->psTdmaDuAdjType = 12;\r
+                                       }\r
+                               } \r
+                               else if (result == 1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 4)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                               pCoexDm->psTdmaDuAdjType = 2;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\r
+                                               pCoexDm->psTdmaDuAdjType = 1;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 1)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71);\r
+                                               pCoexDm->psTdmaDuAdjType = 71;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 12)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 11)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                               pCoexDm->psTdmaDuAdjType = 10;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 10)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\r
+                                               pCoexDm->psTdmaDuAdjType = 9;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else if(maxInterval == 2)\r
+               {\r
+                       if(bTxPause)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n"));\r
+                               if(pCoexDm->curPsTdma == 1)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                       pCoexDm->psTdmaDuAdjType = 6;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 2)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                       pCoexDm->psTdmaDuAdjType = 6;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 3)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                       pCoexDm->psTdmaDuAdjType = 7;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 4)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\r
+                                       pCoexDm->psTdmaDuAdjType = 8;\r
+                               }\r
+                               if(pCoexDm->curPsTdma == 9)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                       pCoexDm->psTdmaDuAdjType = 14;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 10)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                       pCoexDm->psTdmaDuAdjType = 14;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 11)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                       pCoexDm->psTdmaDuAdjType = 15;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 12)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\r
+                                       pCoexDm->psTdmaDuAdjType = 16;\r
+                               }\r
+                               if(result == -1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 5) \r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                               pCoexDm->psTdmaDuAdjType = 6;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 6)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 7)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\r
+                                               pCoexDm->psTdmaDuAdjType = 8;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 13)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                               pCoexDm->psTdmaDuAdjType = 14;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 14)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 15)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\r
+                                               pCoexDm->psTdmaDuAdjType = 16;\r
+                                       }\r
+                               } \r
+                               else if (result == 1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 8)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 7)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                               pCoexDm->psTdmaDuAdjType = 6;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 6)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                               pCoexDm->psTdmaDuAdjType = 6;\r
+                                       }                                       \r
+                                       else if(pCoexDm->curPsTdma == 16)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 15)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                               pCoexDm->psTdmaDuAdjType = 14;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 14)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                               pCoexDm->psTdmaDuAdjType = 14;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n"));\r
+                               if(pCoexDm->curPsTdma == 5)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                       pCoexDm->psTdmaDuAdjType = 2;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 6)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                       pCoexDm->psTdmaDuAdjType = 2;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 7)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                       pCoexDm->psTdmaDuAdjType = 3;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 8)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\r
+                                       pCoexDm->psTdmaDuAdjType = 4;\r
+                               }\r
+                               if(pCoexDm->curPsTdma == 13)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                       pCoexDm->psTdmaDuAdjType = 10;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 14)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                       pCoexDm->psTdmaDuAdjType = 10;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 15)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                       pCoexDm->psTdmaDuAdjType = 11;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 16)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\r
+                                       pCoexDm->psTdmaDuAdjType = 12;\r
+                               }\r
+                               if(result == -1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 1)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                               pCoexDm->psTdmaDuAdjType = 2;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\r
+                                               pCoexDm->psTdmaDuAdjType = 4;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 9)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                               pCoexDm->psTdmaDuAdjType = 10;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 10)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 11)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\r
+                                               pCoexDm->psTdmaDuAdjType = 12;\r
+                                       }\r
+                               } \r
+                               else if (result == 1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 4)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                               pCoexDm->psTdmaDuAdjType = 2;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                               pCoexDm->psTdmaDuAdjType = 2;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 12)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 11)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                               pCoexDm->psTdmaDuAdjType = 10;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 10)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                               pCoexDm->psTdmaDuAdjType = 10;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else if(maxInterval == 3)\r
+               {\r
+                       if(bTxPause)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n"));\r
+                               if(pCoexDm->curPsTdma == 1)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                       pCoexDm->psTdmaDuAdjType = 7;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 2)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                       pCoexDm->psTdmaDuAdjType = 7;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 3)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                       pCoexDm->psTdmaDuAdjType = 7;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 4)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\r
+                                       pCoexDm->psTdmaDuAdjType = 8;\r
+                               }\r
+                               if(pCoexDm->curPsTdma == 9)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                       pCoexDm->psTdmaDuAdjType = 15;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 10)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                       pCoexDm->psTdmaDuAdjType = 15;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 11)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                       pCoexDm->psTdmaDuAdjType = 15;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 12)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\r
+                                       pCoexDm->psTdmaDuAdjType = 16;\r
+                               }\r
+                               if(result == -1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 5) \r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 6)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 7)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\r
+                                               pCoexDm->psTdmaDuAdjType = 8;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 13)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 14)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 15)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\r
+                                               pCoexDm->psTdmaDuAdjType = 16;\r
+                                       }\r
+                               } \r
+                               else if (result == 1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 8)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 7)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 6)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }                                       \r
+                                       else if(pCoexDm->curPsTdma == 16)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 15)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 14)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n"));\r
+                               if(pCoexDm->curPsTdma == 5)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                       pCoexDm->psTdmaDuAdjType = 3;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 6)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                       pCoexDm->psTdmaDuAdjType = 3;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 7)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                       pCoexDm->psTdmaDuAdjType = 3;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 8)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\r
+                                       pCoexDm->psTdmaDuAdjType = 4;\r
+                               }\r
+                               if(pCoexDm->curPsTdma == 13)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                       pCoexDm->psTdmaDuAdjType = 11;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 14)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                       pCoexDm->psTdmaDuAdjType = 11;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 15)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                       pCoexDm->psTdmaDuAdjType = 11;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 16)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\r
+                                       pCoexDm->psTdmaDuAdjType = 12;\r
+                               }\r
+                               if(result == -1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 1)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\r
+                                               pCoexDm->psTdmaDuAdjType = 4;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 9)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 10)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 11)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\r
+                                               pCoexDm->psTdmaDuAdjType = 12;\r
+                                       }\r
+                               } \r
+                               else if (result == 1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 4)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 12)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 11)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 10)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       // if current PsTdma not match with the recorded one (when scan, dhcp...), \r
+       // then we have to adjust it back to the previous record one.\r
+       if(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType)\r
+       {\r
+               BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE;\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", \r
+                       pCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType));\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
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);\r
+               }\r
+               else\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n"));\r
+               }\r
+       }\r
+\r
+       // when halbtc8821aCsr2ant_TdmaDurationAdjust() is called, fw dac swing is included in the function.\r
+       //if(pCoexDm->psTdmaDuAdjType == 71)\r
+       //      halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xc); //Skip because A2DP get worse at HT40\r
+       //else\r
+               halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0x6);\r
+}\r
+\r
+// SCO only or SCO+PAN(HS)\r
+VOID\r
+halbtc8821aCsr2ant_ActionSco(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte  wifiRssiState,btRssiState;\r
+       u4Byte  wifiBw;\r
+\r
+       halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffffff, 0x3);\r
+       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\r
+\r
+       halbtc8821aCsr2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE);\r
+\r
+       halbtc8821aCsr2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 1, 0, 2, 0);\r
+\r
+       if(pCoexSta->bSlave == FALSE)\r
+               halbtc8821aCsr2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x4);\r
+       else\r
+               halbtc8821aCsr2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x2);\r
+\r
+/*\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 4);\r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+       \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if (BTC_WIFI_BW_LEGACY == wifiBw) //for SCO quality at 11b/g mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x5a5a5a5a, 0x5a5a5a5a, 0xffff, 0x3);\r
+       }\r
+       else  //for SCO quality & wifi performance balance at 11n mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x5aea5aea, 0x5aea5aea, 0xffff, 0x3);\r
+       }\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+       \r
+               // fw mechanism\r
+               //halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                       halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);                      \r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                       halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);     \r
+               }               \r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               //halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality\r
+               }\r
+               \r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }               \r
+       }\r
+*/\r
+}\r
+\r
+\r
+VOID\r
+halbtc8821aCsr2ant_ActionHid(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte  wifiRssiState, btRssiState;     \r
+       u4Byte  wifiBw;\r
+\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);\r
+       }\r
+       else  //for HID quality & wifi performance balance at 11n mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5aea5aea, 0xffff, 0x3);\r
+       }\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }       \r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }               \r
+       }\r
+}\r
+\r
+//A2DP only / PAN(EDR) only/ A2DP+PAN(HS)\r
+VOID\r
+halbtc8821aCsr2ant_ActionA2dp(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte          wifiRssiState, btRssiState;\r
+       u4Byte          wifiBw;\r
+\r
+       halbtc8821aCsr2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8);\r
+\r
+       if(pCoexSta->bSlave == FALSE)\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0xfdfdfdfd, 0xdfdadfda, 0xffffff, 0x3);\r
+               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\r
+               halbtc8821aCsr2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0, 1);\r
+               halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x0c);\r
+       }\r
+       else\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0xfdfdfdfd, 0xdfdadfda, 0xffffff, 0x3);\r
+               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 23);\r
+               halbtc8821aCsr2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0, 2);\r
+               halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x18);\r
+       }\r
+\r
+/*\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       //fw dac swing is called in halbtc8821aCsr2ant_TdmaDurationAdjust()\r
+       //halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+       \r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\r
+               }\r
+               \r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }               \r
+       }\r
+*/\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_ActionA2dpPanHs(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte          wifiRssiState, btRssiState, btInfoExt;\r
+       u4Byte          wifiBw;\r
+\r
+       btInfoExt = pCoexSta->btInfoExt;\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2,35, 0);\r
+\r
+       //fw dac swing is called in halbtc8821aCsr2ant_TdmaDurationAdjust()\r
+       //halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+\r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+               // fw mechanism\r
+               if(btInfoExt&BIT0)      //a2dp basic rate\r
+               {\r
+                       halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2);\r
+               }\r
+               else                            //a2dp edr rate\r
+               {\r
+                       halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               if(btInfoExt&BIT0)      //a2dp basic rate\r
+               {\r
+                       halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2);\r
+               }\r
+               else                            //a2dp edr rate\r
+               {\r
+                       halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\r
+               }\r
+               \r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }               \r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_ActionPanEdr(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte          wifiRssiState, btRssiState;\r
+       u4Byte          wifiBw;\r
+\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5aff5aff, 0xffff, 0x3);\r
+       }\r
+       else  //for HID quality & wifi performance balance at 11n mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5aff5aff, 0xffff, 0x3);\r
+       }\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+}\r
+\r
+\r
+//PAN(HS) only\r
+VOID\r
+halbtc8821aCsr2ant_ActionPanHs(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte          wifiRssiState, btRssiState;\r
+       u4Byte          wifiBw;\r
+\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+               // fw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               }\r
+               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               }\r
+\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+}\r
+\r
+//PAN(EDR)+A2DP\r
+VOID\r
+halbtc8821aCsr2ant_ActionPanEdrA2dp(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte          wifiRssiState, btRssiState, btInfoExt;\r
+       u4Byte          wifiBw;\r
+\r
+       btInfoExt = pCoexSta->btInfoExt;\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);\r
+       }\r
+       else  //for HID quality & wifi performance balance at 11n mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);\r
+       }\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\r
+                       }\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               };\r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\r
+                       }\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_ActionPanEdrHid(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte          wifiRssiState, btRssiState;\r
+       u4Byte          wifiBw;\r
+\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5f5a5f, 0xffff, 0x3);\r
+       }\r
+       else  //for HID quality & wifi performance balance at 11n mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5f5a5f, 0xffff, 0x3);\r
+       }\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       { \r
+               halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 3);\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); \r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); \r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+               }\r
+               \r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+}\r
+\r
+// HID+A2DP+PAN(EDR)\r
+VOID\r
+halbtc8821aCsr2ant_ActionHidA2dpPanEdr(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte          wifiRssiState, btRssiState, btInfoExt;\r
+       u4Byte          wifiBw;\r
+\r
+       btInfoExt = pCoexSta->btInfoExt;\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);\r
+       }\r
+       else  //for HID quality & wifi performance balance at 11n mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);\r
+       }\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\r
+                       }\r
+               }\r
+               \r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\r
+                       }\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_ActionHidA2dp(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte          wifiRssiState, btRssiState, btInfoExt;\r
+       u4Byte          wifiBw;\r
+\r
+       btInfoExt = pCoexSta->btInfoExt;\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\r
+       {\r
+//Allen                halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5f5b5f5b, 0xffffff, 0x3);\r
+       }\r
+       else  //for HID quality & wifi performance balance at 11n mode\r
+       {\r
+//Allen                halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);\r
+                       halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5f5b5f5b, 0xffffff, 0x3);\r
+\r
+       }\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+                       }\r
+               }\r
+               \r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+//                             halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2);\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+//Allen                                halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2);\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+                       }\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_RunCoexistMechanism(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       PBTC_STACK_INFO         pStackInfo=&pBtCoexist->stackInfo;\r
+       BOOLEAN                         bWifiUnder5G=FALSE;\r
+       u1Byte                          btInfoOriginal=0, btRetryCnt=0;\r
+       u1Byte                          algorithm=0;\r
+\r
+       if(pBtCoexist->bManualControl)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Manual control!!!\n"));\r
+               return;\r
+       }\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
+\r
+       if(bWifiUnder5G)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\n"));\r
+               halbtc8821aCsr2ant_CoexUnder5G(pBtCoexist);\r
+               return;\r
+       }\r
+\r
+       //if(pStackInfo->bProfileNotified)\r
+       {\r
+               algorithm = halbtc8821aCsr2ant_ActionAlgorithm(pBtCoexist);\r
+               if(pCoexSta->bC2hBtInquiryPage && (BT_8821A_CSR_2ANT_COEX_ALGO_PANHS!=algorithm))\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT is under inquiry/page scan !!\n"));\r
+                       halbtc8821aCsr2ant_BtInquiryPage(pBtCoexist);\r
+                       return;\r
+               }\r
+\r
+               pCoexDm->curAlgorithm = algorithm;\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Algorithm = %d \n", pCoexDm->curAlgorithm));\r
+\r
+               if(halbtc8821aCsr2ant_IsCommonAction(pBtCoexist))\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant common.\n"));\r
+                       pCoexDm->bResetTdmaAdjust = TRUE;\r
+               }\r
+               else\r
+               {\r
+                       if(pCoexDm->curAlgorithm != pCoexDm->preAlgorithm)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n", \r
+                                       pCoexDm->preAlgorithm, pCoexDm->curAlgorithm));\r
+                               pCoexDm->bResetTdmaAdjust = TRUE;\r
+                       }\r
+                       switch(pCoexDm->curAlgorithm)\r
+                       {\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_SCO:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = SCO.\n"));\r
+                                       halbtc8821aCsr2ant_ActionSco(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_HID:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID.\n"));\r
+                                       halbtc8821aCsr2ant_ActionHid(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_A2DP:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP.\n"));\r
+                                       halbtc8821aCsr2ant_ActionA2dp(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_A2DP_PANHS:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n"));\r
+                                       halbtc8821aCsr2ant_ActionA2dpPanHs(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n"));\r
+                                       halbtc8821aCsr2ant_ActionPanEdr(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_PANHS:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HS mode.\n"));\r
+                                       halbtc8821aCsr2ant_ActionPanHs(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_A2DP:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n"));\r
+                                       halbtc8821aCsr2ant_ActionPanEdrA2dp(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n"));\r
+                                       halbtc8821aCsr2ant_ActionPanEdrHid(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n"));\r
+                                       halbtc8821aCsr2ant_ActionHidA2dpPanEdr(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n"));\r
+                                       halbtc8821aCsr2ant_ActionHidA2dp(pBtCoexist);\r
+                                       break;\r
+                               default:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n"));\r
+                                       halbtc8821aCsr2ant_CoexAllOff(pBtCoexist);\r
+                                       break;\r
+                       }\r
+                       pCoexDm->preAlgorithm = pCoexDm->curAlgorithm;\r
+               }\r
+       }\r
+}\r
+\r
+\r
+\r
+//============================================================\r
+// work around function start with wa_halbtc8821aCsr2ant_\r
+//============================================================\r
+//============================================================\r
+// extern function start with EXhalbtc8821aCsr2ant_\r
+//============================================================\r
+VOID\r
+EXhalbtc8821aCsr2ant_PowerOnSetting(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
+{\r
+       PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
+       u4Byte  u4Tmp=0;\r
+       u2Byte                          u2Tmp=0;\r
+       u1Byte  u1Tmp=0;\r
+       u1Byte                          H2C_Parameter[2] ={0};\r
+               \r
+\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n"));\r
+\r
+       if(bWifiOnly)\r
+               return;\r
+       \r
+       //if(bBackUp)\r
+       {\r
+               // backup rf 0x1e value\r
+               pCoexDm->btRf0x1eBackup = pBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff);\r
+               pCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\r
+               pCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);\r
+               pCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\r
+               pCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\r
+               pCoexDm->backupAmpduMaxNum = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x4ca);\r
+       }\r
+\r
+       #if 0 /* REMOVE */\r
+       // 0x790[5:0]=0x5\r
+       u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790);\r
+       u1Tmp &= 0xc0;\r
+       u1Tmp |= 0x5;\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp);\r
+       #endif\r
+       \r
+       //Antenna config\r
+       halbtc8821aCsr2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_MAIN, TRUE, FALSE);\r
+\r
+       // PTA parameter\r
+       halbtc8821aCsr2ant_CoexTable(pBtCoexist, FORCE_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);\r
+       \r
+       // Enable counter statistics\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3);\r
+\r
+       #if 0 /* REMOVE */\r
+       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);\r
+       #endif\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_InitCoexDm(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n"));\r
+       \r
+       halbtc8821aCsr2ant_InitCoexDm(pBtCoexist);\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_DisplayCoexInfo(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
+       PBTC_STACK_INFO         pStackInfo=&pBtCoexist->stackInfo;\r
+       pu1Byte                         cliBuf=pBtCoexist->cliBuf;\r
+       u1Byte                          u1Tmp[4], i, btInfoExt, psTdmaCase=0;\r
+       u4Byte                          u4Tmp[4];\r
+       u4Byte                          fwVer=0, btPatchVer=0;\r
+\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
+       CL_PRINTF(cliBuf);\r
+\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
+               pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
+       CL_PRINTF(cliBuf);      \r
+       \r
+       if(pBtCoexist->bManualControl)\r
+       {\r
+               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "[Action Manual control]!!");\r
+               CL_PRINTF(cliBuf);\r
+       }\r
+       \r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %d", "BT stack/ hci ext ver", \\r
+               ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)", "CoexVer/ FwVer/ PatchVer", \\r
+               GLCoexVerDate8821aCsr2Ant, GLCoexVer8821aCsr2Ant, fwVer, btPatchVer, btPatchVer);\r
+       CL_PRINTF(cliBuf);\r
+\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
+       // 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
+       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
+               ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8821A_CSR_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus)? "idle":(  (BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy"))),\r
+               pCoexSta->btRssi, pCoexSta->btRetryCnt);\r
+       CL_PRINTF(cliBuf);\r
+       \r
+       if(pStackInfo->bProfileNotified)\r
+       {                       \r
+               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP", \\r
+                       pStackInfo->bScoExist, pStackInfo->bHidExist, pStackInfo->bPanExist, pStackInfo->bA2dpExist);\r
+               CL_PRINTF(cliBuf);      \r
+\r
+               pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\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
+       CL_PRINTF(cliBuf);      \r
+\r
+       for(i=0; i<BT_INFO_SRC_8821A_CSR_2ANT_MAX; i++)\r
+       {\r
+               if(pCoexSta->btInfoC2hCnt[i])\r
+               {                               \r
+                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)", GLBtInfoSrc8821aCsr2Ant[i], \\r
+                               pCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1],\r
+                               pCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3],\r
+                               pCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5],\r
+                               pCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]);\r
+                       CL_PRINTF(cliBuf);\r
+               }\r
+       }\r
+\r
+       // Sw mechanism \r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw mechanism]============");\r
+       CL_PRINTF(cliBuf);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "SM1[ShRf/ LpRA/ LimDig]", \\r
+               pCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig);\r
+       CL_PRINTF(cliBuf);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d(0x%x) ", "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]", \\r
+               pCoexDm->bCurAgcTableEn, pCoexDm->bCurAdcBackOff, pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       // Fw mechanism         \r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Fw mechanism]============");\r
+       CL_PRINTF(cliBuf);      \r
+       \r
+       if(!pBtCoexist->bManualControl)\r
+       {\r
+               psTdmaCase = pCoexDm->curPsTdma;\r
+               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x case-%d", "PS TDMA", \\r
+                       pCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1],\r
+                       pCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3],\r
+                       pCoexDm->psTdmaPara[4], psTdmaCase);\r
+               CL_PRINTF(cliBuf);\r
+       \r
+               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "DecBtPwr/ IgnWlanAct", \\r
+                       pCoexDm->bCurDecBtPwr, pCoexDm->bCurIgnoreWlanAct);\r
+               CL_PRINTF(cliBuf);\r
+       }\r
+\r
+       // Hw setting           \r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Hw setting]============");\r
+       CL_PRINTF(cliBuf);      \r
+\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "RF-A, 0x1e initVal", \\r
+               pCoexDm->btRf0x1eBackup);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);\r
+       u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x ", "0x778 (W_Act)/ 0x6cc (CoTab Sel)", \\r
+               u1Tmp[0], u1Tmp[1]);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x8db);\r
+       u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xc5b);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x8db(ADC)/0xc5b[29:25](DAC)", \\r
+               ((u1Tmp[0]&0x60)>>5), ((u1Tmp[1]&0x3e)>>1));\r
+       CL_PRINTF(cliBuf); \r
+       \r
+       u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xcb4);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0xcb4[7:0](ctrl)/ 0xcb4[29:28](val)", \\r
+               u4Tmp[0]&0xff, ((u4Tmp[0]&0x30000000)>>28));\r
+       CL_PRINTF(cliBuf);\r
+\r
+       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);\r
+       u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\r
+       u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x974);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x40/ 0x4c[24:23]/ 0x974", \\r
+               u1Tmp[0], ((u4Tmp[0]&0x01800000)>>23), u4Tmp[1]);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);\r
+       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x550(bcn ctrl)/0x522", \\r
+               u4Tmp[0], u1Tmp[0]);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);\r
+       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa0a);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0xc50(DIG)/0xa0a(CCK-TH)", \\r
+               u4Tmp[0], u1Tmp[0]);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf48);\r
+       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5b);\r
+       u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5c);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "OFDM-FA/ CCK-FA", \\r
+               u4Tmp[0], (u1Tmp[0]<<8) + u1Tmp[1]  );\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
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x6c0/0x6c4/0x6c8", \\r
+               u4Tmp[0], u4Tmp[1], u4Tmp[2]);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "0x770 (hi-pri Rx/Tx)", \\r
+               pCoexSta->highPriorityRx, pCoexSta->highPriorityTx);\r
+       CL_PRINTF(cliBuf);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "0x774(low-pri Rx/Tx)", \\r
+               pCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\r
+}\r
+\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_IpsNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  type\r
+       )\r
+{\r
+       if(BTC_IPS_ENTER == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n"));\r
+               pCoexSta->bUnderIps = TRUE;\r
+               halbtc8821aCsr2ant_CoexAllOff(pBtCoexist);\r
+       }\r
+       else if(BTC_IPS_LEAVE == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n"));\r
+               pCoexSta->bUnderIps = FALSE;\r
+               //halbtc8821aCsr2ant_InitCoexDm(pBtCoexist);\r
+       }\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_LpsNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  type\r
+       )\r
+{\r
+       if(BTC_LPS_ENABLE == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n"));\r
+               pCoexSta->bUnderLps = TRUE;\r
+       }\r
+       else if(BTC_LPS_DISABLE == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n"));\r
+               pCoexSta->bUnderLps = FALSE;\r
+       }\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_ScanNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  type\r
+       )\r
+{\r
+       if(BTC_SCAN_START == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));\r
+       }\r
+       else if(BTC_SCAN_FINISH == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));\r
+       }\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_ConnectNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  type\r
+       )\r
+{\r
+       if(BTC_ASSOCIATE_START == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));\r
+       }\r
+       else if(BTC_ASSOCIATE_FINISH == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));\r
+       }\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_MediaStatusNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          type\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[3] ={0};\r
+       u4Byte                  wifiBw;\r
+       u1Byte                  wifiCentralChnl;\r
+\r
+       if(BTC_MEDIA_CONNECT == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n"));\r
+       }\r
+       else\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n"));\r
+       }\r
+\r
+       // only 2.4G we need to inform bt the chnl mask\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);\r
+       if( (BTC_MEDIA_CONNECT == type) &&\r
+               (wifiCentralChnl <= 14) )\r
+       {\r
+               H2C_Parameter[0] = 0x1;\r
+               H2C_Parameter[1] = wifiCentralChnl;\r
+               pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+               if(BTC_WIFI_BW_HT40 == wifiBw)\r
+                       H2C_Parameter[2] = 0x30;\r
+               else\r
+                       H2C_Parameter[2] = 0x20;\r
+       }\r
+\r
+       #if 0 /* REMOVE */      \r
+       pCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];\r
+       pCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];\r
+       pCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];\r
+       \r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x66=0x%x\n", \r
+               H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));\r
+\r
+       rtw_warn_on(_BTCOEX_CSR);\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter);\r
+       #endif\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_SpecialPacketNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          type\r
+       )\r
+{\r
+       if(type == BTC_PACKET_DHCP)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], DHCP Packet notify\n"));\r
+       }\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_BtInfoNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      pu1Byte                 tmpBuf,\r
+       IN      u1Byte                  length\r
+       )\r
+{\r
+       u1Byte                  btInfo=0;\r
+       u1Byte                  i, rspSource=0;\r
+       BOOLEAN                 bBtBusy=FALSE, bLimitedDig=FALSE;\r
+       BOOLEAN                 bWifiConnected=FALSE, bBtHsOn=FALSE, bWifiUnder5G=FALSE;\r
+\r
+       pCoexSta->bC2hBtInfoReqSent = FALSE;\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
+\r
+       rspSource = tmpBuf[0]&0xf;\r
+       if(rspSource >= BT_INFO_SRC_8821A_CSR_2ANT_MAX)\r
+               rspSource = BT_INFO_SRC_8821A_CSR_2ANT_WIFI_FW;\r
+       pCoexSta->btInfoC2hCnt[rspSource]++;\r
+\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length));\r
+       for(i=0; i<length; i++)\r
+       {\r
+               pCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];\r
+               if(i == 1)\r
+                       btInfo = tmpBuf[i];\r
+               if(i == length-1)\r
+               {\r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i]));\r
+               }\r
+               else\r
+               {\r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i]));\r
+               }\r
+       }\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
+       if(BT_INFO_SRC_8821A_CSR_2ANT_WIFI_FW != rspSource)\r
+       {\r
+               pCoexSta->btRetryCnt =  // [3:0]\r
+                       pCoexSta->btInfoC2h[rspSource][2]&0xf;\r
+\r
+               pCoexSta->btRssi =\r
+                       pCoexSta->btInfoC2h[rspSource][3]*2+10;\r
+\r
+               pCoexSta->btInfoExt = \r
+                       pCoexSta->btInfoC2h[rspSource][4];\r
+\r
+               #if 0 /* REMOVE */\r
+               // Here we need to resend some wifi info to BT\r
+               // because bt is reset and loss of the info.\r
+               if( (pCoexSta->btInfoExt & BIT1) )\r
+               {                       \r
+                       \r
+                       if(bWifiConnected)\r
+                       {\r
+                               EXhalbtc8821aCsr2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);\r
+                       }\r
+                       else\r
+                       {\r
+                               EXhalbtc8821aCsr2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\r
+                       }\r
+               }\r
+               #endif\r
+\r
+               #if 0 /* REMOVE */\r
+               if(!pBtCoexist->bManualControl && !bWifiUnder5G)\r
+               {\r
+                       if( (pCoexSta->btInfoExt&BIT3) )\r
+                       {\r
+                               if(bWifiConnected)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n"));\r
+                                       halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               // BT already NOT ignore Wlan active, do nothing here.\r
+                               if(!bWifiConnected)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT to ignore Wlan active!!\n"));\r
+                                       halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
+                               }\r
+                       }\r
+               }\r
+               #endif\r
+\r
+               #if 0 /* REMOVE */\r
+               if( (pCoexSta->btInfoExt & BIT4) )\r
+               {\r
+                       // BT auto report already enabled, do nothing\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE);\r
+               }\r
+               #endif\r
+       }\r
+               \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
+\r
+       if(btInfo == BT_INFO_8821A_CSR_2ANT_B_CONNECTION)       // connection exists but no busy\r
+       {\r
+               pCoexSta->bBtLinkExist = TRUE;\r
+               pCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE;\r
+       }\r
+       else if(btInfo & BT_INFO_8821A_CSR_2ANT_B_CONNECTION)   // connection exists and some link is busy\r
+       {\r
+               pCoexSta->bBtLinkExist = TRUE;\r
+\r
+               if(btInfo & BT_INFO_8821A_CSR_2ANT_B_FTP)\r
+                       pCoexSta->bPanExist = TRUE;\r
+               else\r
+                       pCoexSta->bPanExist = FALSE;\r
+\r
+               if(btInfo & BT_INFO_8821A_CSR_2ANT_B_A2DP)\r
+                       pCoexSta->bA2dpExist = TRUE;\r
+               else\r
+                       pCoexSta->bA2dpExist = FALSE;\r
+\r
+               if(btInfo & BT_INFO_8821A_CSR_2ANT_B_HID)\r
+                       pCoexSta->bHidExist = TRUE;\r
+               else\r
+                       pCoexSta->bHidExist = FALSE;\r
+\r
+               if(btInfo & BT_INFO_8821A_CSR_2ANT_B_SCO_ESCO)\r
+                       pCoexSta->bScoExist = TRUE;\r
+               else\r
+                       pCoexSta->bScoExist = FALSE;\r
+\r
+               if (pCoexSta->btInfoExt & 0x80)\r
+                       pCoexSta->bSlave = TRUE; //Slave\r
+               else\r
+                       pCoexSta->bSlave = FALSE; //Master\r
+\r
+               pCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE;\r
+       }\r
+       else\r
+       {\r
+               pCoexSta->bBtLinkExist = FALSE;\r
+               pCoexSta->bPanExist = FALSE;\r
+               pCoexSta->bA2dpExist = FALSE;\r
+               pCoexSta->bSlave = FALSE;\r
+               pCoexSta->bHidExist = FALSE;\r
+               pCoexSta->bScoExist = FALSE;\r
+               pCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_IDLE;\r
+       }\r
+\r
+       if(bBtHsOn)\r
+       {\r
+               pCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE;\r
+       }\r
+\r
+       if(btInfo & BT_INFO_8821A_CSR_2ANT_B_INQ_PAGE)\r
+       {\r
+               pCoexSta->bC2hBtInquiryPage = TRUE;\r
+               pCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE;\r
+       } \r
+       else\r
+       {\r
+               pCoexSta->bC2hBtInquiryPage = FALSE;\r
+       }\r
+\r
+\r
+       if(BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE == pCoexDm->btStatus)\r
+       {\r
+               bBtBusy = TRUE;\r
+       }\r
+       else\r
+       {\r
+               bBtBusy = FALSE;\r
+       }\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\r
+\r
+       if(BT_8821A_CSR_2ANT_BT_STATUS_IDLE != pCoexDm->btStatus)\r
+       {\r
+               bLimitedDig = TRUE;\r
+       }\r
+       else\r
+       {\r
+               bLimitedDig = FALSE;\r
+       }\r
+       pCoexDm->bLimitedDig = bLimitedDig;\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_LIMITED_DIG, &bLimitedDig);\r
+\r
+       halbtc8821aCsr2ant_RunCoexistMechanism(pBtCoexist);\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_HaltNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n"));\r
+\r
+       halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
+       EXhalbtc8821aCsr2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_PnpNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          pnpState\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n"));\r
+\r
+       if(BTC_WIFI_PNP_SLEEP == pnpState)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n"));\r
+               halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
+       }\r
+       else if(BTC_WIFI_PNP_WAKE_UP == pnpState)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n"));\r
+       }\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_Periodical(\r
+       IN      PBTC_COEXIST                    pBtCoexist\r
+       )\r
+{\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
+       {\r
+               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
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", \\r
+                       ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion));\r
+               pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\r
+               pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", \\r
+                       GLCoexVerDate8821aCsr2Ant, GLCoexVer8821aCsr2Ant, fwVer, btPatchVer, btPatchVer));\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n"));\r
+       }\r
+\r
+       //halbtc8821aCsr2ant_QueryBtInfo(pBtCoexist);\r
+       //halbtc8821aCsr2ant_RunCoexistMechanism(pBtCoexist);\r
+       halbtc8821aCsr2ant_MonitorBtCtr(pBtCoexist);\r
+       halbtc8821aCsr2ant_MonitorBtEnableDisable(pBtCoexist);\r
+}\r
+\r
+\r
+#endif\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.h
new file mode 100644 (file)
index 0000000..aeebf82
--- /dev/null
@@ -0,0 +1,207 @@
+//===========================================\r
+// The following is for 8821A_CSR 2Ant BT Co-exist definition\r
+//===========================================\r
+#define        BT_INFO_8821A_CSR_2ANT_B_FTP                                            BIT7\r
+#define        BT_INFO_8821A_CSR_2ANT_B_A2DP                                   BIT6\r
+#define        BT_INFO_8821A_CSR_2ANT_B_HID                                            BIT5\r
+#define        BT_INFO_8821A_CSR_2ANT_B_SCO_BUSY                               BIT4\r
+#define        BT_INFO_8821A_CSR_2ANT_B_ACL_BUSY                               BIT3\r
+#define        BT_INFO_8821A_CSR_2ANT_B_INQ_PAGE                               BIT2\r
+#define        BT_INFO_8821A_CSR_2ANT_B_SCO_ESCO                               BIT1\r
+#define        BT_INFO_8821A_CSR_2ANT_B_CONNECTION                             BIT0\r
+\r
+#define                BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT         2\r
+\r
+typedef enum _BT_INFO_SRC_8821A_CSR_2ANT{\r
+       BT_INFO_SRC_8821A_CSR_2ANT_WIFI_FW                      = 0x0,\r
+       BT_INFO_SRC_8821A_CSR_2ANT_BT_RSP                               = 0x1,\r
+       BT_INFO_SRC_8821A_CSR_2ANT_BT_ACTIVE_SEND               = 0x2,\r
+       BT_INFO_SRC_8821A_CSR_2ANT_MAX\r
+}BT_INFO_SRC_8821A_CSR_2ANT,*PBT_INFO_SRC_8821A_CSR_2ANT;\r
+\r
+typedef enum _BT_8821A_CSR_2ANT_BT_STATUS{\r
+       BT_8821A_CSR_2ANT_BT_STATUS_IDLE                                = 0x0,\r
+       BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE      = 0x1,\r
+       BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE                    = 0x2,\r
+       BT_8821A_CSR_2ANT_BT_STATUS_MAX\r
+}BT_8821A_CSR_2ANT_BT_STATUS,*PBT_8821A_CSR_2ANT_BT_STATUS;\r
+\r
+typedef enum _BT_8821A_CSR_2ANT_COEX_ALGO{\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_UNDEFINED                   = 0x0,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_SCO                         = 0x1,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_HID                         = 0x2,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_A2DP                                = 0x3,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_A2DP_PANHS          = 0x4,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR                      = 0x5,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_PANHS                       = 0x6,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_A2DP         = 0x7,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID          = 0x8,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR     = 0x9,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP                    = 0xa,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_MAX                         = 0xb,\r
+}BT_8821A_CSR_2ANT_COEX_ALGO,*PBT_8821A_CSR_2ANT_COEX_ALGO;\r
+\r
+typedef struct _COEX_DM_8821A_CSR_2ANT{\r
+       // fw mechanism\r
+       BOOLEAN         bPreDecBtPwr;\r
+       BOOLEAN         bCurDecBtPwr;\r
+       u1Byte          preFwDacSwingLvl;\r
+       u1Byte          curFwDacSwingLvl;\r
+       BOOLEAN         bCurIgnoreWlanAct;\r
+       BOOLEAN         bPreIgnoreWlanAct;\r
+       u1Byte          prePsTdma;\r
+       u1Byte          curPsTdma;\r
+       u1Byte          psTdmaPara[6];\r
+       u1Byte          psTdmaDuAdjType;\r
+       BOOLEAN         bResetTdmaAdjust;\r
+       BOOLEAN         bPrePsTdmaOn;\r
+       BOOLEAN         bCurPsTdmaOn;\r
+       BOOLEAN         bPreBtAutoReport;\r
+       BOOLEAN         bCurBtAutoReport;\r
+\r
+       // sw mechanism\r
+       BOOLEAN         bPreRfRxLpfShrink;\r
+       BOOLEAN         bCurRfRxLpfShrink;\r
+       u4Byte          btRf0x1eBackup;\r
+       BOOLEAN         bPreLowPenaltyRa;\r
+       BOOLEAN         bCurLowPenaltyRa;\r
+       BOOLEAN         bPreDacSwingOn;\r
+       u4Byte          preDacSwingLvl;\r
+       BOOLEAN         bCurDacSwingOn;\r
+       u4Byte          curDacSwingLvl;\r
+       BOOLEAN         bPreAdcBackOff;\r
+       BOOLEAN         bCurAdcBackOff;\r
+       BOOLEAN         bPreAgcTableEn;\r
+       BOOLEAN         bCurAgcTableEn;\r
+       u4Byte          preVal0x6c0;\r
+       u4Byte          curVal0x6c0;\r
+       u4Byte          preVal0x6c4;\r
+       u4Byte          curVal0x6c4;\r
+       u4Byte          preVal0x6c8;\r
+       u4Byte          curVal0x6c8;\r
+       u1Byte          preVal0x6cc;\r
+       u1Byte          curVal0x6cc;\r
+       BOOLEAN         bLimitedDig;\r
+\r
+       u4Byte          preRaMask;\r
+       u4Byte          curRaMask;\r
+\r
+       u1Byte curAmpduNumType;\r
+       u1Byte preAmpduNumType;\r
+       u2Byte backupAmpduMaxNum;\r
+\r
+       u1Byte curAmpduTimeType;\r
+       u1Byte preAmpduTimeType;\r
+       u1Byte backupAmpduMaxTime;\r
+\r
+       u1Byte          curArfrType;\r
+       u1Byte          preArfrType;\r
+       u4Byte          backupArfrCnt1;\r
+       u4Byte          backupArfrCnt2;\r
+\r
+       u1Byte          curRetryLimitType;\r
+       u1Byte          preRetryLimitType;\r
+       u2Byte          backupRetryLimit;\r
+\r
+       // algorithm related\r
+       u1Byte          preAlgorithm;\r
+       u1Byte          curAlgorithm;\r
+       u1Byte          btStatus;\r
+       u1Byte          wifiChnlInfo[3];\r
+} COEX_DM_8821A_CSR_2ANT, *PCOEX_DM_8821A_CSR_2ANT;\r
+\r
+typedef struct _COEX_STA_8821A_CSR_2ANT{\r
+       BOOLEAN                                 bBtLinkExist;\r
+       BOOLEAN                                 bScoExist;\r
+       BOOLEAN                                 bA2dpExist;\r
+       BOOLEAN                                 bSlave;\r
+       BOOLEAN                                 bHidExist;\r
+       BOOLEAN                                 bPanExist;\r
+\r
+       BOOLEAN                                 bUnderLps;\r
+       BOOLEAN                                 bUnderIps;\r
+       u4Byte                                  highPriorityTx;\r
+       u4Byte                                  highPriorityRx;\r
+       u4Byte                                  lowPriorityTx;\r
+       u4Byte                                  lowPriorityRx;\r
+       u1Byte                                  btRssi;\r
+       u1Byte                                  preBtRssiState;\r
+       u1Byte                                  preWifiRssiState[4];\r
+       BOOLEAN                                 bC2hBtInfoReqSent;\r
+       u1Byte                                  btInfoC2h[BT_INFO_SRC_8821A_CSR_2ANT_MAX][10];\r
+       u4Byte                                  btInfoC2hCnt[BT_INFO_SRC_8821A_CSR_2ANT_MAX];\r
+       BOOLEAN                                 bC2hBtInquiryPage;\r
+       u1Byte                                  btRetryCnt;\r
+       u1Byte                                  btInfoExt;\r
+}COEX_STA_8821A_CSR_2ANT, *PCOEX_STA_8821A_CSR_2ANT;\r
+\r
+//===========================================\r
+// The following is interface which will notify coex module.\r
+//===========================================\r
+VOID\r
+EXhalbtc8821aCsr2ant_PowerOnSetting(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_InitCoexDm(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_IpsNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  type\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_LpsNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  type\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_ScanNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  type\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_ConnectNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  type\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_MediaStatusNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          type\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_SpecialPacketNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          type\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_BtInfoNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      pu1Byte                 tmpBuf,\r
+       IN      u1Byte                  length\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_HaltNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_PnpNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          pnpState\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_Periodical(\r
+       IN      PBTC_COEXIST                    pBtCoexist\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_DisplayCoexInfo(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       );\r
+\r
index 9a5638197863721ff3820062cf47ca7f40d2c9b0..9da0b6746d029d079059e627a23ef587ef60f2e5 100644 (file)
@@ -4,6 +4,9 @@
 #define                NORMAL_EXEC                                     FALSE\r
 #define                FORCE_EXEC                                              TRUE\r
 \r
+#define                BTC_RF_OFF                                      0x0\r
+#define                BTC_RF_ON                                       0x1\r
+\r
 #define                BTC_RF_A                                        0x0\r
 #define                BTC_RF_B                                        0x1\r
 #define                BTC_RF_C                                        0x2\r
@@ -42,6 +45,15 @@ typedef enum _BTC_POWERSAVE_TYPE{
        BTC_PS_MAX\r
 } BTC_POWERSAVE_TYPE, *PBTC_POWERSAVE_TYPE;\r
 \r
+typedef enum _BTC_BT_REG_TYPE{\r
+       BTC_BT_REG_RF                                           = 0,\r
+       BTC_BT_REG_MODEM                                        = 1,\r
+       BTC_BT_REG_BLUEWIZE                                     = 2,\r
+       BTC_BT_REG_VENDOR                                       = 3,\r
+       BTC_BT_REG_LE                                           = 4,\r
+       BTC_BT_REG_MAX\r
+} BTC_BT_REG_TYPE, *PBTC_BT_REG_TYPE;\r
+\r
 typedef enum _BTC_CHIP_INTERFACE{\r
        BTC_INTF_UNKNOWN        = 0,\r
        BTC_INTF_PCI                    = 1,\r
@@ -156,7 +168,8 @@ typedef struct _BTC_BOARD_INFO{
        u1Byte                          pgAntNum;       // pg ant number\r
        u1Byte                          btdmAntNum;     // ant number for btdm\r
        u1Byte                          btdmAntPos;             //Bryant Add to indicate Antenna Position for (pgAntNum = 2) && (btdmAntNum =1)  (DPDT+1Ant case)\r
-       BOOLEAN                         bBtExist;\r
+       u1Byte                          singleAntPath;  // current used for 8723b only, 1=>s0,  0=>s1\r
+       //BOOLEAN                               bBtExist;\r
 } BTC_BOARD_INFO, *PBTC_BOARD_INFO;\r
 \r
 typedef enum _BTC_DBG_OPCODE{\r
@@ -190,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
@@ -209,6 +230,24 @@ typedef enum _BTC_WIFI_PNP{
        BTC_WIFI_PNP_MAX\r
 }BTC_WIFI_PNP,*PBTC_WIFI_PNP;\r
 \r
+//for 8723b-d cut large current issue\r
+typedef enum _BT_WIFI_COEX_STATE{\r
+       BTC_WIFI_STAT_INIT,\r
+       BTC_WIFI_STAT_IQK,\r
+       BTC_WIFI_STAT_NORMAL_OFF,\r
+       BTC_WIFI_STAT_MP_OFF,\r
+       BTC_WIFI_STAT_NORMAL,\r
+       BTC_WIFI_STAT_ANT_DIV,\r
+       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_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
@@ -225,6 +264,7 @@ typedef enum _BTC_GET_TYPE{
        BTC_GET_BL_WIFI_ENABLE_ENCRYPTION,\r
        BTC_GET_BL_WIFI_UNDER_B_MODE,\r
        BTC_GET_BL_EXT_SWITCH,\r
+       BTC_GET_BL_WIFI_IS_IN_MP_MODE,\r
 \r
        // type s4Byte\r
        BTC_GET_S4_WIFI_RSSI,\r
@@ -243,6 +283,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
@@ -260,6 +301,8 @@ typedef enum _BTC_SET_TYPE{
        BTC_SET_BL_TO_REJ_AP_AGG_PKT,\r
        BTC_SET_BL_BT_CTRL_AGG_SIZE,\r
        BTC_SET_BL_INC_SCAN_DEV_NUM,\r
+       BTC_SET_BL_BT_TX_RX_MASK,\r
+       BTC_SET_BL_MIRACAST_PLUS_BT,\r
 \r
        // type u1Byte\r
        BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON,\r
@@ -285,6 +328,7 @@ typedef enum _BTC_SET_TYPE{
        // BT Coex related\r
        BTC_SET_ACT_CTRL_BT_INFO,\r
        BTC_SET_ACT_CTRL_BT_COEX,\r
+       BTC_SET_ACT_CTRL_8723B_ANT,\r
        //=================\r
        BTC_SET_MAX\r
 }BTC_SET_TYPE,*PBTC_SET_TYPE;\r
@@ -292,7 +336,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
@@ -382,6 +426,12 @@ typedef VOID
        IN      u4Byte                  Data\r
        );\r
 typedef VOID\r
+(*BFP_BTC_LOCAL_REG_W1)(\r
+       IN      PVOID                   pBtcContext,\r
+       IN      u4Byte                  RegAddr,\r
+       IN      u1Byte                  Data\r
+       );\r
+typedef VOID\r
 (*BFP_BTC_SET_BB_REG)(\r
        IN      PVOID                   pBtcContext,\r
        IN      u4Byte                  RegAddr,\r
@@ -410,13 +460,6 @@ typedef u4Byte
        IN      u4Byte                  BitMask\r
        );\r
 typedef VOID\r
-(*BFP_BTC_SET_BT_REG)( \r
-       IN      PVOID                   pBtcContext,\r
-       IN      u1Byte                  RegType,\r
-       IN      u4Byte                  RegAddr,\r
-       IN      u4Byte                  Data\r
-       );\r
-typedef VOID\r
 (*BFP_BTC_FILL_H2C)(\r
        IN      PVOID                   pBtcContext,\r
        IN      u1Byte                  elementId,\r
@@ -438,6 +481,19 @@ typedef    BOOLEAN
        OUT     PVOID                   pInBuf\r
        );\r
 typedef VOID\r
+(*BFP_BTC_SET_BT_REG)(\r
+       IN      PVOID                   pBtcContext,\r
+       IN      u1Byte                  regType,\r
+       IN      u4Byte                  offset,\r
+       IN      u4Byte                  value\r
+       );\r
+typedef u4Byte \r
+(*BFP_BTC_GET_BT_REG)(\r
+       IN      PVOID                   pBtcContext,\r
+       IN      u1Byte                  regType,\r
+       IN      u4Byte                  offset\r
+       );\r
+typedef VOID\r
 (*BFP_BTC_DISP_DBG_MSG)(\r
        IN      PVOID                   pBtCoexist,\r
        IN      u1Byte                  dispType\r
@@ -449,8 +505,10 @@ 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
        u1Byte                                  preAggBufSize;\r
        u1Byte                                  aggBufSize;\r
        BOOLEAN                                 bBtBusy;\r
@@ -458,6 +516,8 @@ typedef struct _BTC_BT_INFO{
        u2Byte                                  btHciVer;\r
        u2Byte                                  btRealFwVer;\r
        u1Byte                                  btFwVer;\r
+       u4Byte                                  getBtFwVerCnt;\r
+       BOOLEAN                                 bMiracastPlusBt;\r
 \r
        BOOLEAN                                 bBtDisableLowPwr;\r
 \r
@@ -486,6 +546,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
@@ -494,10 +555,14 @@ typedef struct _BTC_BT_LINK_INFO{
        BOOLEAN                                 bHidOnly;\r
        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
@@ -507,6 +572,7 @@ typedef struct _BTC_STATISTICS{
        u4Byte                                  cntMediaStatusNotify;\r
        u4Byte                                  cntSpecialPacketNotify;\r
        u4Byte                                  cntBtInfoNotify;\r
+       u4Byte                                  cntRfStatusNotify;\r
        u4Byte                                  cntPeriodical;\r
        u4Byte                                  cntCoexDmSwitch;\r
        u4Byte                                  cntStackOperationNotify;\r
@@ -538,6 +604,7 @@ typedef struct _BTC_COEXIST{
        BFP_BTC_W2                      fBtcWrite2Byte;\r
        BFP_BTC_R4                      fBtcRead4Byte;\r
        BFP_BTC_W4                      fBtcWrite4Byte;\r
+       BFP_BTC_LOCAL_REG_W1    fBtcWriteLocalReg1Byte;\r
        // read/write bb related\r
        BFP_BTC_SET_BB_REG      fBtcSetBbReg;\r
        BFP_BTC_GET_BB_REG      fBtcGetBbReg;\r
@@ -546,9 +613,6 @@ typedef struct _BTC_COEXIST{
        BFP_BTC_SET_RF_REG      fBtcSetRfReg;\r
        BFP_BTC_GET_RF_REG      fBtcGetRfReg;\r
        \r
-       //write bt reg related\r
-       BFP_BTC_SET_BT_REG      fBtcSetBtReg;\r
-       \r
        // fill h2c related\r
        BFP_BTC_FILL_H2C                fBtcFillH2c;\r
        // other\r
@@ -556,19 +620,31 @@ typedef struct _BTC_COEXIST{
        // normal get/set related\r
        BFP_BTC_GET                     fBtcGet;\r
        BFP_BTC_SET                     fBtcSet;\r
+\r
+       BFP_BTC_GET_BT_REG      fBtcGetBtReg;\r
+       BFP_BTC_SET_BT_REG      fBtcSetBtReg;\r
 } BTC_COEXIST, *PBTC_COEXIST;\r
 \r
 extern BTC_COEXIST                             GLBtCoexist;\r
 \r
 BOOLEAN\r
 EXhalbtcoutsrc_InitlizeVariables(\r
-       IN      PVOID           Adapter\r
+       IN      PVOID           Adapter \r
        );\r
 VOID\r
-EXhalbtcoutsrc_InitHwConfig(\r
+EXhalbtcoutsrc_PowerOnSetting(\r
+       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
+       );\r
+VOID\r
 EXhalbtcoutsrc_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
@@ -609,6 +685,11 @@ EXhalbtcoutsrc_BtInfoNotify(
        IN      u1Byte                  length\r
        );\r
 VOID\r
+EXhalbtcoutsrc_RfStatusNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                          type\r
+       );\r
+VOID\r
 EXhalbtcoutsrc_StackOperationNotify(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
        IN      u1Byte                  type\r
@@ -618,18 +699,13 @@ EXhalbtcoutsrc_HaltNotify(
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
-EXhalbtcoutsrc_SwitchGntBt(\r
-       IN      PBTC_COEXIST            pBtCoexist\r
-       );\r
-VOID\r
 EXhalbtcoutsrc_PnpNotify(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
        IN      u1Byte                  pnpState\r
        );\r
 VOID\r
 EXhalbtcoutsrc_CoexDmSwitch(\r
-       IN      PBTC_COEXIST            pBtCoexist,\r
-       IN      BOOLEAN                         antInverse\r
+       IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
 EXhalbtcoutsrc_Periodical(\r
@@ -659,10 +735,12 @@ VOID
 EXhalbtcoutsrc_UpdateMinBtRssi(\r
        IN      s1Byte  btRssi\r
        );\r
+#if 0\r
 VOID\r
 EXhalbtcoutsrc_SetBtExist(\r
        IN      BOOLEAN         bBtExist\r
        );\r
+#endif\r
 VOID\r
 EXhalbtcoutsrc_SetChipType(\r
        IN      u1Byte          chipType\r
@@ -670,8 +748,11 @@ EXhalbtcoutsrc_SetChipType(
 VOID\r
 EXhalbtcoutsrc_SetAntNum(\r
        IN      u1Byte          type,\r
-       IN      u1Byte          antNum,\r
-       IN      BOOLEAN         antInverse\r
+       IN      u1Byte          antNum\r
+       );\r
+VOID\r
+EXhalbtcoutsrc_SetSingleAntPath(\r
+       IN      u1Byte          singleAntPath\r
        );\r
 VOID\r
 EXhalbtcoutsrc_DisplayBtCoexInfo(\r
index fdd940611f6f4f24c0cc68373c55e9c01225fe3a..b1fc17ba14844abbd68cf8a5ccf213292cd7775f 100644 (file)
@@ -52,5 +52,6 @@
 #include "HalBtc8812a2Ant.h"
 #include "HalBtc8821a1Ant.h"
 #include "HalBtc8821a2Ant.h"
+#include "HalBtc8821aCsr2Ant.h"
 
 #endif // __MP_PRECOMP_H__
index d74846cb30479ef308546442fff9f187797aabcf..3070e792b9f1008f5992025ea71914fa0ccaf881 100644 (file)
@@ -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/rtl8189es/hal/OUTSRC/Mp_Precomp.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/Mp_Precomp.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/PhyDM_Adaptivity.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/PhyDM_Adaptivity.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/PhyDM_Adaptivity.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/PhyDM_Adaptivity.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/odm.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm.c
deleted file mode 100644 (file)
index 48766a2..0000000
+++ /dev/null
@@ -1,14206 +0,0 @@
-/******************************************************************************
- *
- * 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 "odm_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}};
-
-
-#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
-static u4Byte edca_setting_UL[HT_IOT_PEER_MAX] = 
-// UNKNOWN             REALTEK_90      REALTEK_92SE    BROADCOM                RALINK          ATHEROS         CISCO           MERU        MARVELL     92U_AP          SELF_AP(DownLink/Tx)
-{ 0x5e4322,            0xa44f,                 0x5e4322,               0x5ea32b,               0x5ea422,       0x5ea322,       0x3ea430,       0x5ea42b, 0x5ea44f,     0x5e4322,       0x5e4322};
-
-
-static u4Byte edca_setting_DL[HT_IOT_PEER_MAX] = 
-// UNKNOWN             REALTEK_90      REALTEK_92SE    BROADCOM                RALINK          ATHEROS         CISCO           MERU,       MARVELL     92U_AP          SELF_AP(UpLink/Rx)
-{ 0xa44f,              0x5ea44f,       0x5e4322,               0x5ea42b,               0xa44f,                 0xa630,                 0x5ea630,       0x5ea42b, 0xa44f,               0xa42b,         0xa42b};
-
-static u4Byte edca_setting_DL_GMode[HT_IOT_PEER_MAX] = 
-// UNKNOWN             REALTEK_90      REALTEK_92SE    BROADCOM                RALINK          ATHEROS         CISCO           MERU,       MARVELL     92U_AP          SELF_AP
-{ 0x4322,              0xa44f,                 0x5e4322,               0xa42b,                         0x5e4322,       0x4322,                 0xa42b,         0x5ea42b, 0xa44f,               0x5e4322,       0x5ea42b};
-
-
-//============================================================
-// EDCA Paramter for AP/ADSL   by Mingzhi 2011-11-22
-//============================================================
-#elif (DM_ODM_SUPPORT_TYPE &ODM_ADSL)
-enum qos_prio { BK, BE, VI, VO, VI_AG, VO_AG };
-
-static const struct ParaRecord rtl_ap_EDCA[] =
-{
-//ACM,AIFSN, ECWmin, ECWmax, TXOplimit
-     {0,     7,      4,      10,     0},            //BK
-     {0,     3,      4,      6,      0},             //BE
-     {0,     1,      3,      4,      188},         //VI
-     {0,     1,      2,      3,      102},         //VO
-     {0,     1,      3,      4,      94},          //VI_AG
-     {0,     1,      2,      3,      47},          //VO_AG
-};
-
-static const struct ParaRecord rtl_sta_EDCA[] =
-{
-//ACM,AIFSN, ECWmin, ECWmax, TXOplimit
-     {0,     7,      4,      10,     0},
-     {0,     3,      4,      10,     0},
-     {0,     2,      3,      4,      188},
-     {0,     2,      2,      3,      102},
-     {0,     2,      3,      4,      94},
-     {0,     2,      2,      3,      47},
-};
-#endif
-
-//============================================================
-// 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    
-};
-
-#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
-
-//============================================================
-// Local Function predefine.
-//============================================================
-
-//START------------COMMON INFO RELATED---------------//
-VOID
-odm_CommonInfoSelfInit(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_CommonInfoSelfUpdate(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_CmnInfoInit_Debug(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_CmnInfoHook_Debug(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_CmnInfoUpdate_Debug(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-VOID
-odm_BasicDbgMessage
-(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-//END------------COMMON INFO RELATED---------------//
-
-//START---------------DIG---------------------------//
-VOID 
-odm_FalseAlarmCounterStatistics(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_DIGInit(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID   
-odm_DIG(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-BOOLEAN 
-odm_DigAbort(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID 
-odm_CCKPacketDetectionThresh(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_AdaptivityInit(
-       IN              PDM_ODM_T               pDM_Odm
-);
-
-VOID
-odm_Adaptivity(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  IGI
-);
-//END---------------DIG---------------------------//
-
-//START-------BB POWER SAVE-----------------------//
-VOID 
-odm_DynamicBBPowerSavingInit(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID 
-odm_DynamicBBPowerSaving(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_1R_CCA(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-//END---------BB POWER SAVE-----------------------//
-
-//START-----------------PSD-----------------------//
-#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) 
-//============================================================
-// Function predefine.
-//============================================================
-VOID   odm_PathDiversityInit_92C(      IN      PADAPTER        Adapter);
-VOID   odm_2TPathDiversityInit_92C(    IN      PADAPTER        Adapter);
-VOID   odm_1TPathDiversityInit_92C(    IN      PADAPTER        Adapter);
-BOOLEAN        odm_IsConnected_92C(IN  PADAPTER        Adapter);
-VOID   odm_PathDiversityAfterLink_92C( IN      PADAPTER        Adapter);
-
-VOID
-odm_CCKTXPathDiversityCallback(
-       PRT_TIMER               pTimer
-       );
-
-VOID
-odm_CCKTXPathDiversityWorkItemCallback(
-    IN PVOID            pContext
-    );
-
-VOID
-odm_PathDivChkAntSwitchCallback(
-       PRT_TIMER               pTimer
-       );
-
-VOID
-odm_PathDivChkAntSwitchWorkitemCallback(
-    IN PVOID            pContext
-    );
-
-VOID   odm_SetRespPath_92C(            IN      PADAPTER        Adapter,        IN      u1Byte  DefaultRespPath);
-VOID   odm_OFDMTXPathDiversity_92C(    IN      PADAPTER        Adapter);
-VOID   odm_CCKTXPathDiversity_92C(     IN      PADAPTER        Adapter);
-VOID   odm_ResetPathDiversity_92C(             IN      PADAPTER        Adapter);
-
-//Start-------------------- RX High Power------------------------//
-VOID   odm_RXHPInit(   IN              PDM_ODM_T               pDM_Odm);
-VOID   odm_RXHP(       IN              PDM_ODM_T               pDM_Odm);
-VOID   odm_Write_RXHP( IN      PDM_ODM_T       pDM_Odm);
-
-VOID   odm_PSD_RXHP(           IN      PDM_ODM_T       pDM_Odm);
-VOID   odm_PSD_RXHPCallback(   PRT_TIMER               pTimer);
-VOID   odm_PSD_RXHPWorkitemCallback(   IN PVOID            pContext);
-//End--------------------- RX High Power -----------------------//
-
-VOID   odm_PathDivInit_92D(    IN      PDM_ODM_T       pDM_Odm);
-
-VOID
-odm_SetRespPath_92C(
-       IN      PADAPTER        Adapter,
-       IN      u1Byte  DefaultRespPath 
-       );
-
-#endif
-//END-------------------PSD-----------------------//
-
-VOID
-odm_RefreshRateAdaptiveMaskMP(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_RefreshRateAdaptiveMaskCE(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_RefreshRateAdaptiveMaskAPADSL(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-ODM_DynamicATCSwitch_init(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-ODM_DynamicATCSwitch(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_Write_CrystalCap(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  CrystalCap
-);
-
-VOID 
-odm_DynamicTxPowerInit(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_DynamicTxPowerRestorePowerIndex(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-
-VOID 
-odm_DynamicTxPowerNIC(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-
-#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
-VOID
-odm_DynamicTxPowerSavePowerIndex(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_DynamicTxPowerWritePowerIndex(
-       IN      PDM_ODM_T       pDM_Odm, 
-       IN      u1Byte          Value);
-
-VOID 
-odm_DynamicTxPower_92C(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-
-VOID 
-odm_DynamicTxPower_92D(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-
-VOID
-odm_MPT_DIGCallback(
-       PRT_TIMER               pTimer
-);
-
-VOID
-odm_MPT_DIGWorkItemCallback(
-    IN PVOID            pContext
-    );
-#endif
-
-
-VOID
-odm_RSSIMonitorInit(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-
-VOID
-odm_RSSIMonitorCheckMP(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-
-VOID 
-odm_RSSIMonitorCheckCE(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-VOID 
-odm_RSSIMonitorCheckAP(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-
-
-VOID
-odm_RSSIMonitorCheck(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-VOID 
-odm_DynamicTxPower(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID 
-odm_DynamicTxPowerAP(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-
-VOID
-odm_SwAntDivInit(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_SwAntDivInit_NIC(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_SwAntDetectInit(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_SwAntDivChkAntSwitch(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  Step
-       );
-
-VOID
-odm_SwAntDivChkAntSwitchNIC(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte          Step
-       );
-
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-VOID
-odm_SwAntDivChkAntSwitchCallback(
-       PRT_TIMER               pTimer
-);
-VOID
-odm_SwAntDivChkAntSwitchWorkitemCallback(
-    IN PVOID            pContext
-    );
-VOID
-ODM_UpdateInitRateWorkItemCallback(
-    IN PVOID            pContext
-    );
-#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
-VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext);
-#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
-VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext);
-#endif
-
-
-
-VOID
-odm_GlobalAdapterCheck(
-       IN              VOID
-       );
-
-VOID
-odm_RefreshBasicRateMask(
-       IN              PDM_ODM_T               pDM_Odm 
-       );
-
-VOID
-odm_RefreshRateAdaptiveMask(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-ODM_TXPowerTrackingCheck(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_TXPowerTrackingCheckAP(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-
-
-
-
-
-
-VOID
-odm_RateAdaptiveMaskInit(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-
-VOID
-odm_TXPowerTrackingThermalMeterInit(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-
-
-VOID
-odm_IQCalibrate(
-               IN      PDM_ODM_T       pDM_Odm 
-               );
-
-VOID
-odm_TXPowerTrackingInit(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-
-VOID
-odm_TXPowerTrackingCheckMP(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-
-
-VOID
-odm_TXPowerTrackingCheckCE(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-
-#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) 
-
-VOID
-ODM_RateAdaptiveStateApInit(
-       IN      PADAPTER        Adapter ,
-       IN      PRT_WLAN_STA  pEntry
-       );
-
-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
-
-VOID
-odm_EdcaTurboCheck(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-VOID
-ODM_EdcaTurboInit(
-       IN      PDM_ODM_T               pDM_Odm
-);
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-VOID
-odm_EdcaTurboCheckMP(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-//check if edca turbo is disabled
-BOOLEAN
-odm_IsEdcaTurboDisable(
-       IN      PDM_ODM_T       pDM_Odm
-);
-//choose edca paramter for special IOT case
-VOID 
-ODM_EdcaParaSelByIot(
-       IN      PDM_ODM_T       pDM_Odm,
-       OUT     u4Byte          *EDCA_BE_UL,
-       OUT u4Byte              *EDCA_BE_DL
-       );
-//check if it is UL or DL
-VOID
-odm_EdcaChooseTrafficIdx( 
-       IN      PDM_ODM_T               pDM_Odm,
-       IN      u8Byte                          cur_tx_bytes,  
-       IN      u8Byte                          cur_rx_bytes, 
-       IN      BOOLEAN                 bBiasOnRx,
-       OUT BOOLEAN             *pbIsCurRDLState
-       );
-
-#elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
-VOID
-odm_EdcaTurboCheckCE(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-#else
-VOID 
-odm_IotEngine(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-
-VOID
-odm_EdcaParaInit(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-#endif
-
-
-
-#define        RxDefaultAnt1           0x65a9
-#define        RxDefaultAnt2           0x569a
-
-VOID
-odm_InitHybridAntDiv(
-       IN PDM_ODM_T    pDM_Odm 
-       );
-
-BOOLEAN
-odm_StaDefAntSel(
-       IN PDM_ODM_T    pDM_Odm,
-       IN u4Byte               OFDM_Ant1_Cnt,
-       IN u4Byte               OFDM_Ant2_Cnt,
-       IN u4Byte               CCK_Ant1_Cnt,
-       IN u4Byte               CCK_Ant2_Cnt,
-       OUT u1Byte              *pDefAnt 
-       );
-
-VOID
-odm_SetRxIdleAnt(
-       IN      PDM_ODM_T       pDM_Odm,
-       IN      u1Byte  Ant,
-       IN   BOOLEAN   bDualPath                     
-);
-
-
-
-VOID
-odm_HwAntDiv(
-       IN      PDM_ODM_T       pDM_Odm
-);
-
-VOID   odm_PathDiversityInit(IN        PDM_ODM_T       pDM_Odm);
-VOID   odm_PathDiversity(      IN      PDM_ODM_T       pDM_Odm);
-
-
-
-//============================================================
-//3 Export Interface
-//============================================================
-
-//
-// 2011/09/21 MH Add to describe different team necessary resource allocate??
-//
-VOID
-ODM_DMInit(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-
-       //2012.05.03 Luke: For all IC series
-       odm_CommonInfoSelfInit(pDM_Odm);
-       odm_CmnInfoInit_Debug(pDM_Odm);
-       odm_DIGInit(pDM_Odm);   
-       odm_AdaptivityInit(pDM_Odm);
-       odm_RateAdaptiveMaskInit(pDM_Odm);
-       odm_RSSIMonitorInit(pDM_Odm);
-       
-#if (RTL8192E_SUPPORT == 1)
-       if(pDM_Odm->SupportICType==ODM_RTL8192E)
-       {
-               odm_PrimaryCCA_Check_Init(pDM_Odm);
-       }
-#endif
-
-//#if (MP_DRIVER != 1)
-       if ( *(pDM_Odm->mp_mode) != 1)
-           odm_PathDiversityInit(pDM_Odm);
-//#endif
-       ODM_EdcaTurboInit(pDM_Odm);
-
-       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
-       {
-               odm_TXPowerTrackingInit(pDM_Odm);
-//#if (MP_DRIVER != 1)
-               if ( *(pDM_Odm->mp_mode) != 1)
-                       ODM_AntDivInit(pDM_Odm);
-//#endif
-       }
-       else if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
-       {
-               odm_DynamicBBPowerSavingInit(pDM_Odm);
-               odm_DynamicTxPowerInit(pDM_Odm);
-               odm_TXPowerTrackingInit(pDM_Odm);
-               //ODM_EdcaTurboInit(pDM_Odm);
-//#if (MP_DRIVER != 1)
-               if ( *(pDM_Odm->mp_mode) != 1) {
-               if(pDM_Odm->SupportICType==ODM_RTL8723A)
-                       odm_SwAntDivInit(pDM_Odm);      
-               else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
-               {
-                       if(pDM_Odm->AntDivType == HW_ANTDIV)
-                       odm_InitHybridAntDiv(pDM_Odm);
-                       else
-                       odm_SwAntDivInit(pDM_Odm);
-               }
-               else
-                       ODM_AntDivInit(pDM_Odm);
-       
-               if(pDM_Odm->SupportICType == ODM_RTL8723B)
-                       odm_SwAntDetectInit(pDM_Odm);
-               }
-//#endif
-
-//2010.05.30 LukeLee: For CE platform, files in IC subfolders may not be included to be compiled,
-// so compile flags must be left here to prevent from compile errors
-#if (RTL8188E_SUPPORT == 1)
-               if(pDM_Odm->SupportICType==ODM_RTL8188E)
-               {
-                       odm_PrimaryCCA_Init(pDM_Odm);    // Gary
-                       ODM_RAInfo_Init_all(pDM_Odm);
-               }       
-#endif         
-
-//2010.05.30 LukeLee: Following are not incorporated into ODM structure yet.
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-               if(pDM_Odm->SupportICType&ODM_RTL8723A)
-                       odm_PSDMonitorInit(pDM_Odm);
-               
-               if(!(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8188E)))
-               {
-                       odm_RXHPInit(pDM_Odm);  
-               }
-               if(pDM_Odm->SupportICType==ODM_RTL8192D)
-               {
-                       odm_PathDivInit_92D(pDM_Odm); //92D Path Div Init   //Neil Chen
-               }       
-#endif
-       }
-
-       ODM_DynamicATCSwitch_init(pDM_Odm);
-       ODM_ClearTxPowerTrackingState(pDM_Odm);
-
-}
-
-//
-// 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
-       )
-{      
-       if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->SupportInterface == ODM_ITRF_USB))
-       {
-               if(pDM_Odm->RSSI_Min > 25)
-                       ODM_Write1Byte(pDM_Odm, 0x4CF, 0x02);
-               else if(pDM_Odm->RSSI_Min < 20)
-                       ODM_Write1Byte(pDM_Odm, 0x4CF, 0x00);
-       }
-
-
-       odm_CommonInfoSelfUpdate(pDM_Odm);
-       odm_BasicDbgMessage(pDM_Odm);
-       odm_FalseAlarmCounterStatistics(pDM_Odm);
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): RSSI=0x%x\n",pDM_Odm->RSSI_Min));
-
-       odm_RSSIMonitorCheck(pDM_Odm);
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
-//#ifdef CONFIG_PLATFORM_SPRD
-       //For CE Platform(SPRD or Tablet)
-       //8723A or 8189ES platform
-       //NeilChen--2012--08--24--
-       //Fix Leave LPS issue
-       if(     (adapter_to_pwrctl(pDM_Odm->Adapter)->pwr_mode != PS_MODE_ACTIVE) // in LPS mode
-               //&&(                   
-               //      (pDM_Odm->SupportICType & (ODM_RTL8723A ) )||
-               //      (pDM_Odm->SupportICType & (ODM_RTL8188E) &&((pDM_Odm->SupportInterface  == ODM_ITRF_SDIO)) ) 
-               //)     
-       )
-       {
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("----Step1: odm_DIG is in LPS mode\n"));                              
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("---Step2: 8723AS is in LPS mode\n"));
-                       odm_DIGbyRSSI_LPS(pDM_Odm);
-       }               
-       else                            
-//#endif
-#endif
-       {
-               odm_DIG(pDM_Odm);
-       }
-
-       {
-               pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;
-               odm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue);
-       }
-       odm_CCKPacketDetectionThresh(pDM_Odm);
-
-       if(*(pDM_Odm->pbPowerSaving)==TRUE)
-               return;
-
-       
-       odm_RefreshRateAdaptiveMask(pDM_Odm);
-       odm_RefreshBasicRateMask(pDM_Odm);
-       odm_DynamicBBPowerSaving(pDM_Odm);      
-       odm_EdcaTurboCheck(pDM_Odm);
-       odm_PathDiversity(pDM_Odm);
-       ODM_DynamicATCSwitch(pDM_Odm);
-       odm_DynamicTxPower(pDM_Odm);    
-
-#if (RTL8192E_SUPPORT == 1)
-        if(pDM_Odm->SupportICType==ODM_RTL8192E)
-                odm_DynamicPrimaryCCA_Check(pDM_Odm); 
-#endif
-        //if(pDM_Odm->SupportICType == ODM_RTL8192E)
-        //        return;
-
-       
-//#if (MP_DRIVER != 1)         
-if ( *(pDM_Odm->mp_mode) != 1) {
-       if(pDM_Odm->SupportICType==ODM_RTL8723A)
-       {
-               odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_PEAK);
-       }
-       else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
-       {
-               if(pDM_Odm->AntDivType == HW_ANTDIV)
-                       odm_HwAntDiv(pDM_Odm);
-               else
-                       odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_PEAK);
-       }
-       else
-               ODM_AntDiv(pDM_Odm);
-}
-//#endif
-
-       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
-       {
-               ODM_TXPowerTrackingCheck(pDM_Odm);
-
-               odm_IQCalibrate(pDM_Odm);
-       }
-       else if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
-       {
-               ODM_TXPowerTrackingCheck(pDM_Odm);
-
-               //odm_EdcaTurboCheck(pDM_Odm);
-
-               #if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))   
-               if(!(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8188E)))
-                       odm_RXHP(pDM_Odm);      
-               #endif
-
-       //2010.05.30 LukeLee: For CE platform, files in IC subfolders may not be included to be compiled,
-       // so compile flags must be left here to prevent from compile errors
-#if (RTL8192D_SUPPORT == 1)
-               if(pDM_Odm->SupportICType==ODM_RTL8192D)
-                       ODM_DynamicEarlyMode(pDM_Odm);
-#endif
-               odm_DynamicBBPowerSaving(pDM_Odm);
-#if (RTL8188E_SUPPORT == 1)
-               if(pDM_Odm->SupportICType==ODM_RTL8188E)
-                       odm_DynamicPrimaryCCA(pDM_Odm); 
-#endif
-
-       }
-       pDM_Odm->PhyDbgInfo.NumQryBeaconPkt = 0;
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
-       odm_dtc(pDM_Odm);
-#endif
-}
-
-
-//
-// 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;
-               
-               //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_MP_MODE:
-                       pDM_Odm->mp_mode = (u1Byte *)pValue;
-                       break;
-
-               //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_DISABLED:
-                       pDM_Odm->bBtDisabled = (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;
-                       
-/*
-               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;
-       }
-
-       
-}
-
-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
-
-       ODM_InitDebugSetting(pDM_Odm);
-
-       if(pDM_Odm->SupportICType==ODM_RTL8723A)
-       {
-               pDM_Odm->AntDivType = SW_ANTDIV;
-       }
-       else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
-       {
-           #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))   
-               pDM_Odm->AntDivType = HW_ANTDIV;
-           #elif (defined(CONFIG_SW_ANTENNA_DIVERSITY))
-               pDM_Odm->AntDivType = SW_ANTDIV;
-           #endif
-       }
-       pDM_Odm->TxRate = 0xFF;
-#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
-#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
-
-       if(pDM_Odm->SupportICType==ODM_RTL8723B)
-       {
-               if((!pDM_Odm->DM_SWAT_Table.ANTA_ON || !pDM_Odm->DM_SWAT_Table.ANTB_ON))
-                       pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
-       }
-
-#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)
-
-       #if(defined(CONFIG_NOT_SUPPORT_ANTDIV)) 
-               pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Disable AntDiv function] : Not Support 2.4G & 5G Antenna Diversity\n"));
-       #elif(defined(CONFIG_2G5G_SUPPORT_ANTDIV)) 
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Enable AntDiv function] : 2.4G & 5G Support Antenna Diversity Simultaneously \n"));
-               pDM_FatTable->AntDiv_2G_5G = (ODM_ANTDIV_2G|ODM_ANTDIV_5G);
-               if(pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT)
-                       pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;
-               if(*pDM_Odm->pBandType == ODM_BAND_5G )
-               {
-                       #if ( defined(CONFIG_5G_CGCS_RX_DIVERSITY) )
-                               pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV; 
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n"));
-                       #elif( defined(CONFIG_5G_CG_TRX_DIVERSITY) )
-                               pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CG_TRX_HW_ANTDIV\n"));
-                       #elif( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) )
-                               pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CG_SMART_ANTDIV\n"));
-                       #endif
-               }               
-               else    if(*pDM_Odm->pBandType == ODM_BAND_2_4G )
-               {
-                       #if ( defined(CONFIG_2G_CGCS_RX_DIVERSITY) )
-                               pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n"));
-                       #elif( defined(CONFIG_2G_CG_TRX_DIVERSITY) )
-                               pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CG_TRX_HW_ANTDIV\n"));
-                       #elif( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )
-                               pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CG_SMART_ANTDIV\n"));
-                       #endif
-               }
-        #elif(defined(CONFIG_5G_SUPPORT_ANTDIV))
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Enable AntDiv function] : Only 5G Support Antenna Diversity\n"));
-               pDM_FatTable->AntDiv_2G_5G = (ODM_ANTDIV_5G);
-               if(*pDM_Odm->pBandType == ODM_BAND_5G )
-               {
-                       if(pDM_Odm->SupportICType & ODM_ANTDIV_5G_SUPPORT_IC)
-                               pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;      
-                       #if ( defined(CONFIG_5G_CGCS_RX_DIVERSITY) )
-                               pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n"));
-                       #elif( defined(CONFIG_5G_CG_TRX_DIVERSITY) )
-                               pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CG_TRX_HW_ANTDIV\n"));
-                       #elif( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) )
-                               pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CG_SMART_ANTDIV\n"));
-                       #endif
-               }
-               else if(*pDM_Odm->pBandType == ODM_BAND_2_4G )
-               {
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Not Support 2G AntDivType\n"));
-                       pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
-               }
-       #elif(defined(CONFIG_2G_SUPPORT_ANTDIV)) 
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Enable AntDiv function] : Only 2.4G Support Antenna Diversity\n"));
-               pDM_FatTable->AntDiv_2G_5G = (ODM_ANTDIV_2G);
-               if(*pDM_Odm->pBandType == ODM_BAND_2_4G )
-               {
-                       if(pDM_Odm->SupportICType & ODM_ANTDIV_2G_SUPPORT_IC)
-                               pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;
-                       #if ( defined(CONFIG_2G_CGCS_RX_DIVERSITY) )
-                               pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n"));
-                       #elif( defined(CONFIG_2G_CG_TRX_DIVERSITY) )
-                               pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CG_TRX_HW_ANTDIV\n"));
-                       #elif( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )
-                               pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CG_SMART_ANTDIV\n"));
-                        #endif
-               }
-               else if(*pDM_Odm->pBandType == ODM_BAND_5G )
-               {
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Not Support 5G AntDivType\n"));
-                       pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
-               }
-       #endif
-#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
-#endif //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
-
-}
-
-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;
-       }
-#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;
-}
-
-VOID
-odm_CmnInfoInit_Debug(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_CmnInfoInit_Debug==>\n"));
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportPlatform=%d\n",pDM_Odm->SupportPlatform) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportAbility=0x%x\n",pDM_Odm->SupportAbility) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportInterface=%d\n",pDM_Odm->SupportInterface) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportICType=0x%x\n",pDM_Odm->SupportICType) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("CutVersion=%d\n",pDM_Odm->CutVersion) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("FabVersion=%d\n",pDM_Odm->FabVersion) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RFType=%d\n",pDM_Odm->RFType) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("BoardType=%d\n",pDM_Odm->BoardType) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtLNA=%d\n",pDM_Odm->ExtLNA) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtPA=%d\n",pDM_Odm->ExtPA) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtTRSW=%d\n",pDM_Odm->ExtTRSW) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("PatchID=%d\n",pDM_Odm->PatchID) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bInHctTest=%d\n",pDM_Odm->bInHctTest) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bWIFITest=%d\n",pDM_Odm->bWIFITest) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bDualMacSmartConcurrent=%d\n",pDM_Odm->bDualMacSmartConcurrent) );
-
-}
-
-VOID
-odm_CmnInfoHook_Debug(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_CmnInfoHook_Debug==>\n"));    
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pNumTxBytesUnicast=%llu\n",*(pDM_Odm->pNumTxBytesUnicast)) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pNumRxBytesUnicast=%llu\n",*(pDM_Odm->pNumRxBytesUnicast)) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pWirelessMode=0x%x\n",*(pDM_Odm->pWirelessMode)) );       
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pSecChOffset=%d\n",*(pDM_Odm->pSecChOffset)) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pSecurity=%d\n",*(pDM_Odm->pSecurity)) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pBandWidth=%d\n",*(pDM_Odm->pBandWidth)) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pChannel=%d\n",*(pDM_Odm->pChannel)) );
-
-       if(pDM_Odm->SupportICType==ODM_RTL8192D)
-       {
-               if(pDM_Odm->pBandType)
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pBandType=%d\n",*(pDM_Odm->pBandType)) );
-               if(pDM_Odm->pMacPhyMode)
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pMacPhyMode=%d\n",*(pDM_Odm->pMacPhyMode)) );
-               if(pDM_Odm->pBuddyAdapter)
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbGetValueFromOtherMac=%d\n",*(pDM_Odm->pbGetValueFromOtherMac)) );
-               if(pDM_Odm->pBuddyAdapter)
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pBuddyAdapter=%p\n",*(pDM_Odm->pBuddyAdapter)) );
-               if(pDM_Odm->pbMasterOfDMSP)
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbMasterOfDMSP=%d\n",*(pDM_Odm->pbMasterOfDMSP)) );
-       }
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbScanInProcess=%d\n",*(pDM_Odm->pbScanInProcess)) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbPowerSaving=%d\n",*(pDM_Odm->pbPowerSaving)) );
-
-       if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pOnePathCCA=%d\n",*(pDM_Odm->pOnePathCCA)) );
-}
-
-VOID
-odm_CmnInfoUpdate_Debug(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_CmnInfoUpdate_Debug==>\n"));
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bWIFI_Direct=%d\n",pDM_Odm->bWIFI_Direct) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bWIFI_Display=%d\n",pDM_Odm->bWIFI_Display) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bLinked=%d\n",pDM_Odm->bLinked) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RSSI_Min=%d\n",pDM_Odm->RSSI_Min) );
-}
-
-VOID
-odm_BasicDbgMessage
-(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
-       pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;
-       
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_BasicDbgMsg==>\n"));
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bLinked = %d, RSSI_Min = %d, CurrentIGI = 0x%x \n",
-               pDM_Odm->bLinked, pDM_Odm->RSSI_Min, pDM_DigTable->CurIGValue) );
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("Cnt_Cck_fail = %d, Cnt_Ofdm_fail = %d, Total False Alarm = %d\n", 
-               FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_all));
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RxRate = 0x%x, RSSI_A = %d, RSSI_B = %d\n", 
-               pDM_Odm->RxRate, pDM_Odm->RSSI_A, pDM_Odm->RSSI_B));
-       //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));
-
-}
-
-#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
- *
- *---------------------------------------------------------------------------*/
-VOID
-ODM_ChangeDynamicInitGainThresh(
-       IN      PDM_ODM_T       pDM_Odm,
-       IN      u4Byte          DM_Type,
-       IN      u4Byte          DM_Value
-       )
-{
-       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_AdaptivityInit(
-IN PDM_ODM_T pDM_Odm
-)
-{
-       if(pDM_Odm->SupportICType == ODM_RTL8723B)
-       {
-               pDM_Odm->TH_L2H_ini = 0xf8; // -8
-       }
-       if((pDM_Odm->SupportICType == ODM_RTL8192E)&&(pDM_Odm->SupportInterface == ODM_ITRF_PCIE))
-       {
-               pDM_Odm->TH_L2H_ini = 0xf0; // -16
-       }
-       else
-       {
-               pDM_Odm->TH_L2H_ini = 0xf9; // -7
-       }
-       
-       pDM_Odm->TH_EDCCA_HL_diff = 7;
-       pDM_Odm->IGI_Base = 0x32;
-       pDM_Odm->IGI_target = 0x1c;
-       pDM_Odm->ForceEDCCA = 0;
-       pDM_Odm->AdapEn_RSSI = 20;
-
-       //Reg524[11]=0 is easily to transmit packets during adaptivity test
-
-       //ODM_SetBBReg(pDM_Odm, 0x524, BIT11, 1);// stop counting if EDCCA is asserted
-}
-
-// Add by Neil Chen to enable edcca to MP Platform 
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-
-VOID
-odm_EnableEDCCA(
-       IN              PDM_ODM_T               pDM_Odm
-)
-{
-
-       // This should be moved out of OUTSRC
-       PADAPTER                pAdapter        = pDM_Odm->Adapter;
-       // Enable EDCCA. The value is suggested by SD3 Wilson.
-
-       //
-       // Revised for ASUS 11b/g performance issues, suggested by BB Neil, 2012.04.13.
-       //
-       if((pDM_Odm->SupportICType == ODM_RTL8723A)&&(IS_WIRELESS_MODE_G(pAdapter)))
-       {
-               //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x00);
-               ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x00);
-               ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0xFD);
-               
-       }       
-       else
-       {
-               //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x03);
-               ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x03);
-               ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0x00);
-       }       
-       
-       //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold+2, 0x00);
-}
-
-VOID
-odm_DisableEDCCA(
-       IN              PDM_ODM_T               pDM_Odm
-)
-{      
-       // Disable EDCCA..
-       ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold, 0x7f);
-       ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold+2, 0x7f);
-}
-
-//
-// Description: According to initial gain value to determine to enable or disable EDCCA.
-//
-// Suggested by SD3 Wilson. Added by tynli. 2011.11.25.
-//
-VOID
-odm_DynamicEDCCA(
-       IN              PDM_ODM_T               pDM_Odm
-)
-{
-       PADAPTER                pAdapter        = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
-       u1Byte  RegC50, RegC58;
-       BOOLEAN         bFwCurrentInPSMode=FALSE;       
-
-       pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));   
-
-       // Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.
-       if(bFwCurrentInPSMode)
-               return;
-       
-       RegC50 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0);
-       RegC58 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0);
-
-
-       if((RegC50 > 0x28 && RegC58 > 0x28) ||
-               ((pDM_Odm->SupportICType == ODM_RTL8723A && IS_WIRELESS_MODE_G(pAdapter) && RegC50>0x26)) ||
-               (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 > 0x28))
-       {
-               if(!pHalData->bPreEdccaEnable)
-               {
-                       odm_EnableEDCCA(pDM_Odm);
-                       pHalData->bPreEdccaEnable = TRUE;
-               }
-               
-       }
-       else if((RegC50 < 0x25 && RegC58 < 0x25) || (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 < 0x25))
-       {
-               if(pHalData->bPreEdccaEnable)
-               {
-                       odm_DisableEDCCA(pDM_Odm);
-                       pHalData->bPreEdccaEnable = FALSE;
-               }
-       }
-}
-
-
-#endif    // end MP platform support
-
-VOID
-odm_Adaptivity(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  IGI
-)
-{
-       s1Byte TH_L2H_dmc, TH_H2L_dmc;
-       s1Byte Diff, IGI_target;
-       BOOLEAN EDCCA_State = 0;
-       BOOLEAN isInterference = 0;
-       u4Byte  value32 = 0;
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       PADAPTER                pAdapter        = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
-       BOOLEAN         bFwCurrentInPSMode=FALSE;       
-       PMGNT_INFO                              pMgntInfo = &(pAdapter->MgntInfo);
-               
-       pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));   
-
-       // Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.
-       if(bFwCurrentInPSMode)
-               return;
-#endif
-
-       if(!(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY))
-       {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Go to odm_DynamicEDCCA() \n"));
-               // Add by Neil Chen to enable edcca to MP Platform 
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-               // Adjust EDCCA.
-               if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
-                       odm_DynamicEDCCA(pDM_Odm);
-#endif
-               return;
-       }
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_Adaptivity() =====> \n"));
-
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ForceEDCCA=%d, IGI_Base=0x%x, TH_L2H_ini = %d, TH_EDCCA_HL_diff = %d, AdapEn_RSSI = %d\n", 
-               pDM_Odm->ForceEDCCA, pDM_Odm->IGI_Base, pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff, pDM_Odm->AdapEn_RSSI));
-
-       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
-               ODM_SetBBReg(pDM_Odm, 0x800, BIT10, 0); //ADC_mask enable
-
-       if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {
-               ODM_SetBBReg(pDM_Odm, 0x908, bMaskDWord, 0x208);
-               value32 = ODM_GetBBReg(pDM_Odm, 0xdf4, bMaskDWord);
-       }
-
-       if (value32 & BIT30)
-               isInterference = TRUE;
-       else
-               isInterference = FALSE;
-
-       if(((!pDM_Odm->bLinked) && (!isInterference)) || (*pDM_Odm->pChannel >= 149)) // Band4 doesn't need adaptivity
-       {
-               if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
-               {
-                       ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, 0x7f);
-                       ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, 0x7f);
-               }
-               else
-                       ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, (0x7f<<8) | 0x7f);
-               return;
-       }
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)     
-               if(pMgntInfo->IOTPeer == HT_IOT_PEER_BROADCOM)
-                       ODM_Write1Byte(pDM_Odm, REG_TRX_SIFS_OFDM, 0x0a); 
-               else
-                       ODM_Write1Byte(pDM_Odm, REG_TRX_SIFS_OFDM, 0x0e);
-#endif
-       if(!pDM_Odm->ForceEDCCA)
-       {
-               if(pDM_Odm->RSSI_Min > pDM_Odm->AdapEn_RSSI)
-                       EDCCA_State = 1;
-               else if(pDM_Odm->RSSI_Min < (pDM_Odm->AdapEn_RSSI - 5))
-                       EDCCA_State = 0;
-       }
-       else
-               EDCCA_State = 1;
-       //if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (*pDM_Odm->pBandType == BAND_ON_5G))
-               //IGI_target = pDM_Odm->IGI_Base;
-       //else
-       {
-
-               if(*pDM_Odm->pBandWidth == ODM_BW20M) //CHANNEL_WIDTH_20
-                       IGI_target = pDM_Odm->IGI_Base;
-               else if(*pDM_Odm->pBandWidth == ODM_BW40M)
-                       IGI_target = pDM_Odm->IGI_Base + 2;
-               else if(*pDM_Odm->pBandWidth == ODM_BW80M)
-                       IGI_target = pDM_Odm->IGI_Base + 6;
-               else
-                       IGI_target = pDM_Odm->IGI_Base;
-       }
-
-       pDM_Odm->IGI_target = (u1Byte) IGI_target;
-
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("BandWidth=%s, IGI_target=0x%x, EDCCA_State=%d\n",
-               (*pDM_Odm->pBandWidth==ODM_BW80M)?"80M":((*pDM_Odm->pBandWidth==ODM_BW40M)?"40M":"20M"), IGI_target, EDCCA_State));
-
-       if(EDCCA_State == 1)
-       {
-               Diff = IGI_target -(s1Byte)IGI;
-               TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;
-               if(TH_L2H_dmc > 10)     TH_L2H_dmc = 10;
-               TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
-       }
-       else
-       {
-               TH_L2H_dmc = 0x7f;
-               TH_H2L_dmc = 0x7f;
-       }
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("IGI=0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\n", 
-               IGI, TH_L2H_dmc, TH_H2L_dmc));
-
-       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
-       {
-               ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, (u1Byte)TH_L2H_dmc);
-               ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, (u1Byte)TH_H2L_dmc);
-       }
-       else
-               ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, ((u1Byte)TH_H2L_dmc<<8) | (u1Byte)TH_L2H_dmc);
-}
-
-VOID
-ODM_DynamicATCSwitch_init(
-       IN              PDM_ODM_T               pDM_Odm
-)
-{
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN )
-
-       pDM_Odm->CrystalCap = pHalData->CrystalCap;
-       pDM_Odm->bATCStatus = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM1_CFOTracking, BIT11);
-       pDM_Odm->CFOThreshold = CFO_Threshold_Xtal;
-
-#endif
-}
-
-VOID
-ODM_DynamicATCSwitch(
-       IN              PDM_ODM_T               pDM_Odm
-)
-{
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       u1Byte                  CrystalCap,ATC_status_temp = 0;
-       u4Byte                  packet_count;
-       int                             CFO_kHz_A,CFO_kHz_B,CFO_ave = 0, Adjust_Xtal = 0;
-       int                             CFO_ave_diff;
-
-#if (MP_DRIVER == 1)
-       if ( *(pDM_Odm->mp_mode) == 1)
-               pDM_Odm->bLinked = TRUE;
-#endif 
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN )
-
-       if(!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_ATC))
-               return;
-
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("=========> ODM_DynamicATCSwitch()\n"));
-
-       //2 No link!
-       //
-       if(!pDM_Odm->bLinked)
-       {       
-               //3 
-               //3 1.Enable ATC
-               if(pDM_Odm->bATCStatus == ATC_Status_Off)
-               {
-                       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
-                               ODM_SetBBReg(pDM_Odm, rOFDM1_CFOTracking, BIT11, ATC_Status_On);
-                       
-                       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
-                               ODM_SetBBReg(pDM_Odm, rFc_area_Jaguar, BIT14, ATC_Status_On);
-                       
-                       pDM_Odm->bATCStatus = ATC_Status_On;
-               }
-
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): No link!!\n"));
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): ATCStatus = %d\n", pDM_Odm->bATCStatus));
-
-               //3 2.Disable CFO tracking for BT
-               if(!pDM_Odm->bBtDisabled)
-               {
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Disable CFO tracking for BT!!\n"));
-                       return;
-               }
-
-               //3 3.Reset Crystal Cap.
-               if(pDM_Odm->CrystalCap != pHalData->CrystalCap)
-               {
-                       pDM_Odm->CrystalCap = pHalData->CrystalCap;
-                       CrystalCap = pDM_Odm->CrystalCap & 0x3f;
-                       odm_Write_CrystalCap(pDM_Odm,CrystalCap);
-               }
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): CrystalCap = 0x%x\n", pDM_Odm->CrystalCap));
-               
-       }
-       else
-       {
-
-       //2 Initialization
-       //
-               //3 1. Calculate CFO for path-A & path-B
-               CFO_kHz_A =  (int)(pDM_Odm->CFO_tail[0] * 3125)  / 1280;
-               CFO_kHz_B =  (int)(pDM_Odm->CFO_tail[1] * 3125)  / 1280;
-               packet_count = pDM_Odm->packetCount;
-               
-               //3 2.No new packet
-               if(packet_count == pDM_Odm->packetCount_pre)
-               {
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): packet counter doesn't change\n"));
-                       return;
-               }
-               pDM_Odm->packetCount_pre = packet_count;
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): packet counter = %d\n", pDM_Odm->packetCount));
-               
-               //3 3.Average CFO
-               if(pDM_Odm->RFType == ODM_1T1R)
-                       CFO_ave = CFO_kHz_A;
-               else
-                       CFO_ave = (int)(CFO_kHz_A + CFO_kHz_B) >> 1;
-
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): CFO_kHz_A = %dkHz, CFO_kHz_B = %dkHz, CFO_ave = %dkHz\n", 
-                                               CFO_kHz_A, CFO_kHz_B, CFO_ave));
-
-               //3 4.Avoid abnormal large CFO
-               CFO_ave_diff = (pDM_Odm->CFO_ave_pre >= CFO_ave)?(pDM_Odm->CFO_ave_pre - CFO_ave):(CFO_ave - pDM_Odm->CFO_ave_pre);
-               if(CFO_ave_diff > 20 && pDM_Odm->largeCFOHit == 0)
-               {
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): first large CFO hit\n"));
-                       pDM_Odm->largeCFOHit = 1;
-                       return;
-               }
-               else
-                       pDM_Odm->largeCFOHit = 0;
-               pDM_Odm->CFO_ave_pre = CFO_ave;
-
-       //2 CFO tracking by adjusting Xtal cap.
-       //
-               if (pDM_Odm->bBtDisabled)
-               {
-                       //3 1.Dynamic Xtal threshold
-                       if(CFO_ave >= -pDM_Odm->CFOThreshold && CFO_ave <= pDM_Odm->CFOThreshold && pDM_Odm->bIsfreeze == 0)
-                       {
-                               if (pDM_Odm->CFOThreshold == CFO_Threshold_Xtal)
-                               {
-                                       pDM_Odm->CFOThreshold = CFO_Threshold_Xtal + 10;
-                                       pDM_Odm->bIsfreeze = 1;
-                               }
-                               else
-                                       pDM_Odm->CFOThreshold = CFO_Threshold_Xtal;
-                       }
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Dynamic threshold = %d\n", pDM_Odm->CFOThreshold));
-                       
-               //3      2.Calculate Xtal offset
-                       if(CFO_ave > pDM_Odm->CFOThreshold && pDM_Odm->CrystalCap < 0x3f)
-                               Adjust_Xtal =  ((CFO_ave - CFO_Threshold_Xtal) >> 2) + 1;
-                       else if(CFO_ave < (-pDM_Odm->CFOThreshold) && pDM_Odm->CrystalCap > 0)
-                               Adjust_Xtal =  ((CFO_ave + CFO_Threshold_Xtal) >> 2) - 1;
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Crystal cap = 0x%x, Crystal cap offset = %d\n", pDM_Odm->CrystalCap, Adjust_Xtal));
-
-                       //3 3.Adjudt Crystal Cap.
-                       if(Adjust_Xtal != 0)
-                       {
-                               pDM_Odm->bIsfreeze = 0;
-                               pDM_Odm->CrystalCap = pDM_Odm->CrystalCap + Adjust_Xtal;
-
-                               if(pDM_Odm->CrystalCap > 0x3f)
-                                       pDM_Odm->CrystalCap = 0x3f;
-                               else if (pDM_Odm->CrystalCap < 0)
-                                       pDM_Odm->CrystalCap = 0;
-
-                               CrystalCap = pDM_Odm->CrystalCap & 0x3f;
-                               odm_Write_CrystalCap(pDM_Odm,CrystalCap);
-       
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): New crystal cap = 0x%x \n", pDM_Odm->CrystalCap));
-                       }
-               }
-               else if(pDM_Odm->CrystalCap != pHalData->CrystalCap)
-               {
-                       //3 Reset Xtal Cap when BT is enable
-                       pDM_Odm->CrystalCap = pHalData->CrystalCap;
-                       CrystalCap = pDM_Odm->CrystalCap & 0x3f;
-                       odm_Write_CrystalCap(pDM_Odm,CrystalCap);
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Disable CFO tracking for BT!! (CrystalCap is reset)\n"));
-               }
-               else
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Disable CFO tracking for BT!! (CrystalCap is unchanged)\n"));
-               if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES){
-                       //2 Dynamic ATC switch
-                       //
-                               //3 1.Enable ATC when CFO is larger then 80kHz
-                               if(CFO_ave < CFO_Threshold_ATC && CFO_ave > -CFO_Threshold_ATC)
-                               {
-                                       if(pDM_Odm->bATCStatus == ATC_Status_On)
-                                       {
-                                       ODM_SetBBReg(pDM_Odm, rOFDM1_CFOTracking, BIT11, ATC_Status_Off);
-                                       pDM_Odm->bATCStatus = ATC_Status_Off;
-                                       }
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Disable ATC!!\n"));
-                               }
-                               else
-                               {
-                                       if(pDM_Odm->bATCStatus == ATC_Status_Off)
-                                       {
-                                               ODM_SetBBReg(pDM_Odm, rOFDM1_CFOTracking, BIT11, ATC_Status_On);
-                                               pDM_Odm->bATCStatus = ATC_Status_On;
-                                       }
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Enable ATC!!\n"));
-                               }
-               }
-       }
-#endif
-}
-
-VOID
-odm_Write_CrystalCap(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  CrystalCap
-)
-{
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-
-       if(IS_HARDWARE_TYPE_8192D(Adapter))
-       {
-               PHY_SetBBReg(Adapter, 0x24, 0xF0, CrystalCap & 0x0F);
-               PHY_SetBBReg(Adapter, 0x28, 0xF0000000, ((CrystalCap & 0xF0) >> 4));
-       }
-
-       if(IS_HARDWARE_TYPE_8188E(Adapter))
-       {
-               // write 0x24[16:11] = 0x24[22:17] = CrystalCap
-               PHY_SetBBReg(Adapter, REG_AFE_XTAL_CTRL, 0x7ff800, (CrystalCap | (CrystalCap << 6)));
-       }
-       
-       if(IS_HARDWARE_TYPE_8812(Adapter))
-       {
-               // write 0x2C[30:25] = 0x2C[24:19] = CrystalCap
-               CrystalCap = CrystalCap & 0x3F;
-               PHY_SetBBReg(Adapter, REG_MAC_PHY_CTRL, 0x7FF80000, (CrystalCap | (CrystalCap << 6)));
-       }       
-       
-       //only for B-cut
-       if ((IS_HARDWARE_TYPE_8723A(Adapter) && pHalData->EEPROMVersion >= 0x01) ||
-               IS_HARDWARE_TYPE_8723B(Adapter) ||IS_HARDWARE_TYPE_8192E(Adapter) || IS_HARDWARE_TYPE_8821(Adapter))
-       {
-               // 0x2C[23:18] = 0x2C[17:12] = CrystalCap
-               CrystalCap = CrystalCap & 0x3F;
-               PHY_SetBBReg(Adapter, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6)));    
-       }
-       
-       if(IS_HARDWARE_TYPE_8723AE(Adapter))
-               PHY_SetBBReg(Adapter, REG_LDOA15_CTRL, bMaskDWord, 0x01572505);                         
-
-}
-
-
-VOID
-ODM_Write_DIG(
-       IN      PDM_ODM_T               pDM_Odm,
-       IN      u1Byte                  CurrentIGI
-       )
-{
-       pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;
-
-       if(pDM_Odm->StopDIG)
-       {
-               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_LOUD, ("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)//if(pDM_DigTable->PreIGValue != CurrentIGI)
-       {
-               if(pDM_Odm->SupportPlatform & (ODM_CE|ODM_WIN))
-               { 
-                               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);
-                       }
-               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);
-                               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;
-                               }
-               }
-               
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurrentIGI(0x%02x). \n",CurrentIGI));
-               //pDM_DigTable->PreIGValue = pDM_DigTable->CurIGValue;
-               pDM_DigTable->CurIGValue = CurrentIGI;
-       }       
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ODM_Write_DIG():CurrentIGI=0x%x \n",CurrentIGI));
-       
-}
-
-VOID
-odm_DIGbyRSSI_LPS(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       //PADAPTER                                      pAdapter =pDM_Odm->Adapter;
-       //pDIG_T                                                pDM_DigTable = &pDM_Odm->DM_DigTable;
-       PFALSE_ALARM_STATISTICS         pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
-
-#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 
-
-       u1Byte  RSSI_Lower=DM_DIG_MIN_NIC;   //0x1E or 0x1C
-       u1Byte  CurrentIGI=pDM_Odm->RSSI_Min;
-
-       CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG;
-
-
-       //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG_LPS, ODM_DBG_LOUD, ("odm_DIG()==>\n"));
-
-       // Using FW PS mode to make IGI
-
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("---Neil---odm_DIG is in LPS mode\n"));
-       //Adjust by  FA in LPS MODE
-       if(pFalseAlmCnt->Cnt_all> DM_DIG_FA_TH2_LPS)
-               CurrentIGI = CurrentIGI+2;
-       else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS)
-               CurrentIGI = CurrentIGI+1;
-       else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS)
-               CurrentIGI = CurrentIGI-1;      
-
-
-       //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_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
-
-}
-
-VOID
-odm_DIGInit(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;
-
-       //pDM_DigTable->Dig_Enable_Flag = TRUE;
-       //pDM_DigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX;    
-       pDM_DigTable->CurIGValue = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm));
-       //pDM_DigTable->PreIGValue = 0x0;
-       //pDM_DigTable->CurSTAConnectState = pDM_DigTable->PreSTAConnectState = DIG_STA_DISCONNECT;
-       //pDM_DigTable->CurMultiSTAConnectState = DIG_MultiSTA_DISCONNECT;
-       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;
-       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;
-       }
-       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->DIG_Dynamic_MIN_0 = DM_DIG_MIN_NIC;
-       pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC;
-       pDM_DigTable->bMediaConnect_0 = FALSE;
-       pDM_DigTable->bMediaConnect_1 = FALSE;
-       
-       //To Initialize pDM_Odm->bDMInitialGainEnable == FALSE to avoid DIG error
-       pDM_Odm->bDMInitialGainEnable = TRUE;
-
-       //To Initi BT30 IGI
-       pDM_DigTable->BT30_CurIGI=0x32;
-
-}
-
-VOID
-odm_DigForBtHsMode(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       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_DIG(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;
-       PFALSE_ALARM_STATISTICS         pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
-       pRXHP_T                                         pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;
-       u1Byte                                          DIG_Dynamic_MIN;
-       u1Byte                                          DIG_MaxOfMin;
-       BOOLEAN                                         FirstConnect, FirstDisConnect;
-       u1Byte                                          dm_dig_max, dm_dig_min, offset;
-       u1Byte                                          CurrentIGI = pDM_DigTable->CurIGValue;
-       u1Byte                                          Adap_IGI_Upper = pDM_Odm->IGI_target + 30 + (u1Byte) pDM_Odm->TH_L2H_ini -(u1Byte) pDM_Odm->TH_EDCCA_HL_diff;
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-// This should be moved out of OUTSRC
-       PADAPTER                pAdapter        = pDM_Odm->Adapter;
-#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;
-       }
-#endif
-/*
-       if (pDM_Odm->SupportICType==ODM_RTL8723B)
-               return;
-*/
-
-       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; 
-               }
-       }       
-#endif
-#if (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;
-       }
-#endif
-#endif
-#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
-       prtl8192cd_priv priv                    = pDM_Odm->priv;        
-       if (!((priv->up_time > 5) && (priv->up_time % 2)) )
-       {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: Not In DIG Operation Period \n"));
-               return;
-       }
-#endif
-
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG()==>\n"));
-       //if(!(pDM_Odm->SupportAbility & (ODM_BB_DIG|ODM_BB_FA_CNT)))
-       if((!(pDM_Odm->SupportAbility&ODM_BB_DIG)) ||(!(pDM_Odm->SupportAbility&ODM_BB_FA_CNT)))
-       {
-#if 0  
-               if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
-               {
-                       if ((pDM_Odm->SupportICType == ODM_RTL8192C) && (pDM_Odm->ExtLNA == 1))
-                               CurrentIGI = 0x30; //pDM_DigTable->CurIGValue  = 0x30;
-                       else
-                               CurrentIGI = 0x20; //pDM_DigTable->CurIGValue  = 0x20;
-                       ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
-               }
-#endif         
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: SupportAbility ODM_BB_DIG or ODM_BB_FA_CNT is disabled\n"));
-               return;
-       }
-               
-       if(*(pDM_Odm->pbScanInProcess))
-       {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: In Scan Progress \n"));
-               return;
-       }
-
-       //add by Neil Chen to avoid PSD is processing
-       if(pDM_Odm->SupportICType==ODM_RTL8723A)
-       {
-               if(pDM_Odm->bDMInitialGainEnable == FALSE)
-               {
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: PSD is Processing \n"));
-                       return;
-               }
-       }
-               
-       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
-       {       
-               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);
-       }
-       
-       //1 Boundary Decision
-       if(pDM_Odm->SupportICType & (ODM_RTL8192C) &&(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)))
-       {
-               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
-       {
-               if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
-               {
-#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
-#ifdef DFS
-                       if (!priv->pmib->dot11DFSEntry.disable_DFS &&
-                               (OPMODE & WIFI_AP_STATE) &&
-                               (((pDM_Odm->ControlChannel >= 52) &&
-                               (pDM_Odm->ControlChannel <= 64)) ||
-                               ((pDM_Odm->ControlChannel >= 100) &&
-                               (pDM_Odm->ControlChannel <= 140))))
-                               dm_dig_max = 0x24;
-                       else
-#endif
-                       if (priv->pmib->dot11RFEntry.tx2path) {
-                               if (*(pDM_Odm->pWirelessMode) == ODM_WM_B)//(priv->pmib->dot11BssType.net_work_type == WIRELESS_11B)
-                                       dm_dig_max = 0x2A;
-                               else
-                                       dm_dig_max = 0x32;
-                       }
-                       else
-#endif                         
-                       dm_dig_max = DM_DIG_MAX_AP;
-                       dm_dig_min = DM_DIG_MIN_AP;
-                       DIG_MaxOfMin = dm_dig_max;
-               }
-               else
-               {
-                       if((pDM_Odm->SupportICType >= ODM_RTL8188E) && (pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE)))
-                               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;
-               }
-       }
-
-       if(0 < *pDM_Odm->pu1ForcedIgiLb)
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): 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);
-       }
-               
-       if(pDM_Odm->bLinked)
-       {
-               if(pDM_Odm->SupportICType&(ODM_RTL8723A/*|ODM_RTL8821*/))
-               {
-                       //2 Upper Bound
-                       if(( pDM_Odm->RSSI_Min + 10) > DM_DIG_MAX_NIC )
-                               pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
-                       else if(( pDM_Odm->RSSI_Min + 10) < DM_DIG_MIN_NIC )
-                               pDM_DigTable->rx_gain_range_max = DM_DIG_MIN_NIC;
-                       else
-                               pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 10;
-
-                       //BT is Concurrent
-
-                       if(pDM_Odm->bBtLimitedDig)
-                       {
-                               if(pDM_Odm->RSSI_Min>10)
-                               {
-                                       if((pDM_Odm->RSSI_Min - 10) > DM_DIG_MAX_NIC)
-                                               DIG_Dynamic_MIN = DM_DIG_MAX_NIC;
-                                       else if((pDM_Odm->RSSI_Min - 10) < DM_DIG_MIN_NIC)
-                                               DIG_Dynamic_MIN = DM_DIG_MIN_NIC;
-                                       else
-                                               DIG_Dynamic_MIN = pDM_Odm->RSSI_Min - 10;
-                               }
-                               else
-                                       DIG_Dynamic_MIN=DM_DIG_MIN_NIC;
-                       }
-                       else
-                       {
-                               if((pDM_Odm->RSSI_Min + 20) > dm_dig_max )
-                                       pDM_DigTable->rx_gain_range_max = dm_dig_max;
-                               else if((pDM_Odm->RSSI_Min + 20) < dm_dig_min )
-                                       pDM_DigTable->rx_gain_range_max = dm_dig_min;
-                               else
-                                       pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 20;
-                               
-                       }
-               }
-               else
-               {
-                       if((pDM_Odm->SupportICType & (ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8812|ODM_RTL8821)) && (pDM_Odm->bBtLimitedDig==1)){                              
-                               //2 Modify DIG upper bound for 92E, 8723B, 8821 & 8812 BT
-                               if((pDM_Odm->RSSI_Min + 10) > dm_dig_max )
-                                       pDM_DigTable->rx_gain_range_max = dm_dig_max;
-                               else if((pDM_Odm->RSSI_Min + 10) < dm_dig_min )
-                                       pDM_DigTable->rx_gain_range_max = dm_dig_min;
-                               else
-                                       pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 10;
-                       }
-                       else{
-               
-                       //2 Modify DIG upper bound
-                       //2013.03.19 Luke: Modified upper bound for Netgear rental house test
-                       if(pDM_Odm->SupportICType != ODM_RTL8821 && pDM_Odm->SupportICType != ODM_RTL8192E)
-                               offset = 20;
-                       else
-                               offset = 10;
-                       
-                       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;
-                       
-                       }
-
-                       //2 Modify DIG lower bound
-               /*
-                       if((pFalseAlmCnt->Cnt_all > 500)&&(DIG_Dynamic_MIN < 0x25))
-                               DIG_Dynamic_MIN++;
-                       else if(((pFalseAlmCnt->Cnt_all < 500)||(pDM_Odm->RSSI_Min < 8))&&(DIG_Dynamic_MIN > dm_dig_min))
-                               DIG_Dynamic_MIN--;
-               */
-                       if(pDM_Odm->bOneEntryOnly)
-                       {       
-                               if(pDM_Odm->SupportICType != ODM_RTL8723B)
-                                       offset = 0;
-                               else
-                                       offset = 12;
-                               
-                               if(pDM_Odm->RSSI_Min - offset < dm_dig_min)
-                                       DIG_Dynamic_MIN = dm_dig_min;
-                               else if (pDM_Odm->RSSI_Min - offset > DIG_MaxOfMin)
-                                       DIG_Dynamic_MIN = DIG_MaxOfMin;
-                               else
-                                       DIG_Dynamic_MIN = pDM_Odm->RSSI_Min - offset;
-
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : bOneEntryOnly=TRUE,  DIG_Dynamic_MIN=0x%x\n",DIG_Dynamic_MIN));
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : pDM_Odm->RSSI_Min=%d",pDM_Odm->RSSI_Min));
-                       }
-                       //1 Lower Bound for 88E AntDiv
-#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))
-                       else if( (pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) &&(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV) )
-                       //else if((pDM_Odm->SupportICType == ODM_RTL8188E)&&(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
-                       {
-                               if((pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)||(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV) ||pDM_Odm->AntDivType == S0S1_SW_ANTDIV)
-                               {
-                                       DIG_Dynamic_MIN = (u1Byte) pDM_DigTable->AntDiv_RSSI_max;
-                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_DIG(): pDM_DigTable->AntDiv_RSSI_max=%d \n",pDM_DigTable->AntDiv_RSSI_max));
-                               }
-                       }
-#endif
-                       else
-                       {
-                               DIG_Dynamic_MIN=dm_dig_min;
-                       }
-               }
-       }
-       else
-       {
-               pDM_DigTable->rx_gain_range_max = dm_dig_max;
-               DIG_Dynamic_MIN = dm_dig_min;
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : No Link\n"));
-       }
-       
-       //1 Modify DIG lower bound, deal with abnorally large false alarm
-       if(pFalseAlmCnt->Cnt_all > 10000)
-       {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("dm_DIG(): Abnornally 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 = (u1Byte)CurrentIGI;//pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue;
-                       pDM_DigTable->LargeFAHit = 1;
-               }
-
-               if(pDM_DigTable->LargeFAHit >= 3)
-               {
-                       if((pDM_DigTable->ForbiddenIGI+1) >pDM_DigTable->rx_gain_range_max)
-                               pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
-                       else
-                               pDM_DigTable->rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 1);
-                       pDM_DigTable->Recover_cnt = 3600; //3600=2hr
-               }
-
-       }
-       else
-       {
-               //Recovery mechanism for IGI lower bound
-               if(pDM_DigTable->Recover_cnt != 0)
-                       pDM_DigTable->Recover_cnt --;
-               else
-               {
-                       if(pDM_DigTable->LargeFAHit < 3)
-                       {
-                               if((pDM_DigTable->ForbiddenIGI -1) < DIG_Dynamic_MIN) //DM_DIG_MIN)
-                               {
-                                       pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; //DM_DIG_MIN;
-                                       pDM_DigTable->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 --;
-                                       pDM_DigTable->rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 1);
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Approach Lower Bound\n"));
-                               }
-                       }
-                       else
-                       {
-                               pDM_DigTable->LargeFAHit = 0;
-                       }
-               }
-       }
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): pDM_DigTable->LargeFAHit=%d\n",pDM_DigTable->LargeFAHit));
-
-       #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0])) //STA mode is linked to AP
-               pDM_Odm->bsta_state = _TRUE;
-       #endif  
-       
-       if((pDM_Odm->SupportPlatform&(ODM_WIN|ODM_CE))&&(pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 2) && (pDM_Odm->bsta_state) )
-       {               
-                       pDM_DigTable->rx_gain_range_min = dm_dig_min;
-       }
-       
-       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;
-
-       //1 Adjust initial gain by false alarm
-       if(pDM_Odm->bLinked)
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG AfterLink\n"));
-               if(FirstConnect)
-               {
-                       if(pDM_Odm->RSSI_Min <= DIG_MaxOfMin)
-                               CurrentIGI = pDM_Odm->RSSI_Min;
-                       else
-                               CurrentIGI = DIG_MaxOfMin;
-                       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("DIG: First Connect\n"));
-
-                       ODM_ConfigBBWithHeaderFile(pDM_Odm, CONFIG_BB_AGC_TAB_DIFF);            
-               }
-               else
-               {
-                       if(pDM_Odm->SupportICType == ODM_RTL8192D)
-                       {
-                               if(pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2_92D)
-                                       CurrentIGI = CurrentIGI + 4;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2;
-                               else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_92D)
-                                       CurrentIGI = CurrentIGI + 2; //pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1;
-                               else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_92D)
-                                       CurrentIGI = CurrentIGI - 2;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1;     
-                       }
-                       else
-                       {
-                               //FA for Combo IC--NeilChen--2012--09--28 
-                               if(pDM_Odm->SupportICType == ODM_RTL8723A)
-                               {
-                                       //WLAN and BT ConCurrent
-                                       if(pDM_Odm->bBtLimitedDig)
-                                       {
-                                               if(pFalseAlmCnt->Cnt_all > 0x300)
-                                                       CurrentIGI = CurrentIGI + 4;
-                                               else if (pFalseAlmCnt->Cnt_all > 0x250)
-                                                       CurrentIGI = CurrentIGI + 2;
-                                               else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0)
-                                                       CurrentIGI = CurrentIGI -2;
-                                       }
-                                       else //Not Concurrent
-                                       {
-                                               if(pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2)
-                                                       CurrentIGI = CurrentIGI + 4;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2;
-                                               else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1)
-                                                       CurrentIGI = CurrentIGI + 2;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1;
-                                               else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0)
-                                                       CurrentIGI = CurrentIGI - 2;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1;     
-                                       }
-                               }
-                               else
-                               {
-                                       if(pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2)
-                                               CurrentIGI = CurrentIGI + 4;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2;
-                                       else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1)
-                                               CurrentIGI = CurrentIGI + 2;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1;
-                                       else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0)
-                                               CurrentIGI = CurrentIGI - 2;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1;     
-
-                                       #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-                                       if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0])) //STA mode is linked to AP
-                                               pDM_Odm->bsta_state = _TRUE;
-                                       #endif
-
-                                       if((pDM_Odm->SupportPlatform&(ODM_WIN|ODM_CE))&&(pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 2)
-                                               &&(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(): Beacon is less than 10 and FA is less than 768, IGI GOES TO 0x1E!!!!!!!!!!!!\n"));
-                                       }
-                                       /*{
-                                               u2Byte value16;
-                                               value16 = (u2Byte) ODM_GetBBReg(pDM_Odm, 0x664, bMaskLWord);
-                                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): NumQryBeaconPkt = %d, OFDM_OK_Cnt = %d\n", 
-                                                       pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, value16));
-                                       }*/
-                               }
-                       }
-               }
-       }       
-       else
-       {
-               //CurrentIGI = pDM_DigTable->rx_gain_range_min;//pDM_DigTable->CurIGValue = pDM_DigTable->rx_gain_range_min
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG BeforeLink\n"));
-               if(FirstDisConnect)
-               {
-                               CurrentIGI = pDM_DigTable->rx_gain_range_min;
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First DisConnect \n"));
-               }
-               else
-               {
-                       //2012.03.30 LukeLee: enable DIG before link but with very high thresholds
-                    if(pFalseAlmCnt->Cnt_all > 10000)
-                               CurrentIGI = CurrentIGI + 4;
-                       else if (pFalseAlmCnt->Cnt_all > 8000)
-                               CurrentIGI = CurrentIGI + 2;
-                       else if(pFalseAlmCnt->Cnt_all < 500)
-                               CurrentIGI = CurrentIGI - 2;
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): England DIG \n"));
-               }
-       }
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG End Adjust IGI\n"));
-       //1 Check initial gain by upper/lower bound
-
-       if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
-               CurrentIGI = pDM_DigTable->rx_gain_range_max;
-       if(CurrentIGI < pDM_DigTable->rx_gain_range_min)
-               CurrentIGI = pDM_DigTable->rx_gain_range_min;
-
-       if(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY)
-       {
-               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(): pDM_Odm->IGI_LowerBound = %d\n", pDM_Odm->IGI_LowerBound));
-       }
-       
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): rx_gain_range_max=0x%x, rx_gain_range_min=0x%x\n", 
-               pDM_DigTable->rx_gain_range_max, pDM_DigTable->rx_gain_range_min));
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TotalFA=%d\n", pFalseAlmCnt->Cnt_all));
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue=0x%x\n", CurrentIGI));
-
-       //2 High power RSSI threshold
-#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)    
-{
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
-       //PMGNT_INFO                    pMgntInfo       = &(pAdapter->MgntInfo);        
-       // for LC issue to dymanic modify DIG lower bound----------LC Mocca Issue
-       u8Byte                  curTxOkCnt=0, curRxOkCnt=0;
-       static u8Byte           lastTxOkCnt=0, lastRxOkCnt=0;
-
-       //u8Byte                        OKCntAll=0;
-       //static u8Byte         TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
-       //u8Byte                        CurByteCnt=0, PreByteCnt=0;
-       
-       curTxOkCnt = pAdapter->TxStats.NumTxBytesUnicast - lastTxOkCnt;
-       curRxOkCnt =pAdapter->RxStats.NumRxBytesUnicast - lastRxOkCnt;
-       lastTxOkCnt = pAdapter->TxStats.NumTxBytesUnicast;
-       lastRxOkCnt = pAdapter->RxStats.NumRxBytesUnicast;
-       //----------------------------------------------------------end for LC Mocca issue
-       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;
-                               }       
-                       } 
-               }       
-#if 0
-       if((pDM_Odm->SupportICType & ODM_RTL8723A)&&(pMgntInfo->CustomerID = RT_CID_LENOVO_CHINA))
-       {
-               OKCntAll = (curTxOkCnt+curRxOkCnt);
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue(%#x)\n", CurrentIGI));
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): UndecoratedSmoothedPWDB(%#x)\n", pHalData->UndecoratedSmoothedPWDB));
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): OKCntAll(%#x)\n", OKCntAll));
-               //8723AS_VAU
-               if(pDM_Odm->SupportInterface==ODM_ITRF_USB)
-               {
-                       if(pHalData->UndecoratedSmoothedPWDB < 12)
-                       {
-                               if(CurrentIGI > DM_DIG_MIN_NIC)
-                               {
-                                       if(OKCntAll >= 1500000)                  // >=6Mbps
-                                               CurrentIGI=0x1B;
-                                       else if(OKCntAll >= 1000000)     //4Mbps
-                                               CurrentIGI=0x1A;
-                                       else if(OKCntAll >= 500000)              //2Mbps
-                                               CurrentIGI=0x19;
-                                       else if(OKCntAll >= 250000)             //1Mbps
-                                               CurrentIGI=0x18;
-                                       else
-                                       {
-                                               CurrentIGI=0x17;                //SCAN mode
-                                       }
-                               }
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("Modify---->CurIGValue(%#x)\n", CurrentIGI));        
-                       }
-               }
-       }       
-#endif 
-}
-#endif
-               
-#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, (u1Byte)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(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
-               {
-                       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;
-               }
-       }
-}
-
-
-BOOLEAN 
-odm_DigAbort(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-// This should be moved out of OUTSRC
-       PADAPTER                pAdapter        = pDM_Odm->Adapter;
-       pRXHP_T                 pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;
-       
-#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(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;   
-       }
-
-       return  FALSE;
-#else  // For Other team any special case for DIG?
-       return  FALSE;
-#endif
-       
-
-}
-
-//3============================================================
-//3 FASLE ALARM CHECK
-//3============================================================
-
-VOID 
-odm_FalseAlarmCounterStatistics(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       u4Byte ret_value;
-       PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
-       prtl8192cd_priv priv            = pDM_Odm->priv;
-       if( (priv->auto_channel != 0) && (priv->auto_channel != 2) )
-               return;
-#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(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)||(pDM_Odm->SupportICType == ODM_RTL8192E))
-               {
-                               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));
-       }
-       else 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);
-               
-               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;
-               else
-                       FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail;
-
-               // 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);
-       }
-       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_CCKPacketDetectionThresh(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-
-       u1Byte  CurCCK_CCAThres;
-       PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
-
-#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_DIG, 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|ODM_BB_FA_CNT)))
-               return;
-
-       if(pDM_Odm->ExtLNA)
-               return;
-
-       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);
-}
-
-VOID
-ODM_Write_CCK_CCA_Thres(
-       IN      PDM_ODM_T               pDM_Odm,
-       IN      u1Byte                  CurCCK_CCAThres
-       )
-{
-       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;
-       
-}
-
-//3============================================================
-//3 BB Power Save
-//3============================================================
-VOID 
-odm_DynamicBBPowerSavingInit(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       pPS_T   pDM_PSTable = &pDM_Odm->DM_PSTable;
-
-       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              PDM_ODM_T               pDM_Odm
-       )
-{      
-#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
-
-       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      PDM_ODM_T       pDM_Odm
-       )
-{
-       pPS_T   pDM_PSTable = &pDM_Odm->DM_PSTable;
-
-       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;
-       }
-       //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, ("CCAStage = %s\n",(pDM_PSTable->CurCCAState==0)?"1RCCA":"2RCCA"));
-}
-
-void
-ODM_RF_Saving(
-       IN      PDM_ODM_T       pDM_Odm,
-       IN      u1Byte          bForceInNormal 
-       )
-{
-#if (DM_ODM_SUPPORT_TYPE != ODM_AP)
-       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)
-       if(pDM_Odm->PatchID == 40 ) //RT_CID_819x_FUNAI_TV
-       {
-               Rssi_Up_bound = 50 ;
-               Rssi_Low_bound = 45;
-       }
-       #endif
-       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
-                       //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, (" RF_Save"));
-               }
-               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
-                       }
-                       //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, (" RF_Normal"));
-               }
-               pDM_PSTable->PreRFState =pDM_PSTable->CurRFState;
-       }
-#endif 
-}
-
-
-//3============================================================
-//3 RATR MASK
-//3============================================================
-//3============================================================
-//3 Rate Adaptive
-//3============================================================
-
-VOID
-odm_RateAdaptiveMaskInit(
-       IN      PDM_ODM_T       pDM_Odm
-       )
-{
-       PODM_RATE_ADAPTIVE      pOdmRA = &pDM_Odm->RateAdaptive;
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       PMGNT_INFO              pMgntInfo = &pDM_Odm->Adapter->MgntInfo;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
-
-       pMgntInfo->Ratr_State = DM_RATR_STA_INIT;
-
-       if (pMgntInfo->DM_Type == DM_Type_ByDriver)
-               pHalData->bUseRAMask = TRUE;
-       else
-               pHalData->bUseRAMask = FALSE;   
-
-#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
-       pOdmRA->Type = DM_Type_ByDriver;
-       if (pOdmRA->Type == DM_Type_ByDriver)
-               pDM_Odm->bUseRAMask = _TRUE;
-       else
-               pDM_Odm->bUseRAMask = _FALSE;   
-#endif
-
-       pOdmRA->RATRState = DM_RATR_STA_INIT;
-       pOdmRA->LdpcThres = 35;
-       pOdmRA->bUseLdpc = FALSE;
-       pOdmRA->HighRSSIThresh = 50;
-       pOdmRA->LowRSSIThresh = 20;
-}
-
-#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) 
-VOID
-ODM_RateAdaptiveStateApInit(   
-       IN      PADAPTER                Adapter ,
-       IN      PRT_WLAN_STA    pEntry
-       )
-{
-       pEntry->Ratr_State = DM_RATR_STA_INIT;
-}
-#endif
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
-u4Byte ODM_Get_Rate_Bitmap(
-       IN      PDM_ODM_T       pDM_Odm,        
-       IN      u4Byte          macid,
-       IN      u4Byte          ra_mask,        
-       IN      u1Byte          rssi_level)
-{
-       PSTA_INFO_T     pEntry;
-       u4Byte  rate_bitmap = 0;
-       u1Byte  WirelessMode;
-       //u1Byte        WirelessMode =*(pDM_Odm->pWirelessMode);
-       
-       
-       pEntry = pDM_Odm->pODM_StaInfo[macid];
-       if(!IS_STA_VALID(pEntry))
-               return ra_mask;
-
-       WirelessMode = pEntry->wireless_mode;
-       
-       switch(WirelessMode)
-       {
-               case ODM_WM_B:
-                       if(ra_mask & 0x0000000c)                //11M or 5.5M enable                            
-                               rate_bitmap = 0x0000000d;
-                       else
-                               rate_bitmap = 0x0000000f;
-                       break;
-                       
-               case (ODM_WM_G):
-               case (ODM_WM_A):
-                       if(rssi_level == DM_RATR_STA_HIGH)
-                               rate_bitmap = 0x00000f00;
-                       else
-                               rate_bitmap = 0x00000ff0;
-                       break;
-                       
-               case (ODM_WM_B|ODM_WM_G):
-                       if(rssi_level == DM_RATR_STA_HIGH)
-                               rate_bitmap = 0x00000f00;
-                       else if(rssi_level == DM_RATR_STA_MIDDLE)
-                               rate_bitmap = 0x00000ff0;
-                       else
-                               rate_bitmap = 0x00000ff5;
-                       break;          
-
-               case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G)    :
-               case (ODM_WM_B|ODM_WM_N24G)     :
-               case (ODM_WM_G|ODM_WM_N24G)     :
-               case (ODM_WM_A|ODM_WM_N5G)      :
-                       {                                       
-                               if (    pDM_Odm->RFType == ODM_1T2R ||pDM_Odm->RFType == ODM_1T1R)
-                               {
-                                       if(rssi_level == DM_RATR_STA_HIGH)
-                                       {
-                                               rate_bitmap = 0x000f0000;
-                                       }
-                                       else if(rssi_level == DM_RATR_STA_MIDDLE)
-                                       {
-                                               rate_bitmap = 0x000ff000;
-                                       }
-                                       else{
-                                               if (*(pDM_Odm->pBandWidth) == ODM_BW40M)
-                                                       rate_bitmap = 0x000ff015;
-                                               else
-                                                       rate_bitmap = 0x000ff005;
-                                       }                               
-                               }
-                               else
-                               {
-                                       if(rssi_level == DM_RATR_STA_HIGH)
-                                       {               
-                                               rate_bitmap = 0x0f8f0000;
-                                       }
-                                       else if(rssi_level == DM_RATR_STA_MIDDLE)
-                                       {
-                                               rate_bitmap = 0x0f8ff000;
-                                       }
-                                       else
-                                       {
-                                               if (*(pDM_Odm->pBandWidth) == ODM_BW40M)
-                                                       rate_bitmap = 0x0f8ff015;
-                                               else
-                                                       rate_bitmap = 0x0f8ff005;
-                                       }                                       
-                               }
-                       }
-                       break;
-
-               case (ODM_WM_AC|ODM_WM_G):
-                       if(rssi_level == 1)
-                               rate_bitmap = 0xfc3f0000;
-                       else if(rssi_level == 2)
-                               rate_bitmap = 0xfffff000;
-                       else
-                               rate_bitmap = 0xffffffff;
-                       break;
-
-               case (ODM_WM_AC|ODM_WM_A):
-
-                       if (pDM_Odm->RFType == RF_1T1R)
-                       {
-                               if(rssi_level == 1)                             // add by Gary for ac-series
-                                       rate_bitmap = 0x003f8000;
-                               else if (rssi_level == 2)
-                                       rate_bitmap = 0x003ff000;
-                               else
-                                       rate_bitmap = 0x003ff010;
-                       }
-                       else
-                       {
-                               if(rssi_level == 1)                             // add by Gary for ac-series
-                                       rate_bitmap = 0xfe3f8000;       // VHT 2SS MCS3~9
-                               else if (rssi_level == 2)
-                                       rate_bitmap = 0xfffff000;       // VHT 2SS MCS0~9
-                               else
-                                       rate_bitmap = 0xfffff010;       // All
-                       }
-                       break;
-                       
-               default:
-                       if(pDM_Odm->RFType == RF_1T2R)
-                               rate_bitmap = 0x000fffff;
-                       else
-                               rate_bitmap = 0x0fffffff;
-                       break;  
-
-       }
-
-       //printk("%s ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x \n",__FUNCTION__,rssi_level,WirelessMode,rate_bitmap);
-       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));
-
-       return (ra_mask&rate_bitmap);
-       
-}      
-#endif
-
-
-VOID
-odm_RefreshBasicRateMask(
-       IN              PDM_ODM_T               pDM_Odm 
-       )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       PADAPTER                Adapter  =  pDM_Odm->Adapter;
-       static u1Byte           Stage = 0;
-       u1Byte                  CurStage = 0;
-       OCTET_STRING    osRateSet;
-       PMGNT_INFO              pMgntInfo = GetDefaultMgntInfo(Adapter);
-       u1Byte                  RateSet[5] = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M, MGN_6M};
-
-       if(pDM_Odm->SupportICType != ODM_RTL8812 && pDM_Odm->SupportICType != ODM_RTL8821 )
-               return;
-
-       if(pDM_Odm->bLinked == FALSE)   // unlink Default port information
-               CurStage = 0;   
-       else if(pDM_Odm->RSSI_Min < 40) // link RSSI  < 40%
-               CurStage = 1;
-       else if(pDM_Odm->RSSI_Min > 45) // link RSSI > 45%
-               CurStage = 3;   
-       else
-               CurStage = 2;                                   // link  25% <= RSSI <= 30%
-
-       if(CurStage != Stage)
-       {
-               if(CurStage == 1)
-               {
-                       FillOctetString(osRateSet, RateSet, 5);
-                       FilterSupportRate(pMgntInfo->mBrates, &osRateSet, FALSE);
-                       Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_BASIC_RATE, (pu1Byte)&osRateSet);
-               }
-               else if(CurStage == 3 && (Stage == 1 || Stage == 2))
-               {
-                       Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_BASIC_RATE, (pu1Byte)(&pMgntInfo->mBrates) );
-               }
-       }
-       
-       Stage = CurStage;
-#endif
-}
-
-/*-----------------------------------------------------------------------------
- * Function:   odm_RefreshRateAdaptiveMask()
- *
- * Overview:   Update rate table mask according to rssi
- *
- * Input:              NONE
- *
- * Output:             NONE
- *
- * Return:             NONE
- *
- * Revised History:
- *     When            Who             Remark
- *     05/27/2009      hpfan   Create Version 0.  
- *
- *---------------------------------------------------------------------------*/
-VOID
-odm_RefreshRateAdaptiveMask(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask()---------->\n")); 
-       if (!(pDM_Odm->SupportAbility & ODM_BB_RA_MASK))
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask(): Return cos not supported\n"));
-               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:
-                       odm_RefreshRateAdaptiveMaskMP(pDM_Odm);
-                       break;
-
-               case    ODM_CE:
-                       odm_RefreshRateAdaptiveMaskCE(pDM_Odm);
-                       break;
-
-               case    ODM_AP:
-               case    ODM_ADSL:
-                       odm_RefreshRateAdaptiveMaskAPADSL(pDM_Odm);
-                       break;
-       }
-       
-}
-
-VOID
-odm_RefreshRateAdaptiveMaskMP(
-       IN              PDM_ODM_T               pDM_Odm 
-       )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       PADAPTER                                pAdapter         =  pDM_Odm->Adapter;
-       PADAPTER                                pTargetAdapter = NULL;
-       HAL_DATA_TYPE                   *pHalData = GET_HAL_DATA(pAdapter);
-       PMGNT_INFO                              pMgntInfo = GetDefaultMgntInfo(pAdapter);
-       PODM_RATE_ADAPTIVE              pRA = &pDM_Odm->RateAdaptive;
-
-       if(pAdapter->bDriverStopped)
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));
-               return;
-       }
-
-       if(!pHalData->bUseRAMask)
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));
-               return;
-       }
-
-       // if default port is connected, update RA table for default port (infrastructure mode only)
-       if(pMgntInfo->mAssoc && (!ACTING_AS_AP(pAdapter)))
-       {
-       
-               if(pHalData->UndecoratedSmoothedPWDB < pRA->LdpcThres)
-               {
-                       pRA->bUseLdpc = TRUE;
-                       pRA->bLowerRtsRate = TRUE;
-                       if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))
-                               MgntSet_TX_LDPC(pAdapter,0,TRUE);
-                       //DbgPrint("RSSI=%d, bUseLdpc = TRUE\n", pHalData->UndecoratedSmoothedPWDB);
-               }
-               else if(pHalData->UndecoratedSmoothedPWDB > (pRA->LdpcThres-5))
-               {
-                       pRA->bUseLdpc = FALSE;
-                       pRA->bLowerRtsRate = FALSE;
-                       if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))
-                               MgntSet_TX_LDPC(pAdapter,0,FALSE);
-                       //DbgPrint("RSSI=%d, bUseLdpc = FALSE\n", pHalData->UndecoratedSmoothedPWDB);
-               }
-       
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("odm_RefreshRateAdaptiveMask(): Infrasture Mode\n"));
-               if( ODM_RAStateCheck(pDM_Odm, pHalData->UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pMgntInfo->Ratr_State) )
-               {
-                       ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target AP addr : "), pMgntInfo->Bssid);
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pHalData->UndecoratedSmoothedPWDB, pMgntInfo->Ratr_State));
-                       pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);
-               }
-       }
-
-       //
-       // The following part configure AP/VWifi/IBSS rate adaptive mask.
-       //
-
-       if(pMgntInfo->mIbss)    // Target: AP/IBSS peer.
-               pTargetAdapter = GetDefaultAdapter(pAdapter);
-       else
-               pTargetAdapter = GetFirstAPAdapter(pAdapter);
-
-       // if extension port (softap) is started, updaet RA table for more than one clients associate
-       if(pTargetAdapter != NULL)
-       {
-               int     i;
-               PRT_WLAN_STA    pEntry;
-
-               for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
-               {
-                       pEntry = AsocEntry_EnumStation(pTargetAdapter, i);
-                       if(NULL != pEntry)
-                       {
-                               if(pEntry->bAssociated)
-                               {
-                                       if(ODM_RAStateCheck(pDM_Odm, pEntry->rssi_stat.UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pEntry->Ratr_State) )
-                                       {
-                                               ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pEntry->MacAddr);
-                                               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));
-                                               pAdapter->HalFunc.UpdateHalRAMaskHandler(pTargetAdapter, pEntry->AssociatedMacId, pEntry, pEntry->Ratr_State);
-                                       }
-                               }
-                       }
-               }
-       }
-
-       if(pMgntInfo->bSetTXPowerTrainingByOid)
-               pMgntInfo->bSetTXPowerTrainingByOid = FALSE;    
-#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-}
-
-
-VOID
-odm_RefreshRateAdaptiveMaskCE(
-       IN              PDM_ODM_T               pDM_Odm 
-       )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
-       u1Byte  i;
-       PADAPTER        pAdapter         =  pDM_Odm->Adapter;
-       PODM_RATE_ADAPTIVE              pRA = &pDM_Odm->RateAdaptive;
-
-       if(pAdapter->bDriverStopped)
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));
-               return;
-       }
-
-       if(!pDM_Odm->bUseRAMask)
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));
-               return;
-       }
-
-       //printk("==> %s \n",__FUNCTION__);
-
-       for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++){
-               PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];
-               if(IS_STA_VALID(pstat) ) {
-                       if(IS_MCAST( pstat->hwaddr))  //if(psta->mac_id ==1)
-                                continue;
-                       if(IS_MCAST( pstat->hwaddr))
-                               continue;
-
-                       #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
-                       if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))
-                       {
-                               if(pstat->rssi_stat.UndecoratedSmoothedPWDB < pRA->LdpcThres)
-                               {
-                                       pRA->bUseLdpc = TRUE;
-                                       pRA->bLowerRtsRate = TRUE;
-                                       if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))
-                                               Set_RA_LDPC_8812(pstat, TRUE);
-                                       //DbgPrint("RSSI=%d, bUseLdpc = TRUE\n", pHalData->UndecoratedSmoothedPWDB);
-                               }
-                               else if(pstat->rssi_stat.UndecoratedSmoothedPWDB > (pRA->LdpcThres-5))
-                               {
-                                       pRA->bUseLdpc = FALSE;
-                                       pRA->bLowerRtsRate = FALSE;
-                                       if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))
-                                               Set_RA_LDPC_8812(pstat, FALSE);
-                                       //DbgPrint("RSSI=%d, bUseLdpc = FALSE\n", pHalData->UndecoratedSmoothedPWDB);
-                               }
-                       }
-                       #endif
-
-                       if( TRUE == ODM_RAStateCheck(pDM_Odm, pstat->rssi_stat.UndecoratedSmoothedPWDB, FALSE , &pstat->rssi_level) )
-                       {
-                               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));
-                               //printk("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level);
-                               rtw_hal_update_ra_mask(pstat, pstat->rssi_level);
-                       }
-               
-               }
-       }                       
-       
-#endif
-}
-
-VOID
-odm_RefreshRateAdaptiveMaskAPADSL(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
-       struct rtl8192cd_priv *priv = pDM_Odm->priv;
-       struct stat_info        *pstat;
-
-       if (!priv->pmib->dot11StationConfigEntry.autoRate) 
-               return;
-
-       if (list_empty(&priv->asoc_list))
-               return;
-
-       list_for_each_entry(pstat, &priv->asoc_list, asoc_list) {
-               if(ODM_RAStateCheck(pDM_Odm, (s4Byte)pstat->rssi, FALSE, &pstat->rssi_level) ) {
-                       ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pstat->hwaddr);
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi, pstat->rssi_level));
-
-#ifdef CONFIG_RTL_88E_SUPPORT
-                       if (GET_CHIP_VER(priv)==VERSION_8188E) {
-#ifdef TXREPORT
-                               add_RATid(priv, pstat);
-#endif
-                       } else
-#endif
-                       {
-#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)                 
-                       add_update_RATid(priv, pstat);
-#endif
-                       }
-               }
-       }
-#endif
-}
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-VOID
-ODM_DynamicARFBSelect(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  rate,
-       IN              BOOLEAN                 Collision_State 
-)
-{
-
-       if(pDM_Odm->SupportICType != ODM_RTL8192E)
-               return;
-
-       if (rate >= DESC_RATEMCS8  && rate <= DESC_RATEMCS12){
-               if (Collision_State == 1){
-                       if(rate == DESC_RATEMCS12){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060501);        
-                       }
-                       else if(rate == DESC_RATEMCS11){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07070605);        
-                       }
-                       else if(rate == DESC_RATEMCS10){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080706);        
-                       }
-                       else if(rate == DESC_RATEMCS9){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080707);        
-                       }
-                       else{
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09090808);        
-                       }
-               }
-               else{   // Collision_State == 0
-                       if(rate == DESC_RATEMCS12){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05010000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);        
-                       }
-                       else if(rate == DESC_RATEMCS11){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x06050000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080807);        
-                       }
-                       else if(rate == DESC_RATEMCS10){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07060000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090908);        
-                       }
-                       else if(rate == DESC_RATEMCS9){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07070000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090808);        
-                       }
-                       else{
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x08080000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0b0a0909);        
-                       }
-               }
-       }
-       else{  // MCS13~MCS15,  1SS, G-mode
-               if (Collision_State == 1){
-                       if(rate == DESC_RATEMCS15){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x05040302);        
-                       }
-                       else if(rate == DESC_RATEMCS14){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050302);        
-                       }
-                       else if(rate == DESC_RATEMCS13){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060502);        
-                       }
-                       else{
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050402);        
-                       }
-               }
-               else{   // Collision_State == 0
-                       if(rate == DESC_RATEMCS15){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060504);        
-                       }
-                       else if(rate == DESC_RATEMCS14){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);        
-                       }
-                       else if(rate == DESC_RATEMCS13){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05020000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);        
-                       }
-                       else{
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x04020000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);        
-                       }
-
-
-               }
-
-       }       
-
-}
-
-#endif
-
-// Return Value: BOOLEAN
-// - TRUE: RATRState is changed.
-BOOLEAN 
-ODM_RAStateCheck(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              s4Byte                  RSSI,
-       IN              BOOLEAN                 bForceUpdate,
-       OUT             pu1Byte                 pRATRState
-       )
-{
-       PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive;
-       const u1Byte GoUpGap = 5;
-       u1Byte HighRSSIThreshForRA = pRA->HighRSSIThresh;
-       u1Byte LowRSSIThreshForRA = pRA->LowRSSIThresh;
-       u1Byte RATRState;
-
-       // Threshold Adjustment: 
-       // when RSSI state trends to go up one or two levels, make sure RSSI is high enough.
-       // Here GoUpGap is added to solve the boundary's level alternation issue.
-       switch (*pRATRState)
-       {
-               case DM_RATR_STA_INIT:
-               case DM_RATR_STA_HIGH:
-                       break;
-
-               case DM_RATR_STA_MIDDLE:
-                       HighRSSIThreshForRA += GoUpGap;
-                       break;
-
-               case DM_RATR_STA_LOW:
-                       HighRSSIThreshForRA += GoUpGap;
-                       LowRSSIThreshForRA += GoUpGap;
-                       break;
-
-               default: 
-                       ODM_RT_ASSERT(pDM_Odm, FALSE, ("wrong rssi level setting %d !", *pRATRState) );
-                       break;
-       }
-
-       // Decide RATRState by RSSI.
-       if(RSSI > HighRSSIThreshForRA)
-               RATRState = DM_RATR_STA_HIGH;
-       else if(RSSI > LowRSSIThreshForRA)
-               RATRState = DM_RATR_STA_MIDDLE;
-       else
-               RATRState = DM_RATR_STA_LOW;
-       //printk("==>%s,RATRState:0x%02x ,RSSI:%d \n",__FUNCTION__,RATRState,RSSI);
-
-       if( *pRATRState!=RATRState || bForceUpdate)
-       {
-               ODM_RT_TRACE( pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI Level %d -> %d\n", *pRATRState, RATRState) );
-               *pRATRState = RATRState;
-               return TRUE;
-       }
-
-       return FALSE;
-}
-
-
-//============================================================
-
-//3============================================================
-//3 Dynamic Tx Power
-//3============================================================
-
-VOID 
-odm_DynamicTxPowerInit(
-       IN              PDM_ODM_T               pDM_Odm 
-       )
-{
-#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);
-
-       #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              PDM_ODM_T               pDM_Odm 
-       )
-{      
-       u1Byte          index;
-       u4Byte          Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
-       
-#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
-}
-
-VOID
-odm_DynamicTxPowerRestorePowerIndex(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       u1Byte                  index;
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-
-#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
-       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      PDM_ODM_T       pDM_Odm, 
-       IN      u1Byte          Value)
-{
-
-       u1Byte                  index;
-       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              PDM_ODM_T               pDM_Odm
-       )
-{
-       // 
-       // For AP/ADSL use prtl8192cd_priv
-       // For CE/NIC use PADAPTER
-       //
-       //PADAPTER              pAdapter = pDM_Odm->Adapter;
-//     prtl8192cd_priv priv            = pDM_Odm->priv;
-
-       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              PDM_ODM_T               pDM_Odm
-       )
-{      
-       if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
-               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              PDM_ODM_T               pDM_Odm
-
-       )
-{      
-#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
-       prtl8192cd_priv priv            = pDM_Odm->priv;
-       s4Byte i;
-
-       if(!priv->pshare->rf_ft_var.tx_pwr_ctrl)
-               return;
-       
-#ifdef HIGH_POWER_EXT_PA
-       if(pDM_Odm->ExtPA)
-               tx_power_control(priv);
-#endif         
-
-       /*
-        *      Check if station is near by to use lower tx power
-        */
-
-       if ((priv->up_time % 3) == 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 ((pstat->hp_level == 0) && (pstat->rssi > TX_POWER_NEAR_FIELD_THRESH_AP+4))
-                                       pstat->hp_level = 1;
-                               else if ((pstat->hp_level == 1) && (pstat->rssi < TX_POWER_NEAR_FIELD_THRESH_AP))
-                                       pstat->hp_level = 0;
-                       }
-               }
-       }
-
-#endif 
-}
-
-
-VOID 
-odm_DynamicTxPower_92C(
-       IN      PDM_ODM_T       pDM_Odm
-       )
-{
-#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,COMP_HIPWR, 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,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
-                               break;
-                       case 2:
-                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
-                               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_70\n"));
-                               break;
-                       case 3:
-                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
-                               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_50\n"));
-                               break;
-                       case 4:
-                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
-                               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_35\n"));
-                               break;
-                       case 5:
-                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
-                               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_15\n"));
-                               break;
-                       default:
-                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
-                               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
-                               break;
-               }               
-       }
-       else
-#endif         
-       { 
-               if(     (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
-                       (pHalData->DMFlag & HAL_DM_HIPWR_DISABLE) ||
-                       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,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
-                               }
-                               else
-                               {
-                                       UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
-                                       ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
-                               }
-                       }
-                       else // associated entry pwdb
-                       {       
-                               UndecoratedSmoothedPWDB = pHalData->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)
-                       {
-                               pHalData->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) )
-                       {
-                               pHalData->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))
-                       {
-                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-                               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
-                       }
-               }
-       }
-       if( pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl )
-       {
-               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, 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      PDM_ODM_T       pDM_Odm
-       )
-{
-#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;
-
-       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) ||
-               (pHalData->DMFlag & HAL_DM_HIPWR_DISABLE) ||
-               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,COMP_HIPWR, 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,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
-               }
-               else
-               {
-                       UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
-                       ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
-               }
-       }
-       else // associated entry pwdb
-       {       
-               UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
-               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, 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,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
-               }
-               else if((UndecoratedSmoothedPWDB <0x33) &&
-                       (UndecoratedSmoothedPWDB >= 0x2b) )
-               {
-                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
-                       ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
-               }
-               else if(UndecoratedSmoothedPWDB < 0x2b)
-               {
-                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-                       ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
-               }
-
-       }
-       else
-       
-       {
-               if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
-               {
-                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
-                       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) )
-               {
-                       pHalData->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))
-               {
-                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-                       ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
-               }
-
-       }
-
-//sherry  delete flag 20110517
-       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_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
-                       pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
-                       Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = FALSE;
-               }                                               
-       }
-
-       if( (pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl) )
-       {
-                       ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
-                       if(Adapter->DualMacSmartConcurrent == TRUE)
-                       {
-                               if(BuddyAdapter == NULL)
-                               {
-                                       ODM_RT_TRACE(pDM_Odm,COMP_MLME,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,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_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
-                                                       }
-                                               }
-                                       }
-                                       else
-                                       {
-                                               ODM_RT_TRACE(pDM_Odm,COMP_MLME,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)
-
-}
-
-
-//3============================================================
-//3 RSSI Monitor
-//3============================================================
-
-VOID
-odm_RSSIDumpToRegister(
-       IN      PDM_ODM_T       pDM_Odm
-       )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-
-       if(pDM_Odm->SupportICType == ODM_RTL8812)
-       {
-               PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[0]);
-               PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[1]);
-
-               // Rx EVM
-               PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[0]);
-               PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[1]);
-
-               // Rx SNR
-               PlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));
-               PlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));
-
-               // Rx Cfo_Short
-               PlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[0]);
-               PlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[1]);
-
-               // Rx Cfo_Tail
-               PlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[0]);
-               PlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[1]);
-       }
-       else if(pDM_Odm->SupportICType == ODM_RTL8192E)
-       {
-               PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[0]);
-               PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[1]);
-               // Rx EVM
-               PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[0]);
-               PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[1]);
-               // Rx SNR
-               PlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));
-               PlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));
-               // Rx Cfo_Short
-               PlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[0]);
-               PlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[1]);
-               // Rx Cfo_Tail
-               PlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[0]);
-               PlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[1]);
-        }
-#endif
-}
-
-
-VOID
-odm_RSSIMonitorInit(
-       IN      PDM_ODM_T       pDM_Odm
-       )
-{
-       pRA_T           pRA_Table = &pDM_Odm->DM_RA_Table;
-
-       pRA_Table->firstconnect = FALSE;
-
-}
-
-VOID
-odm_RSSIMonitorCheck(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       // 
-       // For AP/ADSL use prtl8192cd_priv
-       // For CE/NIC use PADAPTER
-       //
-
-       if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
-               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:
-                       odm_RSSIMonitorCheckMP(pDM_Odm);
-                       break;
-
-               case    ODM_CE:
-                       odm_RSSIMonitorCheckCE(pDM_Odm);
-                       break;
-
-               case    ODM_AP:
-                       odm_RSSIMonitorCheckAP(pDM_Odm);
-                       break;          
-
-               case    ODM_ADSL:
-                       //odm_DIGAP(pDM_Odm);
-                       break;  
-       }
-       
-}      // odm_RSSIMonitorCheck
-
-
-VOID
-odm_RSSIMonitorCheckMP(
-       IN      PDM_ODM_T       pDM_Odm
-       )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       PRT_WLAN_STA    pEntry;
-       u1Byte                  i;
-       s4Byte                  tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff;
-       u1Byte                  H2C_Parameter[4] ={0};
-       PMGNT_INFO              pMgntInfo = &Adapter->MgntInfo;
-       u8Byte                  curTxOkCnt = 0, curRxOkCnt = 0; 
-       u1Byte                  STBC_TX = 0;
-       BOOLEAN                 FirstConnect;                                                    
-       pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;      
-#if (BEAMFORMING_SUPPORT == 1) 
-       BEAMFORMING_CAP Beamform_cap = BEAMFORMING_CAP_NONE;
-       u1Byte                  TxBF_EN = 0;
-#endif
-
-       RT_DISP(FDM, DM_PWDB, ("pHalData->UndecoratedSmoothedPWDB = 0x%x( %d)\n", 
-               pHalData->UndecoratedSmoothedPWDB,
-               pHalData->UndecoratedSmoothedPWDB));
-
-       curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;
-       curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;
-       pMgntInfo->lastTxOkCnt = curTxOkCnt;
-       pMgntInfo->lastRxOkCnt = curRxOkCnt;
-
-       RT_DISP(FDM, DM_PWDB, ("Tx = %d Rx = %d\n", curTxOkCnt, curRxOkCnt));
-
-       FirstConnect = (pHalData->bLinked) && (pRA_Table->firstconnect == FALSE);    
-       pRA_Table->firstconnect = pHalData->bLinked;                                               
-       H2C_Parameter[3] |= FirstConnect << 5;
-
-       if(pDM_Odm->SupportICType == ODM_RTL8188E && (pMgntInfo->CustomerID==RT_CID_819x_HP))
-       {
-               if(curRxOkCnt >(curTxOkCnt*6))
-                       PlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0x8f015);
-               else
-                       PlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0xff015);
-       }       
-
-       if(pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821)
-       {
-               if(curRxOkCnt >(curTxOkCnt*6))
-                       H2C_Parameter[3]=0x01;
-               else
-                       H2C_Parameter[3]=0x00;
-       }
-
-       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_DISP_ADDR(FDM, DM_PWDB, ("pEntry->MacAddr ="), pEntry->MacAddr);
-                               RT_DISP(FDM, DM_PWDB, ("pEntry->rssi = 0x%x(%d)\n", 
-                                       pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->rssi_stat.UndecoratedSmoothedPWDB));
-
-                               if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812)
-                               {
-
-#if (BEAMFORMING_SUPPORT == 1)
-                                       Beamform_cap = Beamforming_GetEntryBeamCapByMacId(pMgntInfo, pEntry->AssociatedMacId);
-                                       if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))
-                                               TxBF_EN = 1;
-                                       else
-                                               TxBF_EN = 0;
-       
-                                       H2C_Parameter[3] |= TxBF_EN << 6; 
-                                       
-                                       if(TxBF_EN)
-                                               STBC_TX = 0;
-                                       else
-#endif
-                                       {
-                                               if(IS_WIRELESS_MODE_AC(Adapter))
-                                                       STBC_TX = TEST_FLAG(pEntry->VHTInfo.STBC, STBC_VHT_ENABLE_TX);
-                                               else
-                                                       STBC_TX = TEST_FLAG(pEntry->HTInfo.STBC, STBC_HT_ENABLE_TX);
-                                       }
-
-                                       H2C_Parameter[3] |= STBC_TX << 1;
-                               }
-
-                               if(pEntry->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
-                                       tmpEntryMinPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;
-                               if(pEntry->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
-                                       tmpEntryMaxPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;
-
-                               H2C_Parameter[2] = (u1Byte)(pEntry->rssi_stat.UndecoratedSmoothedPWDB & 0xFF);
-                               H2C_Parameter[1] = 0x20;   // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1
-                               H2C_Parameter[0] = (pEntry->AssociatedMacId);
-                               if(pDM_Odm->SupportICType == ODM_RTL8812)
-                                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);
-                               else if(pDM_Odm->SupportICType == ODM_RTL8192E)
-                                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);
-                               else    
-                                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter);
-                       }
-               }
-               else
-               {
-                       break;
-               }
-       }
-
-       if(tmpEntryMaxPWDB != 0)        // If associated entry is found
-       {
-               pHalData->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;
-               RT_DISP(FDM, DM_PWDB, ("EntryMaxPWDB = 0x%x(%d)\n",     tmpEntryMaxPWDB, tmpEntryMaxPWDB));
-       }
-       else
-       {
-               pHalData->EntryMaxUndecoratedSmoothedPWDB = 0;
-       }
-       
-       if(tmpEntryMinPWDB != 0xff) // If associated entry is found
-       {
-               pHalData->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;
-               RT_DISP(FDM, DM_PWDB, ("EntryMinPWDB = 0x%x(%d)\n", tmpEntryMinPWDB, tmpEntryMinPWDB));
-
-       }
-       else
-       {
-               pHalData->EntryMinUndecoratedSmoothedPWDB = 0;
-       }
-
-       // Indicate Rx signal strength to FW.
-       if(pHalData->bUseRAMask)
-       {
-               if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812)
-               {
-                       PRT_HIGH_THROUGHPUT             pHTInfo = GET_HT_INFO(pMgntInfo);
-                       PRT_VERY_HIGH_THROUGHPUT        pVHTInfo = GET_VHT_INFO(pMgntInfo);
-
-#if (BEAMFORMING_SUPPORT == 1)
-                       
-                       Beamform_cap = Beamforming_GetEntryBeamCapByMacId(pMgntInfo, pMgntInfo->mMacId);
-
-                       if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))
-                               TxBF_EN = 1;
-                       else
-                               TxBF_EN = 0;
-
-                       H2C_Parameter[3] |= TxBF_EN << 6; 
-
-                       if(TxBF_EN)
-                               STBC_TX = 0;
-                       else
-#endif
-                       {
-                               if(IS_WIRELESS_MODE_AC(Adapter))
-                                       STBC_TX = TEST_FLAG(pVHTInfo->VhtCurStbc, STBC_VHT_ENABLE_TX);
-                               else
-                                       STBC_TX = TEST_FLAG(pHTInfo->HtCurStbc, STBC_HT_ENABLE_TX);
-                       }
-
-                       H2C_Parameter[3] |= STBC_TX << 1;
-               }
-               
-               H2C_Parameter[2] = (u1Byte)(pHalData->UndecoratedSmoothedPWDB & 0xFF);
-               H2C_Parameter[1] = 0x20;        // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1
-               H2C_Parameter[0] = 0;           // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1
-               if(pDM_Odm->SupportICType == ODM_RTL8812)
-                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);
-               else  if(pDM_Odm->SupportICType == ODM_RTL8192E)
-                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter); 
-               else    
-                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter);
-       }
-       else
-       {
-               PlatformEFIOWrite1Byte(Adapter, 0x4fe, (u1Byte)pHalData->UndecoratedSmoothedPWDB);
-       }
-
-       if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8192E))
-               odm_RSSIDumpToRegister(pDM_Odm);
-
-       odm_FindMinimumRSSI(Adapter);
-       ODM_CmnInfoUpdate(&pHalData->DM_OutSrc ,ODM_CMNINFO_LINK, (u8Byte)pHalData->bLinked);
-       ODM_CmnInfoUpdate(&pHalData->DM_OutSrc ,ODM_CMNINFO_RSSI_MIN, (u8Byte)pHalData->MinUndecoratedPWDBForDM);
-#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-}
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
-//
-//sherry move from DUSC to here 20110517
-//
-static VOID
-FindMinimumRSSI_Dmsp(
-       IN      PADAPTER        pAdapter
-)
-{
-#if 0
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
-       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
-       s32     Rssi_val_min_back_for_mac0;
-       BOOLEAN         bGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(pAdapter);
-       BOOLEAN         bRestoreRssi = _FALSE;
-       PADAPTER        BuddyAdapter = pAdapter->BuddyAdapter;
-
-       if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
-       {
-               if(BuddyAdapter!= NULL)
-               {
-                       if(pHalData->bSlaveOfDMSP)
-                       {
-                               //ODM_RT_TRACE(pDM_Odm,COMP_EASY_CONCURRENT,DBG_LOUD,("bSlavecase of dmsp\n"));
-                               BuddyAdapter->DualMacDMSPControl.RssiValMinForAnotherMacOfDMSP = pdmpriv->MinUndecoratedPWDBForDM;
-                       }
-                       else
-                       {
-                               if(bGetValueFromBuddyAdapter)
-                               {
-                                       //ODM_RT_TRACE(pDM_Odm,COMP_EASY_CONCURRENT,DBG_LOUD,("get new RSSI\n"));
-                                       bRestoreRssi = _TRUE;
-                                       Rssi_val_min_back_for_mac0 = pdmpriv->MinUndecoratedPWDBForDM;
-                                       pdmpriv->MinUndecoratedPWDBForDM = pAdapter->DualMacDMSPControl.RssiValMinForAnotherMacOfDMSP;
-                               }
-                       }
-               }
-               
-       }
-
-       if(bRestoreRssi)
-       {
-               bRestoreRssi = _FALSE;
-               pdmpriv->MinUndecoratedPWDBForDM = Rssi_val_min_back_for_mac0;
-       }
-#endif
-}
-
-static void
-FindMinimumRSSI(
-IN     PADAPTER        pAdapter
-       )
-{      
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
-       struct dm_priv  *pdmpriv = &pHalData->dmpriv;   
-       PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);
-
-       //1 1.Determine the minimum RSSI 
-
-       if((pDM_Odm->bLinked != _TRUE) &&
-               (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
-       {
-               pdmpriv->MinUndecoratedPWDBForDM = 0;
-               //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any \n"));
-       }
-       else
-       {
-               pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
-       }
-
-       //DBG_8192C("%s=>MinUndecoratedPWDBForDM(%d)\n",__FUNCTION__,pdmpriv->MinUndecoratedPWDBForDM);
-       //ODM_RT_TRACE(pDM_Odm,COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n",pHalData->MinUndecoratedPWDBForDM));
-}
-#endif
-
-VOID
-odm_RSSIMonitorCheckCE(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-#if (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;
-       struct dvobj_priv       *pdvobjpriv = adapter_to_dvobj(Adapter);
-       int     i;
-       int     tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff;
-       u8      sta_cnt=0;
-       u32     UL_DL_STATE = 0, STBC_TX = 0, TxBF_EN = 0;
-       u32     PWDB_rssi[NUM_STA]={0};//[0~15]:MACID, [16~31]:PWDB_rssi
-       BOOLEAN                 FirstConnect = FALSE;
-       pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;
-
-       if(pDM_Odm->bLinked != _TRUE)
-               return;
-
-       #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
-       if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))
-       {
-               u64     curTxOkCnt = pdvobjpriv->traffic_stat.cur_tx_bytes;
-               u64     curRxOkCnt = pdvobjpriv->traffic_stat.cur_rx_bytes;
-
-               if(curRxOkCnt >(curTxOkCnt*6))
-                       UL_DL_STATE = 1;
-               else
-                       UL_DL_STATE = 0;
-       }
-       #endif
-
-       FirstConnect = (pDM_Odm->bLinked) && (pRA_Table->firstconnect == FALSE);    
-       pRA_Table->firstconnect = pDM_Odm->bLinked;
-
-       //if(check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)
-       {
-               #if 1
-               struct sta_info *psta;
-               
-               for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {
-                       if (IS_STA_VALID(psta = pDM_Odm->pODM_StaInfo[i]))
-                       {
-                                       if(IS_MCAST( psta->hwaddr))  //if(psta->mac_id ==1)
-                                                continue;
-                                                               
-                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB == (-1))
-                                                continue;
-                                                               
-                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
-                                               tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
-
-                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
-                                               tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
-
-                                       #if 0
-                                       DBG_871X("%s mac_id:%u, mac:"MAC_FMT", rssi:%d\n", __func__,
-                                               psta->mac_id, MAC_ARG(psta->hwaddr), psta->rssi_stat.UndecoratedSmoothedPWDB);
-                                       #endif
-
-                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)) {
-
-#ifdef CONFIG_80211N_HT
-                                               if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812)
-                                               {
-#ifdef CONFIG_BEAMFORMING
-                                                       BEAMFORMING_CAP Beamform_cap = beamforming_get_entry_beam_cap_by_mac_id(&Adapter->mlmepriv, psta->mac_id);
-
-                                                       if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))
-                                                               TxBF_EN = 1;
-                                                       else
-                                                               TxBF_EN = 0;
-
-                                                       if (TxBF_EN) {
-                                                               STBC_TX = 0;
-                                                       }
-                                                       else
-#endif
-                                                       {
-#ifdef CONFIG_80211AC_VHT
-                                                               if(IsSupportedVHT(psta->wireless_mode))
-                                                                       STBC_TX = TEST_FLAG(psta->vhtpriv.stbc_cap, STBC_VHT_ENABLE_TX);
-                                                               else    
-#endif
-                                                                       STBC_TX = TEST_FLAG(psta->htpriv.stbc_cap, STBC_HT_ENABLE_TX);
-                                                       }
-                                               }
-#endif
-
-                                               if(pDM_Odm->SupportICType == ODM_RTL8192D)
-                                                       PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) | ((Adapter->stapriv.asoc_sta_count+1) << 8));
-                                               else if ((pDM_Odm->SupportICType == ODM_RTL8192E)||(pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))
-                                                       PWDB_rssi[sta_cnt++] = (((u8)(psta->mac_id&0xFF)) | ((psta->rssi_stat.UndecoratedSmoothedPWDB&0x7F)<<16) |(STBC_TX << 25) | (FirstConnect << 29) | (TxBF_EN << 30));
-                                               else
-                                                       PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );
-                                       }
-                       }
-               }
-               #else
-               _irqL irqL;
-               _list   *plist, *phead;
-               struct sta_info *psta;
-               struct sta_priv *pstapriv = &Adapter->stapriv;
-               u8 bcast_addr[ETH_ALEN]= {0xff,0xff,0xff,0xff,0xff,0xff};
-
-               _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
-
-               for(i=0; i< NUM_STA; i++)
-               {
-                       phead = &(pstapriv->sta_hash[i]);
-                       plist = get_next(phead);
-               
-                       while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
-                       {
-                               psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
-
-                               plist = get_next(plist);
-
-                               if(_rtw_memcmp(psta->hwaddr, bcast_addr, ETH_ALEN) || 
-                                       _rtw_memcmp(psta->hwaddr, myid(&Adapter->eeprompriv), ETH_ALEN))
-                                       continue;
-
-                               if(psta->state & WIFI_ASOC_STATE)
-                               {
-                                       
-                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
-                                               tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
-
-                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
-                                               tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
-
-                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)){
-                                               //printk("%s==> mac_id(%d),rssi(%d)\n",__FUNCTION__,psta->mac_id,psta->rssi_stat.UndecoratedSmoothedPWDB);
-                                               #if(RTL8192D_SUPPORT==1)
-                                               PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) | ((Adapter->stapriv.asoc_sta_count+1) << 8));
-                                               #else
-                                               PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );
-                                               #endif
-                                       }
-                               }
-                       
-                       }
-
-               }
-       
-               _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
-               #endif
-
-               //printk("%s==> sta_cnt(%d)\n",__FUNCTION__,sta_cnt);
-
-               for(i=0; i< sta_cnt; i++)
-               {
-                       if(PWDB_rssi[i] != (0)){
-                               if(pHalData->fw_ractrl == _TRUE)// Report every sta's RSSI to FW
-                               {
-                                       #if(RTL8192D_SUPPORT==1)
-                                       if(pDM_Odm->SupportICType == ODM_RTL8192D){
-                                               FillH2CCmd92D(Adapter, H2C_RSSI_REPORT, 3, (u8 *)(&PWDB_rssi[i]));              
-                                       }
-                                       #endif
-                                       
-                                       #if((RTL8192C_SUPPORT==1)||(RTL8723A_SUPPORT==1))
-                                       if((pDM_Odm->SupportICType == ODM_RTL8192C)||(pDM_Odm->SupportICType == ODM_RTL8723A)){
-                                               rtl8192c_set_rssi_cmd(Adapter, (u8*)&PWDB_rssi[i]);
-                                       }
-                                       #endif
-                                       
-                                       #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
-                                       if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821)){   
-                                               PWDB_rssi[i] |= (UL_DL_STATE << 24);
-                                               rtl8812_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));
-                                       }
-                                       #endif
-                                       #if(RTL8192E_SUPPORT==1)
-                                       if(pDM_Odm->SupportICType == ODM_RTL8192E){
-                                               rtl8192e_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));
-                                       }
-                                       #endif
-                                       #if(RTL8723B_SUPPORT==1)
-                                       if(pDM_Odm->SupportICType == ODM_RTL8723B){
-                                               rtl8723b_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));
-                                       }
-                                       #endif
-                               }
-                               else{
-                                       #if((RTL8188E_SUPPORT==1)&&(RATE_ADAPTIVE_SUPPORT == 1))
-                                       if(pDM_Odm->SupportICType == ODM_RTL8188E){
-                                               ODM_RA_SetRSSI_8188E(
-                                               &(pHalData->odmpriv), (PWDB_rssi[i]&0xFF), (u8)((PWDB_rssi[i]>>16) & 0xFF));
-                                       }
-                                       #endif
-                               }
-                       }
-               }               
-       }
-
-
-
-       if(tmpEntryMaxPWDB != 0)        // If associated entry is found
-       {
-               pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;             
-       }
-       else
-       {
-               pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0;
-       }
-
-       if(tmpEntryMinPWDB != 0xff) // If associated entry is found
-       {
-               pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;             
-       }
-       else
-       {
-               pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0;
-       }
-
-       FindMinimumRSSI(Adapter);//get pdmpriv->MinUndecoratedPWDBForDM
-
-       #if(RTL8192D_SUPPORT==1)
-       FindMinimumRSSI_Dmsp(Adapter);
-       #endif
-       pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;
-       //ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);
-#endif//if (DM_ODM_SUPPORT_TYPE == ODM_CE)
-}
-VOID
-odm_RSSIMonitorCheckAP(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
-#ifdef CONFIG_RTL_92C_SUPPORT || defined(CONFIG_RTL_92D_SUPPORT)
-
-       u4Byte i;
-       PSTA_INFO_T pstat;
-
-       for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
-       {
-               pstat = pDM_Odm->pODM_StaInfo[i];
-               if(IS_STA_VALID(pstat) )
-               {                       
-#ifdef STA_EXT
-                       if (REMAP_AID(pstat) < (FW_NUM_STAT - 1))
-#endif
-                               add_update_rssi(pDM_Odm->priv, pstat);
-
-               }               
-       }
-#endif
-#endif
-
-}
-
-
-
-VOID
-ODM_InitAllTimers(
-       IN PDM_ODM_T    pDM_Odm 
-       )
-{
-#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
-#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)
-       ODM_InitializeTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B,
-       (RT_TIMER_CALL_BACK)ODM_SW_AntDiv_Callback, NULL, "SwAntennaSwitchTimer_8723B");
-#endif
-#endif
-
-#if(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_CE))
-#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
-#if (RTL8188E_SUPPORT == 1)
-       ODM_InitializeTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer,
-               (RT_TIMER_CALL_BACK)odm_FastAntTrainingCallback, NULL, "FastAntTrainingTimer");
-#endif
-#endif
-#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))
-#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)
-       ODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B);
-#endif
-#endif
-
-#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
-       ODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);
-#endif
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-
-#if (RTL8188E_SUPPORT == 1)
-       ODM_CancelTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer);
-#endif
-       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))
-#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)
-       ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B);
-#endif
-#endif
-
-#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
-       ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);
-#endif
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-
-#if (RTL8188E_SUPPORT == 1)
-       ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer);
-#endif
-
-       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(!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(Adapter, FALSE);
-               }
-       }
-       else
-               pDM_Odm->LinkedInterval = 0;
-#endif
-}
-
-
-VOID
-odm_TXPowerTrackingInit(
-       IN      PDM_ODM_T       pDM_Odm 
-       )
-{
-       odm_TXPowerTrackingThermalMeterInit(pDM_Odm);
-}      
-
-u1Byte 
-getSwingIndex(
-       IN      PDM_ODM_T       pDM_Odm 
-       )
-{
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-       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      PDM_ODM_T       pDM_Odm 
-       )
-{
-       u1Byte defaultSwingIndex = getSwingIndex(pDM_Odm);
-       u1Byte                  p = 0;
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-
-       #if     MP_DRIVER != 1                                  //for mp driver, turn off txpwrtracking as default
-       pHalData->TxPowerTrackControl = TRUE;           
-       #endif
-#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   (MP_DRIVER != 1)                //for mp driver, turn off txpwrtracking as default
-               if ( *(pDM_Odm->mp_mode) != 1)
-                       pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;
-               //#endif//#if   (MP_DRIVER != 1)
-               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) != 1)
-                       pdmpriv->TxPowerTrackControl = _TRUE;
-               //#endif//#if   (MP_DRIVER != 1)
-
-               //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              PDM_ODM_T               pDM_Odm
-       )
-{
-       //
-       // 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:
-                       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              PDM_ODM_T               pDM_Odm 
-       )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
-       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              PDM_ODM_T               pDM_Odm 
-       )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       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              PDM_ODM_T               pDM_Odm
-       )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
-       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 
-
-}
-
-
-
-//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)
-
-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
-}
-
-// 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============================================================
-#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
-VOID
-odm_SwAntDivInit(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
-       odm_SwAntDivInit_NIC(pDM_Odm);
-#elif(DM_ODM_SUPPORT_TYPE == ODM_AP)
-       dm_SW_AntennaSwitchInit(pDM_Odm->priv);
-#endif
-}
-
-VOID
-odm_SwAntDivInit_NIC(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-
-
-// Init SW ANT DIV mechanism for 8723AE/AU/AS
-// Neil Chen--2012--07--17---
-// CE/AP/ADSL no using SW ANT DIV for 8723A Series IC
-//#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
-#if (RTL8723A_SUPPORT==1) 
-       if(pDM_Odm->SupportICType == ODM_RTL8723A)
-       {
-               odm_SwAntDivInit_NIC_8723A(pDM_Odm);    
-       }       
-#endif
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS:Init SW Antenna Switch\n"));
-       pDM_SWAT_Table->RSSI_sum_A = 0;
-       pDM_SWAT_Table->RSSI_cnt_A = 0;
-       pDM_SWAT_Table->RSSI_sum_B = 0;
-       pDM_SWAT_Table->RSSI_cnt_B = 0;
-       pDM_SWAT_Table->CurAntenna = MAIN_ANT;
-       pDM_SWAT_Table->PreAntenna = MAIN_ANT;
-       pDM_SWAT_Table->try_flag = 0xff;
-       pDM_SWAT_Table->PreRSSI = 0;
-       pDM_SWAT_Table->SWAS_NoLink_State = 0;
-       pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
-       pDM_SWAT_Table->SelectAntennaMap=0xAA;
-       pDM_SWAT_Table->lastTxOkCnt = 0;
-       pDM_SWAT_Table->lastRxOkCnt = 0;
-       pDM_SWAT_Table->TXByteCnt_A = 0;
-       pDM_SWAT_Table->TXByteCnt_B = 0;
-       pDM_SWAT_Table->RXByteCnt_A = 0;
-       pDM_SWAT_Table->RXByteCnt_B = 0;
-       pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
-       pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ODM_Read4Byte(pDM_Odm, 0x860);
-       
-}
-
-//
-// 20100514 Joseph: 
-// Add new function to reset the state of antenna diversity before link.
-//
-VOID
-ODM_SwAntDivResetBeforeLink(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-
-       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-
-       pDM_SWAT_Table->SWAS_NoLink_State = 0;
-
-}
-
-//
-// 20100514 Luke/Joseph:
-// Add new function to reset antenna diversity state after link.
-//
-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;
-               }
-
-       }
-}
-
-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;
-}
-
-VOID
-ODM_SwAntDivChkPerPktRssi(
-       IN PDM_ODM_T    pDM_Odm,
-       IN u1Byte               StationID,
-       IN PODM_PHY_INFO_T pPhyInfo
-       )
-{      
-       SWAT_T          *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-       
-       if(!(pDM_Odm->SupportAbility & (ODM_BB_ANT_DIV)))
-               return;
-
-// temporary Fix 8723A MP SW ANT DIV Bug --NeilChen--2012--07--11
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
-       if(pDM_Odm->SupportICType == ODM_RTL8723A)
-       {
-               //if(StationID == pDM_SWAT_Table->RSSI_target)
-               //{
-               //1 RSSI for SW Antenna Switch
-               if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
-               {
-                       pDM_SWAT_Table->RSSI_sum_A += pPhyInfo->RxPWDBAll;
-                       pDM_SWAT_Table->RSSI_cnt_A++;
-               }
-               else
-               {
-                       pDM_SWAT_Table->RSSI_sum_B += pPhyInfo->RxPWDBAll;
-                       pDM_SWAT_Table->RSSI_cnt_B++;
-
-               }
-               //}
-       }
-       else
-       {
-               if(StationID == pDM_SWAT_Table->RSSI_target)
-               {
-                       //1 RSSI for SW Antenna Switch
-                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
-                       {
-                               pDM_SWAT_Table->RSSI_sum_A += pPhyInfo->RxPWDBAll;
-                               pDM_SWAT_Table->RSSI_cnt_A++;
-                       }
-                       else
-                       {
-                               pDM_SWAT_Table->RSSI_sum_B += pPhyInfo->RxPWDBAll;
-                               pDM_SWAT_Table->RSSI_cnt_B++;
-
-                       }
-               }
-       }
-#else  
-       if(StationID == pDM_SWAT_Table->RSSI_target)
-       {
-               //1 RSSI for SW Antenna Switch
-               if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
-               {
-                       pDM_SWAT_Table->RSSI_sum_A += pPhyInfo->RxPWDBAll;
-                       pDM_SWAT_Table->RSSI_cnt_A++;
-               }
-               else
-               {
-                       pDM_SWAT_Table->RSSI_sum_B += pPhyInfo->RxPWDBAll;
-                       pDM_SWAT_Table->RSSI_cnt_B++;
-
-               }
-       }
-#endif
-}
-
-//
-VOID
-odm_SwAntDivChkAntSwitch(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  Step
-       )
-{
-       // 
-       // For AP/ADSL use prtl8192cd_priv
-       // For CE/NIC use PADAPTER
-       //
-       prtl8192cd_priv priv            = pDM_Odm->priv;
-
-       //
-       // 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:        
-                       odm_SwAntDivChkAntSwitchNIC(pDM_Odm, Step);
-                       break;
-               case    ODM_CE:
-                       odm_SwAntDivChkAntSwitchNIC(pDM_Odm, Step);
-                       break;
-
-               case    ODM_AP:
-               case    ODM_ADSL:
-#if (DM_ODM_SUPPORT_TYPE & (ODM_AP |ODM_ADSL))
-                       if (priv->pshare->rf_ft_var.antSw_enable && (priv->up_time % 4==1))
-                               dm_SW_AntennaSwitch(priv, SWAW_STEP_PEAK);
-#endif         
-                       break;                  
-       }
-
-}
-
-//
-// 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.
-
-
-VOID
-ODM_SetAntenna(
-       IN      PDM_ODM_T       pDM_Odm,
-       IN      u1Byte          Antenna)
-{
-       ODM_SetBBReg(pDM_Odm, 0x860, BIT8|BIT9, Antenna); 
-}
-
-VOID
-odm_SwAntDivChkAntSwitchNIC(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte          Step
-       )
-{
-#if ((RTL8192C_SUPPORT==1)||(RTL8723A_SUPPORT==1))
-       //PMGNT_INFO            pMgntInfo = &(Adapter->MgntInfo);
-       //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
-       PADAPTER                Adapter=pDM_Odm->Adapter;
-#endif
-
-       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=0, curRxOkCnt=0;
-       //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;       //A: Main; B: AUX
-       u1Byte                  i;
-
-       if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
-               return;
-
-       if (pDM_Odm->SupportICType & (ODM_RTL8192D|ODM_RTL8188E))
-               return;
-
-       if((pDM_Odm->SupportICType == ODM_RTL8192C) &&(pDM_Odm->RFType == ODM_2T2R))
-               return;
-
-       if(pDM_Odm->SupportPlatform & ODM_WIN)
-       {
-               if(*(pDM_Odm->pAntennaTest))
-                       return;
-       }
-
-       if((pDM_SWAT_Table->ANTA_ON == FALSE) ||(pDM_SWAT_Table->ANTB_ON == FALSE))
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
-                               ("odm_SwAntDivChkAntSwitch(): No AntDiv Mechanism, Antenna A or B is off\n"));
-               return;
-       }
-
-       // Radio off: Status reset to default and return.
-       if(*(pDM_Odm->pbPowerSaving)==TRUE) //pHalData->eRFPowerState==eRfOff
-       {
-               ODM_SwAntDivRestAfterLink(pDM_Odm);
-               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(pDM_Odm);
-       }
-
-#if  (DM_ODM_SUPPORT_TYPE &( ODM_WIN| ODM_CE ))
-
-       if(pDM_SWAT_Table->try_flag == 0xff)
-       {
-               pDM_SWAT_Table->RSSI_target = 0xff;
-               
-               #if(DM_ODM_SUPPORT_TYPE & ODM_CE)
-               {
-                       u1Byte                  index = 0;
-                       PSTA_INFO_T             pEntry = NULL;
-                       
-                       
-                       for(index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
-                       {                                       
-                               pEntry =  pDM_Odm->pODM_StaInfo[index];
-                               if(IS_STA_VALID(pEntry) ) {
-                                       break;
-                               }
-                       }
-                       if(pEntry == NULL)
-                       {
-                               ODM_SwAntDivRestAfterLink(pDM_Odm);
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
-                               return;
-                       }
-                       else
-                       {
-                               pDM_SWAT_Table->RSSI_target = index;
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
-                       }
-                }
-               #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN) 
-               {
-                       PADAPTER        pAdapter         =  pDM_Odm->Adapter;
-                       PMGNT_INFO      pMgntInfo=&pAdapter->MgntInfo;
-                       
-                       // Select RSSI checking target
-                       if(pMgntInfo->mAssoc && !ACTING_AS_AP(pAdapter))
-                       {
-                               // Target: Infrastructure mode AP.
-                               //pDM_SWAT_Table->RSSI_target = NULL;
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("odm_SwAntDivChkAntSwitch(): RSSI_target is DEF AP!\n"));
-                       }
-                       else
-                       {
-                               u1Byte                  index = 0;
-                               PSTA_INFO_T             pEntry = NULL;
-                               PADAPTER                pTargetAdapter = NULL;
-                       
-                               if(pMgntInfo->mIbss )
-                               {
-                                       // Target: AP/IBSS peer.
-                                       pTargetAdapter = pAdapter;
-                               }
-                               else
-                               {
-                                       pTargetAdapter = GetFirstAPAdapter(pAdapter);
-                               }
-
-                               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_SwAntDivRestAfterLink(pDM_Odm);
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
-                                       return;
-                               }
-                               else
-                               {
-                                       //pDM_SWAT_Table->RSSI_target = pEntry;
-                                       pDM_SWAT_Table->RSSI_target = index;
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
-                               }
-                       }//end if(pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter))
-
-               }
-               #endif
-
-               pDM_SWAT_Table->RSSI_cnt_A = 0;
-               pDM_SWAT_Table->RSSI_cnt_B = 0;
-               pDM_SWAT_Table->try_flag = 0;
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("odm_SwAntDivChkAntSwitch(): Set try_flag to 0 prepare for peak!\n"));
-               return;
-       }
-       else
-       {
-
-// To Fix 8723A SW ANT DIV Bug issue
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
-               if (pDM_Odm->SupportICType & ODM_RTL8723A)
-               {
-                       curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pDM_SWAT_Table->lastTxOkCnt;
-                       curRxOkCnt =Adapter->RxStats.NumRxBytesUnicast - pDM_SWAT_Table->lastRxOkCnt;
-                       pDM_SWAT_Table->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
-                       pDM_SWAT_Table->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
-               }
-#else  
-               curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - pDM_SWAT_Table->lastTxOkCnt;
-               curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - pDM_SWAT_Table->lastRxOkCnt;
-               pDM_SWAT_Table->lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
-               pDM_SWAT_Table->lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
-#endif 
-               if(pDM_SWAT_Table->try_flag == 1)
-               {
-                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
-                       {
-                               pDM_SWAT_Table->TXByteCnt_A += curTxOkCnt;
-                               pDM_SWAT_Table->RXByteCnt_A += curRxOkCnt;
-                       }
-                       else
-                       {
-                               pDM_SWAT_Table->TXByteCnt_B += curTxOkCnt;
-                               pDM_SWAT_Table->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_ANT_DIV, ODM_DBG_LOUD, ("RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying));
-                       if(pDM_SWAT_Table->RSSI_Trying == 0)
-                       {
-                               CurByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (pDM_SWAT_Table->TXByteCnt_A+pDM_SWAT_Table->RXByteCnt_A) : (pDM_SWAT_Table->TXByteCnt_B+pDM_SWAT_Table->RXByteCnt_B);
-                               PreByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (pDM_SWAT_Table->TXByteCnt_B+pDM_SWAT_Table->RXByteCnt_B) : (pDM_SWAT_Table->TXByteCnt_A+pDM_SWAT_Table->RXByteCnt_A);
-                               
-                               if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
-                                       //CurByteCnt = PlatformDivision64(CurByteCnt, 9);
-                                       PreByteCnt = PreByteCnt*9;
-                               else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
-                                       //CurByteCnt = PlatformDivision64(CurByteCnt, 2);
-                                       PreByteCnt = PreByteCnt*2;
-
-                               if(pDM_SWAT_Table->RSSI_cnt_A > 0)
-                                       RSSI_A = pDM_SWAT_Table->RSSI_sum_A/pDM_SWAT_Table->RSSI_cnt_A; 
-                               else
-                                       RSSI_A = 0;
-                               if(pDM_SWAT_Table->RSSI_cnt_B > 0)
-                                       RSSI_B = pDM_SWAT_Table->RSSI_sum_B/pDM_SWAT_Table->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_ANT_DIV, ODM_DBG_LOUD, ("Luke:PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI));
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: 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_ANT_DIV, ODM_DBG_LOUD, ("Luke:RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
-                                       RSSI_A, pDM_SWAT_Table->RSSI_cnt_A, RSSI_B, pDM_SWAT_Table->RSSI_cnt_B));
-                       }
-
-               }
-               else
-               {
-               
-                       if(pDM_SWAT_Table->RSSI_cnt_A > 0)
-                               RSSI_A = pDM_SWAT_Table->RSSI_sum_A/pDM_SWAT_Table->RSSI_cnt_A; 
-                       else
-                               RSSI_A = 0;
-                       if(pDM_SWAT_Table->RSSI_cnt_B > 0)
-                               RSSI_B = pDM_SWAT_Table->RSSI_sum_B/pDM_SWAT_Table->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_ANT_DIV, ODM_DBG_LOUD, ("Ekul:PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI));
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: 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_ANT_DIV, ODM_DBG_LOUD, ("Ekul:RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
-                               RSSI_A, pDM_SWAT_Table->RSSI_cnt_A, RSSI_B, pDM_SWAT_Table->RSSI_cnt_B));
-                       //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt));
-                       //RT_TRACE(COMP_SWAS, 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_ANT_DIV, ODM_DBG_LOUD, ("SWAS: TestMode = TP_MODE"));
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TRY:CurByteCnt = %lld,", CurByteCnt));
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TRY:PreByteCnt = %lld\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_ANT_DIV, ODM_DBG_LOUD, ("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap));
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("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;
-                               }
-                               //RT_TRACE(COMP_SWAS, DBG_LOUD, ("nextAntenna=%s\n",(nextAntenna==Antenna_A)?"A":"B"));
-                               //RT_TRACE(COMP_SWAS, DBG_LOUD, ("preAntenna= %s, curAntenna= %s \n", 
-                               //(DM_SWAT_Table.PreAntenna == Antenna_A?"A":"B"), (DM_SWAT_Table.CurAntenna == Antenna_A?"A":"B")));
-
-                               if(nextAntenna != pDM_SWAT_Table->CurAntenna)
-                               {
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Switch back to another antenna"));
-                               }
-                               else
-                               {
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: current anntena is good\n"));
-                               }       
-                       }
-
-                       if(pDM_SWAT_Table->TestMode == RSSI_MODE)
-                       {       
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: TestMode = RSSI_MODE"));
-                               pDM_SWAT_Table->SelectAntennaMap=0xAA;
-                               if(curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna
-                               {
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_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;
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: current anntena is good\n"));
-                               }
-                       }
-                       pDM_SWAT_Table->try_flag = 0;
-                       pDM_Odm->RSSI_test = FALSE;
-                       pDM_SWAT_Table->RSSI_sum_A = 0;
-                       pDM_SWAT_Table->RSSI_cnt_A = 0;
-                       pDM_SWAT_Table->RSSI_sum_B = 0;
-                       pDM_SWAT_Table->RSSI_cnt_B = 0;
-                       pDM_SWAT_Table->TXByteCnt_A = 0;
-                       pDM_SWAT_Table->TXByteCnt_B = 0;
-                       pDM_SWAT_Table->RXByteCnt_A = 0;
-                       pDM_SWAT_Table->RXByteCnt_B = 0;
-                       
-               }
-
-               //1 Normal State
-               else if(pDM_SWAT_Table->try_flag == 0)
-               {
-                       if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
-                       {
-                               if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
-                                       pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH;
-                               else
-                                       pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
-                       }
-                       else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
-                               {
-                               if ((curTxOkCnt+curRxOkCnt) > 3750000) //if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
-                                       pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH;
-                               else
-                                       pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
-                       }
-                       if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
-                               pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
-                       //RT_TRACE(COMP_SWAS, 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;
-                                       pDM_Odm->RSSI_test = TRUE;
-                       if((curRxOkCnt+curTxOkCnt) > 1000)
-                       {
-                               pDM_SWAT_Table->RSSI_Trying = 4;
-                               pDM_SWAT_Table->TestMode = TP_MODE;
-                               }
-                               else
-                               {
-                               pDM_SWAT_Table->RSSI_Trying = 2;
-                               pDM_SWAT_Table->TestMode = RSSI_MODE;
-
-                       }
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Normal State -> Begin Trying!\n"));
-                       
-                       
-                       pDM_SWAT_Table->RSSI_sum_A = 0;
-                       pDM_SWAT_Table->RSSI_cnt_A = 0;
-                       pDM_SWAT_Table->RSSI_sum_B = 0;
-                       pDM_SWAT_Table->RSSI_cnt_B = 0;
-               }
-       }
-
-       //1 4.Change TRX antenna
-       if(nextAntenna != pDM_SWAT_Table->CurAntenna)
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Change TX Antenna!\n "));
-               //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, nextAntenna);           
-               #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)                    
-               ODM_SetAntenna(pDM_Odm,nextAntenna);            
-               #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
-               {
-                       BOOLEAN bEnqueue;                       
-                       bEnqueue = (pDM_Odm->SupportInterface ==  ODM_ITRF_PCIE)?FALSE :TRUE;                   
-                       rtw_antenna_select_cmd(pDM_Odm->Adapter, nextAntenna, bEnqueue);
-               }
-               #endif
-               
-       }
-
-       //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
-       {
-               //PADAPTER              pAdapter = pDM_Odm->Adapter;
-               //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
-       
-
-       if(pDM_SWAT_Table->RSSI_Trying == 0)
-               return;
-
-       if(pDM_SWAT_Table->RSSI_Trying%2 == 0)
-       {
-               if(pDM_SWAT_Table->TestMode == TP_MODE)
-               {
-                       if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
-                       {
-                               ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 10 ); //ms
-                               
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 10 ms\n"));
-                       }
-                       else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
-                       {
-                               ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 50 ); //ms
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 50 ms\n"));
-                       }
-               }
-               else
-               {
-                       ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 500 ); //ms
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 500 ms\n"));
-               }
-       }
-       else
-       {
-               if(pDM_SWAT_Table->TestMode == TP_MODE)
-               {
-                       if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
-                               ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 90 ); //ms
-                       else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
-                               ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 100 ); //ms
-               }
-               else
-                       ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 500 ); //ms 
-       }
-       }
-#endif // #if (DM_ODM_SUPPORT_TYPE  & (ODM_WIN|ODM_CE))
-#endif // #if (RTL8192C_SUPPORT==1) 
-}
-
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-
-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;
-       u1Byte                          i, 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 = 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.
-               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;
-
-               RtActChannelList(Adapter, RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST, &CustomScanReq, NULL);
-       }
-
-}
-#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-
-//
-// 20100514 Luke/Joseph:
-// Callback function for 500ms antenna test trying.
-//
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-VOID
-odm_SwAntDivChkAntSwitchCallback(
-       PRT_TIMER               pTimer
-)
-{
-       PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       pSWAT_T         pDM_SWAT_Table = &pHalData->DM_OutSrc.DM_SWAT_Table;
-
-       #if DEV_BUS_TYPE==RT_PCI_INTERFACE
-       #if USE_WORKITEM
-       ODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem);
-       #else
-       odm_SwAntDivChkAntSwitch(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);
-       #endif
-       #else
-       ODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem);
-       #endif
-       
-}
-VOID
-odm_SwAntDivChkAntSwitchWorkitemCallback(
-    IN PVOID            pContext
-    )
-{
-
-       PADAPTER                pAdapter = (PADAPTER)pContext;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
-
-       odm_SwAntDivChkAntSwitch(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);
-
-}
-#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
-VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext)
-{
-       PDM_ODM_T       pDM_Odm= (PDM_ODM_T)FunctionContext;
-       PADAPTER        padapter = pDM_Odm->Adapter;
-       if(padapter->net_closed == _TRUE)
-           return;
-       odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_DETERMINE); 
-}
-#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
-VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext)
-{
-       PDM_ODM_T       pDM_Odm= (PDM_ODM_T)FunctionContext;
-       odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_DETERMINE);
-}
-#endif
-
-#else //#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
-
-VOID odm_SwAntDivInit( IN              PDM_ODM_T               pDM_Odm ) {}
-VOID ODM_SwAntDivChkPerPktRssi(
-       IN PDM_ODM_T    pDM_Odm,
-       IN u1Byte               StationID,
-       IN PODM_PHY_INFO_T pPhyInfo
-       ) {}
-VOID odm_SwAntDivChkAntSwitch(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  Step
-       ) {}
-VOID ODM_SwAntDivResetBeforeLink(      IN              PDM_ODM_T               pDM_Odm ){}
-VOID ODM_SwAntDivRestAfterLink(        IN              PDM_ODM_T               pDM_Odm ){}
-VOID odm_SwAntDetectInit(      IN              PDM_ODM_T               pDM_Odm){}
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-VOID odm_SwAntDivChkAntSwitchCallback( PRT_TIMER               pTimer){}
-VOID odm_SwAntDivChkAntSwitchWorkitemCallback(    IN PVOID            pContext    ){}
-#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
-VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext){}
-#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
-VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext){}
-#endif
-
-#endif //#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
-
-
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-BOOLEAN
-ODM_SwAntDivCheckBeforeLink(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-
-#if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
-
-       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;
-       pFAT_T  pDM_FatTable = &pDM_Odm->DM_FatTable;
-       s1Byte                  Score = 0;
-       PRT_WLAN_BSS    pTmpBssDesc, pTestBssDesc;
-       s4Byte                  power_diff = 0, power_target = 10;
-       u1Byte                  index, counter = 0;
-       static u1Byte           ScanChannel;
-       u8Byte                  tStamp_diff = 0;                
-
-
-       if (pDM_Odm->Adapter == NULL)  //For BSOD when plug/unplug fast.  //By YJ,120413
-       {       // The ODM structure is not initialized.
-               return FALSE;
-       }
-
-       // Retrieve antenna detection registry info, added by Roger, 2012.11.27.
-       if(!IS_ANT_DETECT_SUPPORT_RSSI(Adapter))
-                       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);
-       
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
-                               ("ODM_SwAntDivCheckBeforeLink(): RFChangeInProgress(%x), eRFPowerState(%x)\n", 
-                               pMgntInfo->RFChangeInProgress, pHalData->eRFPowerState));
-       
-               pDM_SWAT_Table->SWAS_NoLink_State = 0;
-               
-               return FALSE;
-       }
-       else
-       {
-               PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
-       }
-       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));
-       //1 Run AntDiv mechanism "Before Link" part.
-       if(pDM_SWAT_Table->SWAS_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;
-       
-               // Copy Current Scan list.
-               pMgntInfo->tmpNumBssDesc = pMgntInfo->NumBssDesc;
-               PlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);
-               
-               // Go back to scan function again.
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Scan one more time\n"));
-               pMgntInfo->ScanStep=0;
-               pMgntInfo->bScanAntDetect = TRUE;
-               ScanChannel = odm_SwAntDivSelectScanChnl(Adapter);
-
-               
-               if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))
-               {
-                       if(pDM_FatTable->RxIdleAnt == MAIN_ANT)
-                               ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);
-                       else
-                               ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
-                       if(ScanChannel == 0)
-                       {
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
-                                       ("ODM_SwAntDivCheckBeforeLink(): No AP List Avaiable, Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT"));
-
-                               if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))
-                               {
-                                       pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;
-                                       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"));
-                               }
-                               else
-                               {
-                                       pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;
-                                       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"));
-                               }
-                               return FALSE;
-                       }
-
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
-                               ("ODM_SwAntDivCheckBeforeLink: Change to %s for testing.\n", ((pDM_FatTable->RxIdleAnt == MAIN_ANT)?"MAIN_ANT":"AUX_ANT")));
-               }
-               else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8723B))
-               {
-                       // Switch Antenna to another one.
-                       pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
-                       pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?AUX_ANT:MAIN_ANT;
-                       
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
-                               ("ODM_SwAntDivCheckBeforeLink: Change to Ant(%s) for testing.\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX"));
-                       //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
-                       if(pDM_Odm->SupportICType == ODM_RTL8192C)
-                       {
-                               pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
-                               ODM_SetBBReg(pDM_Odm,  rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
-                       }
-                       else if(pDM_Odm->SupportICType == ODM_RTL8723B)
-                       {
-                               pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c & 0xfffffffc) | (pDM_SWAT_Table->CurAntenna));
-                               ODM_SetBBReg(pDM_Odm,  rfe_ctrl_anta_src, 0xff, 0x77);
-                               ODM_SetBBReg(pDM_Odm,  rDPDT_control, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c);
-                       }
-               }
-               
-               odm_SwAntDivConstructScanChnl(Adapter, ScanChannel);
-               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 < pMgntInfo->tmpNumBssDesc; index++)
-               {
-                       pTmpBssDesc = &(pMgntInfo->tmpbssDesc[index]); // Antenna 1
-                       pTestBssDesc = &(pMgntInfo->bssDesc[index]); // Antenna 2
-
-                       if(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)
-                       {
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): ERROR!! This shall not happen.\n"));
-                               continue;
-                       }
-
-                       if(pDM_Odm->SupportICType != ODM_RTL8723B)
-                       {
-                               if(pTmpBssDesc->ChannelNumber == ScanChannel)
-                               {
-                       if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
-                       {
-                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score++\n"));
-                                               RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
-                                               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));
-                       
-                               Score++;
-                               PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
-                       }
-                       else if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)
-                       {
-                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score--\n"));
-                                               RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
-                                               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));
-                               Score--;
-                       }
-                                       else
-                                       {
-                                               if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp < 5000)
-                                               {
-                                                       RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
-                                                       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));
-                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("The 2nd Antenna didn't get this AP\n\n"));
-                                               }
-                                       }
-                               }
-                       }
-                       else
-                       { 
-                               if(pTmpBssDesc->ChannelNumber == ScanChannel)
-                               {
-                                       if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
-                                       {
-                                               counter++;
-                                               power_diff = power_diff + (pTmpBssDesc->RecvSignalPower - pTestBssDesc->RecvSignalPower); 
-                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
-                                               ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
-                                               ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf);
-                                               PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
-                                       }
-                                       else if(pTestBssDesc->RecvSignalPower > pTmpBssDesc->RecvSignalPower)
-                                       {
-                                               counter++;
-                                               power_diff = power_diff + (pTestBssDesc->RecvSignalPower - pTmpBssDesc->RecvSignalPower);
-                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
-                                               ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
-                                               ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf)
-                                       }
-                                       else if(pTestBssDesc->bdTstamp > pTmpBssDesc->bdTstamp)
-                                       {
-                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("time_diff: %lld\n", (pTestBssDesc->bdTstamp-pTmpBssDesc->bdTstamp)/1000));
-                                               if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp > 5000)
-                                               {
-                                                       counter++;
-                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
-                                                       ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
-                                                       ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf)
-                                               }
-                                       }
-                               }
-                       }
-               }
-
-               if(pDM_Odm->SupportICType == ODM_RTL8723B)
-               { 
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("counter: %d power_diff: %d\n", counter, power_diff));
-
-                       if(counter != 0)
-                               power_diff = power_diff / counter;
-
-                       if(power_diff <= power_target && counter != 0) 
-                               Score++;
-               }
-
-               if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))
-               {
-                       if(pMgntInfo->NumBssDesc!=0 && Score<0)
-                       {
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
-                                                       ("ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
-                       }
-                       else
-                       {
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
-                                               ("ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT"));
-
-                               if(pDM_FatTable->RxIdleAnt == MAIN_ANT)
-                                       ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);
-                               else
-                                       ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
-                       }
-                       
-                       if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))
-                       {
-                               pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;
-                               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"));
-                       }
-                       else
-                       {
-                               pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;
-                               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"));
-                       }
-               }
-               else if(pDM_Odm->SupportICType == ODM_RTL8723B)
-               {
-                       pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;
-                       pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c & 0xfffffffc) | (pDM_SWAT_Table->CurAntenna));
-                       ODM_SetBBReg(pDM_Odm,  rfe_ctrl_anta_src, 0xff, 0x77);
-                       ODM_SetBBReg(pDM_Odm,  rDPDT_control,bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c);
-
-                       if(counter != 0)
-                       {
-                               if(pMgntInfo->NumBssDesc != 0 && Score > 0)
-                               {
-                                       if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)
-                                       {
-                                               pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;
-                                               pDM_Odm->DM_SWAT_Table.ANTB_ON = TRUE;
-                                       }
-                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Dual antenna\n"));
-                               }
-                               else
-                               {
-                                       if(pDM_Odm->DM_SWAT_Table.ANTB_ON == TRUE)
-                                       {
-                                               pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;
-                                               pDM_Odm->DM_SWAT_Table.ANTB_ON = FALSE;
-                                               BT_SetBtCoexAntNum(Adapter, BT_COEX_ANT_TYPE_DETECTED, 1);
-                                       }
-                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));
-                               }
-                       }
-                       else
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Igone result\n"));
-               }
-               else if(pDM_Odm->SupportICType == ODM_RTL8192C)
-               {
-                       if(pMgntInfo->NumBssDesc!=0 && Score<=0)
-                       {
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
-                                       ("ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX"));
-
-                               pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
-                       }
-                       else
-                       {
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
-                                       ("ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"AUX":"MAIN"));
-
-                               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;
-               pMgntInfo->bScanAntDetect = FALSE;
-
-               return FALSE;
-       }
-
-#else
-               return  FALSE;
-#endif
-
-return FALSE;
-}
-
-#endif //#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-
-
-//3============================================================
-//3 SW Antenna Diversity
-//3============================================================
-
-#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
-VOID
-odm_InitHybridAntDiv_88C_92D(
-       IN PDM_ODM_T    pDM_Odm 
-       )
-{
-
-#if((DM_ODM_SUPPORT_TYPE==ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
-       struct rtl8192cd_priv *priv=pDM_Odm->priv;
-#endif
-       SWAT_T                  *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-       u1Byte                  bTxPathSel=0;           //0:Path-A   1:Path-B
-       u1Byte                  i;
-
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_InitHybridAntDiv==============>\n"));
-
-       //whether to do antenna diversity or not
-#if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-       if(priv==NULL)  return;
-       if(!priv->pshare->rf_ft_var.antHw_enable)
-               return; 
-       
-       #ifdef SW_ANT_SWITCH
-       priv->pshare->rf_ft_var.antSw_enable =0;
-       #endif
-#endif
-
-       if((pDM_Odm->SupportICType != ODM_RTL8192C) && (pDM_Odm->SupportICType != ODM_RTL8192D))
-               return;
-
-
-       bTxPathSel=(pDM_Odm->RFType==ODM_1T1R)?FALSE:TRUE;
-
-       ODM_SetBBReg(pDM_Odm,ODM_REG_BB_PWR_SAV1_11N, BIT23, 0); //No update ANTSEL during GNT_BT=1
-       ODM_SetBBReg(pDM_Odm,ODM_REG_TX_ANT_CTRL_11N, BIT21, 1); //TX atenna selection from tx_info
-       ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PIN_11N, BIT23, 1); //enable LED[1:0] pin as ANTSEL
-       ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_CTRL_11N, BIT8|BIT9, 0x01); // 0x01: left antenna, 0x02: right antenna
-       // check HW setting: ANTSEL pin connection
-       #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-       ODM_Write2Byte(pDM_Odm,ODM_REG_RF_PIN_11N, (ODM_Read2Byte(pDM_Odm,0x804)&0xf0ff )| BIT(8) );    // b11-b8=0001,update RFPin setting
-       #endif
-       
-       // only AP support different path selection temperarly
-       if(!bTxPathSel){                 //PATH-A
-               ODM_SetBBReg(pDM_Odm,ODM_REG_PIN_CTRL_11N, BIT8|BIT9, 0 ); // ANTSEL as HW control
-               ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PATH_11N, BIT13, 1);         //select TX ANTESEL from path A
-       }
-       else    {
-               ODM_SetBBReg(pDM_Odm,ODM_REG_PIN_CTRL_11N, BIT24|BIT25, 0 ); // ANTSEL as HW control
-               ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PATH_11N, BIT13, 0);                 //select ANTESEL from path B
-       }
-
-       //Set OFDM HW RX Antenna Diversity
-       ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA1_11N, 0x7FF, 0x0c0); //Pwdb threshold=8dB
-       ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA1_11N, BIT11, 0); //Switch to another antenna by checking pwdb threshold
-       ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA3_11N, BIT23, 1);       // Decide final antenna by comparing 2 antennas' pwdb
-       
-       //Set CCK HW RX Antenna Diversity
-       ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA2_11N, BIT4, 0); //Antenna diversity decision period = 32 sample
-       ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA2_11N, 0xf, 0xf); //Threshold for antenna diversity. Check another antenna power if input power < ANT_lim*4
-       ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA3_11N, BIT13, 1); //polarity ana_A=1 and ana_B=0
-       ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA4_11N, 0x1f, 0x8); //default antenna power = inpwr*(0.5 + r_ant_step/16)
-
-
-       //Enable HW Antenna Diversity
-       if(!bTxPathSel)                 //PATH-A
-               ODM_SetBBReg(pDM_Odm,ODM_REG_IGI_A_11N, BIT7,1);        // Enable Hardware antenna switch
-       else
-               ODM_SetBBReg(pDM_Odm,ODM_REG_IGI_B_11N, BIT7,1);        // Enable Hardware antenna switch
-       ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA1_11N, BIT15, 1);//Enable antenna diversity
-
-       pDM_SWAT_Table->CurAntenna=0;                   //choose left antenna as default antenna
-       pDM_SWAT_Table->PreAntenna=0;
-       for(i=0; i<ASSOCIATE_ENTRY_NUM ; i++)
-       {
-               pDM_SWAT_Table->CCK_Ant1_Cnt[i] = 0;
-               pDM_SWAT_Table->CCK_Ant2_Cnt[i] = 0;
-               pDM_SWAT_Table->OFDM_Ant1_Cnt[i] = 0;
-               pDM_SWAT_Table->OFDM_Ant2_Cnt[i] = 0;
-               pDM_SWAT_Table->RSSI_Ant1_Sum[i] = 0;
-               pDM_SWAT_Table->RSSI_Ant2_Sum[i] = 0;
-       }
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_InitHybridAntDiv\n"));
-}
-
-
-VOID
-odm_InitHybridAntDiv(
-       IN PDM_ODM_T    pDM_Odm 
-       )
-{
-       if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: Not Support HW AntDiv\n"));
-               return;
-       }
-       
-       if(pDM_Odm->SupportICType & (ODM_RTL8192C | ODM_RTL8192D))
-       {
-#if ((RTL8192C_SUPPORT == 1)||(RTL8192D_SUPPORT == 1))
-               odm_InitHybridAntDiv_88C_92D(pDM_Odm);
-#endif
-       }
-}
-
-
-BOOLEAN
-odm_StaDefAntSel(
-       IN PDM_ODM_T    pDM_Odm,
-       IN u4Byte               OFDM_Ant1_Cnt,
-       IN u4Byte               OFDM_Ant2_Cnt,
-       IN u4Byte               CCK_Ant1_Cnt,
-       IN u4Byte               CCK_Ant2_Cnt,
-       OUT u1Byte              *pDefAnt 
-
-       )
-{
-#if 1
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_StaDefAntSelect==============>\n"));
-
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("OFDM_Ant1_Cnt:%d, OFDM_Ant2_Cnt:%d\n",OFDM_Ant1_Cnt,OFDM_Ant2_Cnt));
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("CCK_Ant1_Cnt:%d, CCK_Ant2_Cnt:%d\n",CCK_Ant1_Cnt,CCK_Ant2_Cnt));
-
-       
-       if(((OFDM_Ant1_Cnt+OFDM_Ant2_Cnt)==0)&&((CCK_Ant1_Cnt + CCK_Ant2_Cnt) <10)){
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_StaDefAntSelect Fail: No enough packet info!\n"));
-               return  FALSE;
-       }
-
-       if(OFDM_Ant1_Cnt || OFDM_Ant2_Cnt )     {
-               //if RX OFDM packet number larger than 0
-               if(OFDM_Ant1_Cnt > OFDM_Ant2_Cnt)
-                       (*pDefAnt)=1;
-               else
-                       (*pDefAnt)=0;
-       }
-       // else if RX CCK packet number larger than 10
-       else if((CCK_Ant1_Cnt + CCK_Ant2_Cnt) >=10 )
-       {
-               if(CCK_Ant1_Cnt > (5*CCK_Ant2_Cnt))
-                       (*pDefAnt)=1;
-               else if(CCK_Ant2_Cnt > (5*CCK_Ant1_Cnt))
-                       (*pDefAnt)=0;
-               else if(CCK_Ant1_Cnt > CCK_Ant2_Cnt)
-                       (*pDefAnt)=0;
-               else
-                       (*pDefAnt)=1;
-
-       }
-
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("TxAnt = %s\n",((*pDefAnt)==1)?"Ant1":"Ant2"));
-       
-#endif
-       //u4Byte antsel = ODM_GetBBReg(pDM_Odm, 0xc88, bMaskByte0);
-       //(*pDefAnt)= (u1Byte) antsel;
-       
-
-
-       
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_StaDefAntSelect\n"));
-
-       return TRUE;
-
-       
-}
-
-
-VOID
-odm_SetRxIdleAnt(
-       IN      PDM_ODM_T       pDM_Odm,
-       IN      u1Byte  Ant,
-       IN   BOOLEAN   bDualPath                     
-)
-{
-       SWAT_T                  *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-
-       //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_SetRxIdleAnt==============>\n"));
-
-       if(Ant != pDM_SWAT_Table->RxIdleAnt)
-       {
-       //for path-A
-       if(Ant==1) 
-                       ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF, 0x65a9);   //right-side antenna
-       else
-                       ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF, 0x569a);   //left-side antenna
-
-       //for path-B
-       if(bDualPath){
-               if(Ant==0) 
-                               ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF0000, 0x65a9);   //right-side antenna
-               else 
-                               ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF0000, 0x569a);  //left-side antenna
-               }
-       }
-               pDM_SWAT_Table->RxIdleAnt = Ant;
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("RxIdleAnt: %s  Reg858=0x%x\n",(Ant==1)?"Ant1":"Ant2",(Ant==1)?0x65a9:0x569a));
-
-       //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_SetRxIdleAnt\n"));
-
-       }
-               
-VOID
-ODM_AntselStatistics_88C(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  MacId,
-       IN              u4Byte                  PWDBAll,
-       IN              BOOLEAN                 isCCKrate
-)
-{
-       SWAT_T                  *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-
-       if(pDM_SWAT_Table->antsel == 1)
-       {
-               if(isCCKrate)
-                       pDM_SWAT_Table->CCK_Ant1_Cnt[MacId]++;
-               else
-               {
-                       pDM_SWAT_Table->OFDM_Ant1_Cnt[MacId]++;
-                       pDM_SWAT_Table->RSSI_Ant1_Sum[MacId] += PWDBAll;
-               }
-       }
-       else
-       {
-               if(isCCKrate)
-                       pDM_SWAT_Table->CCK_Ant2_Cnt[MacId]++;
-               else
-               {
-                       pDM_SWAT_Table->OFDM_Ant2_Cnt[MacId]++;
-                       pDM_SWAT_Table->RSSI_Ant2_Sum[MacId] += PWDBAll;
-               }
-       }
-
-}
-
-
-
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-VOID
-ODM_SetTxAntByTxInfo_88C_92D(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              pu1Byte                 pDesc,
-       IN              u1Byte                  macId   
-)
-{
-       SWAT_T                  *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-       u1Byte                  antsel;
-
-       if(!(pDM_Odm->SupportAbility&ODM_BB_ANT_DIV)) 
-               return;
-
-       if(pDM_SWAT_Table->RxIdleAnt == 1)
-               antsel=(pDM_SWAT_Table->TxAnt[macId] == 1)?0:1;
-       else
-               antsel=(pDM_SWAT_Table->TxAnt[macId] == 1)?1:0;
-       
-       SET_TX_DESC_ANTSEL_A_92C(pDesc, antsel);
-       //SET_TX_DESC_ANTSEL_B_92C(pDesc, antsel);
-       //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("SET_TX_DESC_ANTSEL_A_92C=%d\n", pDM_SWAT_Table->TxAnt[macId]));
-}
-#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
-VOID
-ODM_SetTxAntByTxInfo_88C_92D(
-       IN              PDM_ODM_T               pDM_Odm
-)
-{
-
-}
-#elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
-VOID
-ODM_SetTxAntByTxInfo_88C_92D(
-       IN              PDM_ODM_T               pDM_Odm
-)
-{
-
-}
-#endif
-
-VOID
-odm_HwAntDiv_92C_92D(
-       IN      PDM_ODM_T       pDM_Odm
-)
-{
-       SWAT_T                  *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-       u4Byte                  RSSI_Min=0xFF, RSSI, RSSI_Ant1, RSSI_Ant2;
-       u1Byte                  RxIdleAnt, i;
-       BOOLEAN         bRet=FALSE;
-       PSTA_INFO_T     pEntry;
-       
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
-       struct rtl8192cd_priv *priv=pDM_Odm->priv;
-       //if test, return
-       if(priv->pshare->rf_ft_var.CurAntenna & 0x80)
-               return; 
-#endif 
-
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv==============>\n"));
-       
-       if(!(pDM_Odm->SupportAbility&ODM_BB_ANT_DIV))                                    //if don't support antenna diveristy
-       {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv: Not supported!\n"));
-               return;
-       }
-
-       if((pDM_Odm->SupportICType != ODM_RTL8192C) && (pDM_Odm->SupportICType != ODM_RTL8192D))
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: IC Type is not 92C or 92D\n"));
-               return;
-       }
-       
-#if (DM_ODM_SUPPORT_TYPE&(ODM_WIN|ODM_CE))
-       if(!pDM_Odm->bLinked)
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: bLinked is FALSE\n"));
-               return;
-       }
-#endif
-
-       for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
-       {
-               pEntry = pDM_Odm->pODM_StaInfo[i];
-               if(IS_STA_VALID(pEntry))
-               {
-
-                       RSSI_Ant1 = (pDM_SWAT_Table->OFDM_Ant1_Cnt[i] == 0)?0:(pDM_SWAT_Table->RSSI_Ant1_Sum[i]/pDM_SWAT_Table->OFDM_Ant1_Cnt[i]);
-                       RSSI_Ant2 = (pDM_SWAT_Table->OFDM_Ant2_Cnt[i] == 0)?0:(pDM_SWAT_Table->RSSI_Ant2_Sum[i]/pDM_SWAT_Table->OFDM_Ant2_Cnt[i]);
-
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("RSSI_Ant1=%d,  RSSI_Ant2=%d\n", RSSI_Ant1, RSSI_Ant2));
-               
-                       if(RSSI_Ant1 ||RSSI_Ant2) 
-                       {
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)              
-                               if(pDM_Odm->pODM_StaInfo[i]->expire_to)
-#endif
-                               {
-                                       RSSI = (RSSI_Ant1 < RSSI_Ant2) ? RSSI_Ant1 : RSSI_Ant2;
-                                       if((!RSSI) || ( RSSI < RSSI_Min) ) {
-                                               pDM_SWAT_Table->TargetSTA = i;
-                                               RSSI_Min = RSSI;
-                                       }
-                               }
-       }
-                       ///STA: found out default antenna
-                       bRet=odm_StaDefAntSel(pDM_Odm, 
-                                                pDM_SWAT_Table->OFDM_Ant1_Cnt[i], 
-                                                pDM_SWAT_Table->OFDM_Ant2_Cnt[i], 
-                                                pDM_SWAT_Table->CCK_Ant1_Cnt[i], 
-                                                pDM_SWAT_Table->CCK_Ant2_Cnt[i], 
-                                                &pDM_SWAT_Table->TxAnt[i]);
-
-                       //if Tx antenna selection: successful
-                       if(bRet){       
-                               pDM_SWAT_Table->RSSI_Ant1_Sum[i] = 0;
-                               pDM_SWAT_Table->RSSI_Ant2_Sum[i] = 0;
-                               pDM_SWAT_Table->OFDM_Ant1_Cnt[i] = 0;
-                               pDM_SWAT_Table->OFDM_Ant2_Cnt[i] = 0; 
-                               pDM_SWAT_Table->CCK_Ant1_Cnt[i] = 0; 
-                               pDM_SWAT_Table->CCK_Ant2_Cnt[i] = 0; 
-                       }
-               }
-       }
-       
-       //set RX Idle Ant
-       RxIdleAnt = pDM_SWAT_Table->TxAnt[pDM_SWAT_Table->TargetSTA];
-       odm_SetRxIdleAnt(pDM_Odm, RxIdleAnt, FALSE);
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
-#ifdef TX_SHORTCUT
-       if (!priv->pmib->dot11OperationEntry.disable_txsc) {
-               plist = phead->next;
-               while(plist != phead)   {
-                       pstat = list_entry(plist, struct stat_info, asoc_list);
-                       if(pstat->expire_to) {
-                               for (i=0; i<TX_SC_ENTRY_NUM; i++) {
-                                       struct tx_desc *pdesc= &(pstat->tx_sc_ent[i].hwdesc1);  
-                                       pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
-                                       if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
-                                               pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));
-                                       pdesc= &(pstat->tx_sc_ent[i].hwdesc2);  
-                                       pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
-                                       if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
-                                               pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));                                     
-                               }
-                       }               
-
-                       if (plist == plist->next)
-                               break;
-                       plist = plist->next;
-               };
-       }
-#endif 
-#endif
-       
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("<==============odm_HwAntDiv\n"));
-       
-}
-
-VOID
-odm_HwAntDiv(
-       IN      PDM_ODM_T       pDM_Odm
-)
-{      
-
-       PADAPTER                pAdapter        = pDM_Odm->Adapter;
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-       if(pAdapter->MgntInfo.AntennaTest)
-               return;
-#endif
-       if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: Not Support HW AntDiv\n"));
-               return;
-       }
-       
-       if(pDM_Odm->SupportICType & (ODM_RTL8192C | ODM_RTL8192D))
-       {
-#if ((RTL8192C_SUPPORT == 1)||(RTL8192D_SUPPORT == 1))
-               odm_HwAntDiv_92C_92D(pDM_Odm);
-#endif
-       }
-}
-
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-#if 0
-VOID
-odm_HwAntDiv(
-       IN      PDM_ODM_T       pDM_Odm
-)
-{
-       struct rtl8192cd_priv *priv=pDM_Odm->priv;
-       struct stat_info        *pstat, *pstat_min=NULL;
-       struct list_head        *phead, *plist;
-       int rssi_min= 0xff, i;
-       u1Byte  idleAnt=priv->pshare->rf_ft_var.CurAntenna;     
-       u1Byte  nextAnt;
-       BOOLEAN         bRet=FALSE;
-       
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv==============>\n"));
-
-       if((!priv->pshare->rf_ft_var.antHw_enable) ||(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)))
-               return;
-       
-       //if test, return
-       if(priv->pshare->rf_ft_var.CurAntenna & 0x80)
-               return;
-       
-       phead = &priv->asoc_list;
-       plist = phead->next;
-       ////=========================
-       //find mimum rssi sta
-       ////=========================
-       while(plist != phead)   {
-               pstat = list_entry(plist, struct stat_info, asoc_list);
-               if((pstat->expire_to) && (pstat->AntRSSI[0] || pstat->AntRSSI[1])) {
-                       int rssi = (pstat->AntRSSI[0] < pstat->AntRSSI[1]) ? pstat->AntRSSI[0] : pstat->AntRSSI[1];
-                       if((!pstat_min) || ( rssi < rssi_min) ) {
-                               pstat_min = pstat;
-                               rssi_min = rssi;
-                       }
-               }
-               ///STA: found out default antenna
-               bRet=odm_StaDefAntSel(pDM_Odm,
-                                               pstat->hwRxAntSel[1],
-                                               pstat->hwRxAntSel[0],
-                                               pstat->cckPktCount[1],
-                                               pstat->cckPktCount[0],
-                                               &nextAnt
-                                               );
-               
-               //if default antenna selection: successful
-               if(bRet){       
-                       pstat->CurAntenna = nextAnt;
-                       //update rssi
-                       for(i=0; i<2; i++) {
-                               if(pstat->cckPktCount[i]==0 && pstat->hwRxAntSel[i]==0)
-                                       pstat->AntRSSI[i] = 0;
-                       }
-                       if(pstat->AntRSSI[idleAnt]==0)
-                               pstat->AntRSSI[idleAnt] = pstat->AntRSSI[idleAnt^1];
-                       // reset variables
-                       pstat->hwRxAntSel[1] = pstat->hwRxAntSel[0] =0;
-                       pstat->cckPktCount[1]= pstat->cckPktCount[0] =0;
-               }
-
-               if (plist == plist->next)
-                       break;
-               plist = plist->next;
-               
-       };
-       ////=========================
-       //Choose  RX Idle antenna according to minmum rssi
-       ////=========================
-       if(pstat_min)   {
-               if(priv->pshare->rf_ft_var.CurAntenna!=pstat_min->CurAntenna)
-                       odm_SetRxIdleAnt(pDM_Odm,pstat_min->CurAntenna,TRUE);
-               priv->pshare->rf_ft_var.CurAntenna = pstat_min->CurAntenna;
-       }
-
-
-#ifdef TX_SHORTCUT
-       if (!priv->pmib->dot11OperationEntry.disable_txsc) {
-               plist = phead->next;
-               while(plist != phead)   {
-                       pstat = list_entry(plist, struct stat_info, asoc_list);
-                       if(pstat->expire_to) {
-                               for (i=0; i<TX_SC_ENTRY_NUM; i++) {
-                                       struct tx_desc *pdesc= &(pstat->tx_sc_ent[i].hwdesc1);  
-                                       pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
-                                       if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
-                                               pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));
-                                       pdesc= &(pstat->tx_sc_ent[i].hwdesc2);  
-                                       pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
-                                       if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
-                                               pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));                                     
-                               }
-                       }               
-
-                       if (plist == plist->next)
-                               break;
-                       plist = plist->next;
-               };
-       }
-#endif 
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,"<==============odm_HwAntDiv\n");
-}
-#endif
-
-u1Byte
-ODM_Diversity_AntennaSelect(
-       IN      PDM_ODM_T       pDM_Odm,
-       IN      u1Byte  *data
-)
-{
-       struct rtl8192cd_priv *priv=pDM_Odm->priv;
-
-       int ant = _atoi(data, 16);
-
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("ODM_Diversity_AntennaSelect==============>\n"));
-
-       #ifdef PCIE_POWER_SAVING
-       PCIeWakeUp(priv, POWER_DOWN_T0);
-       #endif
-
-       if (ant==AUX_ANT || ant==MAIN_ANT) 
-       {
-               if ( !priv->pshare->rf_ft_var.antSw_select) {
-                       ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) | BIT(8)| BIT(9) );  //  ANTSEL A as SW control
-                       ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) & (~ BIT(7)));       // rx OFDM SW control
-                       PHY_SetBBReg(priv, 0x860, 0x300, ant);
-               } else {
-                       ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) | BIT(24)| BIT(25) ); // ANTSEL B as HW control
-                       PHY_SetBBReg(priv, 0x864, 0x300, ant);
-                       ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) & (~ BIT(7)));               // rx OFDM SW control
-               }
-
-               ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) & (~ BIT(7)));       // rx CCK SW control
-               ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) & (~ BIT(21))); // select ant by tx desc
-               ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
-
-               priv->pshare->rf_ft_var.antHw_enable = 0;
-               priv->pshare->rf_ft_var.CurAntenna  = (ant%2);
-
-               #ifdef SW_ANT_SWITCH
-               priv->pshare->rf_ft_var.antSw_enable = 0;
-               priv->pshare->DM_SWAT_Table.CurAntenna = ant;
-               priv->pshare->RSSI_test =0;
-               #endif
-       }
-       else if(ant==0){
-
-               if ( !priv->pshare->rf_ft_var.antSw_select)  {
-                       ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) & ~(BIT(8)| BIT(9)) );
-                       ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) | BIT(7));   // OFDM HW control
-               } else {
-                       ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) & ~(BIT(24)| BIT(25)) );
-                       ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) | BIT(7));   // OFDM HW control
-               }
-
-               ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) | BIT(7));   // CCK HW control
-               ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) | BIT(21) ); // by tx desc
-               priv->pshare->rf_ft_var.CurAntenna = 0;
-               ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
-               priv->pshare->rf_ft_var.antHw_enable = 1;
-#ifdef SW_ANT_SWITCH
-               priv->pshare->rf_ft_var.antSw_enable = 0;
-               priv->pshare->RSSI_test =0;
-#endif
-       }
-#ifdef SW_ANT_SWITCH
-       else if(ant==3) {
-               if(!priv->pshare->rf_ft_var.antSw_enable) {
-                       
-                       dm_SW_AntennaSwitchInit(priv);
-                       ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
-                       priv->pshare->lastTxOkCnt = priv->net_stats.tx_bytes;
-                       priv->pshare->lastRxOkCnt = priv->net_stats.rx_bytes;
-               }
-               if ( !priv->pshare->rf_ft_var.antSw_select)
-                       ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) & (~ BIT(7)));       // rx OFDM SW control
-               else
-                       ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) & (~ BIT(7)));       // rx OFDM SW control
-
-               ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) & (~ BIT(7)));               // rx CCK SW control
-               ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) & (~ BIT(21)));      // select ant by tx desc
-               priv->pshare->rf_ft_var.antHw_enable = 0;
-               priv->pshare->rf_ft_var.antSw_enable = 1;
-
-       }
-#endif
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============ODM_Diversity_AntennaSelect\n"));
-
-       return 1;
-}
-#endif
-
-#else //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
-
-VOID odm_InitHybridAntDiv(     IN PDM_ODM_T    pDM_Odm         ){}
-VOID odm_HwAntDiv(     IN      PDM_ODM_T       pDM_Odm){}
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-VOID ODM_SetTxAntByTxInfo_88C_92D(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              pu1Byte                 pDesc,
-       IN              u1Byte                  macId   
-){}
-#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
-VOID ODM_SetTxAntByTxInfo_88C_92D(     IN              PDM_ODM_T               pDM_Odm){ }
-#elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
-VOID ODM_SetTxAntByTxInfo_88C_92D(     IN              PDM_ODM_T               pDM_Odm){ }
-#endif
-
-#endif //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
-
-
-
-//============================================================
-//EDCA Turbo
-//============================================================
-VOID
-ODM_EdcaTurboInit(
-       IN    PDM_ODM_T         pDM_Odm)
-{
-
-#if ((DM_ODM_SUPPORT_TYPE == ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
-       odm_EdcaParaInit(pDM_Odm);
-#elif (DM_ODM_SUPPORT_TYPE==ODM_WIN)
-       PADAPTER        Adapter = NULL;
-       HAL_DATA_TYPE   *pHalData = NULL;
-
-       if(pDM_Odm->Adapter==NULL)      {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EdcaTurboInit fail!!!\n"));
-               return;
-       }
-
-       Adapter=pDM_Odm->Adapter;
-       pHalData=GET_HAL_DATA(Adapter);
-
-       pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;       
-       pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;
-       pHalData->bIsAnyNonBEPkts = FALSE;
-       
-#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
-       PADAPTER        Adapter = pDM_Odm->Adapter;     
-       pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;       
-       pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;
-       Adapter->recvpriv.bIsAnyNonBEPkts =FALSE;
-
-#endif 
-       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)));
-       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)));
-       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)));
-       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)));
-
-       
-}      // ODM_InitEdcaTurbo
-
-VOID
-odm_EdcaTurboCheck(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       // 
-       // For AP/ADSL use prtl8192cd_priv
-       // For CE/NIC use PADAPTER
-       //
-
-       //
-       // 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.
-       //
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheck========================>\n"));
-
-       if(!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))
-               return;
-
-       switch  (pDM_Odm->SupportPlatform)
-       {
-               case    ODM_WIN:
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-                       odm_EdcaTurboCheckMP(pDM_Odm);
-#endif
-                       break;
-
-               case    ODM_CE:
-#if(DM_ODM_SUPPORT_TYPE==ODM_CE)
-                       odm_EdcaTurboCheckCE(pDM_Odm);
-#endif
-                       break;
-
-               case    ODM_AP:
-               case    ODM_ADSL:
-
-#if ((DM_ODM_SUPPORT_TYPE == ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
-               odm_IotEngine(pDM_Odm);
-#endif
-                       break;  
-       }
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("<========================odm_EdcaTurboCheck\n"));
-
-}      // odm_CheckEdcaTurbo
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_CE)
-
-
-VOID
-odm_EdcaTurboCheckCE(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_CE)
-
-       PADAPTER                       Adapter = pDM_Odm->Adapter;
-       u32     EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_UL[pMgntInfo->IOTPeer];
-       u32     EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_DL[pMgntInfo->IOTPeer];
-       u32     ICType=pDM_Odm->SupportICType;
-       u32     IOTPeer=0;
-       u8      WirelessMode=0xFF;                   //invalid value
-       u32     trafficIndex;
-       u32     edca_param;
-       u64     cur_tx_bytes = 0;
-       u64     cur_rx_bytes = 0;
-       u8      bbtchange = _FALSE;
-       u8      bBiasOnRx = _FALSE;
-       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
-       struct dvobj_priv               *pdvobjpriv = adapter_to_dvobj(Adapter);
-       struct xmit_priv                *pxmitpriv = &(Adapter->xmitpriv);
-       struct recv_priv                *precvpriv = &(Adapter->recvpriv);
-       struct registry_priv    *pregpriv = &Adapter->registrypriv;
-       struct mlme_ext_priv    *pmlmeext = &(Adapter->mlmeextpriv);
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-
-       if(pDM_Odm->bLinked != _TRUE)
-               goto dm_CheckEdcaTurbo_EXIT;
-
-       if ((pregpriv->wifi_spec == 1) )//|| (pmlmeinfo->HT_enable == 0))
-       {
-               goto dm_CheckEdcaTurbo_EXIT;
-       }
-
-       if(pDM_Odm->pWirelessMode!=NULL)
-               WirelessMode=*(pDM_Odm->pWirelessMode);
-
-       IOTPeer = pmlmeinfo->assoc_AP_vendor;
-
-       if (IOTPeer >=  HT_IOT_PEER_MAX)
-       {
-               goto dm_CheckEdcaTurbo_EXIT;
-       }
-
-       if(     (pDM_Odm->SupportICType == ODM_RTL8192C) ||
-               (pDM_Odm->SupportICType == ODM_RTL8723A) ||
-               (pDM_Odm->SupportICType == ODM_RTL8188E))
-       {
-               if((IOTPeer == HT_IOT_PEER_RALINK)||(IOTPeer == HT_IOT_PEER_ATHEROS))
-                       bBiasOnRx = _TRUE;
-       }
-
-       // Check if the status needs to be changed.
-       if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) )
-       {
-               cur_tx_bytes = pdvobjpriv->traffic_stat.cur_tx_bytes;
-               cur_rx_bytes = pdvobjpriv->traffic_stat.cur_rx_bytes;
-
-               //traffic, TX or RX
-               if(bBiasOnRx)
-               {
-                       if (cur_tx_bytes > (cur_rx_bytes << 2))
-                       { // Uplink TP is present.
-                               trafficIndex = UP_LINK; 
-                       }
-                       else
-                       { // Balance TP is present.
-                               trafficIndex = DOWN_LINK;
-                       }
-               }
-               else
-               {
-                       if (cur_rx_bytes > (cur_tx_bytes << 2))
-                       { // Downlink TP is present.
-                               trafficIndex = DOWN_LINK;
-                       }
-                       else
-                       { // Balance TP is present.
-                               trafficIndex = UP_LINK;
-                       }
-               }
-
-               //if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA))
-               {
-                       if(ICType==ODM_RTL8192D)
-                       {      
-                               // Single PHY
-                               if(pDM_Odm->RFType==ODM_2T2R)
-                               {
-                                       EDCA_BE_UL = 0x60a42b;    //0x5ea42b;
-                                       EDCA_BE_DL = 0x60a42b;    //0x5ea42b;
-                               }
-                               else
-                               {
-                                       EDCA_BE_UL = 0x6ea42b;
-                                       EDCA_BE_DL = 0x6ea42b;
-                               }
-                       }
-                       else
-                       {
-                               if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE) {
-                                       if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R)) {
-                                               EDCA_BE_UL = 0x60a42b;
-                                               EDCA_BE_DL = 0x60a42b;
-                                       }
-                                       else
-                                       {
-                                               EDCA_BE_UL = 0x6ea42b;
-                                               EDCA_BE_DL = 0x6ea42b;
-                                       }
-                               }
-                       }
-               
-                       //92D txop can't be set to 0x3e for cisco1250
-                       if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
-                       {
-                               EDCA_BE_DL = edca_setting_DL[IOTPeer];
-                               EDCA_BE_UL = edca_setting_UL[IOTPeer];
-                       }
-                       //merge from 92s_92c_merge temp brunch v2445    20120215 
-                       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)))
-                       {
-                               EDCA_BE_DL = edca_setting_DL_GMode[IOTPeer];
-                       }
-                       else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))
-                       {
-                               EDCA_BE_DL = 0xa630;
-                       }
-                       else if(IOTPeer == HT_IOT_PEER_MARVELL)
-                       {
-                               EDCA_BE_DL = edca_setting_DL[IOTPeer];
-                               EDCA_BE_UL = edca_setting_UL[IOTPeer];
-                       }
-                       else if(IOTPeer == HT_IOT_PEER_ATHEROS)
-                       {
-                               // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue. 
-                               EDCA_BE_DL = edca_setting_DL[IOTPeer];
-                       }
-
-                       if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8821)||(ICType==ODM_RTL8192E))           //add 8812AU/8812AE
-                       {
-                               EDCA_BE_UL = 0x5ea42b;
-                               EDCA_BE_DL = 0x5ea42b;
-
-                               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));
-                       }
-
-                       if (trafficIndex == DOWN_LINK)
-                               edca_param = EDCA_BE_DL;
-                       else
-                               edca_param = EDCA_BE_UL;
-
-                       rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);
-
-                       pDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex;
-               }
-               
-               pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _TRUE;
-       }
-       else
-       {
-               //
-               // Turn Off EDCA turbo here.
-               // Restore original EDCA according to the declaration of AP.
-               //
-                if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
-               {
-                       rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);
-                       pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;
-               }
-       }
-
-dm_CheckEdcaTurbo_EXIT:
-       // Set variables for next time.
-       precvpriv->bIsAnyNonBEPkts = _FALSE;
-#endif 
-}
-
-
-#elif(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-VOID
-odm_EdcaTurboCheckMP(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-
-
-       PADAPTER                       Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
-
-       PADAPTER                        pDefaultAdapter = GetDefaultAdapter(Adapter);
-       PADAPTER                        pExtAdapter = GetFirstExtAdapter(Adapter);//NULL;
-       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
-       PSTA_QOS                        pStaQos = Adapter->MgntInfo.pStaQos;
-       //[Win7 Count Tx/Rx statistic for Extension Port] odm_CheckEdcaTurbo's Adapter is always Default. 2009.08.20, by Bohn
-       u8Byte                          Ext_curTxOkCnt = 0;
-       u8Byte                          Ext_curRxOkCnt = 0;     
-       //For future Win7  Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.      
-       u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;
-
-       // Keep past Tx/Rx packet count for RT-to-RT EDCA turbo.
-       u8Byte                          curTxOkCnt = 0;
-       u8Byte                          curRxOkCnt = 0; 
-       u4Byte                          EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_UL[pMgntInfo->IOTPeer];
-       u4Byte                          EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_DL[pMgntInfo->IOTPeer];
-       u4Byte                         EDCA_BE = 0x5ea42b;
-       u1Byte                         IOTPeer=0;
-       BOOLEAN                      *pbIsCurRDLState=NULL;
-       BOOLEAN                      bLastIsCurRDLState=FALSE;
-       BOOLEAN                          bBiasOnRx=FALSE;
-       BOOLEAN                         bEdcaTurboOn=FALSE;
-       u1Byte                          TxRate = 0xFF;
-       u8Byte                          value64;        
-
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheckMP========================>"));
-       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)));
-
-////===============================
-////list paramter for different platform
-////===============================
-       bLastIsCurRDLState=pDM_Odm->DM_EDCA_Table.bIsCurRDLState;
-       pbIsCurRDLState=&(pDM_Odm->DM_EDCA_Table.bIsCurRDLState);       
-
-       //2012/09/14 MH Add 
-       if (pMgntInfo->NumNonBePkt > pMgntInfo->RegEdcaThresh && !Adapter->MgntInfo.bWiFiConfg)
-               pHalData->bIsAnyNonBEPkts = TRUE;
-
-       pMgntInfo->NumNonBePkt = 0;
-
-       // Caculate TX/RX TP:
-       //curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;
-       //curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;
-       curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pDM_Odm->lastTxOkCnt;
-       curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pDM_Odm->lastRxOkCnt;
-       pDM_Odm->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
-       pDM_Odm->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
-
-       if(pExtAdapter == NULL) 
-               pExtAdapter = pDefaultAdapter;
-
-       Ext_curTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->Ext_lastTxOkCnt;
-       Ext_curRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->Ext_lastRxOkCnt;
-       GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);
-       //For future Win7  Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.
-       if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)
-       {
-               curTxOkCnt = Ext_curTxOkCnt ;
-               curRxOkCnt = Ext_curRxOkCnt ;
-       }
-       //
-       IOTPeer=pMgntInfo->IOTPeer;
-       bBiasOnRx=(pMgntInfo->IOTAction & HT_IOT_ACT_EDCA_BIAS_ON_RX)?TRUE:FALSE;
-       bEdcaTurboOn=((!pHalData->bIsAnyNonBEPkts) && (!pMgntInfo->bDisableFrameBursting))?TRUE:FALSE;
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bIsAnyNonBEPkts : 0x%lx  bDisableFrameBursting : 0x%lx  \n",pHalData->bIsAnyNonBEPkts,pMgntInfo->bDisableFrameBursting));
-
-
-////===============================
-////check if edca turbo is disabled
-////===============================
-       if(odm_IsEdcaTurboDisable(pDM_Odm))
-               goto dm_CheckEdcaTurbo_EXIT;
-
-
-////===============================
-////remove iot case out
-////===============================
-       ODM_EdcaParaSelByIot(pDM_Odm, &EDCA_BE_UL, &EDCA_BE_DL);
-
-
-////===============================
-////Check if the status needs to be changed.
-////===============================
-       if(bEdcaTurboOn)
-       {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bEdcaTurboOn : 0x%x bBiasOnRx : 0x%x\n",bEdcaTurboOn,bBiasOnRx));
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curTxOkCnt : 0x%lx \n",curTxOkCnt));
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curRxOkCnt : 0x%lx \n",curRxOkCnt));
-               if(bBiasOnRx)
-                       odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt,   TRUE,  pbIsCurRDLState);
-               else
-                       odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt,   FALSE,  pbIsCurRDLState);
-
-//modify by Guo.Mingzhi 2011-12-29
-                       EDCA_BE=((*pbIsCurRDLState)==TRUE)?EDCA_BE_DL:EDCA_BE_UL;
-                       if(IS_HARDWARE_TYPE_8821U(Adapter))
-                       {
-                               if(pMgntInfo->RegTxDutyEnable)
-                               {
-                                       //2013.01.23 LukeLee: debug for 8811AU thermal issue (reduce Tx duty cycle)
-                                       if(!pMgntInfo->ForcedDataRate) //auto rate
-                                       {
-                                               if(pDM_Odm->TxRate != 0xFF)
-                                                       TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); 
-                                       }
-                                       else //force rate
-                                       {
-                                               TxRate = (u1Byte) pMgntInfo->ForcedDataRate;
-                                       }
-
-                                       value64 = (curRxOkCnt<<2);
-                                       if(curTxOkCnt < value64) //Downlink
-                                               ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-                                       else //Uplink
-                                       {
-                                               //DbgPrint("pDM_Odm->RFCalibrateInfo.ThermalValue = 0x%X\n", pDM_Odm->RFCalibrateInfo.ThermalValue);
-                                               //if(pDM_Odm->RFCalibrateInfo.ThermalValue < pHalData->EEPROMThermalMeter)
-                                               if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))
-                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-                                               else
-                                               {
-                                                       switch (TxRate)
-                                                       {
-                                                               case MGN_VHT1SS_MCS6:
-                                                               case MGN_VHT1SS_MCS5:
-                                                               case MGN_MCS6:
-                                                               case MGN_MCS5:
-                                                               case MGN_48M:
-                                                               case MGN_54M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea42b);
-                                                               break;
-                                                               case MGN_VHT1SS_MCS4:
-                                                               case MGN_MCS4:
-                                                               case MGN_36M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa42b);
-                                                               break;
-                                                               case MGN_VHT1SS_MCS3:
-                                                               case MGN_MCS3:
-                                                               case MGN_24M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa47f);
-                                                               break;
-                                                               case MGN_VHT1SS_MCS2:
-                                                               case MGN_MCS2:
-                                                               case MGN_18M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa57f);
-                                                               break;
-                                                               case MGN_VHT1SS_MCS1:
-                                                               case MGN_MCS1:
-                                                               case MGN_9M:
-                                                               case MGN_12M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa77f);
-                                                               break;
-                                                               case MGN_VHT1SS_MCS0:
-                                                               case MGN_MCS0:
-                                                               case MGN_6M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);
-                                                               break;
-                                                               default:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-                                                               break;
-                                                       }
-                                               }
-                                       }                               
-                               }
-                               else
-                               {
-                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-                               }
-
-                       }
-                       else if (IS_HARDWARE_TYPE_8812AU(Adapter)){
-                               if(pMgntInfo->RegTxDutyEnable)
-                               {
-                                       //2013.07.26 Wilson: debug for 8812AU thermal issue (reduce Tx duty cycle)
-                                       // it;s the same issue as 8811AU
-                                       if(!pMgntInfo->ForcedDataRate) //auto rate
-                                       {
-                                               if(pDM_Odm->TxRate != 0xFF)
-                                                       TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); 
-                                       }
-                                       else //force rate
-                                       {
-                                               TxRate = (u1Byte) pMgntInfo->ForcedDataRate;
-                                       }
-
-                                       value64 = (curRxOkCnt<<2);
-                                       if(curTxOkCnt < value64) //Downlink
-                                               ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-                                       else //Uplink
-                                       {
-                                               //DbgPrint("pDM_Odm->RFCalibrateInfo.ThermalValue = 0x%X\n", pDM_Odm->RFCalibrateInfo.ThermalValue);
-                                               //if(pDM_Odm->RFCalibrateInfo.ThermalValue < pHalData->EEPROMThermalMeter)
-                                               if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))
-                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-                                               else
-                                               {
-                                                       switch (TxRate)
-                                                       {
-                                                               case MGN_VHT2SS_MCS9:
-                                                               case MGN_VHT1SS_MCS9:                                                                   
-                                                               case MGN_VHT1SS_MCS8:
-                                                               case MGN_MCS15:
-                                                               case MGN_MCS7:                                                                  
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea44f);                                                     
-                                                               case MGN_VHT2SS_MCS8:
-                                                               case MGN_VHT1SS_MCS7:
-                                                               case MGN_MCS14:
-                                                               case MGN_MCS6:
-                                                               case MGN_54M:                                                                   
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa44f);
-                                                               case MGN_VHT2SS_MCS7:
-                                                               case MGN_VHT2SS_MCS6:
-                                                               case MGN_VHT1SS_MCS6:
-                                                               case MGN_VHT1SS_MCS5:
-                                                               case MGN_MCS13:
-                                                               case MGN_MCS5:
-                                                               case MGN_48M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa630);
-                                                               break;
-                                                               case MGN_VHT2SS_MCS5:
-                                                               case MGN_VHT2SS_MCS4:
-                                                               case MGN_VHT1SS_MCS4:
-                                                               case MGN_VHT1SS_MCS3:   
-                                                               case MGN_MCS12:
-                                                               case MGN_MCS4:  
-                                                               case MGN_MCS3:  
-                                                               case MGN_36M:
-                                                               case MGN_24M:   
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa730);
-                                                               break;
-                                                               case MGN_VHT2SS_MCS3:
-                                                               case MGN_VHT2SS_MCS2:
-                                                               case MGN_VHT2SS_MCS1:
-                                                               case MGN_VHT1SS_MCS2:
-                                                               case MGN_VHT1SS_MCS1:   
-                                                               case MGN_MCS11: 
-                                                               case MGN_MCS10: 
-                                                               case MGN_MCS9:          
-                                                               case MGN_MCS2:  
-                                                               case MGN_MCS1:
-                                                               case MGN_18M:   
-                                                               case MGN_12M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa830);
-                                                               break;
-                                                               case MGN_VHT2SS_MCS0:
-                                                               case MGN_VHT1SS_MCS0:
-                                                               case MGN_MCS0:  
-                                                               case MGN_MCS8:
-                                                               case MGN_9M:    
-                                                               case MGN_6M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);
-                                                               break;
-                                                               default:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-                                                               break;
-                                                       }
-                                               }
-                                       }                               
-                               }
-                               else
-                               {
-                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-                               }
-                       }
-                       else
-                               ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA Turbo on: EDCA_BE:0x%lx\n",EDCA_BE));
-
-               pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = TRUE;
-               
-               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));
-
-       }
-       else
-       {
-               // Turn Off EDCA turbo here.
-               // Restore original EDCA according to the declaration of AP.
-                if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
-               {
-                       Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, GET_WMM_PARAM_ELE_SINGLE_AC_PARAM(pStaQos->WMMParamEle, AC0_BE) );
-
-                       pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Restore EDCA BE: 0x%lx  \n",pDM_Odm->WMMEDCA_BE));
-
-               }
-       }
-
-////===============================
-////Set variables for next time.
-////===============================
-dm_CheckEdcaTurbo_EXIT:
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
-       pHalData->bIsAnyNonBEPkts = FALSE;
-       pMgntInfo->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
-       pMgntInfo->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
-       pMgntInfo->Ext_lastTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast;
-       pMgntInfo->Ext_lastRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast;
-#elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
-       precvpriv->bIsAnyNonBEPkts = FALSE;
-       pxmitpriv->last_tx_bytes = pxmitpriv->tx_bytes;
-       precvpriv->last_rx_bytes = precvpriv->rx_bytes;
-#endif
-
-}
-
-
-//check if edca turbo is disabled
-BOOLEAN
-odm_IsEdcaTurboDisable(
-       IN      PDM_ODM_T       pDM_Odm
-)
-{
-       PADAPTER                       Adapter = pDM_Odm->Adapter;
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
-       u4Byte                          IOTPeer=pMgntInfo->IOTPeer;
-#elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
-       struct registry_priv    *pregpriv = &Adapter->registrypriv;
-       struct mlme_ext_priv    *pmlmeext = &(Adapter->mlmeextpriv);
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-       u4Byte                         IOTPeer=pmlmeinfo->assoc_AP_vendor;
-       u1Byte                         WirelessMode=0xFF;                   //invalid value
-
-       if(pDM_Odm->pWirelessMode!=NULL)
-               WirelessMode=*(pDM_Odm->pWirelessMode);
-
-#endif
-
-       if(pDM_Odm->bBtDisableEdcaTurbo)
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable for BT!!\n"));
-               return TRUE;
-       }
-
-       if((!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))||
-               (pDM_Odm->bWIFITest)||
-               (IOTPeer>= HT_IOT_PEER_MAX))
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable\n"));
-               return TRUE;
-       }
-
-
-#if (DM_ODM_SUPPORT_TYPE ==ODM_WIN)
-       // 1. We do not turn on EDCA turbo mode for some AP that has IOT issue
-       // 2. User may disable EDCA Turbo mode with OID settings.
-       if(pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO){
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("IOTAction:EdcaTurboDisable\n"));
-               return  TRUE;
-               }
-               
-#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
-       //suggested by Jr.Luke: open TXOP for B/G/BG/A mode 2012-0215
-       if((WirelessMode==ODM_WM_B)||(WirelessMode==(ODM_WM_B|ODM_WM_G)||(WirelessMode==ODM_WM_G)||(WirelessMode=ODM_WM_A))
-               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, ODM_Read4Byte(pDM_Odm, ODM_EDCA_BE_PARAM)|0x5E0000); 
-       
-       if(pDM_Odm->SupportICType==ODM_RTL8192D)                {
-               if ((pregpriv->wifi_spec == 1)  || (pmlmeext->cur_wireless_mode == WIRELESS_11B)) {
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("92D:EdcaTurboDisable\n"));
-                       return TRUE;
-               }
-       }       
-       else
-       {
-               if((pregpriv->wifi_spec == 1) || (pmlmeinfo->HT_enable == 0)){
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("Others:EdcaTurboDisable\n"));
-                       return TRUE;
-               }
-       }
-
-#endif
-
-       return  FALSE;
-       
-
-}
-
-//add iot case here: for MP/CE
-VOID 
-ODM_EdcaParaSelByIot(
-       IN      PDM_ODM_T       pDM_Odm,
-       OUT     u4Byte          *EDCA_BE_UL,
-       OUT u4Byte              *EDCA_BE_DL
-       )
-{
-
-       PADAPTER                       Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
-       u4Byte                         IOTPeer=0;
-       u4Byte                         ICType=pDM_Odm->SupportICType;
-       u1Byte                         WirelessMode=0xFF;                   //invalid value
-       u4Byte                          RFType=pDM_Odm->RFType;
-         u4Byte                         IOTPeerSubType=0;
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
-       u1Byte                          TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;
-
-#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-       #ifdef CONFIG_BT_COEXIST
-       struct btcoexist_priv   *pbtpriv = &(pHalData->bt_coexist);     
-       #endif
-       u1Byte bbtchange =FALSE;
-#endif
-
-       if(pDM_Odm->pWirelessMode!=NULL)
-               WirelessMode=*(pDM_Odm->pWirelessMode);
-               
-///////////////////////////////////////////////////////////
-////list paramter for different platform
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)     
-       IOTPeer=pMgntInfo->IOTPeer;
-       IOTPeerSubType=pMgntInfo->IOTPeerSubtype;
-       GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);
-
-#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
-       IOTPeer=pmlmeinfo->assoc_AP_vendor;
-       #ifdef CONFIG_BT_COEXIST
-       if(pbtpriv->BT_Coexist)
-       {
-               if( (pbtpriv->BT_EDCA[UP_LINK]!=0) ||  (pbtpriv->BT_EDCA[DOWN_LINK]!=0))
-                       bbtchange = TRUE;               
-       }
-       #endif
-
-#endif
-
-       if(ICType==ODM_RTL8192D)
-       {      
-               // Single PHY
-               if(pDM_Odm->RFType==ODM_2T2R)
-               {
-                       (*EDCA_BE_UL) = 0x60a42b;    //0x5ea42b;
-                       (*EDCA_BE_DL) = 0x60a42b;    //0x5ea42b;
-
-               }
-               else
-               {
-                       (*EDCA_BE_UL) = 0x6ea42b;
-                       (*EDCA_BE_DL) = 0x6ea42b;
-               }
-
-       }
-////============================
-/// IOT case for MP
-////============================       
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
-       else
-       {
-
-               if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE){
-                       if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R))                 {
-                               (*EDCA_BE_UL) = 0x60a42b;
-                               (*EDCA_BE_DL) = 0x60a42b;
-                       }
-                       else
-                       {
-                               (*EDCA_BE_UL) = 0x6ea42b;
-                               (*EDCA_BE_DL) = 0x6ea42b;
-                       }
-               }
-       }
-       if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)
-       {
-               (*EDCA_BE_UL) = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_UL[ExtAdapter->MgntInfo.IOTPeer];
-               (*EDCA_BE_DL) = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_DL[ExtAdapter->MgntInfo.IOTPeer];
-       }
-     
-       #if (INTEL_PROXIMITY_SUPPORT == 1)
-       if(pMgntInfo->IntelClassModeInfo.bEnableCA == TRUE)
-       {
-               (*EDCA_BE_UL) = (*EDCA_BE_DL) = 0xa44f;
-       }
-       else
-       #endif          
-       {
-               if((!pMgntInfo->bDisableFrameBursting) && 
-                       (pMgntInfo->IOTAction & (HT_IOT_ACT_FORCED_ENABLE_BE_TXOP|HT_IOT_ACT_AMSDU_ENABLE)))
-               {// To check whether we shall force turn on TXOP configuration.
-                       if(!((*EDCA_BE_UL) & 0xffff0000))
-                               (*EDCA_BE_UL) |= 0x005e0000; // Force TxOP limit to 0x005e for UL.
-                       if(!((*EDCA_BE_DL) & 0xffff0000))
-                               (*EDCA_BE_DL) |= 0x005e0000; // Force TxOP limit to 0x005e for DL.
-               }
-               
-               //92D txop can't be set to 0x3e for cisco1250
-               if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
-               {
-                       (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
-                       (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
-               }
-               //merge from 92s_92c_merge temp brunch v2445    20120215 
-               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)))
-               {
-                       (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];
-               }
-               else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))
-               {
-                       (*EDCA_BE_DL) = 0xa630;
-               }
-
-               else if(IOTPeer == HT_IOT_PEER_MARVELL)
-               {
-                       (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
-                       (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
-               }
-               else if(IOTPeer == HT_IOT_PEER_ATHEROS)
-               {
-                       // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue. 
-                       (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
-                       
-                       if(ICType == ODM_RTL8821)
-                                (*EDCA_BE_DL) = 0x5ea630;
-                       
-               }
-       }
-
-       if((ICType == ODM_RTL8192D)&&(IOTPeerSubType == HT_IOT_PEER_LINKSYS_E4200_V1)&&((WirelessMode==ODM_WM_N5G)))
-       {
-               (*EDCA_BE_DL) = 0x432b;
-               (*EDCA_BE_UL) = 0x432b;
-       }               
-
-
-
-       if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8192E))           //add 8812AU/8812AE
-       {
-               (*EDCA_BE_UL) = 0x5ea42b;
-               (*EDCA_BE_DL) = 0x5ea42b;
-
-               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)));
-       }
-
-       // Revised for Atheros DIR-655 IOT issue to improve down link TP, added by Roger, 2013.03.22.
-       if((ICType == ODM_RTL8723A) && (IOTPeerSubType== HT_IOT_PEER_ATHEROS_DIR655) && 
-               (pMgntInfo->dot11CurrentChannelNumber == 6))
-       {
-               (*EDCA_BE_DL) = 0xa92b;
-       }
-
-////============================
-/// IOT case for CE 
-////============================
-#elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
-
-       if(RFType==ODM_RTL8192D)
-       {
-               if((IOTPeer == HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
-               {
-                       (*EDCA_BE_UL) = EDCAParam[IOTPeer][UP_LINK];
-                       (*EDCA_BE_DL)=EDCAParam[IOTPeer][DOWN_LINK];
-               }
-               else if((IOTPeer == HT_IOT_PEER_AIRGO) &&
-                       ((WirelessMode==ODM_WM_B)||(WirelessMode==(ODM_WM_B|ODM_WM_G)))) 
-                       (*EDCA_BE_DL)=0x00a630;
-               
-               else if((IOTPeer== HT_IOT_PEER_ATHEROS) && 
-                                       (WirelessMode&ODM_WM_N5G) &&
-                                       (Adapter->securitypriv.dot11PrivacyAlgrthm == _AES_ ))
-                       (*EDCA_BE_DL)=0xa42b;
-                       
-       }
-       //92C IOT case:
-       else
-       {
-               #ifdef CONFIG_BT_COEXIST
-               if(bbtchange)
-               {
-                       (*EDCA_BE_UL) = pbtpriv->BT_EDCA[UP_LINK];
-                       (*EDCA_BE_DL) = pbtpriv->BT_EDCA[DOWN_LINK];            
-               }
-               else
-               #endif
-               {
-                       if((IOTPeer == HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
-                       {
-                               (*EDCA_BE_UL) = EDCAParam[IOTPeer][UP_LINK];
-                               (*EDCA_BE_DL)=EDCAParam[IOTPeer][DOWN_LINK];
-                       }
-                       else
-                       {
-                               (*EDCA_BE_UL)=EDCAParam[HT_IOT_PEER_UNKNOWN][UP_LINK];
-                               (*EDCA_BE_DL)=EDCAParam[HT_IOT_PEER_UNKNOWN][DOWN_LINK];
-                       }
-               }
-               if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE){
-                       if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R))
-                       {
-                               (*EDCA_BE_UL) = 0x60a42b;
-                               (*EDCA_BE_DL) = 0x60a42b;
-                       }
-                       else
-                       {
-                               (*EDCA_BE_UL) = 0x6ea42b;
-                               (*EDCA_BE_DL) = 0x6ea42b;
-                       }
-               }
-
-       }
-#endif
-
-       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)));
-
-}
-
-
-VOID
-odm_EdcaChooseTrafficIdx( 
-       IN      PDM_ODM_T               pDM_Odm,
-       IN      u8Byte                          cur_tx_bytes,  
-       IN      u8Byte                          cur_rx_bytes, 
-       IN      BOOLEAN                 bBiasOnRx,
-       OUT BOOLEAN             *pbIsCurRDLState
-       )
-{      
-       
-       
-       if(bBiasOnRx)
-       {
-         
-               if(cur_tx_bytes>(cur_rx_bytes*4))
-               {
-                       *pbIsCurRDLState=FALSE;
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Uplink Traffic\n "));
-
-               }
-               else
-               {
-                       *pbIsCurRDLState=TRUE;
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));
-
-               }
-       }
-       else
-       {
-               if(cur_rx_bytes>(cur_tx_bytes*4))
-               {
-                       *pbIsCurRDLState=TRUE;
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Downlink        Traffic\n"));
-
-               }
-               else
-               {
-                       *pbIsCurRDLState=FALSE;
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));
-               }
-       }
-
-       return ;
-}
-
-#endif
-
-#if((DM_ODM_SUPPORT_TYPE==ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
-
-void odm_EdcaParaInit(
-       IN      PDM_ODM_T       pDM_Odm
-       )
-{
-       prtl8192cd_priv priv            = pDM_Odm->priv;
-       int   mode=priv->pmib->dot11BssType.net_work_type;
-       
-       static unsigned int slot_time, VO_TXOP, VI_TXOP, sifs_time;
-       struct ParaRecord EDCA[4];
-
-        memset(EDCA, 0, 4*sizeof(struct ParaRecord));
-
-       sifs_time = 10;
-       slot_time = 20;
-
-       if (mode & (ODM_WM_N24G|ODM_WM_N5G))
-               sifs_time = 16;
-
-       if (mode & (ODM_WM_N24G|ODM_WM_N5G| ODM_WM_G|ODM_WM_A))
-               slot_time = 9;
-
-
-#if((defined(RTL_MANUAL_EDCA))&&(DM_ODM_SUPPORT_TYPE==ODM_AP))
-        if( priv->pmib->dot11QosEntry.ManualEDCA ) {
-                if( OPMODE & WIFI_AP_STATE )
-                        memcpy(EDCA, priv->pmib->dot11QosEntry.AP_manualEDCA, 4*sizeof(struct ParaRecord));
-                else
-                        memcpy(EDCA, priv->pmib->dot11QosEntry.STA_manualEDCA, 4*sizeof(struct ParaRecord));
-
-               #ifdef WIFI_WMM
-               if (QOS_ENABLE)
-                       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));
-               else
-               #endif
-                       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));
-
-       }else
-       #endif //RTL_MANUAL_EDCA
-       {
-
-                if(OPMODE & WIFI_AP_STATE)
-                {
-                       memcpy(EDCA, rtl_ap_EDCA, 2*sizeof(struct ParaRecord));
-
-                       if(mode & (ODM_WM_A|ODM_WM_G|ODM_WM_N24G|ODM_WM_N5G))
-                               memcpy(&EDCA[VI], &rtl_ap_EDCA[VI_AG], 2*sizeof(struct ParaRecord));
-                       else
-                               memcpy(&EDCA[VI], &rtl_ap_EDCA[VI], 2*sizeof(struct ParaRecord));
-                }
-                else
-                {
-                       memcpy(EDCA, rtl_sta_EDCA, 2*sizeof(struct ParaRecord));
-
-                       if(mode & (ODM_WM_A|ODM_WM_G|ODM_WM_N24G|ODM_WM_N5G))
-                               memcpy(&EDCA[VI], &rtl_sta_EDCA[VI_AG], 2*sizeof(struct ParaRecord));
-                       else
-                               memcpy(&EDCA[VI], &rtl_sta_EDCA[VI], 2*sizeof(struct ParaRecord));
-                }
-                
-       #ifdef WIFI_WMM
-               if (QOS_ENABLE)
-                       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));
-               else
-       #endif
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
-                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM,  (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
-#elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
-                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM,  (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + 2* slot_time));
-#endif
-                       
-
-       }
-
-       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));
-       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));
-       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));
-//     ODM_Write1Byte(pDM_Odm,ACMHWCTRL, 0x00);
-
-       priv->pshare->iot_mode_enable = 0;
-#if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-       if (priv->pshare->rf_ft_var.wifi_beq_iot)
-               priv->pshare->iot_mode_VI_exist = 0;
-       
-       #ifdef WMM_VIBE_PRI
-       priv->pshare->iot_mode_BE_exist = 0;
-       #endif
-       
-       #ifdef LOW_TP_TXOP
-       priv->pshare->BE_cwmax_enhance = 0;
-       #endif
-
-#elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
-      priv->pshare->iot_mode_BE_exist = 0;   
-#endif
-       priv->pshare->iot_mode_VO_exist = 0;
-}
-
-BOOLEAN
-ODM_ChooseIotMainSTA(
-       IN      PDM_ODM_T               pDM_Odm,
-       IN      PSTA_INFO_T             pstat
-       )
-{
-       prtl8192cd_priv priv = pDM_Odm->priv;
-       BOOLEAN         bhighTP_found_pstat=FALSE;
-       
-       if ((GET_ROOT(priv)->up_time % 2) == 0) {
-               unsigned int tx_2s_avg = 0;
-               unsigned int rx_2s_avg = 0;
-               int i=0, aggReady=0;
-               unsigned long total_sum = (priv->pshare->current_tx_bytes+priv->pshare->current_rx_bytes);
-
-               pstat->current_tx_bytes += pstat->tx_byte_cnt;
-               pstat->current_rx_bytes += pstat->rx_byte_cnt;
-
-               if (total_sum != 0) {
-                       if (total_sum <= 100) {
-                       tx_2s_avg = (unsigned int)((pstat->current_tx_bytes*100) / total_sum);
-                       rx_2s_avg = (unsigned int)((pstat->current_rx_bytes*100) / total_sum);
-                       } else {
-                               tx_2s_avg = (unsigned int)(pstat->current_tx_bytes / (total_sum / 100));
-                               rx_2s_avg = (unsigned int)(pstat->current_rx_bytes / (total_sum / 100));
-                       }
-
-               }
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
-               if (pstat->ht_cap_len) {
-                       if ((tx_2s_avg + rx_2s_avg) >=25 /*50*/) {
-
-                                       priv->pshare->highTP_found_pstat = pstat;
-                                       bhighTP_found_pstat=TRUE;
-                               }
-                       }
-#elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
-               for(i=0; i<8; i++)
-                       aggReady += (pstat->ADDBA_ready[i]);
-               if (pstat->ht_cap_len && aggReady) 
-               {
-                       if ((tx_2s_avg + rx_2s_avg >= 25)) {
-                               priv->pshare->highTP_found_pstat = pstat;
-                       }
-                       
-               #ifdef CLIENT_MODE
-                       if (OPMODE & WIFI_STATION_STATE) {
-#if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
-                               if ((pstat->IOTPeer==HT_IOT_PEER_RALINK) && ((tx_2s_avg + rx_2s_avg) >= 45))
-#else
-                               if(pstat->is_ralink_sta && ((tx_2s_avg + rx_2s_avg) >= 45))
-#endif                                 
-                                       priv->pshare->highTP_found_pstat = pstat;
-               }
-               #endif                          
-       }
-#endif
-       } else {
-               pstat->current_tx_bytes = pstat->tx_byte_cnt;
-               pstat->current_rx_bytes = pstat->rx_byte_cnt;
-       }
-
-       return bhighTP_found_pstat;
-}
-
-
-#ifdef WIFI_WMM
-VOID
-ODM_IotEdcaSwitch(
-       IN      PDM_ODM_T               pDM_Odm,
-       IN      unsigned char           enable
-       )
-{
-       prtl8192cd_priv priv    = pDM_Odm->priv;
-       int   mode=priv->pmib->dot11BssType.net_work_type;
-       unsigned int slot_time = 20, sifs_time = 10, BE_TXOP = 47, VI_TXOP = 94;
-       unsigned int vi_cw_max = 4, vi_cw_min = 3, vi_aifs;
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
-       if (!(!priv->pmib->dot11OperationEntry.wifi_specific ||
-               ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
-       #ifdef CLIENT_MODE
-               || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
-       #endif
-               ))
-               return;
-#endif
-
-       if ((mode & (ODM_WM_N24G|ODM_WM_N5G)) && (priv->pshare->ht_sta_num
-       #ifdef WDS
-               || ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum)
-       #endif
-               ))
-               sifs_time = 16;
-
-       if (mode & (ODM_WM_N24G|ODM_WM_N5G|ODM_WM_G|ODM_WM_A)) {
-               slot_time = 9;
-       } 
-       else
-       {
-               BE_TXOP = 94;
-               VI_TXOP = 188;
-       }
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
-       if (priv->pshare->iot_mode_VO_exist) {
-               // to separate AC_VI and AC_BE to avoid using the same EDCA settings
-               if (priv->pshare->iot_mode_BE_exist) {
-                       vi_cw_max = 5;
-                       vi_cw_min = 3;
-               } else {
-                       vi_cw_max = 6;
-                       vi_cw_min = 4;
-               }
-       }
-       vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
-
-       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);
-
-       
-#elif (DM_ODM_SUPPORT_TYPE==ODM_AP)
-       if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific) {
-               if (priv->pshare->iot_mode_VO_exist) {
-       #ifdef WMM_VIBE_PRI
-                       if (priv->pshare->iot_mode_BE_exist) 
-                       {
-                               vi_cw_max = 5;
-                               vi_cw_min = 3;
-                               vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
-                       }
-                       else 
-       #endif
-                       {
-                       vi_cw_max = 6;
-                       vi_cw_min = 4;
-                       vi_aifs = 0x2b;
-                       }
-               } 
-               else {
-                       vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
-               }
-
-               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);
-       }
-#endif
-
-
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
-       if (priv->pshare->rf_ft_var.wifi_beq_iot && priv->pshare->iot_mode_VI_exist) 
-               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (10 << 12) | (4 << 8) | 0x4f);
-       else if(!enable)
-#elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)      
-       if(!enable)                                 //if iot is disable ,maintain original BEQ PARAM
-#endif
-               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (((OPMODE & WIFI_AP_STATE)?6:10) << 12) | (4 << 8)
-                       | (sifs_time + 3 * slot_time));
-       else
-       {
-               int txop_enlarge;
-               int txop;
-               unsigned int cw_max;
-               unsigned int txop_close;
-               
-       #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP))
-                       cw_max = ((priv->pshare->BE_cwmax_enhance) ? 10 : 6);
-                       txop_close = ((priv->pshare->rf_ft_var.low_tp_txop && priv->pshare->rf_ft_var.low_tp_txop_close) ? 1 : 0);
-
-                       if(priv->pshare->txop_enlarge == 0xe)   //if intel case
-                               txop = (txop_close ? 0 : (BE_TXOP*2));
-                       else                                                        //if other case
-                               txop = (txop_close ? 0: (BE_TXOP*priv->pshare->txop_enlarge));
-       #else
-                       cw_max=6;
-                       if((priv->pshare->txop_enlarge==0xe)||(priv->pshare->txop_enlarge==0xd))
-                               txop=BE_TXOP*2;
-                       else
-                               txop=BE_TXOP*priv->pshare->txop_enlarge;
-
-       #endif
-                           
-               if (priv->pshare->ht_sta_num
-       #ifdef WDS
-                       || ((OPMODE & WIFI_AP_STATE) && (mode & (ODM_WM_N24G|ODM_WM_N5G)) &&
-                       priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum)
-       #endif
-                       ) 
-                       {
-
-                       if (priv->pshare->txop_enlarge == 0xe) {
-                               // is intel client, use a different edca value
-                               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop<< 16) | (cw_max<< 12) | (4 << 8) | 0x1f);
-                               priv->pshare->txop_enlarge = 2;
-                       } 
-#if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-       #ifndef LOW_TP_TXOP
-                        else if (priv->pshare->txop_enlarge == 0xd) {
-                               // is intel ralink, use a different edca value
-                               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (4 << 12) | (3 << 8) | 0x19);
-                               priv->pshare->txop_enlarge = 2;
-                       } 
-       #endif
-#endif
-                       else 
-                       {
-                               if (pDM_Odm->RFType==ODM_2T2R)
-                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
-                                               (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
-                               else
-                               #if(DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP)
-                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
-                                               (((priv->pshare->BE_cwmax_enhance) ? 10 : 5) << 12) | (3 << 8) | (sifs_time + 2 * slot_time));
-                               #else
-                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
-                                               (5 << 12) | (3 << 8) | (sifs_time + 2 * slot_time));
-
-                               #endif
-                       }
-               }
-              else 
-              {
- #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP))
-                        ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (BE_TXOP << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
- #else
-               #if defined(CONFIG_RTL_8196D) || defined(CONFIG_RTL_8196E) || (defined(CONFIG_RTL_8197D) && !defined(CONFIG_PORT0_EXT_GIGA))
-                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM,  (BE_TXOP*2 << 16) | (cw_max << 12) | (5 << 8) | (sifs_time + 3 * slot_time));
-               #else
-                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM,  (BE_TXOP*2 << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
-               #endif
-               
- #endif
-              }
-
-       }
-}
-#endif
-
-VOID 
-odm_IotEngine(
-       IN      PDM_ODM_T       pDM_Odm
-       )
-{
-
-       struct rtl8192cd_priv *priv=pDM_Odm->priv;
-       PSTA_INFO_T pstat = NULL;
-       u4Byte i;
-       
-#ifdef WIFI_WMM
-       unsigned int switch_turbo = 0;
-#endif 
-////////////////////////////////////////////////////////
-//  if EDCA Turbo function is not supported or Manual EDCA Setting
-//  then return
-////////////////////////////////////////////////////////
-       if(!(pDM_Odm->SupportAbility&ODM_MAC_EDCA_TURBO)){
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO NOT SUPPORTED\n"));
-               return;
-       }
-       
-#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined(RTL_MANUAL_EDCA) && defined(WIFI_WMM))
-       if(priv->pmib->dot11QosEntry.ManualEDCA){
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO OFF: MANUAL SETTING\n"));
-               return ;
-       }
-#endif 
-
-#if !(DM_ODM_SUPPORT_TYPE &ODM_AP)
- //////////////////////////////////////////////////////
- //find high TP STA every 2s
-//////////////////////////////////////////////////////
-       if ((GET_ROOT(priv)->up_time % 2) == 0) 
-               priv->pshare->highTP_found_pstat==NULL;
-
-#if 0
-       phead = &priv->asoc_list;
-       plist = phead->next;
-       while(plist != phead)   {
-               pstat = list_entry(plist, struct stat_info, asoc_list);
-
-               if(ODM_ChooseIotMainSTA(pDM_Odm, pstat));              //find the correct station
-                       break;
-               if (plist == plist->next)                                          //the last plist 
-                       break;
-               plist = plist->next;
-       };
-#endif
-
-       //find highTP STA
-       for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {
-               pstat = pDM_Odm->pODM_StaInfo[i];
-               if(IS_STA_VALID(pstat) && (ODM_ChooseIotMainSTA(pDM_Odm, pstat)))        //find the correct station
-                               break;
-       }
-
- //////////////////////////////////////////////////////
- //if highTP STA is not found, then return
- //////////////////////////////////////////////////////
-       if(priv->pshare->highTP_found_pstat==NULL)      {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO OFF: NO HT STA FOUND\n"));
-               return;
-       }
-#endif
-
-       pstat=priv->pshare->highTP_found_pstat;
-
-
-#ifdef WIFI_WMM
-       if (QOS_ENABLE) {
-               if (!priv->pmib->dot11OperationEntry.wifi_specific 
-               #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-                       ||((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
-               #elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
-                       || (priv->pmib->dot11OperationEntry.wifi_specific == 2)
-               #endif
-                       ) {
-                       if (priv->pshare->iot_mode_enable &&
-                               ((priv->pshare->phw->VO_pkt_count > 50) ||
-                                (priv->pshare->phw->VI_pkt_count > 50) ||
-                                (priv->pshare->phw->BK_pkt_count > 50))) {
-                               priv->pshare->iot_mode_enable = 0;
-                               switch_turbo++;
-                       } else if ((!priv->pshare->iot_mode_enable) &&
-                               ((priv->pshare->phw->VO_pkt_count < 50) &&
-                                (priv->pshare->phw->VI_pkt_count < 50) &&
-                                (priv->pshare->phw->BK_pkt_count < 50))) {
-                               priv->pshare->iot_mode_enable++;
-                               switch_turbo++;
-                       }
-               }
-
-
-               #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-               if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific)
-               #elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
-               if (priv->pmib->dot11OperationEntry.wifi_specific) 
-               #endif
-               {
-                       if (!priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count > 50)) {
-                               priv->pshare->iot_mode_VO_exist++;
-                               switch_turbo++;
-                       } else if (priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count < 50)) {
-                               priv->pshare->iot_mode_VO_exist = 0;
-                               switch_turbo++;
-                       }
-#if((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_VIBE_PRI)))
-                       if (priv->pshare->iot_mode_VO_exist) {
-                               //printk("[%s %d] BE_pkt_count=%d\n", __FUNCTION__, __LINE__, priv->pshare->phw->BE_pkt_count);
-                               if (!priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count > 250)) {
-                                       priv->pshare->iot_mode_BE_exist++;
-                                       switch_turbo++;
-                               } else if (priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count < 250)) {
-                                       priv->pshare->iot_mode_BE_exist = 0;
-                                       switch_turbo++;
-                               }
-                       }
-#endif
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
-                       if (priv->pshare->rf_ft_var.wifi_beq_iot) 
-                       {
-                               if (!priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count > 50)) {
-                                       priv->pshare->iot_mode_VI_exist++;
-                                       switch_turbo++;
-                               } else if (priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count < 50)) {
-                                       priv->pshare->iot_mode_VI_exist = 0;
-                                       switch_turbo++;
-                               }
-                       }
-#endif
-
-               }
-               else if (!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower) {
-                  if (priv->pshare->txop_enlarge) {
-                          priv->pshare->txop_enlarge = 0;
-                          if (priv->pshare->iot_mode_enable)
-                                       switch_turbo++;
-                               }
-               }
-
-#if(defined(CLIENT_MODE) && (DM_ODM_SUPPORT_TYPE==ODM_AP))
-        if ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
-        {
-            if (priv->pshare->iot_mode_enable &&
-                (((priv->pshare->phw->VO_pkt_count > 50) ||
-                 (priv->pshare->phw->VI_pkt_count > 50) ||
-                 (priv->pshare->phw->BK_pkt_count > 50)) ||
-                 (pstat && (!pstat->ADDBA_ready[0]) & (!pstat->ADDBA_ready[3]))))
-            {
-                priv->pshare->iot_mode_enable = 0;
-                switch_turbo++;
-            }
-            else if ((!priv->pshare->iot_mode_enable) &&
-                (((priv->pshare->phw->VO_pkt_count < 50) &&
-                 (priv->pshare->phw->VI_pkt_count < 50) &&
-                 (priv->pshare->phw->BK_pkt_count < 50)) &&
-                 (pstat && (pstat->ADDBA_ready[0] | pstat->ADDBA_ready[3]))))
-            {
-                priv->pshare->iot_mode_enable++;
-                switch_turbo++;
-            }
-        }
-#endif
-
-               priv->pshare->phw->VO_pkt_count = 0;
-               priv->pshare->phw->VI_pkt_count = 0;
-               priv->pshare->phw->BK_pkt_count = 0;
-
-       #if((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_VIBE_PRI)))
-               priv->pshare->phw->BE_pkt_count = 0;
-       #endif
-               
-       #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-               if (priv->pshare->rf_ft_var.wifi_beq_iot)
-                       priv->pshare->phw->VI_rx_pkt_count = 0;
-               #endif
-
-       }
-#endif
-
-       if ((priv->up_time % 2) == 0) {
-               /*
-                * decide EDCA content for different chip vendor
-                */
-#ifdef WIFI_WMM
-       #if(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
-               if (QOS_ENABLE && (!priv->pmib->dot11OperationEntry.wifi_specific || (priv->pmib->dot11OperationEntry.wifi_specific == 2)
-       
-       #elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
-               if (QOS_ENABLE && (!priv->pmib->dot11OperationEntry.wifi_specific || 
-                       ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
-               #ifdef CLIENT_MODE
-            || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
-               #endif
-       #endif
-               ))
-       
-               {
-
-                       if (pstat && pstat->rssi >= priv->pshare->rf_ft_var.txop_enlarge_upper) {
-#ifdef LOW_TP_TXOP
-#if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
-                               if (pstat->IOTPeer==HT_IOT_PEER_INTEL)
-#else
-                               if (pstat->is_intel_sta)
-#endif                                 
-                               {
-                                       if (priv->pshare->txop_enlarge != 0xe)
-                                       {
-                                               priv->pshare->txop_enlarge = 0xe;
-
-                                               if (priv->pshare->iot_mode_enable)
-                                                       switch_turbo++;
-                                       }
-                               } 
-                               else if (priv->pshare->txop_enlarge != 2) 
-                               {
-                                       priv->pshare->txop_enlarge = 2;
-                                       if (priv->pshare->iot_mode_enable)
-                                               switch_turbo++;
-                               }
-#else
-                               if (priv->pshare->txop_enlarge != 2)
-                               {
-#if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
-                                       if (pstat->IOTPeer==HT_IOT_PEER_INTEL)
-#else                          
-                                       if (pstat->is_intel_sta)
-#endif                                         
-                                               priv->pshare->txop_enlarge = 0xe;                                               
-#if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
-                                       else if (pstat->IOTPeer==HT_IOT_PEER_RALINK)
-#else
-                                       else if (pstat->is_ralink_sta)
-#endif                                         
-                                               priv->pshare->txop_enlarge = 0xd;                                               
-                                       else
-                                               priv->pshare->txop_enlarge = 2;
-
-                                       if (priv->pshare->iot_mode_enable)
-                                               switch_turbo++;
-                               }
-#endif
-#if 0
-                               if (priv->pshare->txop_enlarge != 2) 
-                               {
-                               #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-                                       if (pstat->IOTPeer==HT_IOT_PEER_INTEL)
-                               #else
-                                       if (pstat->is_intel_sta)
-                               #endif                                  
-                                               priv->pshare->txop_enlarge = 0xe;
-                               #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-                                       else if (pstat->IOTPeer==HT_IOT_PEER_RALINK)
-                                               priv->pshare->txop_enlarge = 0xd;                                               
-                               #endif
-                                       else
-                                               priv->pshare->txop_enlarge = 2;
-                                       if (priv->pshare->iot_mode_enable)
-                                               switch_turbo++;
-                               }
-#endif
-                       }
-                       else if (!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower) 
-                       {
-                               if (priv->pshare->txop_enlarge) {
-                                       priv->pshare->txop_enlarge = 0;
-                                       if (priv->pshare->iot_mode_enable)
-                                               switch_turbo++;
-                               }
-                       }
-
-#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&( defined LOW_TP_TXOP))
-                       // for Intel IOT, need to enlarge CW MAX from 6 to 10
-                       if (pstat && pstat->is_intel_sta && (((pstat->tx_avarage+pstat->rx_avarage)>>10) < 
-                                       priv->pshare->rf_ft_var.cwmax_enhance_thd)) 
-                       {
-                               if (!priv->pshare->BE_cwmax_enhance && priv->pshare->iot_mode_enable)
-                               {
-                                       priv->pshare->BE_cwmax_enhance = 1;
-                                       switch_turbo++;
-                               }
-                       } else {
-                               if (priv->pshare->BE_cwmax_enhance) {
-                                       priv->pshare->BE_cwmax_enhance = 0;
-                                       switch_turbo++;
-                               }
-                       }
-#endif
-               }
-#endif
-               priv->pshare->current_tx_bytes = 0;
-               priv->pshare->current_rx_bytes = 0;
-       }
-       
-#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined( SW_TX_QUEUE))
-       if ((priv->assoc_num > 1) && (AMPDU_ENABLE))
-       {
-               if (priv->swq_txmac_chg >= priv->pshare->rf_ft_var.swq_en_highthd){
-                       if ((priv->swq_en == 0)){
-                               switch_turbo++;
-                               if (priv->pshare->txop_enlarge == 0)
-                                       priv->pshare->txop_enlarge = 2;
-                               priv->swq_en = 1;
-                               }
-                       else
-                       {
-                               if ((switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0))
-                               {
-                                       priv->pshare->txop_enlarge = 2;
-                                       switch_turbo--;
-                               }
-                       }
-               }
-               else if(priv->swq_txmac_chg <= priv->pshare->rf_ft_var.swq_dis_lowthd){
-                       priv->swq_en = 0;
-               }
-               else if ((priv->swq_en == 1) && (switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0))        {
-                       priv->pshare->txop_enlarge = 2;
-                       switch_turbo--;
-               }
-    }
-#if ((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined CONFIG_RTL_819XD))
-    else if( (priv->assoc_num == 1) && (AMPDU_ENABLE)) {               
-        if (pstat) {
-                       int en_thd = 14417920>>(priv->up_time % 2);
-            if ((priv->swq_en == 0) && (pstat->current_tx_bytes > en_thd) && (pstat->current_rx_bytes > en_thd) )  { //50Mbps
-                priv->swq_en = 1;
-                               priv->swqen_keeptime = priv->up_time;
-            }
-            else if ((priv->swq_en == 1) && ((pstat->tx_avarage < 4587520) || (pstat->rx_avarage < 4587520))) { //35Mbps
-                priv->swq_en = 0;
-                               priv->swqen_keeptime = 0;
-            }
-        }
-        else {
-            priv->swq_en = 0;
-                       priv->swqen_keeptime = 0;
-        }
-    }
-#endif
-#endif
-
-#ifdef WIFI_WMM
-#ifdef LOW_TP_TXOP
-       if ((!priv->pmib->dot11OperationEntry.wifi_specific || (priv->pmib->dot11OperationEntry.wifi_specific == 2))
-               && QOS_ENABLE) {
-               if (switch_turbo || priv->pshare->rf_ft_var.low_tp_txop) {
-                       unsigned int thd_tp;
-                       unsigned char under_thd;
-                       unsigned int curr_tp;
-
-                       if (priv->pmib->dot11BssType.net_work_type & (ODM_WM_N24G|ODM_WM_N5G| ODM_WM_G))
-                       {
-                               // Determine the upper bound throughput threshold.
-                               if (priv->pmib->dot11BssType.net_work_type & (ODM_WM_N24G|ODM_WM_N5G)) {
-                                       if (priv->assoc_num && priv->assoc_num != priv->pshare->ht_sta_num)
-                                               thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g;
-                                       else
-                                               thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_n;
-                               }
-                               else
-                                       thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g;
-
-                               // Determine to close txop.
-                               curr_tp = (unsigned int)(priv->ext_stats.tx_avarage>>17) + (unsigned int)(priv->ext_stats.rx_avarage>>17);
-                               if (curr_tp <= thd_tp && curr_tp >= priv->pshare->rf_ft_var.low_tp_txop_thd_low)
-                                       under_thd = 1;
-                               else
-                                       under_thd = 0;
-                       }
-                       else
-                       {
-                               under_thd = 0;
-                       }
-
-                       if (switch_turbo) 
-                       {
-                               priv->pshare->rf_ft_var.low_tp_txop_close = under_thd;
-                               priv->pshare->rf_ft_var.low_tp_txop_count = 0;
-                       }
-                       else if (priv->pshare->iot_mode_enable && (priv->pshare->rf_ft_var.low_tp_txop_close != under_thd)) {
-                               priv->pshare->rf_ft_var.low_tp_txop_count++;
-                               if (priv->pshare->rf_ft_var.low_tp_txop_close) {
-                                       priv->pshare->rf_ft_var.low_tp_txop_count = priv->pshare->rf_ft_var.low_tp_txop_delay;
-                               }
-                               if (priv->pshare->rf_ft_var.low_tp_txop_count ==priv->pshare->rf_ft_var.low_tp_txop_delay) 
-
-                               {                                       
-                                       priv->pshare->rf_ft_var.low_tp_txop_count = 0;
-                                       priv->pshare->rf_ft_var.low_tp_txop_close = under_thd;
-                                       switch_turbo++;
-                               }
-                       } 
-                       else 
-                       {
-                               priv->pshare->rf_ft_var.low_tp_txop_count = 0;
-                       }
-               }
-       }
-#endif         
-
-       if (switch_turbo)
-               ODM_IotEdcaSwitch( pDM_Odm, priv->pshare->iot_mode_enable );
-#endif
-}
-#endif
-
-
-#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
-
-//
-// LukeLee: 
-// PSD function will be moved to FW in future IC, but now is only implemented in MP platform
-// So PSD function will not be incorporated to common ODM
-//
-#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
-//#if(RTL8723_FPGA_VERIFICATION == 1)
-//#define      PSD_RESCAN              1
-//#else
-//#define      PSD_RESCAN              4
-//#endif
-#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 PDM_ODM_T    pDM_Odm)
-{
-#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
-       //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      PDM_ODM_T       pDM_Odm,
-       pu4Byte         PSD_report,
-       u1Byte          initial_gain_psd
-)
-{
-       //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(
-       PDM_ODM_T       pDM_Odm,
-       pu4Byte         PSD_report,
-       pu1Byte         PSD_bitmap,
-       u1Byte          RSSI_BT,
-       pu1Byte         PSD_bitmap_memory)
-{
-       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,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,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,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,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,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,COMP_PSD, DBG_LOUD,("PSD: good channel cnt = %u",good_cnt));
-       }
-
-       //RT_TRACE(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,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(
-       PDM_ODM_T       pDM_Odm
-)
-{
-       //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->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
-       //pMgntInfo->bDMInitialGainEnable = FALSE;
-       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(       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])
-                               {
-                                       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      PDM_ODM_T       pDM_Odm
-       )
-{
-       //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->bBtDisabled) //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);
-}
-
-// <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, 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, 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, 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, DBG_LOUD, ("<=== odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X\n", RSSIVal, TRSW_HighPwr));        
-}
-
-VOID
-ODM_MPT_DIG(
-       IN      PDM_ODM_T       pDM_Odm
-       )
-{
-       pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;
-       PFALSE_ALARM_STATISTICS         pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
-       u1Byte                                          CurrentIGI = (u1Byte)pDM_DigTable->CurIGValue;
-       u1Byte                                          DIG_Upper = 0x40, DIG_Lower = 0x20, C50, E50;
-       u8Byte                                          RXOK_cal;
-       u1Byte                                          IGI_A = 0x20, IGI_B = 0x20;
-
-#if ODM_FIX_2G_DIG
-       IGI_A = 0x22;
-       IGI_B = 0x24;           
-#endif
-
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_MP, DBG_LOUD, ("===> ODM_MPT_DIG, pBandType = %d\n", *pDM_Odm->pBandType));
-
-       odm_FalseAlarmCounterStatistics( pDM_Odm);
-       pDM_Odm->LastNumQryPhyStatusAll = pDM_Odm->NumQryPhyStatusAll;
-       pDM_Odm->NumQryPhyStatusAll = pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM;
-       RXOK_cal = pDM_Odm->NumQryPhyStatusAll - pDM_Odm->LastNumQryPhyStatusAll;
-       
-       if (RXOK_cal == 0)
-               pDM_Odm->RxPWDBAve_final= 0;
-       else
-               pDM_Odm->RxPWDBAve_final= pDM_Odm->RxPWDBAve/RXOK_cal;
-
-       pDM_Odm->RxPWDBAve = 0;
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, DBG_LOUD, ("RX OK = %d\n", RXOK_cal));
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, DBG_LOUD, ("pDM_Odm->RxPWDBAve_final = %d\n", pDM_Odm->RxPWDBAve_final));
-       
-       // <20130315, Kordan> Except Cameo, we should always trun on 2.4G/5G DIG.
-       // (Cameo fixes the IGI of 2.4G, so only DIG on 5G. Asked by James.)
-#if ODM_FIX_2G_DIG
-       if (*pDM_Odm->pBandType == BAND_ON_5G){  // for 5G
-#else
-       if (1){ // for both 2G/5G
-#endif
-               pDM_Odm->MPDIG_2G = FALSE;
-               pDM_Odm->Times_2G = 0;
-       
-               if (RXOK_cal >= 70 && pDM_Odm->RxPWDBAve_final<= 30)
-               {
-                       if (CurrentIGI > 0x24){
-                               ODM_Write1Byte( pDM_Odm, rA_IGI_Jaguar, 0x24);
-                               ODM_Write1Byte( pDM_Odm, rB_IGI_Jaguar, 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;
-                       }
-                       else if(CurrentIGI > DIG_Upper){
-                               CurrentIGI = DIG_Upper;
-                       }
-                       
-                       pDM_DigTable->CurIGValue = CurrentIGI;
-                       
-                       ODM_Write1Byte( pDM_Odm, rA_IGI_Jaguar, (u1Byte)CurrentIGI);
-                       ODM_Write1Byte( pDM_Odm, rB_IGI_Jaguar, (u1Byte)CurrentIGI);
-
-                       C50 = ODM_Read1Byte( pDM_Odm, 0xc50);
-                       E50 = ODM_Read1Byte( pDM_Odm, 0xe50);
-                       //pDM_Odm->MPDIG_2G = FALSE;
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_MP, DBG_LOUD, ("DIG = (%x, %x), Cnt_all = %d, Cnt_Ofdm_fail = %d, Cnt_Cck_fail = %d\n", C50, E50, pFalseAlmCnt->Cnt_all, pFalseAlmCnt->Cnt_Ofdm_fail, pFalseAlmCnt->Cnt_Cck_fail));
-               }
-                       
-       }
-       else
-       {       //2G
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_MP, DBG_LOUD, ("MPDIG_2G = %d,\n", pDM_Odm->MPDIG_2G));
-               
-               if(pDM_Odm->MPDIG_2G == FALSE){
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_MP, DBG_LOUD, ("===> Fix IGI\n"));
-                       ODM_Write1Byte( pDM_Odm, rA_IGI_Jaguar, (u1Byte)IGI_A);
-                       ODM_Write1Byte( pDM_Odm, rB_IGI_Jaguar, (u1Byte)IGI_B);
-               }
-               if (pDM_Odm->Times_2G == 2)
-                       pDM_Odm->MPDIG_2G = TRUE;
-               pDM_Odm->Times_2G++;
-       }
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, DBG_LOUD, ("pDM_Odm->RxPWDBAve_final = %d\n", pDM_Odm->RxPWDBAve_final));
-
-       if (pDM_Odm->SupportICType == ODM_RTL8812)
-               odm_RFEControl(pDM_Odm, pDM_Odm->RxPWDBAve_final);
-       
-       ODM_SetTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 700);
-       
-}              
-
-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
-
-}
-
-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);
-}
-
-
-
-
- //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,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              PDM_ODM_T               pDM_Odm)
-{
-#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
-       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
-}
-
-void odm_RXHP(
-       IN              PDM_ODM_T               pDM_Odm)
-{
-#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))
-#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) | (DEV_BUS_TYPE == RT_USB_INTERFACE)
-       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 = &(pDM_Odm->FalseAlmCnt);
-       
-       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)
-}
-
-void odm_Write_RXHP(
-       IN      PDM_ODM_T       pDM_Odm)
-{
-       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;
-
-}
-
-VOID
-odm_PSD_RXHP(
-       IN      PDM_ODM_T       pDM_Odm
-)
-{
-       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(       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(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,   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(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(COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
-       
-       initialGainUpper = 0x54;
-       
-       RSSI_BT = initial_gain_psd;
-       //SSBT = RSSI_BT;
-       
-       //RT_TRACE(     COMP_PSD, DBG_LOUD,("PSD: SSBT= %d\n", SSBT));
-       RT_TRACE(       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(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(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,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,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
-                       {       
-               psd_cnt = 0;
-               for(i=0;i<80;i++)
-                       RT_TRACE(       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);
-
-                       }
-               }
-
-VOID
-odm_PSD_RXHPCallback(
-       PRT_TIMER               pTimer
-)
-{
-       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)
-
-VOID
-odm_PathDiversityInit(
-       IN      PDM_ODM_T       pDM_Odm
-)
-{
-       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 
-}
-
-
-VOID
-odm_PathDiversity(
-       IN      PDM_ODM_T       pDM_Odm
-)
-{
-       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 
-}
-
-
-//
-// 2011/12/02 MH Copy from MP oursrc for temporarily test.
-//
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-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_SWAS, 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_SWAS, 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_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port Select Path-1\n"));
-               }
-               //RT_TRACE(     COMP_SWAS, DBG_LOUD, ("pDM_PDTable->OFDMTXPath =0x%x\n",pDM_PDTable->OFDMTXPath));
-       }
-       //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_SWAS, 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_SWAS, 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_SWAS, 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;
-}
-
-
-BOOLEAN
-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;
-}
-
-
-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_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_SWAS, 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_SWAS, 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_SWAS, 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_SWAS, 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_SWAS, 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_SWAS, 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_SWAS, 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_SWAS, 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_SWAS, 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_SWAS, 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_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\n", pEntry->AssociatedMacId));
-                                               }
-                                               else
-                                               {
-                                                       RT_TRACE(       COMP_SWAS, 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_SWAS, 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_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C:MinRSSI=%d\n",MinRSSI));
-
-       if(MinRSSI == 0xFF)
-               DefaultRespPath = pDM_PDTable->CCKDefaultRespPath;
-
-       pDM_PDTable->CCKDefaultRespPath = DefaultRespPath;
-}
-
-
-
-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((!IS_92C_SERIAL(pHalData->VersionID)) || (pHalData->PathDivCfg != 1) || (pHalData->eRFPowerState == eRfOff))
-       {
-               if(pHalData->PathDivCfg == 0)
-               {
-                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("No ODM_TXPathDiversity()\n"));
-               }
-               else
-               {
-                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("2T ODM_TXPathDiversity()\n"));
-               }
-               return;
-       }
-       if(!odm_IsConnected_92C(Adapter))
-       {
-               RT_TRACE(       COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity(): No Connections\n"));
-               return;
-       }
-       
-       
-       if(pDM_PDTable->TrainingState == 0)
-       {
-               RT_TRACE(       COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity() ==>\n"));
-               odm_OFDMTXPathDiversity_92C(Adapter);
-
-               if((pDM_PDTable->CCKPathDivEnable == TRUE) && (pDM_PDTable->OFDM_Pkt_Cnt < 100))
-               {
-                       //RT_TRACE(     COMP_SWAS, 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_SWAS, 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_SWAS, 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_SWAS, DBG_LOUD, ("ODM_TXPathDiversity() <==\n"));
-               }
-       }
-       else if(pDM_PDTable->TrainingState == 1)
-       {
-               //RT_TRACE(     COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=1\n"));
-               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_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=2\n"));
-               pDM_PDTable->TrainingState = 0; 
-               odm_CCKTXPathDiversity_92C(Adapter); 
-               if(pDM_PDTable->OFDM_Pkt_Cnt != 0)
-               {
-                       DefaultRespPath = pDM_PDTable->OFDMDefaultRespPath;
-                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: DefaultRespPath is OFDM\n"));
-               }
-               else
-               {
-                       DefaultRespPath = pDM_PDTable->CCKDefaultRespPath;
-                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: DefaultRespPath is CCK\n"));
-               }
-               odm_SetRespPath_92C(Adapter, DefaultRespPath);
-               odm_ResetPathDiversity_92C(Adapter);
-               RT_TRACE(       COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity() <==\n"));
-       }
-
-}
-
-
-
-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);
-}
-
-
-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]++;
-                       }
-               }
-       }
-}
-
-
-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;
-       u1Byte                  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((!IS_92C_SERIAL(pHalData->VersionID)) || (pHalData->PathDivCfg!=1) || pMgntInfo->AntennaTest )
-       {
-               RT_TRACE(COMP_SWAS, 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_SWAS, 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_SWAS, 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_SWAS, 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_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C(): ERROR!! This shall not happen.\n"));
-                               continue;
-                       }
-
-                       if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
-                       {
-                               RT_TRACE(COMP_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score++\n"));
-                               RT_PRINT_STR(COMP_SWAS, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
-                               RT_TRACE(COMP_SWAS, 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_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score--\n"));
-                               RT_PRINT_STR(COMP_SWAS, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
-                               RT_TRACE(COMP_SWAS, DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
-                               Score--;
-                       }
-
-               }
-
-               if(pMgntInfo->NumBssDesc!=0 && Score<=0)
-               {
-                       RT_TRACE(COMP_SWAS, DBG_LOUD,
-                               ("ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\n", pDM_PDTable->DefaultRespPath));
-
-                       //pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
-               }
-               else
-               {
-                       RT_TRACE(COMP_SWAS, 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
-       
-}
-
-
-//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++;
-
-               }
-       }
-}
-
-
-
-//
-// 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;  
-}
-
-
-//
-// 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);
-}
-
-
- //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_SWAS, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt));
-                       //RT_TRACE(COMP_SWAS, 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_SWAS, 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_SWAS, 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_SWAS, 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_SWAS, 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(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));      
-#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(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));  
-                     //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(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));  
-#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(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));  
-#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
-       }
-}
-
-//==================================================
-//3 PathDiv End
-//==================================================
-
-VOID
-odm_SetRespPath_92C(
-       IN      PADAPTER        Adapter,
-       IN      u1Byte  DefaultRespPath
-       )
-{
-       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
-
-       RT_TRACE(       COMP_SWAS, 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;
-}
-
-
-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_SWAS, 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;
-
-}
-
-#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-
-#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, bMaskDWord, 0x80800000);
-       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, bMaskDWord, 0x00000000);
-
-       //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
-
-#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) */
-
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm.h
deleted file mode 100644 (file)
index 5b19860..0000000
+++ /dev/null
@@ -1,2366 +0,0 @@
-/******************************************************************************\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
-// 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
-\r
-\r
-//============================================================\r
-//3 Tx Power Tracking\r
-//3============================================================\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
-//============================================================\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
-// LPS define\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
-\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
-typedef struct _Dynamic_Initial_Gain_Threshold_\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          BT30_CurIGI;\r
-       u1Byte          BackupIGValue;\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
-\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
-}DIG_T,*pDIG_T;\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
-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_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 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
-typedef struct _Rate_Adaptive_Table_{\r
-       u1Byte          firstconnect;\r
-}RA_T, *pRA_T;\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
-\r
-       // Before link Antenna Switch check\r
-       u1Byte          SWAS_NoLink_State;\r
-       u4Byte          SWAS_NoLink_BK_Reg860;\r
-       u4Byte          SWAS_NoLink_BK_Reg92c;\r
-       BOOLEAN         ANTA_ON;        //To indicate Ant A is or not\r
-       BOOLEAN         ANTB_ON;        //To indicate Ant B is on or not\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
-       RT_TIMER        SwAntennaSwitchTimer_8723B;\r
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)   \r
-       #if USE_WORKITEM\r
-       RT_WORK_ITEM                    SwAntennaSwitchWorkitem;\r
-       RT_WORK_ITEM                    SwAntennaSwitchWorkitem_8723B;\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
-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
-typedef struct _ODM_RATE_ADAPTIVE\r
-{\r
-       u1Byte                          Type;                           // DM_Type_ByFW/DM_Type_ByDriver\r
-       u1Byte                          LdpcThres;                      // if RSSI > LdpcThres => switch from LPDC to BCC\r
-       BOOLEAN                         bUseLdpc;\r
-       BOOLEAN                         bLowerRtsRate;\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
-} ODM_RATE_ADAPTIVE, *PODM_RATE_ADAPTIVE;\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
-\r
-\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
-#define HP_THERMAL_NUM         8\r
-\r
-#define AVG_THERMAL_NUM                8\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
-#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
-\r
-#define IQK_THRESHOLD                  8\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
-}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
-       u8Byte          NumQryPhyStatus;\r
-       u8Byte          NumQryPhyStatusCCK;\r
-       u8Byte          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
-       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
-       //-----------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_MP_MODE,\r
-       //ODM_CMNINFO_RTSTA_AID,                                // For win driver only?\r
-       ODM_CMNINFO_FORCED_IGI_LB,\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_DISABLED,\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
-//------------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-15\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_DYNAMIC_ATC                      = BIT14,\r
-       \r
-       //\r
-       // MAC DM section BIT 16-23\r
-       //\r
-       ODM_MAC_EDCA_TURBO                      = BIT16,\r
-       ODM_MAC_EARLY_MODE                      = BIT17,\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_RTL8813A    =       BIT9,   \r
-       ODM_RTL8881A    =       BIT10\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)\r
-#define ODM_IC_11AC_SERIES             (ODM_RTL8812|ODM_RTL8821|ODM_RTL8813A|ODM_RTL8881A)\r
-\r
-#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\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
-#else\r
-#define ODM_IC_11AC_SERIES_SUPPORT             1\r
-#endif\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_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
-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
-#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\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
-#endif\r
-\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
-       BOOLEAN bNeedIQK;\r
-       BOOLEAN bIQKInProgress; \r
-       u1Byte  Delta_IQK;\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
-       //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
-       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
-\r
-       //for APK\r
-       u4Byte  APKoutput[2][2]; //path A/B; output1_1a/output1_2a\r
-       u1Byte  bAPKdone;\r
-       u1Byte  bAPKThermalMeterIgnore;\r
-       u1Byte  bDPdone;\r
-       u1Byte  bDPPathAOK;\r
-       u1Byte  bDPPathBOK;\r
-\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
-       u4Byte  TxLOK[2];\r
-\r
-}ODM_RF_CAL_T,*PODM_RF_CAL_T;\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
-       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
-}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
-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
-       u8Byte                  NumQryPhyStatusAll;     //CCK + OFDM\r
-       u8Byte                  LastNumQryPhyStatusAll; \r
-       u8Byte                  RxPWDBAve;\r
-       u8Byte                  RxPWDBAve_final;\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
-//-----------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                  *mp_mode;\r
-       //u1Byte                        *pAidMap;\r
-       u1Byte                  *pu1ForcedIgiLb;\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
-\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
-       // Common info for BTDM\r
-       BOOLEAN                 bBtDisabled;                    // BT is disabled\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
-       u8Byte                  RSSI_TRSW;      \r
-       u8Byte                  RSSI_TRSW_H;\r
-       u8Byte                  RSSI_TRSW_L;    \r
-       u8Byte                  RSSI_TRSW_iso;\r
-\r
-       u1Byte                  RxRate;\r
-       BOOLEAN                 StopDIG;\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
-       //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
-       RXHP_T          DM_RXHP_Table;\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
-       //#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_PathA_CCK;\r
-\r
-       //\r
-       // Dynamic ATC switch\r
-       //\r
-       BOOLEAN                 bATCStatus;\r
-       BOOLEAN                 largeCFOHit;\r
-       BOOLEAN                 bIsfreeze;\r
-       int                             CFO_tail[2];\r
-       int                             CFO_ave_pre;\r
-       int                             CrystalCap;\r
-       u1Byte                  CFOThreshold;\r
-       u4Byte                  packetCount;\r
-       u4Byte                  packetCount_pre;\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(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 _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
-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_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
-\r
-#define                DM_DIG_MAX_AP                                   0x32\r
-#define                DM_DIG_MIN_AP                                   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
-//vivi 92c&92d has different definition, 20110504\r
-//this is for 92c\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
-#define                DM_DIG_FA_TH1                           0x300//0x100\r
-#define                DM_DIG_FA_TH2                           0x400//0x200\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
-//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
-#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
-\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
-//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
-#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
-\r
-//3===========================================================\r
-//3 BB Power Save\r
-//3===========================================================\r
-\r
-\r
-//3===========================================================\r
-//3 Dynamic ATC switch\r
-//3===========================================================\r
-#define                ATC_Status_Off                          0x0                     // enable\r
-#define                ATC_Status_On                           0x1                     // disable\r
-#define                CFO_Threshold_Xtal                      10                      // kHz\r
-#define                CFO_Threshold_ATC                       80                      // kHz\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
-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
-//\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
-VOID ODM_Write_DIG(IN  PDM_ODM_T       pDM_Odm,        IN      u1Byte  CurrentIGI);\r
-VOID ODM_Write_CCK_CCA_Thres(IN        PDM_ODM_T       pDM_Odm, IN     u1Byte  CurCCK_CCAThres);\r
-\r
-VOID\r
-ODM_SetAntenna(\r
-       IN      PDM_ODM_T       pDM_Odm,\r
-       IN      u1Byte          Antenna);\r
-\r
-\r
-#define dm_RF_Saving   ODM_RF_Saving\r
-void ODM_RF_Saving(    IN      PDM_ODM_T       pDM_Odm,\r
-                                                       IN      u1Byte          bForceInNormal );\r
-\r
-#define SwAntDivRestAfterLink  ODM_SwAntDivRestAfterLink\r
-VOID ODM_SwAntDivRestAfterLink(        IN      PDM_ODM_T       pDM_Odm);\r
-\r
-#define dm_CheckTXPowerTracking        ODM_TXPowerTrackingCheck\r
-VOID   \r
-ODM_TXPowerTrackingCheck(\r
-       IN              PDM_ODM_T               pDM_Odm\r
-       );\r
-                                               \r
-BOOLEAN \r
-ODM_RAStateCheck(\r
-       IN              PDM_ODM_T               pDM_Odm,\r
-       IN              s4Byte                  RSSI,\r
-       IN              BOOLEAN                 bForceUpdate,\r
-       OUT             pu1Byte                 pRATRState\r
-       );\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
-VOID\r
-ODM_ChangeDynamicInitGainThresh(\r
-       IN      PDM_ODM_T       pDM_Odm,\r
-       IN      u4Byte  DM_Type,\r
-       IN      u4Byte DM_Value\r
-       );\r
-\r
-BOOLEAN\r
-ODM_CheckPowerStatus(\r
-       IN      PADAPTER                Adapter\r
-       );\r
-\r
-\r
-#if (DM_ODM_SUPPORT_TYPE != ODM_ADSL) \r
-VOID\r
-ODM_RateAdaptiveStateApInit(\r
-       IN      PADAPTER        Adapter ,\r
-       IN      PRT_WLAN_STA  pEntry\r
-       );\r
-#endif\r
-#define AP_InitRateAdaptiveState       ODM_RateAdaptiveStateApInit\r
-\r
-\r
-#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
-#ifdef WIFI_WMM\r
-VOID\r
-ODM_IotEdcaSwitch(\r
-       IN      PDM_ODM_T       pDM_Odm,\r
-       IN      unsigned char           enable\r
-       );\r
-#endif\r
-\r
-BOOLEAN\r
-ODM_ChooseIotMainSTA(\r
-       IN      PDM_ODM_T               pDM_Odm,\r
-       IN      PSTA_INFO_T             pstat\r
-       );\r
-#endif\r
-\r
-#if(DM_ODM_SUPPORT_TYPE==ODM_AP)\r
-#ifdef HW_ANT_SWITCH\r
-u1Byte\r
-ODM_Diversity_AntennaSelect(\r
-       IN      PDM_ODM_T       pDM_Odm,\r
-       IN      u1Byte  *data\r
-);\r
-#endif\r
-#endif\r
-\r
-#define SwAntDivResetBeforeLink                ODM_SwAntDivResetBeforeLink\r
-VOID ODM_SwAntDivResetBeforeLink(IN    PDM_ODM_T       pDM_Odm);\r
-\r
-#define SwAntDivCheckBeforeLink        ODM_SwAntDivCheckBeforeLink\r
-\r
-BOOLEAN \r
-ODM_SwAntDivCheckBeforeLink(\r
-       IN              PDM_ODM_T               pDM_Odm\r
-       );\r
-\r
-\r
-#endif\r
-\r
-#define dm_SWAW_RSSI_Check     ODM_SwAntDivChkPerPktRssi\r
-VOID ODM_SwAntDivChkPerPktRssi(        \r
-       IN PDM_ODM_T            pDM_Odm,\r
-       IN u1Byte                       StationID,\r
-       IN PODM_PHY_INFO_T pPhyInfo\r
-       );\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
-#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
-\r
-VOID\r
-odm_DIGbyRSSI_LPS(\r
-       IN              PDM_ODM_T               pDM_Odm\r
-       );\r
-\r
-u4Byte ODM_Get_Rate_Bitmap(\r
-       IN      PDM_ODM_T       pDM_Odm,\r
-       IN      u4Byte          macid,\r
-       IN      u4Byte          ra_mask,        \r
-       IN      u1Byte          rssi_level);\r
-\r
-#endif\r
-       \r
-\r
-#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN))\r
-#define        dm_PSDMonitorCallback   odm_PSDMonitorCallback\r
-VOID   odm_PSDMonitorCallback(PRT_TIMER                pTimer);\r
-\r
-VOID\r
-odm_PSDMonitorWorkItemCallback(\r
-    IN PVOID            pContext\r
-    );\r
-\r
-VOID\r
-ODM_MPT_DIG(\r
-       IN      PDM_ODM_T       pDM_Odm\r
-);\r
-\r
-VOID\r
-PatchDCTone(\r
-       IN      PDM_ODM_T       pDM_Odm,\r
-       pu4Byte         PSD_report,\r
-       u1Byte          initial_gain_psd\r
-);\r
-VOID\r
-ODM_PSDMonitor(\r
-       IN      PDM_ODM_T       pDM_Odm\r
-       );\r
-VOID   odm_PSD_Monitor(PDM_ODM_T       pDM_Odm);\r
-VOID   odm_PSDMonitorInit(PDM_ODM_T    pDM_Odm);\r
-\r
-VOID\r
-ODM_PSDDbgControl(\r
-       IN      PADAPTER        Adapter,\r
-       IN      u4Byte          mode,\r
-       IN      u4Byte          btRssi\r
-       );\r
-\r
-#endif // DM_ODM_SUPPORT_TYPE\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
-\r
-\r
-VOID ODM_DMInit( IN    PDM_ODM_T       pDM_Odm);\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
-VOID odm_PathDivChkAntSwitch(PDM_ODM_T pDM_Odm);\r
-VOID ODM_PathDivRestAfterLink(\r
-       IN      PDM_ODM_T               pDM_Odm\r
-       );\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
-//VOID odm_PathDivChkAntSwitch(PADAPTER        Adapter,u1Byte  Step);\r
-VOID ODM_PathDivRestAfterLink(\r
-       IN      PDM_ODM_T       pDM_Odm\r
-       );\r
-\r
-#define dm_PathDiv_RSSI_Check  ODM_PathDivChkPerPktRssi\r
-VOID ODM_PathDivChkPerPktRssi(PADAPTER         Adapter,\r
-                                                                               BOOLEAN                 bIsDefPort,\r
-                                                                               BOOLEAN                 bMatchBSSID,\r
-                                                                               PRT_WLAN_STA    pEntry,\r
-                                                                               PRT_RFD                 pRfd    );\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
-BOOLEAN \r
-ODM_PathDiversityBeforeLink92C(\r
-       //IN    PADAPTER        Adapter\r
-       IN              PDM_ODM_T               pDM_Odm\r
-       );\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
-\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
-\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
-VOID\r
-ODM_FillTXPathInTXDESC(\r
-               IN      PADAPTER        Adapter,\r
-               IN      PRT_TCB         pTcb,\r
-               IN      pu1Byte         pDesc\r
-);\r
-\r
-\r
-#define dm_SWAW_RSSI_Check     ODM_SwAntDivChkPerPktRssi\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
-VOID\r
-ODM_SetTxAntByTxInfo_88C_92D(\r
-       IN              PDM_ODM_T               pDM_Odm,\r
-       IN              pu1Byte                 pDesc,\r
-       IN              u1Byte                  macId   \r
-       );\r
-\r
-#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
-VOID\r
-ODM_AntselStatistics_88C(\r
-       IN              PDM_ODM_T               pDM_Odm,\r
-       IN              u1Byte                  MacId,\r
-       IN              u4Byte                  PWDBAll,\r
-       IN              BOOLEAN                 isCCKrate\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
-VOID\r
-ODM_DynamicATCSwitch(\r
-       IN              PDM_ODM_T               pDM_Odm\r
-);\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_DynamicARFBSelect(\r
-       IN              PDM_ODM_T               pDM_Odm,\r
-       IN              u1Byte                  rate,\r
-       IN              BOOLEAN                 Collision_State \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/rtl8189es/hal/OUTSRC/odm_AntDiv.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_AntDiv.c
deleted file mode 100644 (file)
index 4b361e2..0000000
+++ /dev/null
@@ -1,2269 +0,0 @@
-/******************************************************************************\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 "odm_precomp.h"\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 AntDiv Function\n",(swch==ANTDIV_ON)?"ON" : "OFF"));\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 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 AntDiv Function\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
-               ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, swch); //CCK AntDiv function block enable\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
-               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
-                       }\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
-\r
-                               if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
-                               {\r
-                                       value32 = ODM_GetBBReg(pDM_Odm, 0x948, 0xFFF);\r
-                               \r
-                                       if (value32 !=0x280)\r
-                                               ODM_SetBBReg(pDM_Odm, 0x948 , BIT9, DefaultAnt);\r
-\r
-                                       rtw_hal_set_tx_power_level(pAdapter, pHalData->CurrentChannel);\r
-                               }\r
-                               \r
-                       }\r
-                       ODM_SetBBReg(pDM_Odm, 0x860, BIT14|BIT13|BIT12, DefaultAnt);            //Default TX    \r
-               }\r
-               else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT)\r
-               {\r
-                       ODM_SetBBReg(pDM_Odm, 0xC08 , BIT21|BIT20|BIT19, DefaultAnt);    //Default RX\r
-                       ODM_SetBBReg(pDM_Odm, 0xC08 , BIT24|BIT23|BIT22, OptionalAnt);//Optional RX\r
-                       ODM_SetBBReg(pDM_Odm, 0xC08 , BIT27|BIT26|BIT25, DefaultAnt);    //Default TX\r
-               }\r
-               ODM_SetMACReg(pDM_Odm, 0x6D8 , BIT10|BIT9|BIT8, DefaultAnt);    //\14PathA Resp Tx\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 (MP_DRIVER == 1)\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
-        #endif\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, 0x0102);       //antenna mapping table\r
-\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 (MP_DRIVER == 1)\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
-        #endif\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, 0x0201);   //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 (MP_DRIVER == 1)\r
-    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("pDM_Odm->AntDivType: %d\n", pDM_Odm->AntDivType));\r
-    return;\r
-#endif\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 (MP_DRIVER == 1)\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
-#endif\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 (MP_DRIVER == 1)\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
-#endif\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
-#endif //#if (RTL8723B_SUPPORT == 1)\r
-\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); //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
-       //2 [--For HW Bug Setting]\r
-       if(pDM_Odm->AntType == ODM_AUTO_ANT)\r
-               ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function block enable\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); //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
-       //2 [--For HW Bug Setting]\r
-       if(pDM_Odm->AntType == ODM_AUTO_ANT)\r
-               ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function block enable\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=[%u] \n",pDM_Odm->SupportICType));\r
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***  Main_Cnt = (( %u ))  , Main_RSSI= ((  %u )) \n", pDM_FatTable->MainAnt_Cnt[i], Main_RSSI));\r
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***  Aux_Cnt   = (( %u ))  , Aux_RSSI = ((  %u )) \n", pDM_FatTable->AuxAnt_Cnt[i]  , Aux_RSSI ));\r
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** MAC ID:[ %u ] , 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
-       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,Train_time_temp;\r
-       u1Byte                  LowTraffic_TrainTime_U=200,LowTraffic_TrainTime_L;\r
-       u1Byte                  RxIdleAnt, TargetAnt, nextAnt;\r
-       pSWAT_T                 pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
-       pFAT_T                  pDM_FatTable = &pDM_Odm->DM_FatTable;   \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(pDM_Odm, MAIN_ANT);\r
-                               else if (value32==0x1)\r
-                                       ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);\r
-                               \r
-                               ODM_SetBBReg(pDM_Odm, 0x948 , BIT6, 0x1);\r
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Set REG 948[6]=0x1 , Set REG 864[5:3]=0x%x \n",value32 ));\r
-                       }\r
-\r
-                       pDM_SWAT_Table->lastTxOkCnt = 0; \r
-                       pDM_SWAT_Table->lastRxOkCnt =0; \r
-                       TxCntOffset = Adapter->TxStats.NumTxBytesUnicast;\r
-                       RxCntOffset = Adapter->RxStats.NumRxBytesUnicast;\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 = Adapter->TxStats.NumTxBytesUnicast - pDM_SWAT_Table->lastTxOkCnt - TxCntOffset;\r
-                       curRxOkCnt =Adapter->RxStats.NumRxBytesUnicast - pDM_SWAT_Table->lastRxOkCnt - RxCntOffset;\r
-                       pDM_SWAT_Table->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;\r
-                       pDM_SWAT_Table->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;\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_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[set try_flag=1]  Normal State:  Begin Trying!! \n"));\r
-                                                                       \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
-                       \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
-                                       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
-                       }\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
-                               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
-#endif  //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
-\r
-#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\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
-       if(padapter->net_closed == _TRUE)\r
-           return;\r
-       //odm_S0S1_SwAntDiv(pDM_Odm, SWAW_STEP_DETERMINE);      \r
-}\r
-#endif  //#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\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
-\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 = (pAdapter->MgntInfo.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->bBtDisabled)  //BT disabled\r
-               {\r
-                       if(pDM_Odm->AntDivType == S0S1_SW_ANTDIV)\r
-                       {\r
-                       pDM_Odm->AntDivType=CG_TRX_HW_ANTDIV;\r
-                       ODM_SetBBReg(pDM_Odm, 0x8D4 , BIT24, 1); \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_SetBBReg(pDM_Odm, 0x8D4 , BIT24, 0); \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
-\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
-#else\r
-\r
-VOID ODM_AntDivInit(   IN PDM_ODM_T    pDM_Odm ){}\r
-VOID ODM_AntDiv(       IN PDM_ODM_T            pDM_Odm){}\r
-\r
-#endif //#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))\r
-\r
-\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_AntDiv.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_AntDiv.h
deleted file mode 100644 (file)
index 832ee6b..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-/******************************************************************************\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        __ODMANTDIV_H__\r
-#define    __ODMANTDIV_H__\r
-\r
-\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_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
-VOID\r
-ODM_AntDivInit(\r
-       IN               PDM_ODM_T              pDM_Odm \r
-);\r
-\r
-VOID\r
-ODM_AntDiv(\r
-       IN              PDM_ODM_T               pDM_Odm\r
-);\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
-#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
-#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
-#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
-VOID\r
-ODM_SW_AntDiv_Callback(void *FunctionContext);\r
-#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\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_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
-#endif //#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))\r
-#endif //#ifndef       __ODMANTDIV_H__\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_HWConfig.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_HWConfig.c
deleted file mode 100644 (file)
index a5955ad..0000000
+++ /dev/null
@@ -1,2354 +0,0 @@
-/******************************************************************************\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
-\r
-#include "odm_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
-       \r
-#define GET_VERSION(ic, txt) do {\\r
-                                                       if (pDM_Odm->bIsMPChip)\\r
-                                                               GET_VERSION_MP(ic,txt);\\r
-                                                       else\\r
-                                                               GET_VERSION_TC(ic,txt);\\r
-                                               } while(0)\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
-\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
-               //2 For dynamic ATC switch\r
-               if(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_ATC)\r
-               {\r
-                       if(pPktinfo->bPacketMatchBSSID && ( *(pDM_Odm->mp_mode) == 0))\r
-                       {\r
-                               // TODO:\r
-                               \r
-                               //3 Update CFO report for path-A & path-B\r
-                                for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++)   \r
-                               {\r
-                                       pDM_Odm->CFO_tail[i] = (int)pPhyStaRpt->path_cfotail[i];\r
-                               }\r
-\r
-                               //3 Update packet counter\r
-                               if(pDM_Odm->packetCount == 0xffffffff)\r
-                                       pDM_Odm->packetCount = 0;\r
-                               else\r
-                                       pDM_Odm->packetCount++;\r
-                               \r
-                               //ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, \r
-                                       //("pPhyStaRpt->path_cfotail[i] = 0x%x, pDM_Odm->CFO_tail[i] = 0x%x\n", pPhyStaRpt->path_cfotail[0], pDM_Odm->CFO_tail[1]));\r
-                       }\r
-               }\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
-               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
-\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
-\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
-               \r
-               LNA_idx = ((cck_agc_rpt & 0xE0) >>5);\r
-               VGA_idx = (cck_agc_rpt & 0x1F); \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
-                       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
-                               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
-                               SQ = 100;\r
-                       }\r
-                       else{                                           \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
-\r
-               PWDB_ALL_BT = PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);  \r
-                       \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
-                       //do nothing    \r
-               }\r
-               else{//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
-                                       {\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
-               //2 For dynamic ATC switch\r
-               if(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_ATC)\r
-               {\r
-                       if(pPktinfo->bPacketMatchBSSID && ( *(pDM_Odm->mp_mode) == 0) )\r
-                       {\r
-                               //3 Update CFO report for path-A & path-B\r
-                                for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++)   \r
-                               {\r
-                                       pDM_Odm->CFO_tail[i] = (int)pPhyStaRpt->cfotail[i];\r
-                               }\r
-\r
-                               //3 Update packet counter\r
-                               if(pDM_Odm->packetCount == 0xffffffff)\r
-                                       pDM_Odm->packetCount = 0;\r
-                               else\r
-                                       pDM_Odm->packetCount++;\r
-                               \r
-                               //ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, \r
-                                       //("pPhyStaRpt->path_cfotail[i] = 0x%x, pDM_Odm->CFO_tail[i] = 0x%x\n", pPhyStaRpt->path_cfotail[0], pDM_Odm->CFO_tail[1]));\r
-                       }\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                  isCCKrate=0;    \r
-       u1Byte                  RSSI_max, RSSI_min, i;\r
-       u4Byte                  OFDM_pkt=0; \r
-       u4Byte                  Weighting=0;\r
-       PSTA_INFO_T             pEntry;\r
-\r
-\r
-       if(pPktinfo->StationID == 0xFF)\r
-               return;\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
-               return;\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
-                               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
-//\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
-                               ODM_SwAntDivChkPerPktRssi(pDM_Odm,pPktinfo->StationID,pPhyInfo);\r
-               }       \r
-       }\r
-       else\r
-       {\r
-               odm_Process_RSSIForDM(pDM_Odm,pPhyInfo,pPktinfo);\r
-       }\r
-       \r
-}\r
-\r
-\r
-\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
-       odm_RxPhyStatusJaguarSeries_Parsing(\r
-                                                       pDM_Odm,\r
-                                                       pPhyInfo,\r
-                                                       pPhyStatus,\r
-                                                       pPktinfo);\r
-       \r
-       odm_Process_RSSIForDM(pDM_Odm,pPhyInfo,pPktinfo);\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
-\r
-       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES )\r
-       {\r
-               ODM_PhyStatusQuery_JaguarSeries(pDM_Odm,pPhyInfo,pPhyStatus,pPktinfo);\r
-       }\r
-       else\r
-       {\r
-               ODM_PhyStatusQuery_92CSeries(pDM_Odm,pPhyInfo,pPhyStatus,pPktinfo);\r
-       }\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_1T);\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
-                               if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter))\r
-                                       READ_AND_CONFIG(8188E,_RadioA_1T_ICUT);\r
-                               else\r
-                                       READ_AND_CONFIG(8188E,_RadioA_1T);\r
-                               }\r
-               }\r
-               else if(ConfigType == CONFIG_RF_TXPWR_LMT) {\r
-                       READ_AND_CONFIG(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(8812A,_RadioA);\r
-                       }\r
-                       else if(eRFPath == ODM_RF_PATH_B)\r
-                       {\r
-                               READ_AND_CONFIG(8812A,_RadioB);\r
-                       }\r
-               }\r
-               else if(ConfigType == CONFIG_RF_TXPWR_LMT) {\r
-                       READ_AND_CONFIG(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(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(8821A,_TXPWR_LMT_8811AU_FEM);\r
-                               else\r
-                                       READ_AND_CONFIG(8821A,_TXPWR_LMT_8811AU_IPA);                           \r
-                       } else {\r
-                               READ_AND_CONFIG(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(8723B,_RadioA);\r
-               }\r
-               else if(ConfigType == CONFIG_RF_TXPWR_LMT) {\r
-                       READ_AND_CONFIG(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(8192E,_RadioA);\r
-                       else if(eRFPath == ODM_RF_PATH_B)\r
-                               READ_AND_CONFIG(8192E,_RadioB);\r
-               }\r
-               else if(ConfigType == CONFIG_RF_TXPWR_LMT) {\r
-                       READ_AND_CONFIG(8192E,_TXPWR_LMT);\r
-               }\r
-       }\r
-#endif\r
-\r
-#if (RTL8813A_SUPPORT == 1)\r
-       if (pDM_Odm->SupportICType == ODM_RTL8813A)\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
-\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(8821A,_TxPowerTrack_PCIE);\r
-               else if (pDM_Odm->SupportInterface == ODM_ITRF_USB)\r
-                       READ_AND_CONFIG(8821A,_TxPowerTrack_USB);\r
-               else\r
-                       READ_AND_CONFIG(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(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(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(8192E,_TxPowerTrack_PCIE);\r
-               else if (pDM_Odm->SupportInterface == ODM_ITRF_USB)\r
-                       READ_AND_CONFIG(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(8723B,_TxPowerTrack_PCIE);\r
-               else if (pDM_Odm->SupportInterface == ODM_ITRF_USB)\r
-                       READ_AND_CONFIG(8723B,_TxPowerTrack_USB);\r
-               else if (pDM_Odm->SupportInterface == ODM_ITRF_SDIO)\r
-                       READ_AND_CONFIG(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(8188E,_TxPowerTrack_PCIE);\r
-               else if (pDM_Odm->SupportInterface == ODM_ITRF_USB)\r
-                       READ_AND_CONFIG(8188E,_TxPowerTrack_USB);\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_1T);\r
-               }\r
-               else if(ConfigType == CONFIG_BB_AGC_TAB)\r
-               {\r
-                       READ_AND_CONFIG_MP(8723A,_AGC_TAB_1T);\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
-                       if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter))\r
-                               READ_AND_CONFIG(8188E,_PHY_REG_1T_ICUT);\r
-                       else\r
-                               READ_AND_CONFIG(8188E,_PHY_REG_1T);\r
-               }\r
-               else if(ConfigType == CONFIG_BB_AGC_TAB)\r
-               {\r
-                       if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter))\r
-                               READ_AND_CONFIG(8188E,_AGC_TAB_1T_ICUT);\r
-                       else\r
-                               READ_AND_CONFIG(8188E,_AGC_TAB_1T);\r
-               }\r
-               else if(ConfigType == CONFIG_BB_PHY_REG_PG)\r
-               {\r
-                       READ_AND_CONFIG(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(8812A,_PHY_REG);\r
-               }\r
-               else if(ConfigType == CONFIG_BB_AGC_TAB)\r
-               {\r
-                       READ_AND_CONFIG(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(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(8821A,_PHY_REG);\r
-               }\r
-               else if(ConfigType == CONFIG_BB_AGC_TAB)\r
-               {\r
-                       READ_AND_CONFIG(8821A,_AGC_TAB);\r
-               }\r
-               else if(ConfigType == CONFIG_BB_PHY_REG_PG)\r
-               {\r
-                       READ_AND_CONFIG(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(8723B,_PHY_REG);\r
-               }\r
-               else if(ConfigType == CONFIG_BB_AGC_TAB)\r
-               {\r
-                       READ_AND_CONFIG(8723B,_AGC_TAB);\r
-               }\r
-               else if(ConfigType == CONFIG_BB_PHY_REG_PG)\r
-               {\r
-                       READ_AND_CONFIG(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(8192E,_PHY_REG);\r
-               }\r
-               else if(ConfigType == CONFIG_BB_AGC_TAB)\r
-               {\r
-                       READ_AND_CONFIG(8192E,_AGC_TAB);\r
-               }\r
-               else if(ConfigType == CONFIG_BB_PHY_REG_PG)\r
-               {\r
-                       READ_AND_CONFIG(8192E,_PHY_REG_PG);\r
-               }\r
-       }\r
-#endif\r
-#if (RTL8813A_SUPPORT == 1)\r
-    if(pDM_Odm->SupportICType == ODM_RTL8813A)\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
-               if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter))\r
-                       result = READ_AND_CONFIG(8188E,_MAC_REG_ICUT);\r
-               else\r
-                       result = READ_AND_CONFIG(8188E,_MAC_REG);\r
-       }\r
-#endif\r
-#if (RTL8812A_SUPPORT == 1)\r
-       if (pDM_Odm->SupportICType == ODM_RTL8812)\r
-       {\r
-               READ_AND_CONFIG(8812A,_MAC_REG);\r
-       }\r
-#endif\r
-#if (RTL8821A_SUPPORT == 1)\r
-       if (pDM_Odm->SupportICType == ODM_RTL8821)\r
-       {\r
-               READ_AND_CONFIG(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(8723B,_MAC_REG);\r
-       }\r
-#endif\r
-#if (RTL8192E_SUPPORT == 1)  \r
-       if (pDM_Odm->SupportICType == ODM_RTL8192E)\r
-       {\r
-               READ_AND_CONFIG(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
-               if (ConfigType == CONFIG_FW_NIC)\r
-               {\r
-                       READ_FIRMWARE(8188E,_FW_NIC_T);\r
-               }\r
-               else if (ConfigType == CONFIG_FW_WoWLAN)\r
-               {\r
-                       READ_FIRMWARE(8188E,_FW_WoWLAN_T);\r
-               }\r
-               else if(ConfigType == CONFIG_FW_NIC_2)\r
-               {\r
-                       READ_FIRMWARE(8188E,_FW_NIC_S);\r
-               }\r
-               else if (ConfigType == CONFIG_FW_WoWLAN_2)\r
-               {\r
-                       READ_FIRMWARE(8188E,_FW_WoWLAN_S);\r
-               }\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(8723B,_FW_NIC);\r
-               }\r
-               else if (ConfigType == CONFIG_FW_WoWLAN)\r
-               {\r
-                       READ_FIRMWARE(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(8812A,_FW_NIC);\r
-               }\r
-               else if (ConfigType == CONFIG_FW_WoWLAN)\r
-               {\r
-                       READ_FIRMWARE(8812A,_FW_WoWLAN);\r
-               }\r
-               else if (ConfigType == CONFIG_FW_BT)\r
-               {\r
-                       READ_FIRMWARE(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(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(8192E,_FW_NIC);\r
-               }\r
-               else if (ConfigType == CONFIG_FW_WoWLAN)\r
-               {\r
-                       READ_FIRMWARE(8192E,_FW_WoWLAN);\r
-               }\r
-#ifdef CONFIG_AP_WOWLAN\r
-               else if (ConfigType == CONFIG_FW_AP_WoWLAN)\r
-               {\r
-                       READ_FIRMWARE(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
-\r
-#if (RTL8812A_SUPPORT == 1)  \r
-       if (pDM_Odm->SupportICType == ODM_RTL8812)\r
-               return GET_VERSION_MP(8812A,_MAC_REG);\r
-#endif\r
-\r
-       return 0;\r
-}\r
-\r
-\r
-\r
-\r
-\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_HWConfig.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_HWConfig.h
deleted file mode 100644 (file)
index 16a26f6..0000000
+++ /dev/null
@@ -1,231 +0,0 @@
-/******************************************************************************\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
-#endif\r
-\r
-#endif\r
-\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_RegDefine11AC.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_RegDefine11AC.h
deleted file mode 100644 (file)
index 1193653..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/******************************************************************************\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
-//PAGE 9\r
-#define        ODM_REG_OFDM_FA_RST_11AC                0x9A4\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 C\r
-#define        ODM_REG_IGI_A_11AC                              0xC50\r
-//PAGE E\r
-#define        ODM_REG_IGI_B_11AC                              0xE50\r
-//PAGE F\r
-#define        ODM_REG_OFDM_FA_11AC                    0xF48\r
-\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
-\r
-#endif\r
-\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_RegDefine11N.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_RegDefine11N.h
deleted file mode 100644 (file)
index b623609..0000000
+++ /dev/null
@@ -1,174 +0,0 @@
-/******************************************************************************\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_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
-//PAGE 9\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_OFDM_FA_TYPE2_11N               0xDA0\r
-#define        ODM_REG_OFDM_FA_TYPE3_11N               0xDA4\r
-#define        ODM_REG_OFDM_FA_TYPE4_11N               0xDA8\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
-\r
-\r
-\r
-\r
-\r
-\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
-\r
-#endif\r
-\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_debug.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_debug.c
deleted file mode 100644 (file)
index 1547ff1..0000000
+++ /dev/null
@@ -1,629 +0,0 @@
-/******************************************************************************\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 "odm_precomp.h"\r
-\r
-\r
-VOID \r
-ODM_InitDebugSetting(\r
-       IN              PDM_ODM_T               pDM_Odm\r
-       )\r
-{\r
-pDM_Odm->DebugLevel                            =       ODM_DBG_LOUD;\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_DYNAMIC_ATC            |\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 0\r
-/*------------------Declare variable-----------------------\r
-// Define debug flag array for common debug print macro. */\r
-u4Byte ODM_DBGP_Type[ODM_DBGP_TYPE_MAX];\r
-\r
-/* Define debug print header for every service module. */\r
-ODM_DBGP_HEAD_T        ODM_DBGP_Head;\r
-\r
-\r
-/*-----------------------------------------------------------------------------\r
- * Function:    DBGP_Flag_Init\r
- *\r
- * Overview:    Refresh all debug print control flag content to zero.\r
- *\r
- * Input:       NONE\r
- *\r
- * Output:      NONE\r
- *\r
- * Return:      NONE\r
- *\r
- * Revised History:\r
- *  When               Who             Remark\r
- *  10/20/2006 MHC             Create Version 0.\r
- *\r
- *---------------------------------------------------------------------------*/\r
-extern void    ODM_DBGP_Flag_Init(void)\r
-{    \r
-    u1Byte i;\r
-    \r
-       for (i = 0; i < ODM_DBGP_TYPE_MAX; i++)\r
-       {\r
-               ODM_DBGP_Type[i] = 0;\r
-       }\r
-    \r
-#ifndef ADSL_AP_BUILD_WORKAROUND\r
-#if DBG                \r
-       // 2010/06/02 MH Free build driver can not out any debug message!!!\r
-       // Init Debug flag enable condition\r
-\r
-       ODM_DBGP_Type[FINIT]                    =       \\r
-//                                                             INIT_EEPROM                                             |\r
-//                                                             INIT_TxPower                                            |\r
-//                                                             INIT_IQK                                                        |\r
-//                                                             INIT_RF                                                 |\r
-                                                               0;\r
-\r
-       ODM_DBGP_Type[FDM]                      =       \\r
-//                                                             WA_IOT                                                  |\r
-//                                                             DM_PWDB                                         |\r
-//                                                             DM_Monitor                                              |\r
-//                                                             DM_DIG                          |\r
-//                                                             DM_EDCA_Turbo           |\r
-//                                                             DM_BT30                         |\r
-                                                               0;\r
-\r
-       ODM_DBGP_Type[FIOCTL]           =       \\r
-//                                                             IOCTL_IRP                                               |\r
-//                                                             IOCTL_IRP_DETAIL                                        |\r
-//                                                             IOCTL_IRP_STATISTICS                            |\r
-//                                                             IOCTL_IRP_HANDLE                                |\r
-//                                                             IOCTL_BT_HCICMD                                 |\r
-//                                                             IOCTL_BT_HCICMD_DETAIL                  |\r
-//                                                             IOCTL_BT_HCICMD_EXT                             |\r
-//                                                             IOCTL_BT_EVENT                                  |\r
-//                                                             IOCTL_BT_EVENT_DETAIL                   |\r
-//                                                             IOCTL_BT_EVENT_PERIODICAL               |\r
-//                                                             IOCTL_BT_TX_ACLDATA                     |\r
-//                                                             IOCTL_BT_TX_ACLDATA_DETAIL              |\r
-//                                                             IOCTL_BT_RX_ACLDATA                             |\r
-//                                                             IOCTL_BT_RX_ACLDATA_DETAIL              |\r
-//                                                             IOCTL_BT_TP                                             |\r
-//                                                             IOCTL_STATE                                             |\r
-//                                                             IOCTL_BT_LOGO                                   |\r
-//                                                             IOCTL_CALLBACK_FUN                              |\r
-//                                                             IOCTL_PARSE_BT_PKT                              |\r
-                                                               0;\r
-\r
-       ODM_DBGP_Type[FBT]                      =       \\r
-//                                                             BT_TRACE                                                |\r
-                                                               0;\r
-\r
-       ODM_DBGP_Type[FEEPROM]          =       \\r
-//                                                             EEPROM_W                                                |\r
-//                                                             EFUSE_PG                                                |\r
-//                                                             EFUSE_READ_ALL                                  |\r
-//                                                             EFUSE_ANALYSIS                                  |\r
-//                                                             EFUSE_PG_DETAIL                                 |\r
-                                                               0;\r
-\r
-       ODM_DBGP_Type[FDBG_CTRL]        =       \\r
-//                                                             DBG_CTRL_TRACE                                  |\r
-//                                                             DBG_CTRL_INBAND_NOISE                   |\r
-                                                               0;\r
-       \r
-       // 2011/07/20 MH Add for short cut \r
-       ODM_DBGP_Type[FSHORT_CUT] =     \\r
-//                                                             SHCUT_TX                                                | \r
-//                                                             SHCUT_RX                                                |\r
-                                                               0;\r
-       \r
-#endif \r
-#endif\r
-       /* Define debug header of every service module. */\r
-       //ODM_DBGP_Head.pMANS   = "\n\r[MANS] ";\r
-       //ODM_DBGP_Head.pRTOS   = "\n\r[RTOS] ";\r
-       //ODM_DBGP_Head.pALM    = "\n\r[ALM]  ";\r
-       //ODM_DBGP_Head.pPEM    = "\n\r[PEM]  ";\r
-       //ODM_DBGP_Head.pCMPK   = "\n\r[CMPK] ";\r
-       //ODM_DBGP_Head.pRAPD   = "\n\r[RAPD] ";\r
-       //ODM_DBGP_Head.pTXPB   = "\n\r[TXPB] ";\r
-       //ODM_DBGP_Head.pQUMG   = "\n\r[QUMG] ";\r
-       \r
-}      /* DBGP_Flag_Init */\r
-\r
-#endif\r
-\r
-\r
-#if 0\r
-u4Byte GlobalDebugLevel                        =       DBG_LOUD;\r
-//\r
-// 2009/06/22 MH Allow Fre build to print none debug info at init time.\r
-//\r
-#if DBG\r
-u8Byte GlobalDebugComponents   =       \\r
-//                                                                     COMP_TRACE                              |\r
-//                                                                     COMP_DBG                                |\r
-//                                                                     COMP_INIT                               |\r
-//                                                                     COMP_OID_QUERY                  |\r
-//                                                                     COMP_OID_SET                    |\r
-//                                                                     COMP_RECV                               |\r
-//                                                                     COMP_SEND                               |\r
-//                                                                     COMP_IO                                 |\r
-//                                                                     COMP_POWER                              |\r
-//                                                                     COMP_MLME                               |\r
-//                                                                     COMP_SCAN                               |\r
-//                                                                     COMP_SYSTEM                     |\r
-//                                                                     COMP_SEC                                |\r
-//                                                                     COMP_AP                         |\r
-//                                                                     COMP_TURBO                              |\r
-//                                                                     COMP_QOS                                |\r
-//                                                                     COMP_AUTHENTICATOR      |\r
-//                                                                     COMP_BEACON                     |\r
-//                                                                     COMP_ANTENNA                    |\r
-//                                                                     COMP_RATE                               |\r
-//                                                                     COMP_EVENTS                     |\r
-//                                                                     COMP_FPGA                               |\r
-//                                                                     COMP_RM                         |\r
-//                                                                     COMP_MP                         |\r
-//                                                                     COMP_RXDESC                     |\r
-//                                                                     COMP_CKIP                               |\r
-//                                                                     COMP_DIG                                |\r
-//                                                                     COMP_TXAGC                              |\r
-//                                                                     COMP_HIPWR                              |\r
-//                                                                     COMP_HALDM                              |\r
-//                                                                     COMP_RSNA                               |\r
-//                                                                     COMP_INDIC                              |\r
-//                                                                     COMP_LED                                |\r
-//                                                                     COMP_RF                                 |\r
-//                                                                     COMP_DUALMACSWITCH      |\r
-//                                                                     COMP_EASY_CONCURRENT    |\r
-\r
-//1!!!!!!!!!!!!!!!!!!!!!!!!!!!\r
-//1//1Attention Please!!!<11n or 8190 specific code should be put below this line>\r
-//1!!!!!!!!!!!!!!!!!!!!!!!!!!!\r
-\r
-//                                                                     COMP_HT                         |\r
-//                                                                     COMP_POWER_TRACKING     |\r
-//                                                                     COMP_RX_REORDER         |\r
-//                                                                     COMP_AMSDU                      |\r
-//                                                                     COMP_WPS                                |\r
-//                                                                     COMP_RATR                               |\r
-//                                                                     COMP_RESET                              |\r
-//                                                                     COMP_CMD                                |\r
-//                                                                     COMP_EFUSE                              |\r
-//                                                                     COMP_MESH_INTERWORKING |\r
-//                                                                     COMP_CCX                                |       \r
-//                                                                     COMP_IOCTL                              |\r
-//                                                                     COMP_GP                                 |\r
-//                                                                     COMP_TXAGG                              |\r
-//                                                                     COMP_BB_POWERSAVING     |\r
-//                                                                     COMP_SWAS                               |\r
-//                                                                     COMP_P2P                                |\r
-//                                                                     COMP_MUX                                |\r
-//                                                                     COMP_FUNC                               |\r
-//                                                                     COMP_TDLS                               |\r
-//                                                                     COMP_OMNIPEEK                   |\r
-//                                                                     COMP_PSD                                |\r
-                                                                       0;\r
-\r
-\r
-#else\r
-u8Byte GlobalDebugComponents   = 0;\r
-#endif\r
-\r
-#if (RT_PLATFORM==PLATFORM_LINUX) \r
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))\r
-EXPORT_SYMBOL(GlobalDebugComponents);\r
-EXPORT_SYMBOL(GlobalDebugLevel);\r
-#endif\r
-#endif\r
-\r
-/*------------------Declare variable-----------------------\r
-// Define debug flag array for common debug print macro. */\r
-u4Byte                 DBGP_Type[DBGP_TYPE_MAX];\r
-\r
-/* Define debug print header for every service module. */\r
-DBGP_HEAD_T            DBGP_Head;\r
-\r
-\r
-/*-----------------------------------------------------------------------------\r
- * Function:    DBGP_Flag_Init\r
- *\r
- * Overview:    Refresh all debug print control flag content to zero.\r
- *\r
- * Input:       NONE\r
- *\r
- * Output:      NONE\r
- *\r
- * Return:      NONE\r
- *\r
- * Revised History:\r
- *  When               Who             Remark\r
- *  10/20/2006 MHC             Create Version 0.\r
- *\r
- *---------------------------------------------------------------------------*/\r
-extern void    DBGP_Flag_Init(void)\r
-{    \r
-    u1Byte     i;\r
-    \r
-       for (i = 0; i < DBGP_TYPE_MAX; i++)\r
-       {\r
-               DBGP_Type[i] = 0;\r
-       }\r
-    \r
-#if DBG                \r
-       // 2010/06/02 MH Free build driver can not out any debug message!!!\r
-       // Init Debug flag enable condition\r
-\r
-       DBGP_Type[FINIT]                        =       \\r
-//                                                             INIT_EEPROM                                             |\r
-//                                                             INIT_TxPower                                            |\r
-//                                                             INIT_IQK                                                        |\r
-//                                                             INIT_RF                                                 |\r
-                                                               0;\r
-\r
-       DBGP_Type[FDM]                  =       \\r
-//                                                             WA_IOT                                                  |\r
-//                                                             DM_PWDB                                         |\r
-//                                                             DM_Monitor                                              |\r
-//                                                             DM_DIG                          |\r
-//                                                             DM_EDCA_Turbo           |\r
-//                                                             DM_BT30                         |\r
-                                                               0;\r
-\r
-       DBGP_Type[FIOCTL]               =       \\r
-//                                                             IOCTL_IRP                                               |\r
-//                                                             IOCTL_IRP_DETAIL                                        |\r
-//                                                             IOCTL_IRP_STATISTICS                            |\r
-//                                                             IOCTL_IRP_HANDLE                                |\r
-//                                                             IOCTL_BT_HCICMD                                 |\r
-//                                                             IOCTL_BT_HCICMD_DETAIL                  |\r
-//                                                             IOCTL_BT_HCICMD_EXT                             |\r
-//                                                             IOCTL_BT_EVENT                                  |\r
-//                                                             IOCTL_BT_EVENT_DETAIL                   |\r
-//                                                             IOCTL_BT_EVENT_PERIODICAL               |\r
-//                                                             IOCTL_BT_TX_ACLDATA                     |\r
-//                                                             IOCTL_BT_TX_ACLDATA_DETAIL              |\r
-//                                                             IOCTL_BT_RX_ACLDATA                             |\r
-//                                                             IOCTL_BT_RX_ACLDATA_DETAIL              |\r
-//                                                             IOCTL_BT_TP                                             |\r
-//                                                             IOCTL_STATE                                             |\r
-//                                                             IOCTL_BT_LOGO                                   |\r
-//                                                             IOCTL_CALLBACK_FUN                              |\r
-//                                                             IOCTL_PARSE_BT_PKT                              |\r
-                                                               0;\r
-\r
-       DBGP_Type[FBT]                  =       \\r
-//                                                             BT_TRACE                                                |\r
-                                                               0;\r
-\r
-       DBGP_Type[FEEPROM]              =       \\r
-//                                                             EEPROM_W                                                |\r
-//                                                             EFUSE_PG                                                |\r
-//                                                             EFUSE_READ_ALL                                  |\r
-//                                                             EFUSE_ANALYSIS                                  |\r
-//                                                             EFUSE_PG_DETAIL                                 |\r
-                                                               0;\r
-\r
-       DBGP_Type[FDBG_CTRL]    =       \\r
-//                                                             DBG_CTRL_TRACE                                  |\r
-//                                                             DBG_CTRL_INBAND_NOISE                   |\r
-                                                               0;\r
-       \r
-       // 2011/07/20 MH Add for short cut \r
-       DBGP_Type[FSHORT_CUT] =         \\r
-//                                                             SHCUT_TX                                                | \r
-//                                                             SHCUT_RX                                                |\r
-                                                               0;\r
-       \r
-#endif \r
-       /* Define debug header of every service module. */\r
-       DBGP_Head.pMANS = "\n\r[MANS] ";\r
-       DBGP_Head.pRTOS = "\n\r[RTOS] ";\r
-       DBGP_Head.pALM  = "\n\r[ALM]  ";\r
-       DBGP_Head.pPEM  = "\n\r[PEM]  ";\r
-       DBGP_Head.pCMPK = "\n\r[CMPK] ";\r
-       DBGP_Head.pRAPD = "\n\r[RAPD] ";\r
-       DBGP_Head.pTXPB = "\n\r[TXPB] ";\r
-       DBGP_Head.pQUMG = "\n\r[QUMG] ";\r
-       \r
-}      /* DBGP_Flag_Init */\r
-\r
-\r
-/*-----------------------------------------------------------------------------\r
- * Function:    DBG_PrintAllFlag\r
- *\r
- * Overview:    Print All debug flag\r
- *\r
- * Input:       NONE\r
- *\r
- * Output:      NONE\r
- *\r
- * Return:      NONE\r
- *\r
- * Revised History:\r
- *  When               Who             Remark\r
- *  12/10/2008 MHC             Create Version 0.\r
- *\r
- *---------------------------------------------------------------------------*/\r
-extern void    DBG_PrintAllFlag(void)\r
-{\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("DBGFLAG 0    FQoS\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("DBGFLAG 1    FTX\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("DBGFLAG 2    FRX\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("DBGFLAG 3    FSEC\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("DBGFLAG 4    FMGNT\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("DBGFLAG 5    FMLME\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("DBGFLAG 6    FRESOURCE\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("DBGFLAG 7    FBEACON\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("DBGFLAG 8    FISR\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("DBGFLAG 9    FPHY\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("DBGFLAG 11   FMP\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("DBGFLAG 12   FPWR\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("DBGFLAG 13   FDM\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("DBGFLAG 14   FDBG_CTRL\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("DBGFLAG 15   FC2H\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("DBGFLAG 16   FBT\n"));                        \r
-}      // DBG_PrintAllFlag\r
-\r
-\r
-extern void    DBG_PrintAllComp(void)\r
-{\r
-       u1Byte  i;\r
-       \r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("GlobalDebugComponents Definition\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT0    COMP_TRACE\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT1    COMP_DBG\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT2    COMP_INIT\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT3    COMP_OID_QUERY\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT4    COMP_OID_SET\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT5    COMP_RECV\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT6    COMP_SEND\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT7    COMP_IO\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT8    COMP_POWER\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT9   COMP_MLME\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT10   COMP_SCAN\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT11   COMP_SYSTEM\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT12   COMP_SEC\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT13   COMP_AP\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT14   COMP_TURBO\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT15   COMP_QOS\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT16   COMP_AUTHENTICATOR\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT17   COMP_BEACON\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT18   COMP_BEACON\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT19   COMP_RATE\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT20   COMP_EVENTS\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT21   COMP_FPGA\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT22   COMP_RM\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT23   COMP_MP\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT24   COMP_RXDESC\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT25   COMP_CKIP\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT26   COMP_DIG\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT27   COMP_TXAGC\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT28   COMP_HIPWR\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT29   COMP_HALDM\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT30   COMP_RSNA\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT31   COMP_INDIC\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT32   COMP_LED\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT33   COMP_RF\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT34   COMP_HT\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT35   COMP_POWER_TRACKING\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT36   COMP_POWER_TRACKING\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT37   COMP_AMSDU\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT38   COMP_WPS\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT39   COMP_RATR\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT40   COMP_RESET\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT41   COMP_CMD\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT42   COMP_EFUSE\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT43   COMP_MESH_INTERWORKING\n"));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT43   COMP_CCX\n"));                \r
-       \r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("GlobalDebugComponents = %"i64fmt"x\n", GlobalDebugComponents));\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("Enable DBG COMP ="));\r
-       for (i = 0; i < 64; i++)\r
-       {\r
-               if (GlobalDebugComponents & ((u8Byte)0x1 << i) )\r
-               {\r
-                       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT%02d |\n", i));\r
-               }\r
-       }\r
-       ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("\n"));\r
-       \r
-}      // DBG_PrintAllComp\r
-\r
-\r
-/*-----------------------------------------------------------------------------\r
- * Function:    DBG_PrintFlagEvent\r
- *\r
- * Overview:    Print dedicated debug flag event\r
- *\r
- * Input:       NONE\r
- *\r
- * Output:      NONE\r
- *\r
- * Return:      NONE\r
- *\r
- * Revised History:\r
- *  When               Who             Remark\r
- *  12/10/2008 MHC             Create Version 0.\r
- *\r
- *---------------------------------------------------------------------------*/\r
-extern void    DBG_PrintFlagEvent(u1Byte       DbgFlag)\r
-{\r
-       switch(DbgFlag)\r
-       {\r
-               case    FQoS:\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 0    QoS_INIT\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 1    QoS_VISTA\n"));\r
-               break;\r
-\r
-               case    FTX:\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 0    TX_DESC\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 1    TX_DESC_TID\n"));\r
-               break;\r
-\r
-               case    FRX:\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 0    RX_DATA\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 1    RX_PHY_STS\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 2    RX_PHY_SS\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 3    RX_PHY_SQ\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 4    RX_PHY_ASTS\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 5    RX_ERR_LEN\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 6    RX_DEFRAG\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 7    RX_ERR_RATE\n"));\r
-               break;\r
-\r
-               case    FSEC:\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("NA\n"));\r
-               break;\r
-\r
-               case    FMGNT:\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("NA\n"));\r
-               break;\r
-\r
-               case    FMLME:\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 0    MEDIA_STS\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 1    LINK_STS\n"));               \r
-               break;\r
-\r
-               case    FRESOURCE:\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 0    OS_CHK\n"));\r
-               break;\r
-\r
-               case    FBEACON:\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 0    BCN_SHOW\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 1    BCN_PEER\n"));               \r
-               break;\r
-\r
-               case    FISR:\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 0    ISR_CHK\n"));\r
-               break;\r
-\r
-               case    FPHY:\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 0    PHY_BBR\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 1    PHY_BBW\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 2    PHY_RFR\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 3    PHY_RFW\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 4    PHY_MACR\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 5    PHY_MACW\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 6    PHY_ALLR\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 7    PHY_ALLW\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 8    PHY_TXPWR\n"));\r
-               break;\r
-\r
-               case    FMP:\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 0    MP_RX\n"));\r
-               break;\r
-               \r
-               case    FEEPROM:\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 0    EEPROM_W\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 1    EFUSE_PG\n"));               \r
-               break;\r
-               \r
-               case    FPWR:\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 0    LPS\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 1    IPS\n"));            \r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 2    PWRSW\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 3    PWRHW\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 4    PWRHAL\n"));\r
-               break;\r
-\r
-               case    FDM:\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 0    WA_IOT\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 1    DM_PWDB\n"));                \r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 2    DM_Monitor\n"));             \r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 3    DM_DIG\n"));         \r
-               break;\r
-\r
-               case    FDBG_CTRL:\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 0    DBG_CTRL_TRACE\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 1    DBG_CTRL_INBAND_NOISE\n"));          \r
-               break;\r
-               \r
-               case    FC2H:\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 0    C2H_Summary\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 1    C2H_PacketData\n"));         \r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 2    C2H_ContentData\n"));                \r
-               break;\r
-               \r
-               case    FBT:\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 0    BT_TRACE\n"));\r
-               ODM_RT_TRACE(pDM_Odm,COMP_CMD, DBG_LOUD,        ("BIT 1    BT_RFPoll\n"));              \r
-               break;          \r
-               \r
-               default:\r
-                       break;\r
-       }\r
-\r
-}      // DBG_PrintFlagEvent\r
-\r
-\r
-extern void    DBG_DumpMem(const u1Byte DbgComp, \r
-                                                       const u1Byte DbgLevel, \r
-                                                       pu1Byte pMem, \r
-                                                       u2Byte Len)\r
-{\r
-       u2Byte i;\r
-\r
-       for (i=0;i<((Len>>3) + 1);i++)\r
-       {\r
-               ODM_RT_TRACE(pDM_Odm,DbgComp, DbgLevel, ("%02X %02X %02X %02X %02X %02X %02X %02X\n",\r
-                                       *(pMem+(i*8)), *(pMem+(i*8+1)), *(pMem+(i*8+2)), *(pMem+(i*8+3)),\r
-                                       *(pMem+(i*8+4)), *(pMem+(i*8+5)), *(pMem+(i*8+6)), *(pMem+(i*8+7))));\r
-               \r
-       }\r
-}\r
-\r
-\r
-#endif\r
-\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_debug.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_debug.h
deleted file mode 100644 (file)
index 0a32f85..0000000
+++ /dev/null
@@ -1,892 +0,0 @@
-/******************************************************************************\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_DYNAMIC_ATC                   BIT15\r
-//MAC Functions\r
-#define ODM_COMP_EDCA_TURBO                    BIT16\r
-#define ODM_COMP_EARLY_MODE                    BIT17\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
-                       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
-ODM_InitDebugSetting(\r
-       IN              PDM_ODM_T               pDM_Odm\r
-       );\r
-\r
-\r
-\r
-#if 0\r
-#if DBG\r
-#define DbgPrint printk\r
-\r
-#define PRINT_DATA(_TitleString, _HexData, _HexDataLen)                                                                \\r
-                       {                                                                                                                                               \\r
-                               char                    *szTitle = _TitleString;                                                                        \\r
-                               pu1Byte         pbtHexData = _HexData;                                                                  \\r
-                               u4Byte          u4bHexDataLen = _HexDataLen;                                                    \\r
-                               u4Byte          __i;                                                                                                            \\r
-                               DbgPrint("%s", szTitle);                                                                                                        \\r
-                               for (__i=0;__i<u4bHexDataLen;__i++)                                                                     \\r
-                               {                                                                                                                                       \\r
-                                       if ((__i & 15) == 0)                                                                                            \\r
-                                       {                                                                                                                               \\r
-                                               DbgPrint("\n");                                                                                         \\r
-                                       }                                                                                                                               \\r
-                                       DbgPrint("%02X%s", pbtHexData[__i], ( ((__i&3)==3) ? "  " : " ") );             \\r
-                               }                                                                                                                                       \\r
-                               DbgPrint("\n");                                                                                                         \\r
-                       }\r
-\r
-// RT_PRINT_XXX macros: implemented for debugging purpose.\r
-// Added by Annie, 2005-11-21.\r
-#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen)                      \\r
-                       if(((_Comp) & ODM_GlobalDebugComponents) && (_Level <= ODM_GlobalDebugLevel))   \\r
-                       {                                                                                                                                               \\r
-                               int __i;                                                                                                                                \\r
-                               pu1Byte ptr = (pu1Byte)_HexData;                                                                                \\r
-                               DbgPrint("Rtl819x: ");                                                                                                  \\r
-                               DbgPrint(_TitleString);                                                                                         \\r
-                               for( __i=0; __i<(int)_HexDataLen; __i++ )                                                               \\r
-                               {                                                                                                                                       \\r
-                                       DbgPrint("%02X%s", ptr[__i], (((__i + 1) % 4) == 0)?"  ":" ");                  \\r
-                                       if (((__i + 1) % 16) == 0)      DbgPrint("\n");                                                 \\r
-                               }                                                                                                                                       \\r
-                               DbgPrint("\n");                                                                                                         \\r
-                       }\r
-\r
-#define RT_PRINT_ADDR(_Comp, _Level, _TitleString, _Ptr)                                                               \\r
-                       if(((_Comp) & ODM_GlobalDebugComponents) && (_Level <= ODM_GlobalDebugLevel))   \\r
-                       {                                                                                                                                               \\r
-                               int __i;                                                                                                                                \\r
-                               pu1Byte ptr = (pu1Byte)_Ptr;                                                                                    \\r
-                               DbgPrint("Rtl819x: ");                                                                                                  \\r
-                               DbgPrint(_TitleString);                                                                                         \\r
-                               DbgPrint(" ");                                                                                                                  \\r
-                               for( __i=0; __i<6; __i++ )                                                                                              \\r
-                                       DbgPrint("%02X%s", ptr[__i], (__i==5)?"":"-");                                                  \\r
-                               DbgPrint("\n");                                                                                                         \\r
-                       }\r
-\r
-#define RT_PRINT_ADDRS(_Comp, _Level, _TitleString, _Ptr, _AddNum)                                     \\r
-                       if(((_Comp) & ODM_GlobalDebugComponents) && (_Level <= ODM_GlobalDebugLevel))   \\r
-                       {                                                                                                                                               \\r
-                               int __i, __j;                                                                                                                   \\r
-                               pu1Byte ptr = (pu1Byte)_Ptr;                                                                                    \\r
-                               DbgPrint("Rtl819x: ");                                                                                                  \\r
-                               DbgPrint(_TitleString);                                                                                         \\r
-                               DbgPrint("\n");                                                                                                         \\r
-                               for( __i=0; __i<(int)_AddNum; __i++ )                                                                   \\r
-                               {                                                                                                                                       \\r
-                                       for( __j=0; __j<6; __j++ )                                                                                      \\r
-                                               DbgPrint("%02X%s", ptr[__i*6+__j], (__j==5)?"":"-");                            \\r
-                                       DbgPrint("\n");                                                                                                 \\r
-                               }                                                                                                                                       \\r
-                       }\r
-\r
-// Added by Annie, 2005-11-22.\r
-#define        MAX_STR_LEN     64\r
-#define        PRINTABLE(_ch)  (_ch>=' ' &&_ch<='~' )  // I want to see ASCII 33 to 126 only. Otherwise, I print '?'. Annie, 2005-11-22.\r
-\r
-#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len)                                                  \\r
-                       if(((_Comp) & ODM_GlobalDebugComponents) && (_Level <= ODM_GlobalDebugLevel))   \\r
-                       {                                                                                                                                               \\r
-                               int             __i;                                                                                                                    \\r
-                               u1Byte  buffer[MAX_STR_LEN];                                                                                    \\r
-                               int     length = (_Len<MAX_STR_LEN)? _Len : (MAX_STR_LEN-1) ;                           \\r
-                               PlatformZeroMemory( buffer, MAX_STR_LEN );                                                      \\r
-                               PlatformMoveMemory( buffer, (pu1Byte)_Ptr, length );                                            \\r
-                               for( __i=0; __i<MAX_STR_LEN; __i++ )                                                                    \\r
-                               {                                                                                                                                       \\r
-                                       if( !PRINTABLE(buffer[__i]) )   buffer[__i] = '?';                                              \\r
-                               }                                                                                                                                       \\r
-                               buffer[length] = '\0';                                                                                                  \\r
-                               DbgPrint("Rtl819x: ");                                                                                                  \\r
-                               DbgPrint(_TitleString);                                                                                         \\r
-                               DbgPrint(": %d, <%s>\n", _Len, buffer);                                                                 \\r
-                       }\r
-                       \r
-#else  // of #if DBG\r
-#define DbgPrint(...)  \r
-#define PRINT_DATA(_TitleString, _HexData, _HexDataLen)\r
-#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen)\r
-#define RT_PRINT_ADDR(_Comp, _Level, _TitleString, _Ptr)\r
-#define RT_PRINT_ADDRS(_Comp, _Level, _TitleString, _Ptr, _AddNum)\r
-#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len)\r
-#endif // of #if DBG\r
-\r
-#endif \r
-\r
-\r
-#if 0\r
-/* Define debug print header for every service module.*/\r
-typedef struct tag_ODM_DBGP_Service_Module_Header_Name_Structure\r
-{\r
-       const char      *pMANS;\r
-       const char      *pRTOS;\r
-       const char      *pALM;\r
-       const char      *pPEM;\r
-       const char      *pCMPK;\r
-       const char      *pRAPD;\r
-       const char      *pTXPB;\r
-       const char      *pQUMG;\r
-}ODM_DBGP_HEAD_T;\r
-\r
-\r
-/* Define different debug flag for dedicated service modules in debug flag array. */\r
-// Each module has independt 32 bit debug flag you cnn define the flag as yout require.\r
-typedef enum tag_ODM_DBGP_Flag_Type_Definition\r
-{\r
-       ODM_FTX                         = 0,\r
-       ODM_FRX                         ,       \r
-       ODM_FPHY                                ,\r
-       ODM_FPWR                                ,\r
-       ODM_FDM                         ,\r
-       ODM_FC2H                                ,\r
-       ODM_FBT                         ,\r
-       ODM_DBGP_TYPE_MAX\r
-}ODM_DBGP_FLAG_E;\r
-\r
-\r
-// Define TX relative debug bit                                --> FTX\r
-#define                ODM_TX_DESC                     BIT0\r
-#define                ODM_TX_DESC_TID         BIT1\r
-#define                ODM_TX_PATH                     BIT2\r
-\r
-// Define RX relative debug  bit                               --> FRX\r
-#define                ODM_RX_DATA                             BIT0    \r
-#define                ODM_RX_PHY_STS                  BIT1\r
-#define                ODM_RX_PHY_SS                           BIT2\r
-#define                ODM_RX_PHY_SQ                           BIT3\r
-#define                ODM_RX_PHY_ASTS                 BIT4\r
-#define                ODM_RX_ERR_LEN                  BIT5\r
-#define                ODM_RX_DEFRAG                           BIT6\r
-#define                ODM_RX_ERR_RATE                 BIT7\r
-#define                ODM_RX_PATH                             BIT8\r
-#define                ODM_RX_BEACON                           BIT9\r
-\r
-// Define PHY-BB/RF/MAC check module bit               --> FPHY\r
-#define                ODM_PHY_BBR                             BIT0\r
-#define                ODM_PHY_BBW                             BIT1\r
-#define                ODM_PHY_RFR                             BIT2\r
-#define                ODM_PHY_RFW                             BIT3\r
-#define                ODM_PHY_MACR                            BIT4\r
-#define                ODM_PHY_MACW                            BIT5\r
-#define                ODM_PHY_ALLR                            BIT6\r
-#define                ODM_PHY_ALLW                            BIT7\r
-#define                ODM_PHY_TXPWR                   BIT8\r
-#define                ODM_PHY_PWRDIFF                 BIT9\r
-#define                ODM_PHY_SICR                            BIT10\r
-#define                ODM_PHY_SICW                            BIT11\r
-\r
-\r
-\r
-\r
-extern u4Byte ODM_GlobalDebugLevel;\r
-\r
-\r
-#if DBG\r
-extern u8Byte ODM_GlobalDebugComponents;\r
-#endif\r
-#endif\r
-#if 0\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(pDM_Odm,)!\r
-//\r
-#define DBG_OFF                                        0\r
-\r
-//\r
-//     Deprecated! Don't use it! \r
-//     TODO: fix related debug message!\r
-//\r
-//#define DBG_SEC                                      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 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 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 DBG_LOUD                               4\r
-\r
-//\r
-//     Normal case with detail execution flow or information.\r
-//\r
-#define DBG_TRACE                              5\r
-\r
-\r
-\r
-//-----------------------------------------------------------------------------\r
-// Define the tracing components\r
-//\r
-//-----------------------------------------------------------------------------\r
-#define COMP_TRACE                             BIT0            // For function call tracing.\r
-#define COMP_DBG                               BIT1            // Only for temporary debug message.\r
-#define COMP_INIT                              BIT2            // during driver initialization / halt / reset.\r
-#define COMP_OID_QUERY                         BIT3            // Query OID.\r
-#define COMP_OID_SET                           BIT4            // Set OID.\r
-#define COMP_RECV                              BIT5            // Reveive part data path.\r
-#define COMP_SEND                              BIT6            // Send part path.\r
-#define COMP_IO                                        BIT7            // I/O Related. Added by Annie, 2006-03-02.\r
-#define COMP_POWER                             BIT8            // 802.11 Power Save mode or System/Device Power state related.\r
-#define COMP_MLME                              BIT9            // 802.11 link related: join/start BSS, leave BSS.\r
-#define COMP_SCAN                              BIT10   // For site survey.\r
-#define COMP_SYSTEM                            BIT11   // For general platform function.\r
-#define COMP_SEC                               BIT12   // For Security.\r
-#define COMP_AP                                        BIT13   // For AP mode related.\r
-#define COMP_TURBO                             BIT14   // For Turbo Mode related. By Annie, 2005-10-21.\r
-#define COMP_QOS                               BIT15   // For QoS.\r
-#define COMP_AUTHENTICATOR                     BIT16   // For AP mode Authenticator. Added by Annie, 2006-01-30.\r
-#define COMP_BEACON                            BIT17   // For Beacon related, by rcnjko.\r
-#define COMP_ANTENNA                           BIT18   // For Antenna diversity related, by rcnjko. \r
-#define COMP_RATE                              BIT19   // For Rate Adaptive mechanism, 2006.07.02, by rcnjko. #define COMP_EVENTS                              0x00000080      // Event handling\r
-#define COMP_EVENTS                            BIT20   // Event handling\r
-#define COMP_FPGA                              BIT21   // For FPGA verfication \r
-#define COMP_RM                                        BIT22   // For Radio Measurement. \r
-#define COMP_MP                                        BIT23   // For mass production test, by shien chang, 2006.07.13\r
-#define COMP_RXDESC                            BIT24   // Show Rx desc information for SD3 debug. Added by Annie, 2006-07-15.\r
-#define COMP_CKIP                              BIT25   // For CCX 1 S13: CKIP. Added by Annie, 2006-08-14.\r
-#define COMP_DIG                               BIT26   // For DIG, 2006.09.25, by rcnjko.\r
-#define COMP_TXAGC                             BIT27   // For Tx power, 060928, by rcnjko. \r
-#define COMP_HIPWR                             BIT28   // For High Power Mechanism, 060928, by rcnjko. \r
-#define COMP_HALDM                             BIT29   // For HW Dynamic Mechanism, 061010, by rcnjko. \r
-#define COMP_RSNA                              BIT30   // For RSNA IBSS , 061201, by CCW. \r
-#define COMP_INDIC                             BIT31   // For link indication\r
-#define COMP_LED                               BIT32   // For LED.\r
-#define COMP_RF                                        BIT33   // For RF.\r
-//1!!!!!!!!!!!!!!!!!!!!!!!!!!!\r
-//1//1Attention Please!!!<11n or 8190 specific code should be put below this line>\r
-//1!!!!!!!!!!!!!!!!!!!!!!!!!!!\r
-\r
-#define COMP_HT                                        BIT34   // For 802.11n HT related information. by Emily 2006-8-11\r
-#define COMP_POWER_TRACKING                    BIT35   //FOR 8190 TX POWER TRACKING\r
-#define COMP_RX_REORDER                                BIT36   // 8190 Rx Reorder\r
-#define COMP_AMSDU                             BIT37   // For A-MSDU Debugging\r
-#define COMP_WPS                               BIT38   //WPS Debug Message \r
-#define COMP_RATR                              BIT39   \r
-#define COMP_RESET                             BIT40\r
-// For debug command to print on dbgview!!\r
-#define COMP_CMD                               BIT41\r
-#define COMP_EFUSE                             BIT42\r
-#define COMP_MESH_INTERWORKING                         BIT43\r
-#define COMP_CCX                               BIT44   //CCX Debug Flag\r
-#define        COMP_IOCTL                              BIT45   // IO Control\r
-#define COMP_GP                                        BIT46   // For generic parser.\r
-#define COMP_TXAGG                             BIT47\r
-#define COMP_HVL                               BIT48     // For Ndis 6.2 Context Swirch and Hardware Virtualiztion Layer\r
-#define COMP_TEST                              BIT49\r
-#define COMP_BB_POWERSAVING    BIT50\r
-#define COMP_SWAS                              BIT51   // For SW Antenna Switch\r
-#define COMP_P2P                               BIT52\r
-#define COMP_MUX                               BIT53\r
-#define COMP_FUNC                              BIT54\r
-#define COMP_TDLS                              BIT55\r
-#define COMP_OMNIPEEK                  BIT56\r
-#define COMP_DUALMACSWITCH     BIT60   // 2010/12/27 Add for Dual mac mode debug\r
-#define COMP_EASY_CONCURRENT   BIT61   // 2010/12/27 Add for easy cncurrent mode debug\r
-#define COMP_PSD                               BIT63   //2011/3/9 Add for WLAN PSD for BT AFH\r
-\r
-#define COMP_DFS                                BIT62\r
-\r
-#define        COMP_ALL                                UINT64_C(0xFFFFFFFFFFFFFFFF) // All components\r
-// For debug print flag to use\r
-/*------------------------------Define structure----------------------------*/\r
-/* 2007/07/13 MH  *//*------For DeBuG Print modeue------*/\r
-\r
-/* Defnie structure to store different debug flag variable. Every debug flag \r
-     is a UINT32 integer and you can assign 32 different events. */\r
-typedef struct tag_DBGP_Debug_Flag_Structure\r
-{\r
-       u4Byte  Mans;                   /* Main Scheduler module. */\r
-       u4Byte  Rtos;                   /* RTOS module. */\r
-       u4Byte  Alarm;          /* Alarm module. */     \r
-       u4Byte  Pm;                     /* Performance monitor module. */       \r
-}DBGP_FLAG_T;\r
-\r
-/* Define debug print header for every service module.*/\r
-typedef struct tag_DBGP_Service_Module_Header_Name_Structure\r
-{\r
-       const char      *pMANS;\r
-       const char      *pRTOS;\r
-       const char      *pALM;\r
-       const char      *pPEM;\r
-       const char      *pCMPK;\r
-       const char      *pRAPD;\r
-       const char      *pTXPB;\r
-       const char      *pQUMG;\r
-}DBGP_HEAD_T;\r
-\r
-\r
-/* Define different debug flag for dedicated service modules in debug flag array. */\r
-// Each module has independt 32 bit debug flag you cnn define the flag as yout require.\r
-typedef enum tag_DBGP_Flag_Type_Definition\r
-{\r
-       FQoS                            = 0,    \r
-       FTX                                     = 1,\r
-       FRX                                     = 2,    \r
-       FSEC                            = 3,\r
-       FMGNT                           = 4,\r
-       FMLME                           = 5,\r
-       FRESOURCE                       = 6,\r
-       FBEACON                         = 7,\r
-       FISR                            = 8,\r
-       FPHY                            = 9,\r
-       FMP                                     = 10,\r
-       FEEPROM                 = 11,\r
-       FPWR                            = 12,\r
-       FDM                                     = 13,\r
-       FDBG_CTRL                       = 14,\r
-       FC2H                            = 15,\r
-       FBT                                     = 16,\r
-       FINIT                           = 17,\r
-       FIOCTL                          = 18,\r
-       FSHORT_CUT                      = 19,\r
-       DBGP_TYPE_MAX\r
-}DBGP_FLAG_E;\r
-\r
-\r
-// Define Qos Relative debug flag bit          --> FQoS\r
-#define                QoS_INIT                        BIT0\r
-#define                QoS_VISTA                       BIT1\r
-\r
-// Define TX relative debug bit                                --> FTX\r
-#define                TX_DESC                 BIT0\r
-#define                TX_DESC_TID             BIT1\r
-#define                TX_PATH                 BIT2\r
-\r
-// Define RX relative debug  bit                               --> FRX\r
-#define                RX_DATA                         BIT0    \r
-#define                RX_PHY_STS                              BIT1\r
-#define                RX_PHY_SS                               BIT2\r
-#define                RX_PHY_SQ                               BIT3\r
-#define                RX_PHY_ASTS                     BIT4\r
-#define                RX_ERR_LEN                      BIT5\r
-#define                RX_DEFRAG                       BIT6\r
-#define                RX_ERR_RATE                     BIT7\r
-#define                RX_PATH                         BIT8\r
-#define                RX_BEACON                               BIT9\r
-\r
-// Define Security relative debug  bit                 --> FSEC\r
-\r
-// Define MGNT relative debug bit                      --> FMGNT\r
-\r
-// Define MLME relative debug bit                              --> FMLME\r
-#define                MEDIA_STS                       BIT0\r
-#define                LINK_STS                        BIT1\r
-\r
-// Define OS resource check module bit         --> FRESOURCE\r
-#define                OS_CHK                          BIT0\r
-\r
-// Define beacon content check module bit              --> FBEACON\r
-#define                BCN_SHOW                        BIT0\r
-#define                BCN_PEER                        BIT1\r
-\r
-// Define ISR/IMR check module bit             --> FISR\r
-#define                ISR_CHK                         BIT0\r
-\r
-// Define PHY-BB/RF/MAC check module bit               --> FPHY\r
-#define                PHY_BBR                         BIT0\r
-#define                PHY_BBW                         BIT1\r
-#define                PHY_RFR                         BIT2\r
-#define                PHY_RFW                         BIT3\r
-#define                PHY_MACR                                BIT4\r
-#define                PHY_MACW                                BIT5\r
-#define                PHY_ALLR                                BIT6\r
-#define                PHY_ALLW                                BIT7\r
-#define                PHY_TXPWR                               BIT8\r
-#define                PHY_PWRDIFF                     BIT9\r
-#define                PHY_SICR                                BIT10\r
-#define                PHY_SICW                                BIT11\r
-\r
-// Define MPT driver check module bit          --> FMP\r
-#define                MP_RX                                   BIT0\r
-#define                MP_SWICH_CH                     BIT1\r
-\r
-// Define EEPROM and EFUSE  check module bit           --> FEEPROM\r
-#define                EEPROM_W                                        BIT0\r
-#define                EFUSE_PG                                        BIT1\r
-#define                EFUSE_READ_ALL                  BIT2\r
-#define                EFUSE_ANALYSIS                          BIT3\r
-#define                EFUSE_PG_DETAIL                 BIT4\r
-\r
-// Define power save  check module bit         --> FPWR\r
-#define                LPS                                     BIT0\r
-#define                IPS                                     BIT1\r
-#define                PWRSW                           BIT2\r
-#define                PWRHW                           BIT3\r
-#define                PWRHAL                          BIT4\r
-\r
-// Define Dynamic Mechanism check module bit           --> FDM\r
-#define                WA_IOT                          BIT0\r
-#define                DM_PWDB                 BIT1\r
-#define                DM_Monitor                      BIT2\r
-#define                DM_DIG                          BIT3\r
-#define                DM_EDCA_Turbo           BIT4\r
-#define                DM_BT30                 BIT5\r
-\r
-// Define Dbg Control module bit               --> FDBG_CTRL\r
-#define                DBG_CTRL_TRACE                  BIT0\r
-#define                DBG_CTRL_INBAND_NOISE   BIT1\r
-\r
-// Define FW C2H Cmd check module bit          --> FC2H\r
-#define                C2H_Summary                             BIT0\r
-#define                C2H_PacketData                          BIT1\r
-#define                C2H_ContentData                 BIT2\r
-// Define BT Cmd check module bit              --> FBT\r
-#define                BT_TRACE                                        BIT0\r
-#define                BT_RFPoll                                       BIT1\r
-\r
-// Define init check for module bit            --> FINIT\r
-#define                INIT_EEPROM                             BIT0\r
-#define                INIT_TxPower                            BIT1\r
-#define                INIT_IQK                                        BIT2\r
-#define                INIT_RF                                         BIT3\r
-\r
-// Define IOCTL Cmd check module bit           --> FIOCTL\r
-// section 1 : IRP related\r
-#define                IOCTL_IRP                                               BIT0\r
-#define                IOCTL_IRP_DETAIL                                BIT1\r
-#define                IOCTL_IRP_STATISTICS                    BIT2\r
-#define                IOCTL_IRP_HANDLE                                BIT3\r
-// section 2 : HCI command/event\r
-#define                IOCTL_BT_HCICMD                         BIT8\r
-#define                IOCTL_BT_HCICMD_DETAIL          BIT9\r
-#define                IOCTL_BT_HCICMD_EXT                     BIT10\r
-#define                IOCTL_BT_EVENT                                  BIT11\r
-#define                IOCTL_BT_EVENT_DETAIL                   BIT12\r
-#define                IOCTL_BT_EVENT_PERIODICAL               BIT13\r
-// section 3 : BT tx/rx data and throughput\r
-#define                IOCTL_BT_TX_ACLDATA                     BIT16\r
-#define                IOCTL_BT_TX_ACLDATA_DETAIL      BIT17\r
-#define                IOCTL_BT_RX_ACLDATA                     BIT18\r
-#define                IOCTL_BT_RX_ACLDATA_DETAIL      BIT19\r
-#define                IOCTL_BT_TP                                     BIT20\r
-// section 4 : BT connection state machine.\r
-#define                IOCTL_STATE                                     BIT21   \r
-#define                IOCTL_BT_LOGO                                   BIT22\r
-// section 5 : BT function trace\r
-#define                IOCTL_CALLBACK_FUN                      BIT24\r
-#define                IOCTL_PARSE_BT_PKT                      BIT25\r
-#define                IOCTL_BT_TX_PKT                         BIT26\r
-#define                IOCTL_BT_FLAG_MON                               BIT27\r
-\r
-//\r
-// Define init check for module bit            --> FSHORT_CUT\r
-// 2011/07/20 MH Add for short but definition.\r
-//\r
-#define                SHCUT_TX                                BIT0\r
-#define                SHCUT_RX                                BIT1\r
-\r
-\r
-/* 2007/07/13 MH  *//*------For DeBuG Print modeue------*/\r
-/*------------------------------Define structure----------------------------*/\r
-\r
-\r
-/*------------------------Export Marco Definition---------------------------*/\r
-#if (DM_ODM_SUPPORT_TYPE != ODM_WIN)\r
-#define RT_PRINTK(fmt, args...)    printk( "%s(): " fmt, __FUNCTION__, ## args);\r
-\r
-#if DBG\r
-#define ODM_RT_TRACE(pDM_Odm,comp, level, fmt)                                                                                 \\r
-               if(((comp) & GlobalDebugComponents) && (level <= GlobalDebugLevel))     \\r
-               {                                                                                                                                       \\r
-                       RT_PRINTK fmt;                                                                                                  \\r
-               }\r
-\r
-#define RT_TRACE_F(comp, level, fmt)                                                                                   \\r
-               if(((comp) & GlobalDebugComponents) && (level <= GlobalDebugLevel))     \\r
-               {                                                                                                                                       \\r
-                       RT_PRINTK fmt;                                                                                                  \\r
-               }\r
-\r
-#define RT_ASSERT(expr,fmt)                                                                                                    \\r
-               if(!(expr)) {                                                                                                                   \\r
-                       printk( "Assertion failed! %s at ......\n", #expr);                                                     \\r
-                       printk( "      ......%s,%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__);  \\r
-               }\r
-#define dbg_enter() { printk("==> %s\n", __FUNCTION__); }\r
-#define dbg_exit() { printk("<== %s\n", __FUNCTION__); }\r
-#define dbg_trace(str) { printk("%s:%s\n", __FUNCTION__, str); }\r
-#else\r
-#define ODM_RT_TRACE(pDM_Odm,comp, level, fmt)\r
-#define RT_TRACE_F(comp, level, fmt)\r
-#define RT_ASSERT(expr, fmt)\r
-#define dbg_enter()\r
-#define dbg_exit()\r
-#define dbg_trace(str)\r
-#endif\r
-\r
-#if DBG\r
-#define DbgPrint printk\r
-\r
-#define PRINT_DATA(_TitleString, _HexData, _HexDataLen)                                                                \\r
-                       {                                                                                                                                               \\r
-                               char                    *szTitle = _TitleString;                                                                        \\r
-                               pu1Byte         pbtHexData = _HexData;                                                                  \\r
-                               u4Byte          u4bHexDataLen = _HexDataLen;                                                    \\r
-                               u4Byte          __i;                                                                                                            \\r
-                               DbgPrint("%s", szTitle);                                                                                                        \\r
-                               for (__i=0;__i<u4bHexDataLen;__i++)                                                                     \\r
-                               {                                                                                                                                       \\r
-                                       if ((__i & 15) == 0)                                                                                            \\r
-                                       {                                                                                                                               \\r
-                                               DbgPrint("\n");                                                                                         \\r
-                                       }                                                                                                                               \\r
-                                       DbgPrint("%02X%s", pbtHexData[__i], ( ((__i&3)==3) ? "  " : " ") );             \\r
-                               }                                                                                                                                       \\r
-                               DbgPrint("\n");                                                                                                         \\r
-                       }\r
-\r
-// RT_PRINT_XXX macros: implemented for debugging purpose.\r
-// Added by Annie, 2005-11-21.\r
-#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen)                      \\r
-                       if(((_Comp) & GlobalDebugComponents) && (_Level <= GlobalDebugLevel))   \\r
-                       {                                                                                                                                               \\r
-                               int __i;                                                                                                                                \\r
-                               pu1Byte ptr = (pu1Byte)_HexData;                                                                                \\r
-                               DbgPrint("Rtl819x: ");                                                                                                  \\r
-                               DbgPrint(_TitleString);                                                                                         \\r
-                               for( __i=0; __i<(int)_HexDataLen; __i++ )                                                               \\r
-                               {                                                                                                                                       \\r
-                                       DbgPrint("%02X%s", ptr[__i], (((__i + 1) % 4) == 0)?"  ":" ");                  \\r
-                                       if (((__i + 1) % 16) == 0)      DbgPrint("\n");                                                 \\r
-                               }                                                                                                                                       \\r
-                               DbgPrint("\n");                                                                                                         \\r
-                       }\r
-\r
-#define RT_PRINT_ADDR(_Comp, _Level, _TitleString, _Ptr)                                                               \\r
-                       if(((_Comp) & GlobalDebugComponents) && (_Level <= GlobalDebugLevel))   \\r
-                       {                                                                                                                                               \\r
-                               int __i;                                                                                                                                \\r
-                               pu1Byte ptr = (pu1Byte)_Ptr;                                                                                    \\r
-                               DbgPrint("Rtl819x: ");                                                                                                  \\r
-                               DbgPrint(_TitleString);                                                                                         \\r
-                               DbgPrint(" ");                                                                                                                  \\r
-                               for( __i=0; __i<6; __i++ )                                                                                              \\r
-                                       DbgPrint("%02X%s", ptr[__i], (__i==5)?"":"-");                                                  \\r
-                               DbgPrint("\n");                                                                                                         \\r
-                       }\r
-\r
-#define RT_PRINT_ADDRS(_Comp, _Level, _TitleString, _Ptr, _AddNum)                                     \\r
-                       if(((_Comp) & GlobalDebugComponents) && (_Level <= GlobalDebugLevel))   \\r
-                       {                                                                                                                                               \\r
-                               int __i, __j;                                                                                                                   \\r
-                               pu1Byte ptr = (pu1Byte)_Ptr;                                                                                    \\r
-                               DbgPrint("Rtl819x: ");                                                                                                  \\r
-                               DbgPrint(_TitleString);                                                                                         \\r
-                               DbgPrint("\n");                                                                                                         \\r
-                               for( __i=0; __i<(int)_AddNum; __i++ )                                                                   \\r
-                               {                                                                                                                                       \\r
-                                       for( __j=0; __j<6; __j++ )                                                                                      \\r
-                                               DbgPrint("%02X%s", ptr[__i*6+__j], (__j==5)?"":"-");                            \\r
-                                       DbgPrint("\n");                                                                                                 \\r
-                               }                                                                                                                                       \\r
-                       }\r
-\r
-// Added by Annie, 2005-11-22.\r
-#define        MAX_STR_LEN     64\r
-#define        PRINTABLE(_ch)  (_ch>=' ' &&_ch<='~' )  // I want to see ASCII 33 to 126 only. Otherwise, I print '?'. Annie, 2005-11-22.\r
-\r
-#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len)                                                  \\r
-                       if(((_Comp) & GlobalDebugComponents) && (_Level <= GlobalDebugLevel))   \\r
-                       {                                                                                                                                               \\r
-                               int             __i;                                                                                                                    \\r
-                               u1Byte  buffer[MAX_STR_LEN];                                                                                    \\r
-                               int     length = (_Len<MAX_STR_LEN)? _Len : (MAX_STR_LEN-1) ;                           \\r
-                               PlatformZeroMemory( buffer, MAX_STR_LEN );                                                      \\r
-                               PlatformMoveMemory( buffer, (pu1Byte)_Ptr, length );                                            \\r
-                               for( __i=0; __i<MAX_STR_LEN; __i++ )                                                                    \\r
-                               {                                                                                                                                       \\r
-                                       if( !PRINTABLE(buffer[__i]) )   buffer[__i] = '?';                                              \\r
-                               }                                                                                                                                       \\r
-                               buffer[length] = '\0';                                                                                                  \\r
-                               DbgPrint("Rtl819x: ");                                                                                                  \\r
-                               DbgPrint(_TitleString);                                                                                         \\r
-                               DbgPrint(": %d, <%s>\n", _Len, buffer);                                                                 \\r
-                       }\r
-                       \r
-#else  // of #if DBG\r
-#define DbgPrint(...)  \r
-#define PRINT_DATA(_TitleString, _HexData, _HexDataLen)\r
-#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen)\r
-#define RT_PRINT_ADDR(_Comp, _Level, _TitleString, _Ptr)\r
-#define RT_PRINT_ADDRS(_Comp, _Level, _TitleString, _Ptr, _AddNum)\r
-#define RT_PRINT_STR(_Comp, _Level, _TitleString, _Ptr, _Len)\r
-#endif // of #if DBG\r
-\r
-\r
-\r
-#endif // #if (DM_ODM_SUPPORT_TYPE != ODM_WIN)\r
-\r
-#define                DEBUG_PRINT                             1\r
-\r
-// Please add new OS's print API by yourself\r
-\r
-//#if (RT_PLATFORM==PLATFORM_WINDOWS) \r
-#if (DEBUG_PRINT == 1) && DBG\r
-#define        RT_DISP(dbgtype, dbgflag, printstr)\\r
-{\\r
-       if (DBGP_Type[dbgtype] & dbgflag)\\r
-       {\\r
-               DbgPrint printstr;\\r
-       }\\r
-}\r
-\r
-#define        RT_DISP_ADDR(dbgtype, dbgflag, printstr, _Ptr)\\r
-{\\r
-       if (DBGP_Type[dbgtype] & dbgflag)\\r
-       {\\r
-                               int __i;                                                \\r
-                               pu1Byte ptr = (pu1Byte)_Ptr;    \\r
-                               DbgPrint printstr;                              \\r
-                               DbgPrint(" ");                                  \\r
-                               for( __i=0; __i<6; __i++ )              \\r
-                                       DbgPrint("%02X%s", ptr[__i], (__i==5)?"":"-");          \\r
-                               DbgPrint("\n");                                                 \\r
-       }\\r
-}\r
-\r
-#define RT_DISP_DATA(dbgtype, dbgflag, _TitleString, _HexData, _HexDataLen)\\r
-{\\r
-       if (DBGP_Type[dbgtype] & dbgflag)\\r
-       {\\r
-               int __i;                                                                        \\r
-               pu1Byte ptr = (pu1Byte)_HexData;                        \\r
-               DbgPrint(_TitleString);                                 \\r
-               for( __i=0; __i<(int)_HexDataLen; __i++ )       \\r
-               {                                                                               \\r
-                       DbgPrint("%02X%s", ptr[__i], (((__i + 1) % 4) == 0)?"  ":" ");\\r
-                       if (((__i + 1) % 16) == 0)      DbgPrint("\n");\\r
-               }                                                                               \\r
-               DbgPrint("\n");                                                 \\r
-       }\\r
-}\r
-\r
-#define FunctionIn(_comp)              ODM_RT_TRACE(pDM_Odm,(_comp), DBG_LOUD, ("==========> %s\n",  __FUNCTION__))\r
-#define FunctionOut(_comp)             ODM_RT_TRACE(pDM_Odm,(_comp), DBG_LOUD, ("<========== %s\n",  __FUNCTION__))\r
-\r
-\r
-#else\r
-\r
-#define        RT_DISP(dbgtype, dbgflag, printstr)\r
-#define        RT_DISP_ADDR(dbgtype, dbgflag, printstr, _Ptr)\r
-#define   RT_DISP_DATA(dbgtype, dbgflag, _TitleString, _HexData, _HexDataLen)\r
-\r
-#define FunctionIn(_comp)\r
-#define FunctionOut(_comp)\r
-#endif\r
-/*------------------------Export Marco Definition---------------------------*/\r
-\r
-\r
-/*------------------------Export global variable----------------------------*/\r
-extern u4Byte                  DBGP_Type[DBGP_TYPE_MAX];\r
-extern DBGP_HEAD_T     DBGP_Head;\r
-\r
-/*------------------------Export global variable----------------------------*/\r
-\r
-\r
-/*--------------------------Exported Function prototype---------------------*/\r
-extern void    DBGP_Flag_Init(void);\r
-extern void    DBG_PrintAllFlag(void);\r
-extern void    DBG_PrintAllComp(void);\r
-extern void    DBG_PrintFlagEvent(u1Byte       DbgFlag);\r
-extern void    DBG_DumpMem(const u1Byte DbgComp, \r
-                                                       const u1Byte DbgLevel, \r
-                                                       pu1Byte pMem, \r
-                                                       u2Byte Len);\r
-\r
-/*--------------------------Exported Function prototype---------------------*/\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-extern u4Byte GlobalDebugLevel;\r
-extern u8Byte GlobalDebugComponents;\r
-\r
-\r
-#endif\r
-\r
-\r
-#endif // __ODM_DBG_H__\r
-\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_interface.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_interface.c
deleted file mode 100644 (file)
index 555fd7d..0000000
+++ /dev/null
@@ -1,750 +0,0 @@
-/******************************************************************************\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
-\r
-#include "odm_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_QueryMacReg(pDM_Odm->priv, RegAddr, BitMask);\r
-#elif(DM_ODM_SUPPORT_TYPE & (ODM_WIN))\r
-       PADAPTER                Adapter = pDM_Odm->Adapter;\r
-       return PHY_QueryMacReg(Adapter, RegAddr, BitMask);\r
-#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE))\r
-       return PHY_QueryBBReg(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
-       \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
-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
-\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
-       \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 + (msDelay+9)/10);    \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
-       pTimer->function = CallBackFunc;\r
-       pTimer->data = (unsigned long)pDM_Odm;\r
-       init_timer(pTimer);     \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)\r
-VOID\r
-ODM_FillH2CCmd(\r
-       IN      PADAPTER                Adapter,\r
-       IN      u1Byte  ElementID,\r
-       IN      u4Byte  CmdLen,\r
-       IN      pu1Byte pCmdBuffer\r
-)\r
-{\r
-       if(IS_HARDWARE_TYPE_JAGUAR(Adapter))\r
-       {\r
-               switch(ElementID)\r
-               {\r
-               case ODM_H2C_RSSI_REPORT:\r
-                       FillH2CCmd8812(Adapter, H2C_8812_RSSI_REPORT, CmdLen, pCmdBuffer);\r
-                       break;\r
-               default:\r
-                       break;\r
-               }\r
-\r
-       }\r
-       else if(IS_HARDWARE_TYPE_8192E(Adapter))\r
-       {\r
-               switch(ElementID)\r
-               {\r
-               case ODM_H2C_RSSI_REPORT:\r
-                       FillH2CCmd8812(Adapter, H2C_8812_RSSI_REPORT, CmdLen, pCmdBuffer);\r
-                       break;\r
-               default:\r
-                       break;\r
-               }       \r
-       }\r
-       else if(IS_HARDWARE_TYPE_8723B(Adapter))\r
-       {\r
-               //\r
-               // <Roger_TODO> We should take RTL8723B into consideration, 2012.10.08\r
-               //\r
-               switch(ElementID)\r
-               {\r
-                       case ODM_H2C_RSSI_REPORT:\r
-                          FillH2CCmd8723B(Adapter, H2C_8723B_RSSI_REPORT, CmdLen, pCmdBuffer);\r
-                          break;\r
-                          \r
-                       default:\r
-                          break;                          \r
-               }\r
-\r
-       }\r
-       else if(IS_HARDWARE_TYPE_8188E(Adapter))\r
-       {\r
-               switch(ElementID)\r
-               {\r
-               case ODM_H2C_PSD_RESULT:\r
-                       FillH2CCmd88E(Adapter, H2C_88E_PSD_RESULT, CmdLen, pCmdBuffer);\r
-                       break;\r
-               case ODM_H2C_RSSI_REPORT:\r
-                       if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter))\r
-                               FillH2CCmd88E(Adapter, H2C_88E_RSSI_REPORT, CmdLen, pCmdBuffer);\r
-                       break;\r
-               default:\r
-                       break;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               switch(ElementID)\r
-               {\r
-               case ODM_H2C_RSSI_REPORT:\r
-                       FillH2CCmd92C(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer);\r
-                       break;\r
-               case ODM_H2C_PSD_RESULT:\r
-                       FillH2CCmd92C(Adapter, H2C_92C_PSD_RESULT, CmdLen, pCmdBuffer);\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
-u4Byte\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 rtw_get_current_time();\r
-#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)   \r
-       return  0;\r
-#endif\r
-}\r
-\r
-s4Byte\r
-ODM_GetProgressingTime(        \r
-       IN      PDM_ODM_T               pDM_Odm,\r
-       IN      u4Byte                  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(Start_Time);\r
-#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)   \r
-       return  0;\r
-#endif\r
-}\r
-\r
-\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_interface.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_interface.h
deleted file mode 100644 (file)
index 8c0303b..0000000
+++ /dev/null
@@ -1,394 +0,0 @@
-/******************************************************************************\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
-#if 1 //TODO: enable it if we need to support run-time to differentiate between 92C_SERIES and JAGUAR_SERIES.\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
-#if 0 // 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
-#endif\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
-#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
-\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_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
-//\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)\r
-VOID\r
-ODM_FillH2CCmd(\r
-       IN      PADAPTER                Adapter,\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
-u4Byte\r
-ODM_GetCurrentTime(    \r
-       IN      PDM_ODM_T               pDM_Odm\r
-       );\r
-s4Byte\r
-ODM_GetProgressingTime(        \r
-       IN      PDM_ODM_T               pDM_Odm,\r
-       IN      u4Byte                  Start_Time\r
-       );\r
-\r
-#endif // __ODM_INTERFACE_H__\r
-\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_precomp.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_precomp.h
deleted file mode 100644 (file)
index e3c71d2..0000000
+++ /dev/null
@@ -1,307 +0,0 @@
-/******************************************************************************\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 "odm_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
-\r
-#include "odm.h"\r
-#include "odm_HWConfig.h"\r
-#include "odm_debug.h"\r
-#include "odm_RegDefine11AC.h"\r
-#include "odm_RegDefine11N.h"\r
-#include "odm_AntDiv.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
-       #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
-#include "odm_interface.h"\r
-#include "odm_reg.h"\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/odm_RTL8192C.h"\r
-#endif\r
-#if (RTL8192D_SUPPORT==1) \r
-#include "rtl8192d/odm_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/odm_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/odm_RegConfig8188E.h"\r
-#include "rtl8188e/odm_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/odm_RegConfig8192E.h"\r
-#include "rtl8192e/odm_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/odm_RTL8723B.h"\r
-#include "rtl8723b/odm_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/odm_RegConfig8812A.h"\r
-#include "rtl8812a/odm_RTL8812A.h"\r
-#if (TESTCHIP_SUPPORT == 1) \r
-#include "rtl8812a/HalHWImg8812A_TestChip_MAC.h"\r
-#include "rtl8812a/HalHWImg8812A_TestChip_RF.h"\r
-#include "rtl8812a/HalHWImg8812A_TestChip_BB.h"\r
-#endif\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/odm_RegConfig8821A.h"\r
-#include "rtl8821a/odm_RTL8821A.h"\r
-#if (TESTCHIP_SUPPORT == 1) \r
-#include "rtl8821a/HalHWImg8821A_TestChip_MAC.h"\r
-#include "rtl8821a/HalHWImg8821A_TestChip_RF.h"\r
-#include "rtl8821a/HalHWImg8821A_TestChip_BB.h"\r
-#include "rtl8821a/HalHWImg8821A_TestChip_FW.h"\r
-#endif\r
-#endif\r
-\r
-#endif // __ODM_PRECOMP_H__\r
-\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_reg.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_reg.h
deleted file mode 100644 (file)
index 16999a1..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-/******************************************************************************\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_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
-\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
-\r
-#define        BIT_FA_RESET                                    BIT0\r
-\r
-\r
-\r
-#endif\r
-\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_types.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/odm_types.h
deleted file mode 100644 (file)
index 27cecce..0000000
+++ /dev/null
@@ -1,265 +0,0 @@
-/******************************************************************************
- *
- * 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 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        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) ||(DM_ODM_SUPPORT_TYPE == ODM_ADSL) || (DM_ODM_SUPPORT_TYPE == ODM_CE))
-
-#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_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_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
-       //
-#ifdef CONFIG_ANT_SWITCH
-       #define CONFIG_HW_ANTENNA_DIVERSITY 
-       #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;
-       typedef char                                    s1Byte,*ps1Byte;
-       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;
-
-       #define DEV_BUS_TYPE            RT_PCI_INTERFACE
-
-       #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;
-       typedef char                                    s1Byte,*ps1Byte;
-       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
-
-
-#endif // __ODM_TYPES_H__
-
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_ACS.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_ACS.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_ACS.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_ACS.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_AntDect.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_AntDect.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_AntDect.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_AntDect.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_AntDiv.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_AntDiv.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_AntDiv.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_AntDiv.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_CfoTracking.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_CfoTracking.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_CfoTracking.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_CfoTracking.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_DIG.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_DIG.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_DIG.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_DIG.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_DynamicBBPowerSaving.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_DynamicBBPowerSaving.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_DynamicBBPowerSaving.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_DynamicBBPowerSaving.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_DynamicTxPower.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_DynamicTxPower.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_DynamicTxPower.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_DynamicTxPower.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_EdcaTurboCheck.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_EdcaTurboCheck.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_EdcaTurboCheck.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_EdcaTurboCheck.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_HWConfig.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_HWConfig.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_HWConfig.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_HWConfig.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_NoiseMonitor.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_NoiseMonitor.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_NoiseMonitor.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_NoiseMonitor.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_PathDiv.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_PathDiv.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_PathDiv.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_PathDiv.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_PowerTracking.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_PowerTracking.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_PowerTracking.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_PowerTracking.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_RXHP.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_RXHP.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_RXHP.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_RXHP.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_RaInfo.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_RaInfo.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_RaInfo.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_RaInfo.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_RegDefine11AC.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_RegDefine11AC.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_RegDefine11N.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_RegDefine11N.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_debug.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_debug.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_debug.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_debug.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_interface.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_interface.c
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_interface.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_interface.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_precomp.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_precomp.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_reg.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_reg.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/phydm_types.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/phydm_types.h
new file mode 100644 (file)
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 bda8ad87db47f4601f1bea4640ef8e9f7971b7ce..0f128d161ab8805fba38e38ee22edf06e1ced8cb 100644 (file)
@@ -13,9 +13,9 @@ Major Change History:
        2011-08-12 Page            Create.      
 
 --*/
+#include "Mp_Precomp.h"
 
-
-#include "../odm_precomp.h"
+#include "../phydm_precomp.h"
 
 
 #if (RATE_ADAPTIVE_SUPPORT == 1)
@@ -565,6 +565,7 @@ odm_ARFBRefresh_8188E(
 #if POWER_TRAINING_ACTIVE == 1
 static void 
 odm_PTTryState_8188E(
+       IN      PDM_ODM_T               pDM_Odm,
        IN      PODM_RA_INFO_T  pRaInfo
        )
 {
@@ -621,6 +622,17 @@ odm_PTTryState_8188E(
                pRaInfo->RAstage=0;
        }
        pRaInfo->PTPreRate=pRaInfo->DecisionRate;
+
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       // Disable power training when noisy environment
+       if(pDM_Odm->bDisablePowerTraining)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_PTTryState_8188E(): Disable power training when noisy environment\n"));
+               pRaInfo->PTStage = 0;
+               pRaInfo->RAstage = 0;
+               pRaInfo->PTStopCount = 0;
+       }
+#endif
 }
 
 static void 
@@ -703,10 +715,12 @@ ODM_RASupport_Init(
                //I Cut: FALSE(FW RA); Ohterwise: TRUE(Driver RA)
                pDM_Odm->RaSupport88E = (pDM_Odm->Adapter->RASupport == TRUE);
 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
-               if(pDM_Odm->CutVersion == ODM_CUT_I)//I Cut use FW RA
-                       pDM_Odm->RaSupport88E = FALSE;
-               else
-                       pDM_Odm->RaSupport88E = TRUE;
+               {       
+                       PADAPTER                Adapter = pDM_Odm->Adapter;
+                       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+                       pDM_Odm->RaSupport88E = (TRUE == pHalData->fw_ractrl)?FALSE:TRUE;
+                       
+               }
 #endif
        }
 }
@@ -1037,12 +1051,11 @@ ODM_RA_TxRPT2Handle_8188E(
 
        do
        {
-               if(MacId >= ASSOCIATE_ENTRY_NUM)
-                       valid = 0;
-               else if(MacId >= 32)
-                       valid = (1<<(MacId-32)) & MacIDValidEntry1;
-               else
+               valid = 0;
+               if(MacId < 32)
                        valid = (1<<MacId) & MacIDValidEntry0;
+               else if(MacId < 64)
+                       valid = (1<<(MacId-32)) & MacIDValidEntry1;
 
                if(valid)
                {
@@ -1081,7 +1094,7 @@ ODM_RA_TxRPT2Handle_8188E(
                                                odm_RateDecision_8188E(pDM_Odm,pRAInfo);
                                        }
                                        else if(pRAInfo->RAstage==5){  // Power training try state
-                                               odm_PTTryState_8188E(pRAInfo);
+                                               odm_PTTryState_8188E(pDM_Odm, pRAInfo);
                                        }
                                        else {// RAstage==6
                                                odm_PTDecision_8188E(pRAInfo);
index f5401453ffa4a57aa4640cfd88d5583f1c147c8b..aeb4e76d55fdedddf4570bbb687150a83e540a95 100644 (file)
@@ -41,7 +41,7 @@
 // Bitmap Definition\r
 //\r
 #define        BIT_FA_RESET_8188E                      BIT0\r
-\r
+#define        REG_ADAPTIVE_DATA_RATE_0                0x2B0\r
 #define        REG_DBI_WDATA_8188                      0x0348  // DBI Write Data\r
 #define        REG_DBI_RDATA_8188                      0x034C  // DBI Read Data\r
 #define        REG_DBI_ADDR_8188                       0x0350  // DBI Address\r
@@ -50,5 +50,8 @@
 #define        REG_MDIO_RDATA_8188E            0x0356  // MDIO for Reads PCIE PHY\r
 #define        REG_MDIO_CTL_8188E                      0x0358  // MDIO for Control\r
 \r
+// [0-63]\r
+#define        REG_MACID_NO_LINK                       0x484   // No Link register (bit[x] enabled means dropping packets for MACID in HW queue)\r
+\r
 #endif\r
 \r
index 48945bfa2a1073240986eb925dc8ae18fcd7a163..947281450efb4229e5f85f1d160e5160de41edaa 100644 (file)
 * \r
 ******************************************************************************/\r
 \r
-#include "../odm_precomp.h"\r
-\r
-#ifdef CONFIG_IOL_IOREG_CFG\r
-#include <rtw_iol.h>\r
-#endif\r
+#include "Mp_Precomp.h"\r
+#include "../phydm_precomp.h"\r
 \r
 #if (RTL8188E_SUPPORT == 1)\r
 static BOOLEAN\r
-CheckCondition(\r
-    const u4Byte  Condition,\r
-    const u4Byte  Hex\r
+CheckPositive(\r
+    IN  PDM_ODM_T     pDM_Odm,\r
+    IN  const u4Byte  Condition1,\r
+    IN  const u4Byte  Condition2\r
     )\r
 {\r
-    u4Byte _board     = (Hex & 0x000000FF);\r
-    u4Byte _interface = (Hex & 0x0000FF00) >> 8;\r
-    u4Byte _platform  = (Hex & 0x00FF0000) >> 16;\r
-    u4Byte cond = Condition;\r
+    u1Byte    _BoardType = ((pDM_Odm->BoardType & BIT4) >> 4) << 0 | // _GLNA\r
+                           ((pDM_Odm->BoardType & BIT3) >> 3) << 1 | // _GPA \r
+                           ((pDM_Odm->BoardType & BIT7) >> 7) << 2 | // _ALNA\r
+                           ((pDM_Odm->BoardType & BIT6) >> 6) << 3 | // _APA \r
+                           ((pDM_Odm->BoardType & BIT2) >> 2) << 4;  // _BT  \r
 \r
-    if ( Condition == 0xCDCDCDCD )\r
-        return TRUE;\r
+       u4Byte    cond1   = Condition1, cond2 = Condition2;\r
+       u4Byte    driver1 = pDM_Odm->CutVersion       << 24 |  \r
+                               pDM_Odm->SupportPlatform  << 16 | \r
+                               pDM_Odm->PackageType      << 12 | \r
+                               pDM_Odm->SupportInterface << 8  |\r
+                               _BoardType;\r
 \r
-    cond = Condition & 0x000000FF;\r
-    if ( (_board != cond) && (cond != 0xFF) )\r
-        return FALSE;\r
+       u4Byte    driver2 = pDM_Odm->TypeGLNA <<  0 |  \r
+                               pDM_Odm->TypeGPA  <<  8 | \r
+                               pDM_Odm->TypeALNA << 16 | \r
+                               pDM_Odm->TypeAPA  << 24; \r
 \r
-    cond = Condition & 0x0000FF00;\r
-    cond = cond >> 8;\r
-    if ( ((_interface & cond) == 0) && (cond != 0x07) )\r
-        return FALSE;\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n", cond1, cond2));\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n", driver1, driver2));\r
+\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("     (Platform, Interface) = (0x%X, 0x%X)\n", pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface));\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("     (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->BoardType, pDM_Odm->PackageType));\r
+\r
+\r
+       //============== Value Defined Check ===============//\r
+       //QFN Type [15:12] and Cut Version [27:24] need to do value check\r
+       \r
+       if(((cond1 & 0x0000F000) != 0) &&((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))\r
+               return FALSE;\r
+       if(((cond1 & 0x0F000000) != 0) &&((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))\r
+               return FALSE;           \r
+\r
+       //=============== Bit Defined Check ================//\r
+    // We don't care [31:28] and [23:20]\r
+    //\r
+       cond1   &= 0x000F0FFF; \r
+       driver1 &= 0x000F0FFF; \r
 \r
-    cond = Condition & 0x00FF0000;\r
-    cond = cond >> 16;\r
-    if ( ((_platform & cond) == 0) && (cond != 0x0F) )\r
+    if ((cond1 & driver1) == cond1) \r
+    {\r
+        u4Byte bitMask = 0;\r
+        if ((cond1 & 0x0F) == 0) // BoardType is DONTCARE\r
+            return TRUE;\r
+\r
+        if ((cond1 & BIT0) != 0) //GLNA\r
+            bitMask |= 0x000000FF;\r
+        if ((cond1 & BIT1) != 0) //GPA\r
+            bitMask |= 0x0000FF00;\r
+        if ((cond1 & BIT2) != 0) //ALNA\r
+            bitMask |= 0x00FF0000;\r
+        if ((cond1 & BIT3) != 0) //APA\r
+            bitMask |= 0xFF000000;\r
+\r
+        if ((cond2 & bitMask) == (driver2 & bitMask)) // BoardType of each RF path is matched\r
+            return TRUE;\r
+        else\r
+            return FALSE;\r
+    }\r
+    else \r
+    {\r
         return FALSE;\r
+    }\r
+}\r
+static BOOLEAN\r
+CheckNegative(\r
+    IN  PDM_ODM_T     pDM_Odm,\r
+    IN  const u4Byte  Condition1,\r
+    IN  const u4Byte  Condition2\r
+    )\r
+{\r
     return TRUE;\r
 }\r
 \r
-\r
 /******************************************************************************\r
-*                           AGC_TAB_1T.TXT\r
+*                           AGC_TAB.TXT\r
 ******************************************************************************/\r
 \r
-u4Byte Array_MP_8188E_AGC_TAB_1T[] = { \r
-       0xFF0F0718, 0xABCD,\r
+u4Byte Array_MP_8188E_AGC_TAB[] = { \r
+       0x88000001,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0xF6000001,\r
+               0xC78, 0xF5010001,\r
+               0xC78, 0xF4020001,\r
+               0xC78, 0xF3030001,\r
+               0xC78, 0xF2040001,\r
+       0x90000001,0x00000000,0x40000000,0x00000000,\r
                0xC78, 0xF7000001,\r
                0xC78, 0xF6010001,\r
                0xC78, 0xF5020001,\r
                0xC78, 0xF4030001,\r
                0xC78, 0xF3040001,\r
+       0xA0000000,0x00000000,\r
+               0xC78, 0xFB000001,\r
+               0xC78, 0xFB010001,\r
+               0xC78, 0xFB020001,\r
+               0xC78, 0xFB030001,\r
+               0xC78, 0xFB040001,\r
+       0xB0000000,0x00000000,\r
+       0x88000001,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0xF1050001,\r
+               0xC78, 0xF0060001,\r
+               0xC78, 0xEF070001,\r
+               0xC78, 0xEE080001,\r
+               0xC78, 0xED090001,\r
+               0xC78, 0xEC0A0001,\r
+               0xC78, 0xEB0B0001,\r
+               0xC78, 0xEA0C0001,\r
+               0xC78, 0xE90D0001,\r
+               0xC78, 0xE80E0001,\r
+               0xC78, 0xE70F0001,\r
+               0xC78, 0xE6100001,\r
+               0xC78, 0xE5110001,\r
+               0xC78, 0xE4120001,\r
+               0xC78, 0xE3130001,\r
+               0xC78, 0xE2140001,\r
+               0xC78, 0xC5150001,\r
+               0xC78, 0xC4160001,\r
+               0xC78, 0xC3170001,\r
+               0xC78, 0xC2180001,\r
+               0xC78, 0x88190001,\r
+               0xC78, 0x871A0001,\r
+               0xC78, 0x861B0001,\r
+               0xC78, 0x851C0001,\r
+               0xC78, 0x841D0001,\r
+               0xC78, 0x831E0001,\r
+               0xC78, 0x821F0001,\r
+               0xC78, 0x81200001,\r
+               0xC78, 0x80210001,\r
+       0x90000001,0x00000000,0x40000000,0x00000000,\r
                0xC78, 0xF2050001,\r
                0xC78, 0xF1060001,\r
                0xC78, 0xF0070001,\r
@@ -96,42 +191,37 @@ u4Byte Array_MP_8188E_AGC_TAB_1T[] = {
                0xC78, 0x811F0001,\r
                0xC78, 0x6B200001,\r
                0xC78, 0x6A210001,\r
-               0xC78, 0x69220001,\r
-               0xC78, 0x68230001,\r
-               0xC78, 0x67240001,\r
-               0xC78, 0x66250001,\r
-               0xC78, 0x65260001,\r
-               0xC78, 0x64270001,\r
-               0xC78, 0x63280001,\r
-               0xC78, 0x62290001,\r
-               0xC78, 0x612A0001,\r
-               0xC78, 0x462B0001,\r
-               0xC78, 0x452C0001,\r
-               0xC78, 0x442D0001,\r
-               0xC78, 0x432E0001,\r
-               0xC78, 0x422F0001,\r
-               0xC78, 0x41300001,\r
-               0xC78, 0x40310001,\r
-               0xC78, 0x40320001,\r
-               0xC78, 0x40330001,\r
-               0xC78, 0x40340001,\r
-               0xC78, 0x40350001,\r
-               0xC78, 0x40360001,\r
-               0xC78, 0x40370001,\r
-               0xC78, 0x40380001,\r
-               0xC78, 0x40390001,\r
-               0xC78, 0x403A0001,\r
-               0xC78, 0x403B0001,\r
-               0xC78, 0x403C0001,\r
-               0xC78, 0x403D0001,\r
-               0xC78, 0x403E0001,\r
-               0xC78, 0x403F0001,\r
-       0xCDCDCDCD, 0xCDCD,\r
-               0xC78, 0xFB000001,\r
-               0xC78, 0xFB010001,\r
-               0xC78, 0xFB020001,\r
-               0xC78, 0xFB030001,\r
-               0xC78, 0xFB040001,\r
+       0x98000000,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0xFA050001,\r
+               0xC78, 0xF9060001,\r
+               0xC78, 0xF8070001,\r
+               0xC78, 0xF7080001,\r
+               0xC78, 0xF6090001,\r
+               0xC78, 0xF50A0001,\r
+               0xC78, 0xF40B0001,\r
+               0xC78, 0xF30C0001,\r
+               0xC78, 0xF20D0001,\r
+               0xC78, 0xF10E0001,\r
+               0xC78, 0xF00F0001,\r
+               0xC78, 0xEF100001,\r
+               0xC78, 0xEE110001,\r
+               0xC78, 0xED120001,\r
+               0xC78, 0xEC130001,\r
+               0xC78, 0xEB140001,\r
+               0xC78, 0xEA150001,\r
+               0xC78, 0xE9160001,\r
+               0xC78, 0xE8170001,\r
+               0xC78, 0xE7180001,\r
+               0xC78, 0xE6190001,\r
+               0xC78, 0xE51A0001,\r
+               0xC78, 0xE41B0001,\r
+               0xC78, 0xC71C0001,\r
+               0xC78, 0xC61D0001,\r
+               0xC78, 0xC51E0001,\r
+               0xC78, 0xC41F0001,\r
+               0xC78, 0xC3200001,\r
+               0xC78, 0xC2210001,\r
+       0xA0000000,0x00000000,\r
                0xC78, 0xFB050001,\r
                0xC78, 0xFA060001,\r
                0xC78, 0xF9070001,\r
@@ -161,6 +251,24 @@ u4Byte Array_MP_8188E_AGC_TAB_1T[] = {
                0xC78, 0xE11F0001,\r
                0xC78, 0x8A200001,\r
                0xC78, 0x89210001,\r
+       0xB0000000,0x00000000,\r
+       0x88000001,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0x66220001,\r
+               0xC78, 0x65230001,\r
+               0xC78, 0x64240001,\r
+               0xC78, 0x63250001,\r
+               0xC78, 0x62260001,\r
+               0xC78, 0x61270001,\r
+               0xC78, 0x60280001,\r
+       0x90000001,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0x69220001,\r
+               0xC78, 0x68230001,\r
+               0xC78, 0x67240001,\r
+               0xC78, 0x66250001,\r
+               0xC78, 0x65260001,\r
+               0xC78, 0x64270001,\r
+               0xC78, 0x63280001,\r
+       0xA0000000,0x00000000,\r
                0xC78, 0x88220001,\r
                0xC78, 0x87230001,\r
                0xC78, 0x86240001,\r
@@ -168,10 +276,45 @@ u4Byte Array_MP_8188E_AGC_TAB_1T[] = {
                0xC78, 0x84260001,\r
                0xC78, 0x83270001,\r
                0xC78, 0x82280001,\r
+       0xB0000000,0x00000000,\r
+       0x88000001,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0x4A290001,\r
+               0xC78, 0x492A0001,\r
+               0xC78, 0x482B0001,\r
+               0xC78, 0x472C0001,\r
+       0x90000001,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0x62290001,\r
+               0xC78, 0x612A0001,\r
+               0xC78, 0x462B0001,\r
+               0xC78, 0x452C0001,\r
+       0x98000000,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0x81290001,\r
+               0xC78, 0x242A0001,\r
+               0xC78, 0x232B0001,\r
+               0xC78, 0x222C0001,\r
+       0xA0000000,0x00000000,\r
                0xC78, 0x6B290001,\r
                0xC78, 0x6A2A0001,\r
                0xC78, 0x692B0001,\r
                0xC78, 0x682C0001,\r
+       0xB0000000,0x00000000,\r
+       0x88000001,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0x462D0001,\r
+               0xC78, 0x452E0001,\r
+               0xC78, 0x442F0001,\r
+               0xC78, 0x43300001,\r
+               0xC78, 0x42310001,\r
+               0xC78, 0x41320001,\r
+               0xC78, 0x40330001,\r
+       0x90000001,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0x442D0001,\r
+               0xC78, 0x432E0001,\r
+               0xC78, 0x422F0001,\r
+               0xC78, 0x41300001,\r
+               0xC78, 0x40310001,\r
+               0xC78, 0x40320001,\r
+               0xC78, 0x40330001,\r
+       0xA0000000,0x00000000,\r
                0xC78, 0x672D0001,\r
                0xC78, 0x662E0001,\r
                0xC78, 0x652F0001,\r
@@ -179,6 +322,44 @@ u4Byte Array_MP_8188E_AGC_TAB_1T[] = {
                0xC78, 0x63310001,\r
                0xC78, 0x62320001,\r
                0xC78, 0x61330001,\r
+       0xB0000000,0x00000000,\r
+       0x88000001,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0x40340001,\r
+               0xC78, 0x40350001,\r
+               0xC78, 0x40360001,\r
+               0xC78, 0x40370001,\r
+               0xC78, 0x40380001,\r
+               0xC78, 0x40390001,\r
+               0xC78, 0x403A0001,\r
+               0xC78, 0x403B0001,\r
+               0xC78, 0x403C0001,\r
+               0xC78, 0x403D0001,\r
+               0xC78, 0x403E0001,\r
+       0x90000001,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0x40340001,\r
+               0xC78, 0x40350001,\r
+               0xC78, 0x40360001,\r
+               0xC78, 0x40370001,\r
+               0xC78, 0x40380001,\r
+               0xC78, 0x40390001,\r
+               0xC78, 0x403A0001,\r
+               0xC78, 0x403B0001,\r
+               0xC78, 0x403C0001,\r
+               0xC78, 0x403D0001,\r
+               0xC78, 0x403E0001,\r
+       0x98000000,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0x60340001,\r
+               0xC78, 0x4A350001,\r
+               0xC78, 0x49360001,\r
+               0xC78, 0x48370001,\r
+               0xC78, 0x47380001,\r
+               0xC78, 0x46390001,\r
+               0xC78, 0x453A0001,\r
+               0xC78, 0x443B0001,\r
+               0xC78, 0x433C0001,\r
+               0xC78, 0x423D0001,\r
+               0xC78, 0x413E0001,\r
+       0xA0000000,0x00000000,\r
                0xC78, 0x46340001,\r
                0xC78, 0x45350001,\r
                0xC78, 0x44360001,\r
@@ -190,9 +371,50 @@ u4Byte Array_MP_8188E_AGC_TAB_1T[] = {
                0xC78, 0x403C0001,\r
                0xC78, 0x403D0001,\r
                0xC78, 0x403E0001,\r
+       0xB0000000,0x00000000,\r
                0xC78, 0x403F0001,\r
-       0xFF0F0718, 0xDEAD,\r
-       0xFF0F0718, 0xABCD,\r
+       0x88000001,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0xFB400001,\r
+               0xC78, 0xFA410001,\r
+               0xC78, 0xF9420001,\r
+               0xC78, 0xF8430001,\r
+               0xC78, 0xF7440001,\r
+               0xC78, 0xF6450001,\r
+               0xC78, 0xF5460001,\r
+               0xC78, 0xF4470001,\r
+               0xC78, 0xF3480001,\r
+               0xC78, 0xF2490001,\r
+               0xC78, 0xF14A0001,\r
+               0xC78, 0xF04B0001,\r
+               0xC78, 0xEF4C0001,\r
+               0xC78, 0xEE4D0001,\r
+               0xC78, 0xED4E0001,\r
+               0xC78, 0xEC4F0001,\r
+               0xC78, 0xEB500001,\r
+               0xC78, 0xEA510001,\r
+               0xC78, 0xE9520001,\r
+               0xC78, 0xE8530001,\r
+               0xC78, 0xE7540001,\r
+               0xC78, 0xE6550001,\r
+               0xC78, 0xE5560001,\r
+               0xC78, 0xC6570001,\r
+               0xC78, 0xC5580001,\r
+               0xC78, 0xC4590001,\r
+               0xC78, 0xC35A0001,\r
+               0xC78, 0xC25B0001,\r
+               0xC78, 0xC15C0001,\r
+               0xC78, 0xC05D0001,\r
+               0xC78, 0xA35E0001,\r
+               0xC78, 0xA25F0001,\r
+               0xC78, 0xA1600001,\r
+               0xC78, 0x88610001,\r
+               0xC78, 0x87620001,\r
+               0xC78, 0x86630001,\r
+               0xC78, 0x85640001,\r
+               0xC78, 0x84650001,\r
+               0xC78, 0x83660001,\r
+               0xC78, 0x82670001,\r
+       0x90000001,0x00000000,0x40000000,0x00000000,\r
                0xC78, 0xFB400001,\r
                0xC78, 0xFA410001,\r
                0xC78, 0xF9420001,\r
@@ -233,31 +455,48 @@ u4Byte Array_MP_8188E_AGC_TAB_1T[] = {
                0xC78, 0x67650001,\r
                0xC78, 0x66660001,\r
                0xC78, 0x65670001,\r
-               0xC78, 0x64680001,\r
-               0xC78, 0x63690001,\r
-               0xC78, 0x626A0001,\r
-               0xC78, 0x616B0001,\r
-               0xC78, 0x606C0001,\r
-               0xC78, 0x466D0001,\r
-               0xC78, 0x456E0001,\r
-               0xC78, 0x446F0001,\r
-               0xC78, 0x43700001,\r
-               0xC78, 0x42710001,\r
-               0xC78, 0x41720001,\r
-               0xC78, 0x40730001,\r
-               0xC78, 0x40740001,\r
-               0xC78, 0x40750001,\r
-               0xC78, 0x40760001,\r
-               0xC78, 0x40770001,\r
-               0xC78, 0x40780001,\r
-               0xC78, 0x40790001,\r
-               0xC78, 0x407A0001,\r
-               0xC78, 0x407B0001,\r
-               0xC78, 0x407C0001,\r
-               0xC78, 0x407D0001,\r
-               0xC78, 0x407E0001,\r
-               0xC78, 0x407F0001,\r
-       0xCDCDCDCD, 0xCDCD,\r
+       0x98000000,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0xFB400001,\r
+               0xC78, 0xFB410001,\r
+               0xC78, 0xFB420001,\r
+               0xC78, 0xFB430001,\r
+               0xC78, 0xFB440001,\r
+               0xC78, 0xFB450001,\r
+               0xC78, 0xFB460001,\r
+               0xC78, 0xFB470001,\r
+               0xC78, 0xFA480001,\r
+               0xC78, 0xF9490001,\r
+               0xC78, 0xF84A0001,\r
+               0xC78, 0xF74B0001,\r
+               0xC78, 0xF64C0001,\r
+               0xC78, 0xF54D0001,\r
+               0xC78, 0xF44E0001,\r
+               0xC78, 0xF34F0001,\r
+               0xC78, 0xF2500001,\r
+               0xC78, 0xF1510001,\r
+               0xC78, 0xF0520001,\r
+               0xC78, 0xEF530001,\r
+               0xC78, 0xEE540001,\r
+               0xC78, 0xED550001,\r
+               0xC78, 0xEC560001,\r
+               0xC78, 0xEB570001,\r
+               0xC78, 0xEA580001,\r
+               0xC78, 0xE9590001,\r
+               0xC78, 0xE85A0001,\r
+               0xC78, 0xE75B0001,\r
+               0xC78, 0xE65C0001,\r
+               0xC78, 0xE55D0001,\r
+               0xC78, 0xC65E0001,\r
+               0xC78, 0xC55F0001,\r
+               0xC78, 0xC4600001,\r
+               0xC78, 0xC3610001,\r
+               0xC78, 0xC2620001,\r
+               0xC78, 0xC1630001,\r
+               0xC78, 0xC0640001,\r
+               0xC78, 0xA3650001,\r
+               0xC78, 0xA2660001,\r
+               0xC78, 0xA1670001,\r
+       0xA0000000,0x00000000,\r
                0xC78, 0xFB400001,\r
                0xC78, 0xFB410001,\r
                0xC78, 0xFB420001,\r
@@ -298,283 +537,61 @@ u4Byte Array_MP_8188E_AGC_TAB_1T[] = {
                0xC78, 0x8B650001,\r
                0xC78, 0x8A660001,\r
                0xC78, 0x89670001,\r
+       0xB0000000,0x00000000,\r
+       0x88000001,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0x66680001,\r
+               0xC78, 0x65690001,\r
+               0xC78, 0x646A0001,\r
+               0xC78, 0x636B0001,\r
+               0xC78, 0x626C0001,\r
+       0x90000001,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0x64680001,\r
+               0xC78, 0x63690001,\r
+               0xC78, 0x626A0001,\r
+               0xC78, 0x616B0001,\r
+               0xC78, 0x606C0001,\r
+       0xA0000000,0x00000000,\r
                0xC78, 0x88680001,\r
                0xC78, 0x87690001,\r
                0xC78, 0x866A0001,\r
                0xC78, 0x856B0001,\r
                0xC78, 0x846C0001,\r
-               0xC78, 0x676D0001,\r
-               0xC78, 0x666E0001,\r
-               0xC78, 0x656F0001,\r
-               0xC78, 0x64700001,\r
-               0xC78, 0x63710001,\r
-               0xC78, 0x62720001,\r
-               0xC78, 0x61730001,\r
-               0xC78, 0x60740001,\r
-               0xC78, 0x46750001,\r
-               0xC78, 0x45760001,\r
-               0xC78, 0x44770001,\r
-               0xC78, 0x43780001,\r
-               0xC78, 0x42790001,\r
-               0xC78, 0x417A0001,\r
+       0xB0000000,0x00000000,\r
+       0x88000001,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0x616D0001,\r
+               0xC78, 0x486E0001,\r
+               0xC78, 0x476F0001,\r
+               0xC78, 0x46700001,\r
+               0xC78, 0x45710001,\r
+               0xC78, 0x44720001,\r
+               0xC78, 0x43730001,\r
+               0xC78, 0x42740001,\r
+               0xC78, 0x41750001,\r
+               0xC78, 0x40760001,\r
+               0xC78, 0x40770001,\r
+               0xC78, 0x40780001,\r
+               0xC78, 0x40790001,\r
+               0xC78, 0x407A0001,\r
                0xC78, 0x407B0001,\r
                0xC78, 0x407C0001,\r
-               0xC78, 0x407D0001,\r
-               0xC78, 0x407E0001,\r
-               0xC78, 0x407F0001,\r
-       0xFF0F0718, 0xDEAD,\r
-               0xC50, 0x69553422,\r
-               0xC50, 0x69553420,\r
-\r
-};\r
-\r
-HAL_STATUS\r
-ODM_ReadAndConfig_MP_8188E_AGC_TAB_1T(\r
-       IN   PDM_ODM_T  pDM_Odm\r
-       )\r
-{\r
-       #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)\r
-\r
-       u4Byte     hex         = 0;\r
-       u4Byte     i           = 0;\r
-       u2Byte     count       = 0;\r
-       pu4Byte    ptr_array   = NULL;\r
-       u1Byte     platform    = pDM_Odm->SupportPlatform;\r
-       u1Byte     _interface   = pDM_Odm->SupportInterface;\r
-       u1Byte     board       = pDM_Odm->BoardType;  \r
-       u4Byte     ArrayLen    = sizeof(Array_MP_8188E_AGC_TAB_1T)/sizeof(u4Byte);\r
-       pu4Byte    Array       = Array_MP_8188E_AGC_TAB_1T;\r
-       BOOLEAN         biol = FALSE;\r
-#ifdef CONFIG_IOL_IOREG_CFG\r
-       PADAPTER        Adapter =  pDM_Odm->Adapter;    \r
-       struct xmit_frame       *pxmit_frame;   \r
-       u8 bndy_cnt=1;  \r
-#endif//#ifdef CONFIG_IOL_IOREG_CFG\r
-       HAL_STATUS rst =HAL_STATUS_SUCCESS;\r
-\r
-       hex += board;\r
-       hex += _interface << 8;\r
-       hex += platform << 16;\r
-       hex += 0xFF000000;\r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8188E_AGC_TAB_1T, hex = 0x%X\n", hex));\r
-#ifdef CONFIG_IOL_IOREG_CFG\r
-       biol = rtw_IOL_applied(Adapter);\r
-       \r
-       if(biol){               \r
-               if((pxmit_frame= rtw_IOL_accquire_xmit_frame(Adapter)) == NULL){\r
-                       printk("rtw_IOL_accquire_xmit_frame failed\n");\r
-                       return HAL_STATUS_FAILURE;\r
-               }\r
-       }               \r
-#endif//#ifdef CONFIG_IOL_IOREG_CFG\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 meets the condition.\r
-           if ( v1 < 0xCDCDCDCD )\r
-           {\r
-                       #ifdef CONFIG_IOL_IOREG_CFG\r
-                       if(biol){       \r
-                               if(rtw_IOL_cmd_boundary_handle(pxmit_frame))\r
-                                       bndy_cnt++;\r
-                               rtw_IOL_append_WD_cmd(pxmit_frame,(u2Byte)v1, v2,bMaskDWord);                                   \r
-                       }\r
-                       else\r
-                       #endif  //#ifdef CONFIG_IOL_IOREG_CFG\r
-                       {\r
-                       odm_ConfigBB_AGC_8188E(pDM_Odm, v1, bMaskDWord, v2);\r
-                       }\r
-                   continue;\r
-               }\r
-               else\r
-               { // This line is the start line of branch.\r
-                   if ( !CheckCondition(Array[i], hex) )\r
-                   { // Discard the following (offset, data) pairs.\r
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\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
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\r
-                                       #ifdef CONFIG_IOL_IOREG_CFG\r
-                                       if(biol){       \r
-                                               if(rtw_IOL_cmd_boundary_handle(pxmit_frame))\r
-                                                       bndy_cnt++;\r
-                                               rtw_IOL_append_WD_cmd(pxmit_frame,(u2Byte)v1, v2,bMaskDWord);                                                   \r
-                                       }\r
-                                       else\r
-                                       #endif  //#ifdef CONFIG_IOL_IOREG_CFG\r
-                                       {\r
-                                       odm_ConfigBB_AGC_8188E(pDM_Odm, v1, bMaskDWord, v2);\r
-                                       }\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-\r
-                       while (v2 != 0xDEAD && i < ArrayLen -2)\r
-                       {\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-                       \r
-                   }\r
-               }       \r
-       }\r
-#ifdef CONFIG_IOL_IOREG_CFG\r
-       if(biol){\r
-               //printk("==> %s, pktlen = %d,bndy_cnt = %d\n",__FUNCTION__,pxmit_frame->attrib.pktlen+4+32,bndy_cnt);\r
-               if(rtw_IOL_exec_cmds_sync(pDM_Odm->Adapter, pxmit_frame, 1000, bndy_cnt))\r
-               {                       \r
-                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                       printk("~~~ %s Success !!! \n",__FUNCTION__);\r
-                       {\r
-                               //dump data from TX packet buffer                               \r
-                               rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);\r
-                       }\r
-                       #endif //CONFIG_IOL_IOREG_CFG_DBG\r
-               \r
-               }\r
-               else{\r
-                       printk("~~~ %s IOL_exec_cmds Failed !!! \n",__FUNCTION__);\r
-                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                       {\r
-                               //dump data from TX packet buffer                               \r
-                               rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);\r
-                       }\r
-                       #endif //CONFIG_IOL_IOREG_CFG_DBG\r
-\r
-                       rst = HAL_STATUS_FAILURE;                       \r
-               }\r
-       }\r
-#endif //#ifdef CONFIG_IOL_IOREG_CFG\r
-       return rst;\r
-}\r
-\r
-/******************************************************************************\r
-*                           AGC_TAB_1T_ICUT.TXT\r
-******************************************************************************/\r
-\r
-u4Byte Array_MP_8188E_AGC_TAB_1T_ICUT[] = { \r
-               0xC78, 0xFB000001,\r
-               0xC78, 0xFB010001,\r
-               0xC78, 0xFB020001,\r
-               0xC78, 0xFB030001,\r
-               0xC78, 0xFB040001,\r
-               0xC78, 0xFA050001,\r
-               0xC78, 0xF9060001,\r
-               0xC78, 0xF8070001,\r
-               0xC78, 0xF7080001,\r
-               0xC78, 0xF6090001,\r
-               0xC78, 0xF50A0001,\r
-               0xC78, 0xF40B0001,\r
-               0xC78, 0xF30C0001,\r
-               0xC78, 0xF20D0001,\r
-               0xC78, 0xF10E0001,\r
-               0xC78, 0xF00F0001,\r
-               0xC78, 0xEF100001,\r
-               0xC78, 0xEE110001,\r
-               0xC78, 0xED120001,\r
-               0xC78, 0xEC130001,\r
-               0xC78, 0xEB140001,\r
-               0xC78, 0xEA150001,\r
-               0xC78, 0xE9160001,\r
-               0xC78, 0xE8170001,\r
-               0xC78, 0xE7180001,\r
-               0xC78, 0xE6190001,\r
-               0xC78, 0xE51A0001,\r
-               0xC78, 0xE41B0001,\r
-               0xC78, 0xC71C0001,\r
-               0xC78, 0xC61D0001,\r
-               0xC78, 0xC51E0001,\r
-               0xC78, 0xC41F0001,\r
-               0xC78, 0xC3200001,\r
-               0xC78, 0xC2210001,\r
-               0xC78, 0x88220001,\r
-               0xC78, 0x87230001,\r
-               0xC78, 0x86240001,\r
-               0xC78, 0x85250001,\r
-               0xC78, 0x84260001,\r
-               0xC78, 0x83270001,\r
-               0xC78, 0x82280001,\r
-               0xC78, 0x81290001,\r
-               0xC78, 0x242A0001,\r
-               0xC78, 0x232B0001,\r
-               0xC78, 0x222C0001,\r
-               0xC78, 0x672D0001,\r
-               0xC78, 0x662E0001,\r
-               0xC78, 0x652F0001,\r
-               0xC78, 0x64300001,\r
-               0xC78, 0x63310001,\r
-               0xC78, 0x62320001,\r
-               0xC78, 0x61330001,\r
-               0xC78, 0x60340001,\r
-               0xC78, 0x4A350001,\r
-               0xC78, 0x49360001,\r
-               0xC78, 0x48370001,\r
-               0xC78, 0x47380001,\r
-               0xC78, 0x46390001,\r
-               0xC78, 0x453A0001,\r
-               0xC78, 0x443B0001,\r
-               0xC78, 0x433C0001,\r
-               0xC78, 0x423D0001,\r
-               0xC78, 0x413E0001,\r
-               0xC78, 0x403F0001,\r
-               0xC78, 0xFB400001,\r
-               0xC78, 0xFB410001,\r
-               0xC78, 0xFB420001,\r
-               0xC78, 0xFB430001,\r
-               0xC78, 0xFB440001,\r
-               0xC78, 0xFB450001,\r
-               0xC78, 0xFB460001,\r
-               0xC78, 0xFB470001,\r
-               0xC78, 0xFA480001,\r
-               0xC78, 0xF9490001,\r
-               0xC78, 0xF84A0001,\r
-               0xC78, 0xF74B0001,\r
-               0xC78, 0xF64C0001,\r
-               0xC78, 0xF54D0001,\r
-               0xC78, 0xF44E0001,\r
-               0xC78, 0xF34F0001,\r
-               0xC78, 0xF2500001,\r
-               0xC78, 0xF1510001,\r
-               0xC78, 0xF0520001,\r
-               0xC78, 0xEF530001,\r
-               0xC78, 0xEE540001,\r
-               0xC78, 0xED550001,\r
-               0xC78, 0xEC560001,\r
-               0xC78, 0xEB570001,\r
-               0xC78, 0xEA580001,\r
-               0xC78, 0xE9590001,\r
-               0xC78, 0xE85A0001,\r
-               0xC78, 0xE75B0001,\r
-               0xC78, 0xE65C0001,\r
-               0xC78, 0xE55D0001,\r
-               0xC78, 0xC65E0001,\r
-               0xC78, 0xC55F0001,\r
-               0xC78, 0xC4600001,\r
-               0xC78, 0xC3610001,\r
-               0xC78, 0xC2620001,\r
-               0xC78, 0xC1630001,\r
-               0xC78, 0xC0640001,\r
-               0xC78, 0xA3650001,\r
-               0xC78, 0xA2660001,\r
-               0xC78, 0xA1670001,\r
-               0xC78, 0x88680001,\r
-               0xC78, 0x87690001,\r
-               0xC78, 0x866A0001,\r
-               0xC78, 0x856B0001,\r
-               0xC78, 0x846C0001,\r
+       0x90000001,0x00000000,0x40000000,0x00000000,\r
+               0xC78, 0x466D0001,\r
+               0xC78, 0x456E0001,\r
+               0xC78, 0x446F0001,\r
+               0xC78, 0x43700001,\r
+               0xC78, 0x42710001,\r
+               0xC78, 0x41720001,\r
+               0xC78, 0x40730001,\r
+               0xC78, 0x40740001,\r
+               0xC78, 0x40750001,\r
+               0xC78, 0x40760001,\r
+               0xC78, 0x40770001,\r
+               0xC78, 0x40780001,\r
+               0xC78, 0x40790001,\r
+               0xC78, 0x407A0001,\r
+               0xC78, 0x407B0001,\r
+               0xC78, 0x407C0001,\r
+       0x98000000,0x00000000,0x40000000,0x00000000,\r
                0xC78, 0x836D0001,\r
                0xC78, 0x826E0001,\r
                0xC78, 0x666F0001,\r
@@ -586,591 +603,113 @@ u4Byte Array_MP_8188E_AGC_TAB_1T_ICUT[] = {
                0xC78, 0x48750001,\r
                0xC78, 0x47760001,\r
                0xC78, 0x46770001,\r
-               0xC78, 0x45780001,\r
-               0xC78, 0x44790001,\r
-               0xC78, 0x437A0001,\r
-               0xC78, 0x427B0001,\r
-               0xC78, 0x417C0001,\r
-               0xC78, 0x407D0001,\r
-               0xC78, 0x407E0001,\r
-               0xC78, 0x407F0001,\r
-               0xC50, 0x69553422,\r
-               0xC50, 0x69553420,\r
-\r
-};\r
-\r
-HAL_STATUS\r
-ODM_ReadAndConfig_MP_8188E_AGC_TAB_1T_ICUT(\r
-       IN   PDM_ODM_T  pDM_Odm\r
-       )\r
-{\r
-       #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)\r
-\r
-       u4Byte     hex         = 0;\r
-       u4Byte     i           = 0;\r
-       u2Byte     count       = 0;\r
-       pu4Byte    ptr_array   = NULL;\r
-       u1Byte     platform    = pDM_Odm->SupportPlatform;\r
-       u1Byte     _interface   = pDM_Odm->SupportInterface;\r
-       u1Byte     board       = pDM_Odm->BoardType;  \r
-       u4Byte     ArrayLen    = sizeof(Array_MP_8188E_AGC_TAB_1T_ICUT)/sizeof(u4Byte);\r
-       pu4Byte    Array       = Array_MP_8188E_AGC_TAB_1T_ICUT;\r
-       BOOLEAN         biol = FALSE;\r
-#ifdef CONFIG_IOL_IOREG_CFG\r
-       PADAPTER        Adapter =  pDM_Odm->Adapter;    \r
-       struct xmit_frame       *pxmit_frame;   \r
-       u8 bndy_cnt=1;  \r
-#endif//#ifdef CONFIG_IOL_IOREG_CFG\r
-       HAL_STATUS rst =HAL_STATUS_SUCCESS;\r
-\r
-       hex += board;\r
-       hex += _interface << 8;\r
-       hex += platform << 16;\r
-       hex += 0xFF000000;\r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8188E_AGC_TAB_1T_ICUT, hex = 0x%X\n", hex));\r
-#ifdef CONFIG_IOL_IOREG_CFG\r
-       biol = rtw_IOL_applied(Adapter);\r
-       \r
-       if(biol){               \r
-               if((pxmit_frame= rtw_IOL_accquire_xmit_frame(Adapter)) == NULL){\r
-                       printk("rtw_IOL_accquire_xmit_frame failed\n");\r
-                       return HAL_STATUS_FAILURE;\r
-               }\r
-       }               \r
-#endif//#ifdef CONFIG_IOL_IOREG_CFG\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 meets the condition.\r
-           if ( v1 < 0xCDCDCDCD )\r
-           {\r
-                       #ifdef CONFIG_IOL_IOREG_CFG\r
-                       if(biol){       \r
-                               if(rtw_IOL_cmd_boundary_handle(pxmit_frame))\r
-                                       bndy_cnt++;\r
-                               rtw_IOL_append_WD_cmd(pxmit_frame,(u2Byte)v1, v2,bMaskDWord);                                   \r
-                       }\r
-                       else\r
-                       #endif  //#ifdef CONFIG_IOL_IOREG_CFG\r
-                       {\r
-                       odm_ConfigBB_AGC_8188E(pDM_Odm, v1, bMaskDWord, v2);\r
-                       }\r
-                   continue;\r
-               }\r
-               else\r
-               { // This line is the start line of branch.\r
-                   if ( !CheckCondition(Array[i], hex) )\r
-                   { // Discard the following (offset, data) pairs.\r
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\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
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\r
-                                       #ifdef CONFIG_IOL_IOREG_CFG\r
-                                       if(biol){       \r
-                                               if(rtw_IOL_cmd_boundary_handle(pxmit_frame))\r
-                                                       bndy_cnt++;\r
-                                               rtw_IOL_append_WD_cmd(pxmit_frame,(u2Byte)v1, v2,bMaskDWord);                                                   \r
-                                       }\r
-                                       else\r
-                                       #endif  //#ifdef CONFIG_IOL_IOREG_CFG\r
-                                       {\r
-                                       odm_ConfigBB_AGC_8188E(pDM_Odm, v1, bMaskDWord, v2);\r
-                                       }\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-\r
-                       while (v2 != 0xDEAD && i < ArrayLen -2)\r
-                       {\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-                       \r
-                   }\r
-               }       \r
-       }\r
-#ifdef CONFIG_IOL_IOREG_CFG\r
-       if(biol){\r
-               //printk("==> %s, pktlen = %d,bndy_cnt = %d\n",__FUNCTION__,pxmit_frame->attrib.pktlen+4+32,bndy_cnt);\r
-               if(rtw_IOL_exec_cmds_sync(pDM_Odm->Adapter, pxmit_frame, 1000, bndy_cnt))\r
-               {                       \r
-                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                       printk("~~~ %s Success !!! \n",__FUNCTION__);\r
-                       {\r
-                               //dump data from TX packet buffer                               \r
-                               rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);\r
-                       }\r
-                       #endif //CONFIG_IOL_IOREG_CFG_DBG\r
-               \r
-               }\r
-               else{\r
-                       printk("~~~ %s IOL_exec_cmds Failed !!! \n",__FUNCTION__);\r
-                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                       {\r
-                               //dump data from TX packet buffer                               \r
-                               rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);\r
-                       }\r
-                       #endif //CONFIG_IOL_IOREG_CFG_DBG\r
-\r
-                       rst = HAL_STATUS_FAILURE;                       \r
-               }\r
-       }\r
-#endif //#ifdef CONFIG_IOL_IOREG_CFG\r
-       return rst;\r
-}\r
-\r
-/******************************************************************************\r
-*                           PHY_REG_1T.TXT\r
-******************************************************************************/\r
-\r
-u4Byte Array_MP_8188E_PHY_REG_1T[] = { \r
-               0x800, 0x80040000,\r
-               0x804, 0x00000003,\r
-               0x808, 0x0000FC00,\r
-               0x80C, 0x0000000A,\r
-               0x810, 0x10001331,\r
-               0x814, 0x020C3D10,\r
-               0x818, 0x02200385,\r
-               0x81C, 0x00000000,\r
-               0x820, 0x01000100,\r
-               0x824, 0x00390204,\r
-               0x828, 0x00000000,\r
-               0x82C, 0x00000000,\r
-               0x830, 0x00000000,\r
-               0x834, 0x00000000,\r
-               0x838, 0x00000000,\r
-               0x83C, 0x00000000,\r
-               0x840, 0x00010000,\r
-               0x844, 0x00000000,\r
-               0x848, 0x00000000,\r
-               0x84C, 0x00000000,\r
-               0x850, 0x00000000,\r
-               0x854, 0x00000000,\r
-               0x858, 0x569A11A9,\r
-               0x85C, 0x01000014,\r
-               0x860, 0x66F60110,\r
-               0x864, 0x061F0649,\r
-               0x868, 0x00000000,\r
-               0x86C, 0x27272700,\r
-       0xFF0F0718, 0xABCD,\r
-               0x870, 0x07000300,\r
-       0xCDCDCDCD, 0xCDCD,\r
-               0x870, 0x07000760,\r
-       0xFF0F0718, 0xDEAD,\r
-               0x874, 0x25004000,\r
-               0x878, 0x00000808,\r
-               0x87C, 0x00000000,\r
-               0x880, 0xB0000C1C,\r
-               0x884, 0x00000001,\r
-               0x888, 0x00000000,\r
-               0x88C, 0xCCC000C0,\r
-               0x890, 0x00000800,\r
-               0x894, 0xFFFFFFFE,\r
-               0x898, 0x40302010,\r
-               0x89C, 0x00706050,\r
-               0x900, 0x00000000,\r
-               0x904, 0x00000023,\r
-               0x908, 0x00000000,\r
-               0x90C, 0x81121111,\r
-               0x910, 0x00000002,\r
-               0x914, 0x00000201,\r
-               0xA00, 0x00D047C8,\r
-               0xA04, 0x80FF000C,\r
-               0xA08, 0x8C838300,\r
-               0xA0C, 0x2E7F120F,\r
-               0xA10, 0x9500BB78,\r
-               0xA14, 0x1114D028,\r
-               0xA18, 0x00881117,\r
-               0xA1C, 0x89140F00,\r
-       0xFF0F0718, 0xABCD,\r
-               0xA20, 0x13130000,\r
-               0xA24, 0x060A0D10,\r
-               0xA28, 0x00000103,\r
-       0xCDCDCDCD, 0xCDCD,\r
-               0xA20, 0x1A1B0000,\r
-               0xA24, 0x090E1317,\r
-               0xA28, 0x00000204,\r
-       0xFF0F0718, 0xDEAD,\r
-               0xA2C, 0x00D30000,\r
-               0xA70, 0x101FBF00,\r
-               0xA74, 0x00000007,\r
-               0xA78, 0x00000900,\r
-               0xA7C, 0x225B0606,\r
-               0xA80, 0x218075B1,\r
-       0xFF0F0718, 0xABCD,\r
-               0xB2C, 0x00000000,\r
-       0xCDCDCDCD, 0xCDCD,\r
-               0xB2C, 0x80000000,\r
-       0xFF0F0718, 0xDEAD,\r
-               0xC00, 0x48071D40,\r
-               0xC04, 0x03A05611,\r
-               0xC08, 0x000000E4,\r
-               0xC0C, 0x6C6C6C6C,\r
-               0xC10, 0x08800000,\r
-               0xC14, 0x40000100,\r
-               0xC18, 0x08800000,\r
-               0xC1C, 0x40000100,\r
-               0xC20, 0x00000000,\r
-               0xC24, 0x00000000,\r
-               0xC28, 0x00000000,\r
-               0xC2C, 0x00000000,\r
-               0xC30, 0x69E9AC47,\r
-               0xC34, 0x469652AF,\r
-               0xC38, 0x49795994,\r
-               0xC3C, 0x0A97971C,\r
-               0xC40, 0x1F7C403F,\r
-               0xC44, 0x000100B7,\r
-               0xC48, 0xEC020107,\r
-               0xC4C, 0x007F037F,\r
+               0xC78, 0x45780001,\r
+               0xC78, 0x44790001,\r
+               0xC78, 0x437A0001,\r
+               0xC78, 0x427B0001,\r
+               0xC78, 0x417C0001,\r
+       0xA0000000,0x00000000,\r
+               0xC78, 0x676D0001,\r
+               0xC78, 0x666E0001,\r
+               0xC78, 0x656F0001,\r
+               0xC78, 0x64700001,\r
+               0xC78, 0x63710001,\r
+               0xC78, 0x62720001,\r
+               0xC78, 0x61730001,\r
+               0xC78, 0x60740001,\r
+               0xC78, 0x46750001,\r
+               0xC78, 0x45760001,\r
+               0xC78, 0x44770001,\r
+               0xC78, 0x43780001,\r
+               0xC78, 0x42790001,\r
+               0xC78, 0x417A0001,\r
+               0xC78, 0x407B0001,\r
+               0xC78, 0x407C0001,\r
+       0xB0000000,0x00000000,\r
+               0xC78, 0x407D0001,\r
+               0xC78, 0x407E0001,\r
+               0xC78, 0x407F0001,\r
+               0xC50, 0x69553422,\r
                0xC50, 0x69553420,\r
-               0xC54, 0x43BC0094,\r
-               0xC58, 0x00013169,\r
-               0xC5C, 0x00250492,\r
-               0xC60, 0x00000000,\r
-               0xC64, 0x7112848B,\r
-               0xC68, 0x47C00BFF,\r
-               0xC6C, 0x00000036,\r
-               0xC70, 0x2C7F000D,\r
-               0xC74, 0x020610DB,\r
-               0xC78, 0x0000001F,\r
-               0xC7C, 0x00B91612,\r
-       0xFF0F0718, 0xABCD,\r
-               0xC80, 0x2D4000B5,\r
-       0xCDCDCDCD, 0xCDCD,\r
-               0xC80, 0x390000E4,\r
-       0xFF0F0718, 0xDEAD,\r
-               0xC84, 0x20F60000,\r
-               0xC88, 0x40000100,\r
-               0xC8C, 0x20200000,\r
-               0xC90, 0x00091521,\r
-               0xC94, 0x00000000,\r
-               0xC98, 0x00121820,\r
-               0xC9C, 0x00007F7F,\r
-               0xCA0, 0x00000000,\r
-               0xCA4, 0x000300A0,\r
-               0xCA8, 0x00000000,\r
-               0xCAC, 0x00000000,\r
-               0xCB0, 0x00000000,\r
-               0xCB4, 0x00000000,\r
-               0xCB8, 0x00000000,\r
-               0xCBC, 0x28000000,\r
-               0xCC0, 0x00000000,\r
-               0xCC4, 0x00000000,\r
-               0xCC8, 0x00000000,\r
-               0xCCC, 0x00000000,\r
-               0xCD0, 0x00000000,\r
-               0xCD4, 0x00000000,\r
-               0xCD8, 0x64B22427,\r
-               0xCDC, 0x00766932,\r
-               0xCE0, 0x00222222,\r
-               0xCE4, 0x00000000,\r
-               0xCE8, 0x37644302,\r
-               0xCEC, 0x2F97D40C,\r
-               0xD00, 0x00000740,\r
-               0xD04, 0x00020401,\r
-               0xD08, 0x0000907F,\r
-               0xD0C, 0x20010201,\r
-               0xD10, 0xA0633333,\r
-               0xD14, 0x3333BC43,\r
-               0xD18, 0x7A8F5B6F,\r
-               0xD2C, 0xCC979975,\r
-               0xD30, 0x00000000,\r
-               0xD34, 0x80608000,\r
-               0xD38, 0x00000000,\r
-               0xD3C, 0x00127353,\r
-               0xD40, 0x00000000,\r
-               0xD44, 0x00000000,\r
-               0xD48, 0x00000000,\r
-               0xD4C, 0x00000000,\r
-               0xD50, 0x6437140A,\r
-               0xD54, 0x00000000,\r
-               0xD58, 0x00000282,\r
-               0xD5C, 0x30032064,\r
-               0xD60, 0x4653DE68,\r
-               0xD64, 0x04518A3C,\r
-               0xD68, 0x00002101,\r
-               0xD6C, 0x2A201C16,\r
-               0xD70, 0x1812362E,\r
-               0xD74, 0x322C2220,\r
-               0xD78, 0x000E3C24,\r
-               0xE00, 0x2D2D2D2D,\r
-               0xE04, 0x2D2D2D2D,\r
-               0xE08, 0x0390272D,\r
-               0xE10, 0x2D2D2D2D,\r
-               0xE14, 0x2D2D2D2D,\r
-               0xE18, 0x2D2D2D2D,\r
-               0xE1C, 0x2D2D2D2D,\r
-               0xE28, 0x00000000,\r
-               0xE30, 0x1000DC1F,\r
-               0xE34, 0x10008C1F,\r
-               0xE38, 0x02140102,\r
-               0xE3C, 0x681604C2,\r
-               0xE40, 0x01007C00,\r
-               0xE44, 0x01004800,\r
-               0xE48, 0xFB000000,\r
-               0xE4C, 0x000028D1,\r
-               0xE50, 0x1000DC1F,\r
-               0xE54, 0x10008C1F,\r
-               0xE58, 0x02140102,\r
-               0xE5C, 0x28160D05,\r
-               0xE60, 0x00000008,\r
-               0xE68, 0x001B25A4,\r
-               0xE6C, 0x00C00014,\r
-               0xE70, 0x00C00014,\r
-               0xE74, 0x01000014,\r
-               0xE78, 0x01000014,\r
-               0xE7C, 0x01000014,\r
-               0xE80, 0x01000014,\r
-               0xE84, 0x00C00014,\r
-               0xE88, 0x01000014,\r
-               0xE8C, 0x00C00014,\r
-               0xED0, 0x00C00014,\r
-               0xED4, 0x00C00014,\r
-               0xED8, 0x00C00014,\r
-               0xEDC, 0x00000014,\r
-               0xEE0, 0x00000014,\r
-       0xFF0F0718, 0xABCD,\r
-               0xEE8, 0x32555448,\r
-       0xCDCDCDCD, 0xCDCD,\r
-               0xEE8, 0x21555448,\r
-       0xFF0F0718, 0xDEAD,\r
-               0xEEC, 0x01C00014,\r
-               0xF14, 0x00000003,\r
-               0xF4C, 0x00000000,\r
-               0xF00, 0x00000300,\r
 \r
 };\r
 \r
-HAL_STATUS\r
-ODM_ReadAndConfig_MP_8188E_PHY_REG_1T(\r
+void\r
+ODM_ReadAndConfig_MP_8188E_AGC_TAB(\r
        IN   PDM_ODM_T  pDM_Odm\r
        )\r
 {\r
-       #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)\r
-\r
-       u4Byte     hex         = 0;\r
-       u4Byte     i           = 0;\r
-       u2Byte     count       = 0;\r
-       pu4Byte    ptr_array   = NULL;\r
-       u1Byte     platform    = pDM_Odm->SupportPlatform;\r
-       u1Byte     _interface   = pDM_Odm->SupportInterface;\r
-       u1Byte     board       = pDM_Odm->BoardType;  \r
-       u4Byte     ArrayLen    = sizeof(Array_MP_8188E_PHY_REG_1T)/sizeof(u4Byte);\r
-       pu4Byte    Array       = Array_MP_8188E_PHY_REG_1T;\r
-       BOOLEAN         biol = FALSE;\r
-#ifdef CONFIG_IOL_IOREG_CFG\r
-       PADAPTER        Adapter =  pDM_Odm->Adapter;    \r
-       struct xmit_frame       *pxmit_frame;\r
-       u8 bndy_cnt=1;\r
-       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-       struct cmd_cmp cmpdata[ArrayLen];\r
-       u4Byte  cmpdata_idx=0;\r
-       #endif\r
-#endif//#ifdef CONFIG_IOL_IOREG_CFG\r
-       HAL_STATUS rst =HAL_STATUS_SUCCESS;\r
-\r
-       hex += board;\r
-       hex += _interface << 8;\r
-       hex += platform << 16;\r
-       hex += 0xFF000000;\r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8188E_PHY_REG_1T, hex = 0x%X\n", hex));\r
-#ifdef CONFIG_IOL_IOREG_CFG\r
-       biol = rtw_IOL_applied(Adapter);\r
+    u4Byte     i         = 0;\r
+    u1Byte     cCond;\r
+    BOOLEAN bMatched = TRUE, bSkipped = FALSE;\r
+//ask by Luke.Lee\r
+    u4Byte     ArrayLen    = sizeof(Array_MP_8188E_AGC_TAB)/sizeof(u4Byte);\r
+    pu4Byte    Array       = Array_MP_8188E_AGC_TAB;\r
        \r
-       if(biol){               \r
-               if((pxmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL)\r
-               {\r
-                       printk("rtw_IOL_accquire_xmit_frame failed\n");\r
-                       return HAL_STATUS_FAILURE;\r
-               }\r
-       }               \r
-#endif//#ifdef CONFIG_IOL_IOREG_CFG\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8188E_AGC_TAB\n"));\r
 \r
-       for (i = 0; i < ArrayLen; i += 2 )\r
+       while(( i+1) < ArrayLen)\r
        {\r
-           u4Byte v1 = Array[i];\r
-           u4Byte v2 = Array[i+1];\r
-       \r
-           // This (offset, data) pair meets the condition.\r
-           if ( v1 < 0xCDCDCDCD )\r
-           {\r
-                       #ifdef CONFIG_IOL_IOREG_CFG\r
-                       if(biol){\r
-                               if(rtw_IOL_cmd_boundary_handle(pxmit_frame))\r
-                                       bndy_cnt++;\r
-\r
+               u4Byte v1 = Array[i];\r
+               u4Byte v2 = Array[i+1];\r
 \r
-                               if (v1 == 0xfe){                                                \r
-                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,50);                                    \r
-                               }\r
-                               else if (v1 == 0xfd){\r
-                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,5);\r
-                               }\r
-                               else if (v1 == 0xfc){\r
-                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,1);\r
-                               }\r
-                               else if (v1 == 0xfb){\r
-                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,50);\r
-                               }\r
-                               else if (v1 == 0xfa){\r
-                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 5);\r
-                               }\r
-                               else if (v1 == 0xf9){\r
-                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,1);\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{\r
-                                       if (v1 == 0xa24)\r
-                                               pDM_Odm->RFCalibrateInfo.RegA24 = v2;   \r
-               \r
-                                       rtw_IOL_append_WD_cmd(pxmit_frame,(u2Byte)v1, v2,bMaskDWord);   \r
-                                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                                                       cmpdata[cmpdata_idx].addr = v1;\r
-                                                       cmpdata[cmpdata_idx].value= v2;\r
-                                                       cmpdata_idx++;\r
-                                       #endif\r
+                               else if(cCond == COND_ELSE) //else\r
+                               {\r
+                                       bMatched = bSkipped?FALSE:TRUE;\r
                                }\r
-                       }\r
-                       else\r
-                       #endif  //#ifdef CONFIG_IOL_IOREG_CFG\r
-                       {\r
-                               odm_ConfigBB_PHY_8188E(pDM_Odm, v1, bMaskDWord, v2);\r
-                       }\r
-                       continue;\r
-               }\r
-               else\r
-               { // This line is the start line of branch.\r
-                   if ( !CheckCondition(Array[i], hex) )\r
-                   { // Discard the following (offset, data) pairs.\r
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\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
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\r
-                                       #ifdef CONFIG_IOL_IOREG_CFG\r
-                                       if(biol){       \r
-                                               if(rtw_IOL_cmd_boundary_handle(pxmit_frame))    \r
-                                                       bndy_cnt++;\r
-                                               if (v1 == 0xfe){                                                \r
-                                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,50);                                            \r
-                                               }\r
-                                               else if (v1 == 0xfd){\r
-                                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,5);\r
-                                               }\r
-                                               else if (v1 == 0xfc){\r
-                                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,1);\r
-                                               }\r
-                                               else if (v1 == 0xfb){\r
-                                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,50);\r
-                                               }\r
-                                               else if (v1 == 0xfa){\r
-                                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,5);\r
-                                               }\r
-                                               else if (v1 == 0xf9){\r
-                                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,1);\r
-                                               }\r
-                                               else{\r
-                                                       if (v1 == 0xa24)\r
-                                                               pDM_Odm->RFCalibrateInfo.RegA24 = v2;   \r
-                       \r
-                                                       rtw_IOL_append_WD_cmd(pxmit_frame,(u2Byte)v1, v2,bMaskDWord);   \r
-                                                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                                                               cmpdata[cmpdata_idx].addr = v1;\r
-                                                               cmpdata[cmpdata_idx].value= v2;\r
-                                                               cmpdata_idx++;\r
-                                                       #endif\r
-                                               }\r
-                                       }\r
+                               else //if , else if\r
+                               {\r
+                                       if(bSkipped)\r
+                                               bMatched = FALSE;\r
                                        else\r
-                                       #endif  //#ifdef CONFIG_IOL_IOREG_CFG\r
                                        {\r
-                                               odm_ConfigBB_PHY_8188E(pDM_Odm, v1, bMaskDWord, v2);\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
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-\r
-                       while (v2 != 0xDEAD && i < ArrayLen -2)\r
-                       {\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-                       \r
-                   }\r
-               }       \r
-       }\r
-#ifdef CONFIG_IOL_IOREG_CFG\r
-       if(biol){\r
-               //printk("==> %s, pktlen = %d,bndy_cnt = %d\n",__FUNCTION__,pxmit_frame->attrib.pktlen+4+32,bndy_cnt);\r
-               if(rtw_IOL_exec_cmds_sync(pDM_Odm->Adapter, pxmit_frame, 1000, bndy_cnt))\r
-               {                       \r
-                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                       printk("~~~ %s IOL_exec_cmds Success !!! \n",__FUNCTION__);\r
-                       {\r
-                               u4Byte idx;\r
-                               u4Byte cdata;\r
-                               printk("  %s data compare => array_len:%d \n",__FUNCTION__,cmpdata_idx);\r
-                               printk("### %s data compared !!###\n",__FUNCTION__);\r
-                               for(idx=0;idx< cmpdata_idx;idx++)\r
-                               {\r
-                                       cdata = ODM_Read4Byte(pDM_Odm, cmpdata[idx].addr);\r
-                                       if(cdata != cmpdata[idx].value){\r
-                                               printk(" addr:0x%04x, data:(0x%02x : 0x%02x) \n",\r
-                                                       cmpdata[idx].addr,cmpdata[idx].value,cdata);\r
-                                               rst = HAL_STATUS_FAILURE;\r
-                                       }                                       \r
                                }\r
-                               printk("### %s data compared !!###\n",__FUNCTION__);\r
-                               //if(rst == HAL_STATUS_FAILURE)\r
-                               {//dump data from TX packet buffer                              \r
-                                       rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);\r
-                               }\r
-                               \r
                        }\r
-                       #endif //CONFIG_IOL_IOREG_CFG_DBG\r
-               \r
-               }\r
-               else{\r
-                       rst = HAL_STATUS_FAILURE;\r
-                       printk("~~~ IOL Config %s Failed !!! \n",__FUNCTION__);\r
-                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                       {\r
-                               //dump data from TX packet buffer                               \r
-                               rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);\r
+                       else if(v1 & BIT30){ //negative condition\r
+                       //do nothing\r
                        }\r
-                       #endif //CONFIG_IOL_IOREG_CFG_DBG\r
                }\r
+               else\r
+               {\r
+                       if(bMatched)\r
+                       odm_ConfigBB_AGC_8188E(pDM_Odm, v1, bMaskDWord, v2);\r
+               }\r
+       i = i + 2;\r
        }\r
-#endif //#ifdef CONFIG_IOL_IOREG_CFG\r
-       return rst;\r
+}\r
+\r
+u4Byte\r
+ODM_GetVersion_MP_8188E_AGC_TAB(void)\r
+{\r
+          return 53;\r
 }\r
 \r
 /******************************************************************************\r
-*                           PHY_REG_1T_ICUT.TXT\r
+*                           PHY_REG.TXT\r
 ******************************************************************************/\r
 \r
-u4Byte Array_MP_8188E_PHY_REG_1T_ICUT[] = { \r
+u4Byte Array_MP_8188E_PHY_REG[] = { \r
                0x800, 0x80040000,\r
                0x804, 0x00000003,\r
                0x808, 0x0000FC00,\r
@@ -1199,7 +738,17 @@ u4Byte Array_MP_8188E_PHY_REG_1T_ICUT[] = {
                0x864, 0x061F0649,\r
                0x868, 0x00000000,\r
                0x86C, 0x27272700,\r
+       0x88000003,0x00000000,0x40000000,0x00000000,\r
+               0x870, 0x07000300,\r
+       0x98000001,0x00000000,0x40000000,0x00000000,\r
+               0x870, 0x07000300,\r
+       0x90000003,0x00000000,0x40000000,0x00000000,\r
+               0x870, 0x07000300,\r
+       0x90000001,0x00000000,0x40000000,0x00000000,\r
+               0x870, 0x07000300,\r
+       0xA0000000,0x00000000,\r
                0x870, 0x07000760,\r
+       0xB0000000,0x00000000,\r
                0x874, 0x25004000,\r
                0x878, 0x00000808,\r
                0x87C, 0x00000000,\r
@@ -1218,23 +767,43 @@ u4Byte Array_MP_8188E_PHY_REG_1T_ICUT[] = {
                0x910, 0x00000002,\r
                0x914, 0x00000201,\r
                0xA00, 0x00D047C8,\r
-               0xA04, 0x80FF000C,\r
+               0xA04, 0x80FF800C,\r
                0xA08, 0x8C838300,\r
                0xA0C, 0x2E7F120F,\r
                0xA10, 0x9500BB78,\r
                0xA14, 0x1114D028,\r
                0xA18, 0x00881117,\r
                0xA1C, 0x89140F00,\r
+       0x88000003,0x00000000,0x40000000,0x00000000,\r
+               0xA20, 0x13130000,\r
+               0xA24, 0x060A0D10,\r
+               0xA28, 0x00000103,\r
+       0x90000003,0x00000000,0x40000000,0x00000000,\r
+               0xA20, 0x13130000,\r
+               0xA24, 0x060A0D10,\r
+               0xA28, 0x00000103,\r
+       0xA0000000,0x00000000,\r
                0xA20, 0x1A1B0000,\r
                0xA24, 0x090E1317,\r
                0xA28, 0x00000204,\r
+       0xB0000000,0x00000000,\r
                0xA2C, 0x00D30000,\r
                0xA70, 0x101FBF00,\r
                0xA74, 0x00000007,\r
                0xA78, 0x00000900,\r
                0xA7C, 0x225B0606,\r
                0xA80, 0x218075B1,\r
+       0x88000003,0x00000000,0x40000000,0x00000000,\r
+               0xB2C, 0x00000000,\r
+       0x98000001,0x00000000,0x40000000,0x00000000,\r
+               0xB2C, 0x00000000,\r
+       0x90000003,0x00000000,0x40000000,0x00000000,\r
+               0xB2C, 0x00000000,\r
+       0x90000001,0x00000000,0x40000000,0x00000000,\r
+               0xB2C, 0x00000000,\r
+       0xA0000000,0x00000000,\r
                0xB2C, 0x80000000,\r
+       0xB0000000,0x00000000,\r
                0xC00, 0x48071D40,\r
                0xC04, 0x03A05611,\r
                0xC08, 0x000000E4,\r
@@ -1257,18 +826,44 @@ u4Byte Array_MP_8188E_PHY_REG_1T_ICUT[] = {
                0xC4C, 0x007F037F,\r
                0xC50, 0x69553420,\r
                0xC54, 0x43BC0094,\r
+       0x88000003,0x00000000,0x40000000,0x00000000,\r
+               0xC58, 0x00013159,\r
+       0x98000001,0x00000000,0x40000000,0x00000000,\r
                0xC58, 0x00013159,\r
+       0x98000400,0x00000000,0x40000000,0x00000000,\r
+               0xC58, 0x00013159,\r
+       0x98000000,0x00000000,0x40000000,0x00000000,\r
+               0xC58, 0x00013159,\r
+       0xA0000000,0x00000000,\r
+               0xC58, 0x00013169,\r
+       0xB0000000,0x00000000,\r
                0xC5C, 0x00250492,\r
                0xC60, 0x00000000,\r
                0xC64, 0x7112848B,\r
                0xC68, 0x47C00BFF,\r
                0xC6C, 0x00000036,\r
                0xC70, 0x2C7F000D,\r
+       0x88000003,0x00000000,0x40000000,0x00000000,\r
+               0xC74, 0x028610DB,\r
+       0x98000001,0x00000000,0x40000000,0x00000000,\r
                0xC74, 0x028610DB,\r
+       0x98000400,0x00000000,0x40000000,0x00000000,\r
+               0xC74, 0x028610DB,\r
+       0x98000000,0x00000000,0x40000000,0x00000000,\r
+               0xC74, 0x028610DB,\r
+       0xA0000000,0x00000000,\r
+               0xC74, 0x020610DB,\r
+       0xB0000000,0x00000000,\r
                0xC78, 0x0000001F,\r
                0xC7C, 0x00B91612,\r
+       0x88000003,0x00000000,0x40000000,0x00000000,\r
+               0xC80, 0x2D4000B5,\r
+       0x90000003,0x00000000,0x40000000,0x00000000,\r
+               0xC80, 0x2D4000B5,\r
+       0xA0000000,0x00000000,\r
                0xC80, 0x390000E4,\r
-               0xC84, 0x20F60000,\r
+       0xB0000000,0x00000000,\r
+               0xC84, 0x21F60000,\r
                0xC88, 0x40000100,\r
                0xC8C, 0x20200000,\r
                0xC90, 0x00091521,\r
@@ -1277,7 +872,17 @@ u4Byte Array_MP_8188E_PHY_REG_1T_ICUT[] = {
                0xC9C, 0x00007F7F,\r
                0xCA0, 0x00000000,\r
                0xCA4, 0x000300A0,\r
+       0x88000003,0x00000000,0x40000000,0x00000000,\r
+               0xCA8, 0xFFFF0000,\r
+       0x98000001,0x00000000,0x40000000,0x00000000,\r
+               0xCA8, 0xFFFF0000,\r
+       0x98000400,0x00000000,0x40000000,0x00000000,\r
+               0xCA8, 0xFFFF0000,\r
+       0x98000000,0x00000000,0x40000000,0x00000000,\r
                0xCA8, 0xFFFF0000,\r
+       0xA0000000,0x00000000,\r
+               0xCA8, 0x00000000,\r
+       0xB0000000,0x00000000,\r
                0xCAC, 0x00000000,\r
                0xCB0, 0x00000000,\r
                0xCB4, 0x00000000,\r
@@ -1358,6 +963,17 @@ u4Byte Array_MP_8188E_PHY_REG_1T_ICUT[] = {
                0xED8, 0x00C00014,\r
                0xEDC, 0x00000014,\r
                0xEE0, 0x00000014,\r
+       0x88000003,0x00000000,0x40000000,0x00000000,\r
+               0xEE8, 0x32555448,\r
+       0x98000001,0x00000000,0x40000000,0x00000000,\r
+               0xEE8, 0x32555448,\r
+       0x90000003,0x00000000,0x40000000,0x00000000,\r
+               0xEE8, 0x32555448,\r
+       0x90000001,0x00000000,0x40000000,0x00000000,\r
+               0xEE8, 0x32555448,\r
+       0xA0000000,0x00000000,\r
+               0xEE8, 0x21555448,\r
+       0xB0000000,0x00000000,\r
                0xEEC, 0x01C00014,\r
                0xF14, 0x00000003,\r
                0xF4C, 0x00000000,\r
@@ -1365,216 +981,75 @@ u4Byte Array_MP_8188E_PHY_REG_1T_ICUT[] = {
 \r
 };\r
 \r
-HAL_STATUS\r
-ODM_ReadAndConfig_MP_8188E_PHY_REG_1T_ICUT(\r
+void\r
+ODM_ReadAndConfig_MP_8188E_PHY_REG(\r
        IN   PDM_ODM_T  pDM_Odm\r
        )\r
 {\r
-       #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)\r
-\r
-       u4Byte     hex         = 0;\r
-       u4Byte     i           = 0;\r
-       u2Byte     count       = 0;\r
-       pu4Byte    ptr_array   = NULL;\r
-       u1Byte     platform    = pDM_Odm->SupportPlatform;\r
-       u1Byte     _interface   = pDM_Odm->SupportInterface;\r
-       u1Byte     board       = pDM_Odm->BoardType;  \r
-       u4Byte     ArrayLen    = sizeof(Array_MP_8188E_PHY_REG_1T_ICUT)/sizeof(u4Byte);\r
-       pu4Byte    Array       = Array_MP_8188E_PHY_REG_1T_ICUT;\r
-       BOOLEAN         biol = FALSE;\r
-#ifdef CONFIG_IOL_IOREG_CFG\r
-       PADAPTER        Adapter =  pDM_Odm->Adapter;    \r
-       struct xmit_frame       *pxmit_frame;\r
-       u8 bndy_cnt=1;\r
-       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-       struct cmd_cmp cmpdata[ArrayLen];\r
-       u4Byte  cmpdata_idx=0;\r
-       #endif\r
-#endif//#ifdef CONFIG_IOL_IOREG_CFG\r
-       HAL_STATUS rst =HAL_STATUS_SUCCESS;\r
-\r
-       hex += board;\r
-       hex += _interface << 8;\r
-       hex += platform << 16;\r
-       hex += 0xFF000000;\r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8188E_PHY_REG_1T_ICUT, hex = 0x%X\n", hex));\r
-#ifdef CONFIG_IOL_IOREG_CFG\r
-       biol = rtw_IOL_applied(Adapter);\r
+    u4Byte     i         = 0;\r
+    u1Byte     cCond;\r
+    BOOLEAN bMatched = TRUE, bSkipped = FALSE;\r
+//ask by Luke.Lee\r
+    u4Byte     ArrayLen    = sizeof(Array_MP_8188E_PHY_REG)/sizeof(u4Byte);\r
+    pu4Byte    Array       = Array_MP_8188E_PHY_REG;\r
        \r
-       if(biol){               \r
-               if((pxmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL)\r
-               {\r
-                       printk("rtw_IOL_accquire_xmit_frame failed\n");\r
-                       return HAL_STATUS_FAILURE;\r
-               }\r
-       }               \r
-#endif//#ifdef CONFIG_IOL_IOREG_CFG\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8188E_PHY_REG\n"));\r
 \r
-       for (i = 0; i < ArrayLen; i += 2 )\r
+       while(( i+1) < ArrayLen)\r
        {\r
-           u4Byte v1 = Array[i];\r
-           u4Byte v2 = Array[i+1];\r
-       \r
-           // This (offset, data) pair meets the condition.\r
-           if ( v1 < 0xCDCDCDCD )\r
-           {\r
-                       #ifdef CONFIG_IOL_IOREG_CFG\r
-                       if(biol){\r
-                               if(rtw_IOL_cmd_boundary_handle(pxmit_frame))\r
-                                       bndy_cnt++;\r
+               u4Byte v1 = Array[i];\r
+               u4Byte v2 = Array[i+1];\r
 \r
-\r
-                               if (v1 == 0xfe){                                                \r
-                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,50);                                    \r
-                               }\r
-                               else if (v1 == 0xfd){\r
-                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,5);\r
-                               }\r
-                               else if (v1 == 0xfc){\r
-                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,1);\r
-                               }\r
-                               else if (v1 == 0xfb){\r
-                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,50);\r
-                               }\r
-                               else if (v1 == 0xfa){\r
-                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame, 5);\r
-                               }\r
-                               else if (v1 == 0xf9){\r
-                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,1);\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{\r
-                                       if (v1 == 0xa24)\r
-                                               pDM_Odm->RFCalibrateInfo.RegA24 = v2;   \r
-               \r
-                                       rtw_IOL_append_WD_cmd(pxmit_frame,(u2Byte)v1, v2,bMaskDWord);   \r
-                                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                                                       cmpdata[cmpdata_idx].addr = v1;\r
-                                                       cmpdata[cmpdata_idx].value= v2;\r
-                                                       cmpdata_idx++;\r
-                                       #endif\r
+                               else if(cCond == COND_ELSE) //else\r
+                               {\r
+                                       bMatched = bSkipped?FALSE:TRUE;\r
                                }\r
-                       }\r
-                       else\r
-                       #endif  //#ifdef CONFIG_IOL_IOREG_CFG\r
-                       {\r
-                               odm_ConfigBB_PHY_8188E(pDM_Odm, v1, bMaskDWord, v2);\r
-                       }\r
-                   continue;\r
-               }\r
-               else\r
-               { // This line is the start line of branch.\r
-                   if ( !CheckCondition(Array[i], hex) )\r
-                   { // Discard the following (offset, data) pairs.\r
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\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
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\r
-                                       #ifdef CONFIG_IOL_IOREG_CFG\r
-                                       if(biol){       \r
-                                               if(rtw_IOL_cmd_boundary_handle(pxmit_frame))    \r
-                                                       bndy_cnt++;\r
-                                               if (v1 == 0xfe){                                                \r
-                                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,50);                                            \r
-                                               }\r
-                                               else if (v1 == 0xfd){\r
-                                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,5);\r
-                                               }\r
-                                               else if (v1 == 0xfc){\r
-                                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,1);\r
-                                               }\r
-                                               else if (v1 == 0xfb){\r
-                                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,50);\r
-                                               }\r
-                                               else if (v1 == 0xfa){\r
-                                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,5);\r
-                                               }\r
-                                               else if (v1 == 0xf9){\r
-                                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,1);\r
-                                               }\r
-                                               else{\r
-                                                       if (v1 == 0xa24)\r
-                                                               pDM_Odm->RFCalibrateInfo.RegA24 = v2;   \r
-                       \r
-                                                       rtw_IOL_append_WD_cmd(pxmit_frame,(u2Byte)v1, v2,bMaskDWord);   \r
-                                                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                                                               cmpdata[cmpdata_idx].addr = v1;\r
-                                                               cmpdata[cmpdata_idx].value= v2;\r
-                                                               cmpdata_idx++;\r
-                                                       #endif\r
-                                               }\r
-                                       }\r
+                               else //if , else if\r
+                               {\r
+                                       if(bSkipped)\r
+                                               bMatched = FALSE;\r
                                        else\r
-                                       #endif  //#ifdef CONFIG_IOL_IOREG_CFG\r
                                        {\r
-                                               odm_ConfigBB_PHY_8188E(pDM_Odm, v1, bMaskDWord, v2);\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
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-\r
-                       while (v2 != 0xDEAD && i < ArrayLen -2)\r
-                       {\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-                       \r
-                   }\r
-               }       \r
-       }\r
-#ifdef CONFIG_IOL_IOREG_CFG\r
-       if(biol){\r
-               //printk("==> %s, pktlen = %d,bndy_cnt = %d\n",__FUNCTION__,pxmit_frame->attrib.pktlen+4+32,bndy_cnt);\r
-               if(rtw_IOL_exec_cmds_sync(pDM_Odm->Adapter, pxmit_frame, 1000, bndy_cnt))\r
-               {                       \r
-                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                       printk("~~~ %s IOL_exec_cmds Success !!! \n",__FUNCTION__);\r
-                       {\r
-                               u4Byte idx;\r
-                               u4Byte cdata;\r
-                               printk("  %s data compare => array_len:%d \n",__FUNCTION__,cmpdata_idx);\r
-                               printk("### %s data compared !!###\n",__FUNCTION__);\r
-                               for(idx=0;idx< cmpdata_idx;idx++)\r
-                               {\r
-                                       cdata = ODM_Read4Byte(pDM_Odm, cmpdata[idx].addr);\r
-                                       if(cdata != cmpdata[idx].value){\r
-                                               printk(" addr:0x%04x, data:(0x%02x : 0x%02x) \n",\r
-                                                       cmpdata[idx].addr,cmpdata[idx].value,cdata);\r
-                                               rst = HAL_STATUS_FAILURE;\r
-                                       }                                       \r
-                               }\r
-                               printk("### %s data compared !!###\n",__FUNCTION__);\r
-                               //if(rst == HAL_STATUS_FAILURE)\r
-                               {//dump data from TX packet buffer                              \r
-                                       rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);\r
                                }\r
-                               \r
                        }\r
-                       #endif //CONFIG_IOL_IOREG_CFG_DBG\r
-               \r
-               }\r
-               else{\r
-                       rst = HAL_STATUS_FAILURE;\r
-                       printk("~~~ IOL Config %s Failed !!! \n",__FUNCTION__);\r
-                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                       {\r
-                               //dump data from TX packet buffer                               \r
-                               rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);\r
+                       else if(v1 & BIT30){ //negative condition\r
+                       //do nothing\r
                        }\r
-                       #endif //CONFIG_IOL_IOREG_CFG_DBG\r
                }\r
+               else\r
+               {\r
+                       if(bMatched)\r
+                       odm_ConfigBB_PHY_8188E(pDM_Odm, v1, bMaskDWord, v2);\r
+               }\r
+       i = i + 2;\r
        }\r
-#endif //#ifdef CONFIG_IOL_IOREG_CFG\r
-       return rst;\r
+}\r
+\r
+u4Byte\r
+ODM_GetVersion_MP_8188E_PHY_REG(void)\r
+{\r
+          return 53;\r
 }\r
 \r
 /******************************************************************************\r
@@ -1595,22 +1070,15 @@ ODM_ReadAndConfig_MP_8188E_PHY_REG_PG(
        IN   PDM_ODM_T  pDM_Odm\r
        )\r
 {\r
-       u4Byte     hex = 0;\r
-       u4Byte     i           = 0;\r
-       u2Byte     count       = 0;\r
-       pu4Byte    ptr_array   = NULL;\r
-       u1Byte     platform    = pDM_Odm->SupportPlatform;\r
-       u1Byte     _interface   = pDM_Odm->SupportInterface;\r
-       u1Byte     board       = pDM_Odm->BoardType;  \r
-       u4Byte     ArrayLen    = sizeof(Array_MP_8188E_PHY_REG_PG)/sizeof(u4Byte);\r
-       pu4Byte    Array       = Array_MP_8188E_PHY_REG_PG;\r
+    u4Byte     i         = 0;\r
+    u4Byte     ArrayLen    = sizeof(Array_MP_8188E_PHY_REG_PG)/sizeof(u4Byte);\r
+    pu4Byte    Array       = Array_MP_8188E_PHY_REG_PG;\r
+\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8188E_PHY_REG_PG\n"));\r
 \r
        pDM_Odm->PhyRegPgVersion = 1;\r
        pDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE;\r
-       hex += board;\r
-       hex += _interface << 8;\r
-       hex += platform << 16;\r
-       hex += 0xFF000000;\r
+\r
        for (i = 0; i < ArrayLen; i += 6 )\r
        {\r
            u4Byte v1 = Array[i];\r
@@ -1620,29 +1088,7 @@ ODM_ReadAndConfig_MP_8188E_PHY_REG_PG(
            u4Byte v5 = Array[i+4];\r
            u4Byte v6 = Array[i+5];\r
 \r
-           // this line is a line of pure_body\r
-           if ( v1 < 0xCDCDCDCD )\r
-           {\r
-                        odm_ConfigBB_PHY_REG_PG_8188E(pDM_Odm, v1, v2, v3, v4, v5, v6);\r
-                        continue;\r
-           }\r
-           else\r
-           { // this line is the start of branch\r
-               if ( !CheckCondition(Array[i], hex) )\r
-               { // don't need the hw_body\r
-                   i += 2; // skip the pair of expression\r
-                   v1 = Array[i];\r
-                   v2 = Array[i+1];\r
-                   v3 = Array[i+2];\r
-                   while (v2 != 0xDEAD)\r
-                   {\r
-                       i += 3;\r
-                       v1 = Array[i];\r
-                       v2 = Array[i+1];\r
-                       v3 = Array[i+1];\r
-                   }\r
-               }\r
-           }\r
+           odm_ConfigBB_PHY_REG_PG_8188E(pDM_Odm, v1, v2, v3, v4, v5, v6);\r
        }\r
 }\r
 \r
index 1bd271c66bbaec0b12967e8278ad01048f75af88..807fd2a12688f978c907d1b379db7aa7211f3b99 100644 (file)
 #ifndef __INC_MP_BB_HW_IMG_8188E_H\r
 #define __INC_MP_BB_HW_IMG_8188E_H\r
 \r
-//static BOOLEAN CheckCondition(const u4Byte Condition, const u4Byte Hex);\r
 \r
 /******************************************************************************\r
-*                           AGC_TAB_1T.TXT\r
+*                           AGC_TAB.TXT\r
 ******************************************************************************/\r
 \r
-HAL_STATUS\r
-ODM_ReadAndConfig_MP_8188E_AGC_TAB_1T( // TC: Test Chip, MP: MP Chip\r
-       IN   PDM_ODM_T  pDM_Odm\r
-);\r
-\r
-/******************************************************************************\r
-*                           AGC_TAB_1T_ICUT.TXT\r
-******************************************************************************/\r
-\r
-HAL_STATUS\r
-ODM_ReadAndConfig_MP_8188E_AGC_TAB_1T_ICUT( // TC: Test Chip, MP: MP Chip\r
-       IN   PDM_ODM_T  pDM_Odm\r
-);\r
-\r
-/******************************************************************************\r
-*                           PHY_REG_1T.TXT\r
-******************************************************************************/\r
-\r
-HAL_STATUS\r
-ODM_ReadAndConfig_MP_8188E_PHY_REG_1T( // TC: Test Chip, MP: MP Chip\r
+void\r
+ODM_ReadAndConfig_MP_8188E_AGC_TAB( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8188E_AGC_TAB(void);\r
 \r
 /******************************************************************************\r
-*                           PHY_REG_1T_ICUT.TXT\r
+*                           PHY_REG.TXT\r
 ******************************************************************************/\r
 \r
-HAL_STATUS\r
-ODM_ReadAndConfig_MP_8188E_PHY_REG_1T_ICUT( // TC: Test Chip, MP: MP Chip\r
+void\r
+ODM_ReadAndConfig_MP_8188E_PHY_REG( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8188E_PHY_REG(void);\r
 \r
 /******************************************************************************\r
 *                           PHY_REG_PG.TXT\r
@@ -68,6 +51,7 @@ void
 ODM_ReadAndConfig_MP_8188E_PHY_REG_PG( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8188E_PHY_REG_PG(void);\r
 \r
 #endif\r
 #endif // end of HWIMG_SUPPORT\r
index 497f3a1a065079181c6bb28090ed7dc588aace45..8a73cc691699e708b249136b2ee296735c20cfe3 100644 (file)
 * \r
 ******************************************************************************/\r
 \r
-\r
-#include "../odm_precomp.h"\r
+#include "Mp_Precomp.h"\r
+#include "../phydm_precomp.h"\r
 \r
 #if (RTL8188E_SUPPORT == 1)\r
 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP))\r
 \r
 \r
 u1Byte Array_MP_8188E_FW_AP[] = {\r
-0x00, 0x95, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x18, 0x19, 0x12, 0x5A, 0x3B, 0x00, 0x00, \r
-0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x02, 0x49, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x59, 0xC3, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x59, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x5F, 0xDD, 0x00, 0x00, \r
-0x0F, 0xF0, 0x8F, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, \r
-0x8F, 0x0F, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF0, 0x8F, 0x0F, \r
-0x00, 0x00, 0x00, 0x0A, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, \r
-0x04, 0x03, 0x02, 0x00, 0x03, 0x06, 0x05, 0x04, 0x03, 0x00, 0x04, 0x06, 0x05, 0x04, 0x02, 0x00, \r
-0x04, 0x08, 0x07, 0x06, 0x04, 0x00, 0x06, 0x0A, 0x09, 0x08, 0x06, 0x00, 0x08, 0x0A, 0x09, 0x08, \r
-0x04, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x02, 0x00, 0x08, 0x0A, 0x09, 0x08, 0x00, 0x00, 0x08, 0x12, \r
-0x11, 0x10, 0x08, 0x00, 0x10, 0x1A, 0x19, 0x18, 0x10, 0x00, 0x18, 0x22, 0x21, 0x20, 0x18, 0x00, \r
-0x20, 0x22, 0x21, 0x20, 0x10, 0x00, 0x20, 0x22, 0x21, 0x20, 0x08, 0x00, 0x20, 0x22, 0x21, 0x1C, \r
-0x08, 0x00, 0x20, 0x22, 0x21, 0x14, 0x08, 0x00, 0x20, 0x22, 0x20, 0x18, 0x08, 0x00, 0x20, 0x31, \r
-0x30, 0x20, 0x10, 0x00, 0x30, 0x31, 0x30, 0x18, 0x00, 0x00, 0x30, 0x31, 0x2F, 0x10, 0x10, 0x00, \r
-0x30, 0x31, 0x2C, 0x10, 0x10, 0x00, 0x30, 0x31, 0x28, 0x10, 0x00, 0x00, 0x30, 0x31, 0x20, 0x10, \r
-0x00, 0x00, 0x30, 0x31, 0x10, 0x10, 0x00, 0x00, 0x30, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, \r
-0x07, 0x07, 0x07, 0x08, 0x0A, 0x04, 0x04, 0x04, 0x04, 0x06, 0x0A, 0x0B, 0x0D, 0x05, 0x05, 0x07, \r
-0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x05, 0x05, 0x07, \r
-0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x0F, 0x0F, 0x05, \r
-0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x0F, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, \r
-0x0F, 0x0F, 0x0F, 0x05, 0x05, 0x07, 0x07, 0x08, 0x0B, 0x0D, 0x0F, 0x0F, 0x0F, 0x04, 0x04, 0x04, \r
-0x05, 0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x04, 0x04, 0x05, 0x05, 0x06, 0x0A, 0x11, \r
-0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, \r
-0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x13, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, \r
-0x0E, 0x11, 0x13, 0x13, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x13, 0x13, 0x09, \r
-0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x18, 0x1A, 0x1D, \r
-0x1F, 0x21, 0x27, 0x29, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x28, 0x2A, 0x2C, 0x00, 0x00, 0x00, \r
-0x1F, 0x23, 0x28, 0x2A, 0x2C, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x28, 0x2A, 0x2C, 0x00, 0x00, 0x00, \r
-0x1F, 0x23, 0x28, 0x2A, 0x2C, 0x2C, 0x2C, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x28, 0x2A, 0x2C, 0x2C, \r
-0x2C, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x28, 0x2A, 0x2C, 0x2C, 0x2C, 0x00, 0x00, 0x00, 0x1F, 0x23, \r
-0x28, 0x2A, 0x2C, 0x2C, 0x2C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, \r
-0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x90, 0x00, 0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, \r
-0x78, 0x00, 0xA0, 0x00, 0xC8, 0x01, 0x40, 0x01, 0x90, 0x01, 0xE0, 0x02, 0x30, 0x01, 0x2C, 0x01, \r
-0x40, 0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, 0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x01, 0x2C, 0x01, \r
-0x40, 0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, 0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x01, 0x2C, 0x01, \r
-0x40, 0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, 0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x01, 0x2C, 0x01, \r
-0x40, 0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, 0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x07, 0xD0, 0x07, \r
-0xD0, 0x01, 0x2C, 0x01, 0x40, 0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, 0x04, 0xB0, 0x06, 0x40, 0x07, \r
-0xD0, 0x07, 0xD0, 0x07, 0xD0, 0x01, 0x2C, 0x01, 0x40, 0x01, 0xE0, 0x02, 0xD0, 0x03, 0xE8, 0x04, \r
-0xB0, 0x06, 0x40, 0x07, 0xD0, 0x07, 0xD0, 0x07, 0xD0, 0x01, 0x2C, 0x01, 0x40, 0x01, 0xE0, 0x02, \r
-0xD0, 0x03, 0xE8, 0x04, 0xB0, 0x06, 0x40, 0x07, 0xD0, 0x07, 0xD0, 0x07, 0xD0, 0x00, 0x02, 0x00, \r
-0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, \r
-0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x64, 0x00, 0xA0, 0x00, \r
-0xC8, 0x00, 0xF0, 0x01, 0x18, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, \r
-0x58, 0x03, 0x20, 0x03, 0xE8, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, \r
-0x58, 0x03, 0x20, 0x03, 0xE8, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, \r
-0x58, 0x03, 0x20, 0x03, 0xE8, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, \r
-0x58, 0x03, 0x20, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xF0, 0x01, \r
-0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x00, 0x64, 0x00, \r
-0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, 0xE8, 0x03, 0xE8, 0x03, \r
-0xE8, 0x00, 0x64, 0x00, 0xA0, 0x00, 0xF0, 0x01, 0x68, 0x01, 0xF4, 0x02, 0x58, 0x03, 0x20, 0x03, \r
-0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, \r
-0x50, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x07, 0x05, 0x05, 0x05, \r
-0x06, 0x06, 0x07, 0x07, 0x08, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x05, 0x06, 0x06, \r
-0x07, 0x07, 0x08, 0x09, 0x0A, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x05, 0x06, 0x06, \r
-0x07, 0x07, 0x08, 0x09, 0x0A, 0x0A, 0x0B, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x0A, \r
-0x0B, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0A, 0x0A, 0x0B, 0x05, 0x06, 0x06, 0x07, 0x07, \r
-0x08, 0x09, 0x0A, 0x0A, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, \r
-0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, \r
-0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, \r
-0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, \r
-0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, \r
-0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x20, 0x1E, 0x1C, 0x18, 0x10, 0x18, 0x00, \r
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0xE1, 0x88, 0x20, 0x00, 0x14, 0x00, 0x00, 0x00, 0x09, 0x11, 0x20, 0x13, 0xCA, 0x37, 0x00, 0x00, \r
+0xEE, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x02, 0x45, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0xC1, 0x99, 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
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0xA1, 0xEE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xFA, 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
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
@@ -108,48 +44,48 @@ u1Byte Array_MP_8188E_FW_AP[] = {
 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
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x45, 0x04, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, \r
+0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x41, 0x04, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, \r
 0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, \r
-0xEC, 0x24, 0x89, 0xF8, 0xE6, 0xBC, 0x03, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, \r
-0x40, 0xCE, 0x79, 0x04, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, \r
+0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, \r
+0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, \r
 0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, \r
-0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x04, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, \r
-0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x88, 0x25, 0x0C, 0xF8, \r
-0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x03, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, \r
+0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, \r
+0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, \r
+0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, \r
 0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, \r
-0x0C, 0x24, 0x89, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x03, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, \r
-0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x88\r
+0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, \r
+0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86\r
 0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, \r
 0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, \r
-0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x88, 0xA6, \r
-0x81, 0x74, 0x03, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x04, 0xE4, 0x78, 0x80, \r
-0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x49, 0xF8, 0x74, 0x01, 0x93, \r
+0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, \r
+0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, \r
+0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x45, 0xE8, 0x74, 0x01, 0x93, \r
 0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, \r
-0x8C, 0xD2, 0xAF, 0x22, 0x03, 0xEF, 0xD3, 0x94, 0x03, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, \r
+0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, \r
 0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, \r
-0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x88, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, \r
-0xBE, 0x03, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, \r
+0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, \r
+0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, \r
 0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, \r
-0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x88, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, \r
+0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, \r
 0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, \r
-0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x88, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, \r
-0x04, 0x90, 0x49, 0xF8, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, \r
-0x94, 0x03, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, \r
-0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x88, 0x2F, \r
-0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x45, 0x4D, 0x50, 0x2E, 0x74, 0x89, 0x2F, 0xF8, 0xE6, 0xBF, 0x03\r
-0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x88, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, \r
+0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, \r
+0x04, 0x90, 0x45, 0xE8, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, \r
+0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, \r
+0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, \r
+0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x41, 0x4D, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02\r
+0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, \r
 0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, \r
-0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x89, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, \r
-0x0F, 0x74, 0x88, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, \r
+0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, \r
+0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, \r
 0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, \r
-0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x03, 0x40, 0x03, 0x7F, 0xFF, 0x22, \r
+0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, \r
 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, \r
-0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x45, 0x4C, 0x8F, 0xF0, \r
+0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x41, 0x4C, 0x8F, 0xF0, \r
 0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, \r
 0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, \r
 0x60, 0x25, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30, \r
 0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC, \r
-0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x45, 0x4D, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, \r
+0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x41, 0x4D, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, \r
 0x56, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xE7, 0x09, 0xF6, 0x08, 0xDF, 0xFA, 0x80, \r
 0x46, 0xE7, 0x09, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x3E, 0x88, 0x82, 0x8C, 0x83, 0xE7, 0x09, 0xF0, \r
 0xA3, 0xDF, 0xFA, 0x80, 0x32, 0xE3, 0x09, 0xF6, 0x08, 0xDF, 0xFA, 0x80, 0x78, 0xE3, 0x09, 0xF2, \r
@@ -165,821 +101,828 @@ u1Byte Array_MP_8188E_FW_AP[] = {
 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xEA, 0xDE, 0xE8, 0x80, 0xDB, 0x89, 0x82, 0x8A, 0x83, \r
 0xE4, 0x93, 0xA3, 0xF2, 0x08, 0xDF, 0xF9, 0x80, 0xCC, 0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, \r
 0x60, 0xC3, 0x88, 0xF0, 0xED, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0xB9, 0xF5, 0x82, 0xEB, 0x24, \r
-0x02, 0xB4, 0x04, 0x00, 0x50, 0xAF, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x47, 0xF9, 0x73, 0xC5, \r
+0x02, 0xB4, 0x04, 0x00, 0x50, 0xAF, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x43, 0xF9, 0x73, 0xC5, \r
 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, 0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, \r
-0x83, 0xE0, 0x38, 0xF0, 0x22, 0xBB, 0x01, 0x0A, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, \r
-0xE0, 0x22, 0x50, 0x06, 0x87, 0xF0, 0x09, 0xE7, 0x19, 0x22, 0xBB, 0xFE, 0x07, 0xE3, 0xF5, 0xF0, \r
-0x09, 0xE3, 0x19, 0x22, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0x74, 0x01, 0x93, 0x22, \r
-0xBB, 0x01, 0x10, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, \r
-0xA3, 0xE0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, \r
-0x0A, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0xF5, 0xF0, 0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, \r
-0xE9, 0x93, 0xF5, 0xF0, 0xA3, 0xE9, 0x93, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, \r
-0xA3, 0xE0, 0xFF, 0x22, 0xA4, 0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, \r
-0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, \r
-0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, \r
-0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, \r
-0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0x02, 0x49, 0xA6, 0x02, 0x45, 0xDD, 0xE4, 0x93, \r
-0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, \r
-0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, \r
-0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, \r
-0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x49, 0xEB, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, \r
-0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, \r
-0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, \r
-0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, \r
-0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x00, 0x41, 0x9E, 0xA8, 0x00, \r
-0x41, 0x9E, 0xA9, 0x00, 0x41, 0x9E, 0xBA, 0x00, 0x4A, 0xEA, 0x4D, 0xD3, 0x52, 0xD2, 0x57, 0xF6, \r
-0x90, 0x00, 0xF0, 0xE0, 0x7F, 0x01, 0x20, 0xE2, 0x02, 0x7F, 0x03, 0x22, 0x51, 0x00, 0x90, 0x9C, \r
-0x94, 0xEF, 0xF0, 0x51, 0x1E, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x02, 0x2D, 0x4A, 0x51, 0x89, \r
-0x51, 0xB9, 0x51, 0x4B, 0x51, 0x6A, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, 0x0F, 0xF5, 0x10, 0xAD, \r
-0x0D, 0x7F, 0x50, 0x12, 0x31, 0xE4, 0xAD, 0x0E, 0x7F, 0x51, 0x12, 0x31, 0xE4, 0xAD, 0x0F, 0x7F, \r
-0x52, 0x12, 0x31, 0xE4, 0xAD, 0x10, 0x7F, 0x53, 0x02, 0x31, 0xE4, 0x75, 0x15, 0x12, 0xE4, 0xF5, \r
-0x16, 0x75, 0x17, 0x07, 0x75, 0x18, 0x32, 0x90, 0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, \r
-0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5, 0x18, 0xF0, 0x22, 0x75, 0x1D, 0x0E, 0x75, 0x1E, 0x01, \r
-0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, \r
-0xA3, 0xE5, 0x1F, 0xF0, 0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, \r
-0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, \r
-0x50, 0x12, 0x31, 0xE4, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x31, 0xE4, 0xE4, 0xFD, 0x7F, 0x52, 0x12, \r
-0x31, 0xE4, 0xE4, 0xFD, 0x7F, 0x53, 0x02, 0x31, 0xE4, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, \r
-0x7F, 0x54, 0x12, 0x31, 0xE4, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x31, 0xE4, 0x7D, 0xFF, 0x7F, 0x56, \r
-0x12, 0x31, 0xE4, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x31, 0xE4, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, \r
-0xFD, 0x7F, 0x80, 0x12, 0x31, 0xE4, 0x71, 0x6B, 0x12, 0x32, 0x25, 0x71, 0x85, 0x7F, 0x01, 0x12, \r
-0x46, 0x15, 0x90, 0x9D, 0xCA, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x46, 0x15, 0x90, 0x9D, 0xCA, 0xE0, \r
-0x04, 0xF0, 0x7F, 0x03, 0x12, 0x46, 0x15, 0x90, 0x9D, 0xCA, 0xE0, 0x04, 0xF0, 0x51, 0x0C, 0x71, \r
-0x39, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x31, 0xE4, 0x75, 0x28, 0xFF, \r
-0x71, 0x5C, 0x71, 0xB5, 0xE4, 0xFF, 0x02, 0x46, 0x9E, 0x71, 0x56, 0x71, 0x63, 0x91, 0xB7, 0x91, \r
-0x0A, 0x71, 0x73, 0x90, 0x9D, 0xCE, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xA3, 0xF0, \r
-0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xE4, 0x90, 0x9D, 0x36, 0xF0, 0x22, 0x75, 0xE8, 0x03, 0x75, \r
-0xA8, 0x85, 0x22, 0xE4, 0x90, 0x9D, 0x30, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, \r
-0x01, 0xF0, 0x22, 0x90, 0x9D, 0xCB, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0A, \r
-0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, \r
-0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, \r
-0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, \r
-0x01, 0x98, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0x9D, 0xD3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, 0xE0, \r
-0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3D, 0xC3, 0x90, 0x9D, 0xD4, \r
-0xE0, 0x94, 0x88, 0x90, 0x9D, 0xD3, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, \r
-0x10, 0xF0, 0x22, 0x90, 0x9D, 0xD3, 0xE4, 0x75, 0xF0, 0x01, 0x11, 0x9F, 0x7F, 0x14, 0x7E, 0x00, \r
-0x12, 0x32, 0x58, 0xD3, 0x90, 0x9D, 0xD4, 0xE0, 0x94, 0x32, 0x90, 0x9D, 0xD3, 0xE0, 0x94, 0x00, \r
-0x40, 0xBA, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xB3, 0x22, 0xE4, 0x90, 0x9D, 0xBA, 0xF0, 0x90, \r
-0x9D, 0xB9, 0xE0, 0x54, 0x0F, 0xF0, 0x54, 0xF0, 0xF0, 0x90, 0x9D, 0xB7, 0xE0, 0x54, 0xFD, 0xF0, \r
-0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x90, 0x9D, 0xBF, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x90, 0x9D, \r
-0xB7, 0xE0, 0x54, 0xFB, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x9D, 0xC2, 0xF0, 0x90, \r
-0x9D, 0xC1, 0x74, 0x07, 0xF0, 0x90, 0x9D, 0xC4, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0x90, \r
-0x9D, 0xBD, 0xF0, 0x90, 0x9D, 0xB7, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x9D, 0xBB, 0x74, 0x0C, 0xF0, \r
-0x90, 0x9D, 0xB7, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x9D, 0xBC, 0x74, 0x0C, 0xF0, 0x90, 0x9D, 0xB7, \r
-0xE0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, \r
-0xF7, 0xF0, 0x90, 0x9C, 0x94, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0x9D, 0xC3, 0x74, 0x93, 0xF0, \r
-0x80, 0x0F, 0xEF, 0x90, 0x9D, 0xC3, 0xB4, 0x03, 0x05, 0x74, 0xDC, 0xF0, 0x80, 0x03, 0x74, 0x40, \r
-0xF0, 0x90, 0x9D, 0xC6, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, \r
-0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xE4, 0xFF, 0xE4, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, \r
-0x81, 0x00, 0xBE, 0x03, 0x11, 0x31, 0x24, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, \r
-0x83, 0x74, 0x80, 0xF0, 0x80, 0x0E, 0x31, 0x24, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, \r
-0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89, 0x00, 0x31, 0x24, 0xE5, 0x82, 0x2E, \r
-0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0xBE, 0x10, 0xBE, 0x0F, 0xBF, 0x80, \r
-0xB8, 0xE4, 0x90, 0xAF, 0x71, 0xF0, 0xFF, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x31, 0x24, \r
-0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x31, 0x24, 0xE4, 0xF0, 0xA3, \r
-0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x05, 0x31, 0x24, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, \r
-0x0A, 0xEF, 0x90, 0x8D, 0x07, 0x31, 0x24, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, \r
-0x8D, 0x09, 0x31, 0x24, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, \r
-0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x93, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, \r
-0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x94, 0x98, 0x31, 0x24, 0x74, 0x01, 0xF0, \r
-0x75, 0xF0, 0x09, 0xEF, 0x90, 0x94, 0x99, 0x31, 0x24, 0xE4, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, \r
-0x94, 0x97, 0x31, 0x24, 0x74, 0x01, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x94, 0x95, 0x31, 0x24, \r
-0x74, 0x09, 0xF0, 0xF5, 0xF0, 0xEF, 0x90, 0x94, 0x96, 0x31, 0x24, 0xE4, 0xF0, 0x75, 0xF0, 0x09, \r
-0xEF, 0x90, 0x94, 0x93, 0x31, 0x24, 0x74, 0x13, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x94, 0x94, \r
-0x31, 0x24, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0x31, 0x24, 0x74, 0x13, 0xF0, \r
-0x0F, 0xEF, 0x64, 0x80, 0x60, 0x02, 0xA1, 0x07, 0x7F, 0x20, 0x90, 0x9E, 0x7B, 0xE4, 0xF0, 0xA3, \r
-0xDF, 0xFC, 0x22, 0xE4, 0x90, 0x9D, 0xD5, 0xF0, 0x90, 0x9D, 0xD5, 0xE0, 0x64, 0x01, 0xF0, 0x24, \r
-0xD3, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x4D, 0xA3, 0xF0, 0x90, 0x9D, 0xBC, 0xE0, 0xFF, 0x90, 0x9D, \r
-0xBB, 0xE0, 0x6F, 0x60, 0x03, 0x12, 0x5F, 0xC4, 0x90, 0x9D, 0xB7, 0xE0, 0x30, 0xE0, 0x09, 0x12, \r
-0x67, 0xF4, 0xBF, 0x01, 0x03, 0x12, 0x6B, 0x36, 0x90, 0x9D, 0xBC, 0xE0, 0x90, 0x01, 0xBC, 0xF0, \r
-0x90, 0x9D, 0x36, 0xE0, 0x90, 0x01, 0xBD, 0xF0, 0xD1, 0x3B, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, \r
-0xF0, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x32, 0x58, 0x90, 0x00, 0x02, 0xE0, 0x44, 0x01, 0xF0, 0x7F, \r
-0xF4, 0x7E, 0x01, 0x12, 0x32, 0x58, 0x12, 0x45, 0x4D, 0x80, 0x9D, 0x12, 0x7A, 0x45, 0x12, 0x52, \r
-0x73, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x9E, 0xAB, 0xF0, 0x90, 0x00, 0x8F, \r
-0xE0, 0x20, 0xE6, 0x03, 0x02, 0x51, 0x91, 0x90, 0x00, 0x8D, 0xE0, 0x90, 0x9E, 0xAA, 0xF0, 0x90, \r
-0x00, 0x8C, 0xE0, 0x90, 0x9E, 0xAB, 0xF0, 0x90, 0x9E, 0xAA, 0xE0, 0x31, 0x42, 0x4E, 0x86, 0x01, \r
-0x4E, 0x91, 0x02, 0x4E, 0x9C, 0x04, 0x4F, 0x8A, 0x05, 0x50, 0x82, 0x06, 0x51, 0x07, 0x07, 0x51, \r
-0x4B, 0x08, 0x00, 0x00, 0x51, 0x83, 0x90, 0x9E, 0xAB, 0xE0, 0xFF, 0x12, 0x52, 0x18, 0x02, 0x51, \r
-0x83, 0x90, 0x9E, 0xAB, 0xE0, 0xFF, 0x12, 0x51, 0xC4, 0x02, 0x51, 0x83, 0x90, 0x9E, 0xAB, 0xE0, \r
-0x75, 0xF0, 0x09, 0x90, 0x94, 0x98, 0x31, 0x24, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x12, 0x51, 0x9C, \r
-0x90, 0x9E, 0xAB, 0xE0, 0x75, 0xF0, 0x09, 0x90, 0x94, 0x96, 0x12, 0x51, 0x96, 0x90, 0x9E, 0xAB, \r
-0xE0, 0x75, 0xF0, 0x09, 0x90, 0x94, 0x9B, 0x12, 0x51, 0x96, 0x90, 0x9E, 0xAB, 0xE0, 0x75, 0xF0, \r
-0x09, 0x90, 0x94, 0x99, 0x12, 0x51, 0x96, 0x90, 0x9E, 0xAB, 0xE0, 0x75, 0xF0, 0x09, 0x90, 0x94, \r
-0x93, 0x31, 0x24, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x12, 0x51, 0x9C, 0x90, 0x9E, 0xAB, 0xE0, 0x75, \r
-0xF0, 0x09, 0x90, 0x94, 0x94, 0x12, 0x51, 0x96, 0x90, 0x9E, 0xAB, 0xE0, 0x75, 0xF0, 0x09, 0x90, \r
-0x94, 0x97, 0x12, 0x51, 0x96, 0x90, 0x9E, 0xAB, 0xE0, 0x75, 0xF0, 0x09, 0x90, 0x94, 0x95, 0x12, \r
-0x51, 0x96, 0x90, 0x9E, 0xAB, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x31, 0x24, 0xE0, 0xFB, \r
-0xE4, 0xFD, 0x0F, 0x12, 0x51, 0x9C, 0x90, 0x9E, 0xAB, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x01, \r
-0x12, 0x51, 0x96, 0x90, 0x9E, 0xAB, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x02, 0x12, 0x51, 0x96, \r
-0x90, 0x9E, 0xAB, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x03, 0x12, 0x51, 0x96, 0x90, 0x9E, 0xAB, \r
-0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x04, 0x31, 0x24, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x12, 0x51, \r
-0x9C, 0x90, 0x9E, 0xAB, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x05, 0x12, 0x51, 0x96, 0x90, 0x9E, \r
-0xAB, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x06, 0x12, 0x51, 0x96, 0x90, 0x9E, 0xAB, 0xE0, 0x75, \r
-0xF0, 0x08, 0x90, 0x89, 0x07, 0x31, 0x24, 0x02, 0x51, 0x46, 0x90, 0x9E, 0xAB, 0xE0, 0x25, 0xE0, \r
-0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xA3, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x12, \r
-0x51, 0x9C, 0x90, 0x9E, 0xAB, 0xE0, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, \r
-0x83, 0xE0, 0xFB, 0x0D, 0x12, 0x51, 0x9C, 0x90, 0x9E, 0xAB, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, \r
-0x01, 0x31, 0x24, 0xA3, 0xE0, 0xFB, 0x0D, 0x12, 0x51, 0x9C, 0x90, 0x9E, 0xAB, 0xE0, 0x75, 0xF0, \r
-0x0A, 0x90, 0x8D, 0x01, 0x12, 0x51, 0x96, 0x90, 0x9E, 0xAB, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, \r
-0x03, 0x31, 0x24, 0xA3, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x12, 0x51, 0x9C, 0x90, 0x9E, 0xAB, 0xE0, \r
-0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x05, 0x31, 0x24, 0xA3, 0xE0, 0xFB, 0x0D, 0x12, 0x51, 0x9C, 0x90, \r
-0x9E, 0xAB, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x07, 0x12, 0x49, 0x24, 0xA3, 0xE0, 0xFB, 0x0D, \r
-0x31, 0x9C, 0x90, 0x9E, 0xAB, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x09, 0x12, 0x49, 0x24, 0xA3, \r
-0xE0, 0xFB, 0x0D, 0x31, 0x9C, 0x90, 0x9E, 0xAB, 0xE0, 0x24, 0x93, 0xF5, 0x82, 0xE4, 0x34, 0x99, \r
-0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x31, 0x9C, 0x90, 0x9E, 0xAB, 0xE0, 0x25, 0xE0, 0x24, \r
-0x91, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xA3, 0xE0, 0xFB, 0x7D, 0x02, 0x31, 0x9C, 0x90, \r
-0x9E, 0xAB, 0xE0, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xFB, \r
-0x0D, 0x31, 0x9C, 0x90, 0x9E, 0x7B, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x31, 0x9C, 0x90, 0x9E, 0x7C, \r
-0xE0, 0xFB, 0x0D, 0x31, 0x9C, 0x90, 0x9E, 0x7D, 0xE0, 0xFB, 0x0D, 0x31, 0x9C, 0x90, 0x9E, 0x7E, \r
-0x21, 0x46, 0x90, 0x9E, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x31, 0x9C, 0x90, 0x9E, 0x84, 0xE0, \r
-0xFB, 0x0D, 0x31, 0x9C, 0x90, 0x9E, 0x85, 0xE0, 0xFB, 0x0D, 0x31, 0x9C, 0x90, 0x9E, 0x86, 0xE0, \r
-0xFB, 0x0D, 0x31, 0x9C, 0x90, 0x9E, 0x87, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x31, 0x9C, 0x90, 0x9E, \r
-0x88, 0xE0, 0xFB, 0x0D, 0x31, 0x9C, 0x90, 0x9E, 0x89, 0xE0, 0xFB, 0x0D, 0x31, 0x9C, 0x90, 0x9E, \r
-0x8A, 0xE0, 0xFB, 0x0D, 0x31, 0x9C, 0x90, 0x9E, 0x8B, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x31, 0x9C, \r
-0x90, 0x9E, 0x8C, 0xE0, 0xFB, 0x0D, 0x31, 0x9C, 0x90, 0x9E, 0x8D, 0xE0, 0xFB, 0x0D, 0x31, 0x9C, \r
-0x90, 0x9E, 0x8E, 0xE0, 0xFB, 0x0D, 0x31, 0x9C, 0x90, 0x9E, 0x8F, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, \r
-0x31, 0x9C, 0x90, 0x9E, 0x90, 0xE0, 0xFB, 0x0D, 0x31, 0x9C, 0x90, 0x9E, 0x91, 0xE0, 0xFB, 0x0D, \r
-0x31, 0x9C, 0x90, 0x9E, 0x92, 0x80, 0x3F, 0x90, 0x9E, 0x93, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x31, \r
-0x9C, 0x90, 0x9E, 0x94, 0xE0, 0xFB, 0x0D, 0x31, 0x9C, 0x90, 0x9E, 0x95, 0xE0, 0xFB, 0x0D, 0x31, \r
-0x9C, 0x90, 0x9E, 0x96, 0xE0, 0xFB, 0x0D, 0x31, 0x9C, 0x90, 0x9E, 0x97, 0xE0, 0xFB, 0xE4, 0xFD, \r
-0x0F, 0x31, 0x9C, 0x90, 0x9E, 0x98, 0xE0, 0xFB, 0x0D, 0x31, 0x9C, 0x90, 0x9E, 0x99, 0xE0, 0xFB, \r
-0x0D, 0x31, 0x9C, 0x90, 0x9E, 0x9A, 0xE0, 0xFB, 0x0D, 0x80, 0x36, 0x90, 0x9D, 0xBA, 0xE0, 0xFB, \r
-0xE4, 0xFD, 0xFF, 0x31, 0x9C, 0x90, 0x9D, 0xB9, 0xE0, 0x54, 0x0F, 0xFB, 0x0D, 0x31, 0x9C, 0x90, \r
-0x9D, 0xBB, 0xE0, 0xFB, 0x0D, 0x31, 0x9C, 0x90, 0x9D, 0xBC, 0xE0, 0xFB, 0x0D, 0x31, 0x9C, 0x90, \r
-0x9E, 0xAB, 0xE0, 0x24, 0x36, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, \r
-0x0F, 0x31, 0x9C, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x31, \r
-0xE4, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x49, 0x24, 0xE0, 0xFB, 0x0D, 0xEF, 0x70, 0x04, 0x74, \r
-0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, \r
-0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, \r
-0x83, 0xEB, 0xF0, 0x22, 0x8F, 0x27, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE6, 0x4A, 0x90, 0x00, 0x8D, \r
-0xE0, 0x64, 0x02, 0x70, 0x42, 0x90, 0x9E, 0xB9, 0xF0, 0x90, 0x9E, 0xB9, 0xE0, 0xFD, 0xE5, 0x27, \r
-0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2D, \r
-0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x31, 0x9C, 0x90, 0x9E, 0xB9, \r
-0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x08, 0x40, 0xD0, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, \r
-0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x31, 0xE4, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, \r
-0x26, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE6, 0x46, 0x90, 0x00, 0x8D, 0xE0, 0x64, 0x01, 0x70, 0x3E, \r
-0x90, 0x9E, 0xB8, 0xF0, 0x90, 0x9E, 0xB8, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xE5, 0x26, 0x90, 0x81, \r
-0x00, 0x12, 0x49, 0x24, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, \r
-0xE4, 0xFF, 0x31, 0x9C, 0x90, 0x9E, 0xB8, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD4, \r
-0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x31, 0xE4, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE6, 0x57, 0x90, 0x00, 0x8D, 0xE0, 0x64, 0x03, \r
-0x70, 0x4F, 0x90, 0x00, 0x8F, 0xE0, 0xFE, 0x90, 0x00, 0x8E, 0xE0, 0xFD, 0xED, 0xFF, 0x90, 0x9D, \r
-0xD7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x9D, 0xD6, 0xF0, 0x90, 0x9D, 0xD6, 0xE0, 0xFD, \r
-0xFF, 0x90, 0x9D, 0xD8, 0xE0, 0x2F, 0xFF, 0x90, 0x9D, 0xD7, 0xE0, 0x34, 0x00, 0x8F, 0x82, 0xF5, \r
-0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x31, 0x9C, 0x90, 0x9D, 0xD6, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, \r
-0x10, 0x40, 0xD8, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x31, \r
-0xE4, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x47, 0x4E, 0x90, 0x9D, 0xD9, 0xEF, 0xF0, \r
-0x60, 0xF0, 0x90, 0x9E, 0x93, 0xE0, 0x04, 0xF0, 0x51, 0xEC, 0x80, 0xE6, 0xD3, 0x10, 0xAF, 0x01, \r
-0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x9D, 0xDA, 0xF0, 0x90, 0x9D, 0xDA, \r
-0xE0, 0xFD, 0x70, 0x02, 0x81, 0x25, 0x90, 0x9E, 0xA8, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, \r
-0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, \r
-0x81, 0x0F, 0x90, 0x9E, 0xA8, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x49, 0x24, 0xE0, \r
-0x90, 0x9D, 0xDB, 0xF0, 0x75, 0x40, 0x01, 0x75, 0x41, 0x9D, 0x75, 0x42, 0xDB, 0x75, 0x43, 0x01, \r
-0x7B, 0x01, 0x7A, 0x9D, 0x79, 0xDC, 0x12, 0x2B, 0x33, 0x90, 0x9E, 0xA8, 0xE0, 0x75, 0xF0, 0x04, \r
-0x90, 0x01, 0xD1, 0x12, 0x49, 0x24, 0xE0, 0x90, 0x9D, 0xDD, 0xF0, 0x90, 0x9E, 0xA8, 0xE0, 0x75, \r
-0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x49, 0x24, 0xE0, 0x90, 0x9D, 0xDE, 0xF0, 0x90, 0x9E, 0xA8, \r
-0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x49, 0x24, 0xE0, 0x90, 0x9D, 0xDF, 0xF0, 0x90, \r
-0x9E, 0xA8, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF0, 0x12, 0x49, 0x24, 0xE0, 0x90, 0x9D, 0xE0, \r
-0xF0, 0x90, 0x9E, 0xA8, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF1, 0x12, 0x49, 0x24, 0xE0, 0x90, \r
-0x9D, 0xE1, 0xF0, 0x90, 0x9E, 0xA8, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF2, 0x12, 0x49, 0x24, \r
-0xE0, 0x90, 0x9D, 0xE2, 0xF0, 0x90, 0x9E, 0xA8, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF3, 0x12, \r
-0x49, 0x24, 0xE0, 0x90, 0x9D, 0xE3, 0xF0, 0x90, 0x9D, 0xDA, 0xE0, 0xFF, 0x90, 0x9E, 0xA8, 0xE0, \r
-0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x9D, \r
-0xDA, 0xF0, 0x90, 0x9E, 0xA8, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, \r
-0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x9D, 0xDC, 0xE0, 0xFF, 0x7B, 0x01, 0x7A, 0x9D, 0x79, \r
-0xDD, 0x91, 0x2A, 0x90, 0x9E, 0xA8, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x41, 0xFD, 0x90, \r
-0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x90, 0x9E, 0xA8, \r
-0xE0, 0x90, 0x00, 0x89, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9D, 0xE4, 0x12, 0x49, 0x39, \r
-0xEF, 0x12, 0x49, 0x42, 0x54, 0x56, 0x00, 0x54, 0x5F, 0x01, 0x54, 0x68, 0x02, 0x54, 0x71, 0x03, \r
-0x54, 0x7A, 0x04, 0x54, 0x83, 0x20, 0x54, 0x8B, 0x21, 0x54, 0x94, 0x23, 0x54, 0x9C, 0x40, 0x54, \r
-0xAB, 0x42, 0x00, 0x00, 0x54, 0xB4, 0x90, 0x9D, 0xE4, 0x12, 0x49, 0x30, 0x02, 0x65, 0xE8, 0x90, \r
-0x9D, 0xE4, 0x12, 0x49, 0x30, 0x02, 0x66, 0x30, 0x90, 0x9D, 0xE4, 0x12, 0x49, 0x30, 0x02, 0x66, \r
-0xC8, 0x90, 0x9D, 0xE4, 0x12, 0x49, 0x30, 0x02, 0x7A, 0x7D, 0x90, 0x9D, 0xE4, 0x12, 0x49, 0x30, \r
-0x02, 0x7A, 0x9D, 0x90, 0x9D, 0xE4, 0x12, 0x49, 0x30, 0x80, 0x31, 0x90, 0x9D, 0xE4, 0x12, 0x49, \r
-0x30, 0x02, 0x67, 0x00, 0x90, 0x9D, 0xE4, 0x12, 0x49, 0x30, 0xE1, 0xE4, 0x90, 0x9E, 0x94, 0xE0, \r
-0x04, 0xF0, 0x90, 0x9D, 0xE4, 0x12, 0x49, 0x30, 0x02, 0x79, 0x17, 0x90, 0x9D, 0xE4, 0x12, 0x49, \r
-0x30, 0x02, 0x79, 0xFE, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x12, 0x1F, 0x96, 0x90, \r
-0x9D, 0xBA, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xAF, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, \r
-0x90, 0x9D, 0xB9, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0xAF, 0x54, 0x01, \r
-0x25, 0xE0, 0xFE, 0x90, 0x9D, 0xB7, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, \r
-0xF0, 0xFF, 0x90, 0x9D, 0xB9, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0xAF, \r
-0x90, 0x9D, 0xBB, 0xF0, 0xB1, 0x2B, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0xF0, \r
-0x90, 0x9D, 0xBA, 0xE0, 0x90, 0x01, 0xBA, 0xF0, 0x90, 0x9D, 0xBB, 0xE0, 0x90, 0x01, 0xBB, 0xF0, \r
-0x90, 0x9D, 0xB9, 0xE0, 0x54, 0x0F, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0x9D, 0xE7, 0x12, 0x49, \r
-0x39, 0x12, 0x7A, 0xC7, 0x90, 0x9D, 0xBA, 0xE0, 0xFF, 0xB1, 0x5B, 0x90, 0x9D, 0xBA, 0xE0, 0x60, \r
-0x19, 0x90, 0x9D, 0xE7, 0x12, 0x49, 0x30, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xAF, 0x54, 0x0F, 0xFF, \r
-0x90, 0x00, 0x02, 0x12, 0x1F, 0xAF, 0xFD, 0x12, 0x7A, 0xD8, 0x22, 0xEF, 0x70, 0x3E, 0x7D, 0x01, \r
-0xFF, 0x12, 0x5E, 0x47, 0x7D, 0x78, 0x7F, 0x02, 0x12, 0x5E, 0x47, 0x7D, 0x02, 0x7F, 0x03, 0x12, \r
-0x5E, 0x47, 0x7D, 0xC8, 0x7F, 0x02, 0x12, 0x7A, 0x2D, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, \r
-0x3C, 0x74, 0x02, 0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0xB1, 0xF5, 0x90, 0x9D, 0xB7, 0xE0, 0x54, 0xF7, \r
-0xF0, 0x54, 0xEF, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x30, 0x74, \r
-0x01, 0xF0, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x01, 0xE4, 0xFF, \r
-0xF1, 0xA9, 0x7D, 0x78, 0x7F, 0x02, 0xF1, 0xA9, 0x7D, 0x02, 0x7F, 0x03, 0xF1, 0xA9, 0x90, 0x06, \r
-0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x90, 0x9D, 0xC4, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x9D, \r
-0x36, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0x9D, 0xB8, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x9D, 0xBC, 0xE0, \r
-0x20, 0xE2, 0x0D, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x0C, 0x90, 0x9D, 0xB8, 0xE0, 0x44, 0x04, 0xF0, \r
-0x22, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9E, 0xB4, 0xED, \r
-0xF0, 0x90, 0x9D, 0xBC, 0xE0, 0x90, 0x9E, 0xB5, 0xF0, 0x90, 0x9D, 0xB7, 0xE0, 0xFE, 0xC4, 0x13, \r
-0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xE1, 0x53, 0xEE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, \r
-0xE0, 0x02, 0xE1, 0x53, 0x90, 0x9E, 0xB5, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xE1, 0x53, 0xEF, 0x70, \r
-0x02, 0xC1, 0xC4, 0x24, 0xFC, 0x60, 0x52, 0x24, 0xFE, 0x70, 0x02, 0xE1, 0x00, 0x24, 0xFE, 0x70, \r
-0x02, 0xE1, 0x3E, 0x24, 0xFC, 0x60, 0x02, 0xE1, 0x53, 0xEE, 0xB4, 0x0E, 0x03, 0x12, 0x7B, 0x1C, \r
-0x90, 0x9E, 0xB5, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x6A, 0x9A, 0x90, 0x9E, 0xB5, 0xE0, 0xB4, \r
-0x06, 0x02, 0xF1, 0xBE, 0x90, 0x9E, 0xB5, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x9E, 0xB4, 0xE0, 0xFF, \r
-0x60, 0x05, 0x12, 0x63, 0xEF, 0x80, 0x03, 0x12, 0x7B, 0x09, 0x90, 0x9E, 0xB5, 0xE0, 0x64, 0x08, \r
-0x60, 0x02, 0xE1, 0x53, 0x12, 0x6A, 0xB3, 0xE1, 0x53, 0x90, 0x9E, 0xB5, 0xE0, 0x70, 0x05, 0x7F, \r
-0x01, 0x12, 0x6A, 0x9A, 0x90, 0x9E, 0xB5, 0xE0, 0xB4, 0x06, 0x02, 0xF1, 0xBE, 0x90, 0x9E, 0xB5, \r
-0xE0, 0xB4, 0x0E, 0x08, 0xF1, 0x58, 0xBF, 0x01, 0x03, 0x12, 0x7B, 0x1C, 0x90, 0x9E, 0xB5, 0xE0, \r
-0x64, 0x0C, 0x60, 0x02, 0xE1, 0x53, 0xF1, 0x58, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xE1, 0x53, 0x12, \r
-0x60, 0xE0, 0xE1, 0x53, 0x90, 0x9E, 0xB5, 0xE0, 0xB4, 0x0E, 0x08, 0xF1, 0x58, 0xBF, 0x01, 0x03, \r
-0x12, 0x7B, 0x1C, 0x90, 0x9E, 0xB5, 0xE0, 0xB4, 0x06, 0x02, 0xF1, 0xBE, 0x90, 0x9E, 0xB5, 0xE0, \r
-0xB4, 0x0C, 0x08, 0xF1, 0x58, 0xBF, 0x01, 0x03, 0x12, 0x60, 0xE0, 0x90, 0x9E, 0xB5, 0xE0, 0x64, \r
-0x04, 0x70, 0x60, 0x12, 0x68, 0xB1, 0xEF, 0x64, 0x01, 0x70, 0x58, 0x12, 0x69, 0xC7, 0x80, 0x53, \r
-0x90, 0x9E, 0xB5, 0xE0, 0xB4, 0x0E, 0x08, 0xF1, 0x58, 0xBF, 0x01, 0x03, 0x12, 0x7B, 0x1C, 0x90, \r
-0x9E, 0xB5, 0xE0, 0xB4, 0x06, 0x02, 0xF1, 0xBE, 0x90, 0x9E, 0xB5, 0xE0, 0xB4, 0x0C, 0x08, 0xF1, \r
-0x58, 0xBF, 0x01, 0x03, 0x12, 0x60, 0xE0, 0x90, 0x9E, 0xB5, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, \r
-0x6A, 0x9A, 0x90, 0x9E, 0xB5, 0xE0, 0xB4, 0x04, 0x1A, 0x12, 0x7B, 0x44, 0x80, 0x15, 0x90, 0x9E, \r
-0xB5, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, 0x9D, 0xB8, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, \r
-0x02, 0xF1, 0xEC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x68, 0x98, 0xEF, 0x64, 0x01, 0x60, 0x08, \r
-0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x38, 0x90, 0x9D, 0xB7, 0xE0, 0xFF, 0x13, 0x13, 0x13, \r
-0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x23, 0xEF, 0xC4, 0x54, \r
-0x0F, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x14, 0x90, 0x9D, 0xBB, 0xE0, \r
-0xD3, 0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x03, 0x7F, 0x01, 0x22, \r
-0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, \r
-0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x9D, \r
-0xB8, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x0C, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x9D, 0xBC, 0x74, \r
-0x04, 0xF0, 0x80, 0x0A, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x9D, 0xBC, 0x74, 0x0C, 0xF0, 0x90, 0x05, \r
-0x22, 0xE4, 0xF0, 0x22, 0x12, 0x1F, 0x96, 0x90, 0x9D, 0xC3, 0xF0, 0x22, 0x12, 0x69, 0xE3, 0x90, \r
-0x9D, 0xBC, 0x74, 0x08, 0xF0, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x47, 0x4E, 0x90, \r
-0x9D, 0xEC, 0xEF, 0xF0, 0x60, 0xF0, 0x11, 0x0A, 0x80, 0xEC, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x90, 0x9D, 0x31, 0xE0, 0xFF, 0x90, 0x9D, 0x30, 0xE0, 0xFE, 0xB5, 0x07, 0x04, 0x7F, 0x01, \r
-0x80, 0x02, 0x7F, 0x00, 0xEF, 0x64, 0x01, 0x60, 0x45, 0x90, 0x01, 0xAF, 0xE0, 0x70, 0x3F, 0xEE, \r
-0x75, 0xF0, 0x0F, 0xA4, 0xFF, 0xAE, 0xF0, 0x24, 0x9A, 0xF9, 0x74, 0x9C, 0x3E, 0xFA, 0x7B, 0x01, \r
-0xC0, 0x02, 0xC0, 0x01, 0x74, 0x9C, 0x2F, 0xF9, 0x74, 0x9C, 0x3E, 0xFA, 0x90, 0x9D, 0xF0, 0x12, \r
-0x49, 0x39, 0xD0, 0x01, 0xD0, 0x02, 0x11, 0x73, 0x90, 0x9D, 0x30, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, \r
-0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9D, 0x30, 0xF0, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9D, 0xED, 0x12, 0x49, 0x39, \r
-0x90, 0x9E, 0xA9, 0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x1F, 0xEE, 0x7F, 0xAF, \r
-0x7E, 0x01, 0x11, 0xE5, 0xEF, 0x60, 0x49, 0x90, 0x9D, 0xED, 0x12, 0x49, 0x30, 0x8B, 0x40, 0x8A, \r
-0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x2B, 0x33, 0x90, \r
-0x9D, 0xF0, 0x12, 0x49, 0x30, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x90, 0x9D, 0xED, 0x12, 0x49, \r
-0x30, 0x12, 0x1F, 0x96, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA2, \r
-0x12, 0x2B, 0x33, 0x90, 0x01, 0xAF, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9D, 0xF3, 0xEE, \r
-0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x9D, 0xF3, 0xE0, 0xFE, 0xA3, 0xE0, \r
-0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0x9D, 0xF6, 0xE0, 0x94, 0xE8, 0x90, 0x9D, \r
-0xF5, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, \r
-0x15, 0x90, 0x9D, 0xF5, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x48, 0x9F, 0x7F, 0x0A, 0x7E, 0x00, 0x12, \r
-0x32, 0x58, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, \r
-0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, \r
-0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x3B, 0xF0, 0x74, 0x59, \r
-0xA3, 0xF0, 0x53, 0x91, 0xEF, 0x31, 0x8D, 0x74, 0x3B, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x59, \r
-0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, \r
-0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x00, 0x54, \r
-0xE0, 0x55, 0x0D, 0xF5, 0x11, 0xA3, 0xE0, 0x55, 0x0E, 0xF5, 0x12, 0xA3, 0xE0, 0x55, 0x0F, 0xF5, \r
-0x13, 0xA3, 0xE0, 0x55, 0x10, 0xF5, 0x14, 0xAD, 0x11, 0x7F, 0x54, 0x12, 0x31, 0xE4, 0xAD, 0x12, \r
-0x7F, 0x55, 0x12, 0x31, 0xE4, 0xAD, 0x13, 0x7F, 0x56, 0x12, 0x31, 0xE4, 0xAD, 0x14, 0x7F, 0x57, \r
-0x02, 0x31, 0xE4, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, \r
-0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, \r
-0x90, 0x01, 0xC4, 0x74, 0xC3, 0xF0, 0x74, 0x59, 0xA3, 0xF0, 0x12, 0x68, 0x13, 0xE5, 0x19, 0x30, \r
-0xE0, 0x03, 0x12, 0x68, 0x40, 0xE5, 0x19, 0x30, 0xE1, 0x02, 0x51, 0x7B, 0xE5, 0x19, 0x30, 0xE4, \r
-0x05, 0x7F, 0x02, 0x12, 0x47, 0x27, 0xE5, 0x1B, 0x30, 0xE0, 0x02, 0x51, 0xBE, 0xE5, 0x1B, 0x30, \r
-0xE1, 0x02, 0xB1, 0xDE, 0xE5, 0x1B, 0x30, 0xE2, 0x02, 0xD1, 0x5F, 0xE5, 0x1B, 0x30, 0xE3, 0x03, \r
-0x12, 0x69, 0x1D, 0xE5, 0x1B, 0x30, 0xE4, 0x03, 0x12, 0x69, 0x50, 0xE5, 0x1B, 0x30, 0xE5, 0x02, \r
-0xF1, 0x3A, 0xE5, 0x1B, 0x30, 0xE6, 0x02, 0xF1, 0x1F, 0xE5, 0x1C, 0x30, 0xE1, 0x02, 0x91, 0x32, \r
-0xE5, 0x1C, 0x30, 0xE4, 0x02, 0x91, 0x3B, 0xE5, 0x1C, 0x30, 0xE5, 0x02, 0x71, 0x82, 0xE5, 0x1C, \r
-0x30, 0xE6, 0x02, 0x71, 0x4B, 0x74, 0xC3, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x59, 0xA3, 0xF0, \r
-0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, \r
-0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x04, 0x7E, 0xE0, 0xFF, \r
-0xA3, 0xE0, 0x04, 0xFE, 0xEE, 0xD3, 0x9F, 0x50, 0x2F, 0xE4, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, \r
-0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, \r
-0x83, 0xF5, 0x83, 0xE0, 0xFC, 0x74, 0x72, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xAF, 0xF5, 0x83, 0xEC, \r
-0xF0, 0x0D, 0xBD, 0x08, 0xD6, 0x0E, 0x80, 0xCC, 0x90, 0x04, 0x7F, 0xEF, 0xF0, 0x22, 0xE4, 0xFF, \r
-0x90, 0x9D, 0xBA, 0xE0, 0x70, 0x02, 0x61, 0x4A, 0x90, 0x9D, 0x36, 0xE0, 0x64, 0x01, 0x70, 0x7A, \r
-0x90, 0x9D, 0xB9, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x24, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1F, \r
-0x90, 0x9D, 0xC0, 0xE0, 0x14, 0xF0, 0xE0, 0xFE, 0x60, 0x06, 0x90, 0x9D, 0xC2, 0xE0, 0x60, 0x0F, \r
-0xEE, 0x70, 0x06, 0x90, 0x9D, 0xBF, 0xE0, 0xA3, 0xF0, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x01, 0xEF, \r
-0x60, 0x48, 0x90, 0x9D, 0xBD, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x9D, 0xC2, 0xE0, 0x60, 0x03, 0xB4, \r
-0x01, 0x09, 0xE4, 0xF5, 0x3B, 0x90, 0x9D, 0xC2, 0xE0, 0x80, 0x0D, 0xE4, 0xF5, 0x3B, 0x90, 0x9D, \r
-0xC2, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x9D, 0xC1, 0xE0, 0x2F, 0xF5, 0x3C, \r
-0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x2B, 0xF0, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, \r
-0x90, 0x9D, 0xBC, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x55, 0xF1, 0x22, 0x90, 0x07, 0x1F, 0xE0, 0x54, \r
-0x7F, 0xF0, 0x90, 0x07, 0x1C, 0xE0, 0x54, 0x01, 0x90, 0x9D, 0xF9, 0xF0, 0x90, 0x9D, 0xF7, 0xE0, \r
-0x54, 0xF0, 0x44, 0x02, 0xF0, 0x54, 0x0F, 0x44, 0x10, 0xF0, 0x7B, 0x01, 0x7A, 0x9D, 0x79, 0xF9, \r
-0x90, 0x9D, 0xFD, 0x12, 0x49, 0x39, 0x7A, 0x9D, 0x79, 0xF7, 0x12, 0x67, 0x46, 0x7F, 0x03, 0x02, \r
-0x47, 0x27, 0x90, 0x9E, 0x90, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x52, 0x90, 0x9D, 0x36, 0xE0, 0x70, \r
-0x02, 0x81, 0x26, 0xE5, 0x52, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x52, 0x54, 0x07, 0xFE, \r
-0x74, 0x81, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x06, 0x74, 0x01, \r
-0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, \r
-0x5D, 0x60, 0x63, 0x75, 0xF0, 0x10, 0xE5, 0x52, 0x90, 0x81, 0x01, 0x12, 0x49, 0x24, 0xE0, 0x20, \r
-0xE7, 0x02, 0x80, 0x10, 0x75, 0xF0, 0x10, 0xE5, 0x52, 0x90, 0x81, 0x02, 0x12, 0x49, 0x24, 0xE0, \r
-0xFF, 0x20, 0xE7, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x80, 0x39, 0xEF, 0x30, 0xE6, \r
-0x2A, 0x90, 0x9E, 0x8D, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x52, 0x90, 0x81, 0x00, 0x12, \r
-0x49, 0x24, 0xE0, 0xFD, 0x75, 0xF0, 0x09, 0xE5, 0x52, 0x90, 0x94, 0x96, 0x12, 0x49, 0x24, 0xE0, \r
-0xF5, 0x6A, 0xE4, 0xFB, 0xAF, 0x52, 0x12, 0x6B, 0xD1, 0x80, 0x0B, 0x90, 0x9E, 0x8E, 0xE0, 0x04, \r
-0xF0, 0xAF, 0x52, 0x12, 0x6F, 0x28, 0x05, 0x52, 0xE5, 0x52, 0xC3, 0x94, 0x80, 0x50, 0x02, 0x61, \r
-0x8B, 0x22, 0x90, 0x9D, 0xBA, 0xE0, 0x60, 0x02, 0xF1, 0x92, 0x22, 0x90, 0x9E, 0x8F, 0xE0, 0x04, \r
-0xF0, 0xE4, 0xFF, 0x8F, 0x52, 0xE4, 0xFC, 0x74, 0xF7, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, \r
-0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x03, 0x12, 0x49, 0x24, 0xE0, 0xFF, 0x30, \r
-0xE7, 0x0F, 0xEC, 0x70, 0x1D, 0xEF, 0x30, 0xE6, 0x19, 0x90, 0x9E, 0x8C, 0xE0, 0x04, 0xF0, 0x80, \r
-0x11, 0xAF, 0x04, 0xF1, 0xCE, 0x74, 0xF7, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0x74, \r
-0x01, 0xF0, 0x0C, 0xBC, 0x80, 0xC1, 0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x32, 0x58, 0xE4, 0xFC, 0x74, \r
-0xF7, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0xA1, 0xD5, 0x75, 0xF0, \r
-0x10, 0xEC, 0x90, 0x81, 0x06, 0x12, 0x49, 0x24, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, \r
-0x07, 0x12, 0x49, 0x24, 0xE0, 0xFE, 0xED, 0xFB, 0xEB, 0xFF, 0xEC, 0x25, 0xE0, 0x24, 0x01, 0xF5, \r
-0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, \r
-0x81, 0x0A, 0x12, 0x49, 0x24, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0B, 0x12, 0x49, \r
-0x24, 0xE0, 0xFB, 0xFE, 0xED, 0xF5, 0x82, 0xE5, 0x82, 0xFF, 0x75, 0xF0, 0x0A, 0xEC, 0x90, 0x8D, \r
-0x01, 0x12, 0x49, 0x24, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0C, \r
-0x12, 0x49, 0x24, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xEC, 0x90, 0x8D, 0x03, 0x12, 0x49, 0x24, 0xE4, \r
-0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0D, 0x12, 0x49, 0x24, 0xE0, 0xFF, \r
-0x75, 0xF0, 0x0A, 0xEC, 0x90, 0x8D, 0x05, 0x12, 0x49, 0x24, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, \r
-0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0E, 0x12, 0x49, 0x24, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xEC, 0x90, \r
-0x8D, 0x07, 0x12, 0x49, 0x24, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, \r
-0x0F, 0x12, 0x49, 0x24, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xEC, 0x90, 0x8D, 0x09, 0x12, 0x49, 0x24, \r
-0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x09, 0x12, 0x49, 0x24, 0xE0, \r
-0xFF, 0x74, 0x93, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xEF, 0xF0, 0xEC, 0x70, 0x4E, \r
-0xEB, 0x30, 0xE7, 0x05, 0x90, 0x9E, 0x8B, 0x80, 0x42, 0xEB, 0x30, 0xE6, 0x05, 0x90, 0x9E, 0x8A, \r
-0x80, 0x39, 0xEB, 0x30, 0xE5, 0x05, 0x90, 0x9E, 0x89, 0x80, 0x30, 0xEB, 0x30, 0xE4, 0x05, 0x90, \r
-0x9E, 0x88, 0x80, 0x27, 0xEB, 0x30, 0xE3, 0x05, 0x90, 0x9E, 0x87, 0x80, 0x1E, 0xEB, 0x30, 0xE2, \r
-0x05, 0x90, 0x9E, 0x86, 0x80, 0x15, 0xEB, 0x30, 0xE1, 0x05, 0x90, 0x9E, 0x85, 0x80, 0x0C, 0xEB, \r
-0x30, 0xE0, 0x05, 0x90, 0x9E, 0x84, 0x80, 0x03, 0x90, 0x9E, 0x83, 0xE0, 0x04, 0xF0, 0xAF, 0x04, \r
-0xAD, 0x52, 0x12, 0x76, 0x33, 0x0C, 0xEC, 0x64, 0x80, 0x60, 0x02, 0x81, 0x8F, 0x22, 0x90, 0x9D, \r
-0xBA, 0xE0, 0x60, 0x45, 0x90, 0x9D, 0xB8, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, \r
-0x12, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0xD1, 0x3D, 0x90, 0x9D, 0xBF, 0xE0, 0x14, 0x90, \r
-0x05, 0x73, 0xF0, 0x90, 0x9E, 0xAC, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x48, 0x9F, 0xC3, 0x90, 0x9E, \r
-0xAD, 0xE0, 0x94, 0x80, 0x90, 0x9E, 0xAC, 0xE0, 0x64, 0x80, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, \r
-0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0x63, 0x03, 0x12, 0x60, 0x85, 0xE4, \r
-0xFF, 0x91, 0x43, 0x12, 0x73, 0x7B, 0x90, 0x9E, 0x91, 0xE0, 0x04, 0xF0, 0x22, 0x7D, 0x02, 0x7F, \r
-0x02, 0xD1, 0x47, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, \r
-0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, \r
-0x9D, 0xBC, 0xE0, 0x64, 0x06, 0x60, 0x22, 0xD1, 0x8A, 0x90, 0x9D, 0xB8, 0xE0, 0x13, 0x13, 0x13, \r
-0x54, 0x1F, 0x30, 0xE0, 0x14, 0x90, 0x9D, 0xBF, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x0A, 0xF1, \r
-0x6E, 0xD1, 0x3D, 0x90, 0x9D, 0xC0, 0xE0, 0x14, 0xF0, 0x22, 0x90, 0x9D, 0x36, 0xE0, 0x64, 0x01, \r
-0x60, 0x02, 0xE1, 0x1E, 0x90, 0x9D, 0xBA, 0xE0, 0x70, 0x02, 0xE1, 0x1E, 0x90, 0x9D, 0xB9, 0xE0, \r
-0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x9D, 0xC0, 0xF0, 0x90, \r
-0x06, 0xAA, 0xE0, 0x90, 0x9D, 0xBF, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x9D, 0xBF, 0xE0, \r
-0xFE, 0xFF, 0x80, 0x00, 0x90, 0x9D, 0xC0, 0xEF, 0xF0, 0x90, 0x9D, 0xB8, 0xE0, 0x44, 0x04, 0xF0, \r
-0xE4, 0x90, 0x9D, 0xC2, 0xF0, 0x90, 0x9D, 0xC4, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, \r
-0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x9D, 0xBD, 0xE0, 0x54, 0xFD, 0xF0, \r
-0x54, 0xEF, 0xF0, 0x90, 0x9D, 0xB9, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, \r
-0x03, 0x12, 0x65, 0x6A, 0x90, 0x9D, 0xB8, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0E, \r
-0x90, 0x9D, 0xBF, 0xE0, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x04, 0xF1, 0x6E, 0xD1, 0x43, 0x22, 0x90, \r
-0x9D, 0x36, 0xE0, 0xB4, 0x01, 0x13, 0x90, 0x9D, 0xBA, 0xE0, 0x60, 0x0D, 0x90, 0x9D, 0xBD, 0xE0, \r
-0x54, 0xFE, 0xF0, 0x54, 0x07, 0x70, 0x02, 0xF1, 0xC4, 0x22, 0x90, 0x9D, 0x36, 0xE0, 0xB4, 0x01, \r
-0x15, 0x90, 0x9D, 0xBA, 0xE0, 0x60, 0x0F, 0x90, 0x9D, 0xB9, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, \r
-0x02, 0x80, 0x04, 0x12, 0x64, 0x77, 0x22, 0x12, 0x62, 0xD5, 0xBF, 0x01, 0x10, 0x90, 0x9C, 0x96, \r
-0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x62, 0x0A, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0xEF, 0x14, \r
-0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x1D, 0x2F, \r
-0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, \r
-0xF0, 0x22, 0x90, 0x9D, 0xBA, 0xE0, 0x64, 0x01, 0x70, 0x29, 0x90, 0x9D, 0xB9, 0xE0, 0x54, 0x0F, \r
-0x60, 0x15, 0x90, 0x9D, 0xBC, 0xE0, 0x70, 0x04, 0xFF, 0x12, 0x6A, 0x9A, 0x90, 0x9D, 0xBC, 0xE0, \r
-0x64, 0x0C, 0x60, 0x0F, 0x02, 0x7B, 0x09, 0x90, 0x9D, 0xBC, 0xE0, 0xC3, 0x94, 0x04, 0x50, 0x03, \r
-0x12, 0x55, 0xF1, 0x22, 0x90, 0x9D, 0xBB, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x55, 0xF5, 0x75, 0xF0, \r
-0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x49, 0x24, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, \r
-0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, \r
-0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xDD, 0xF0, \r
-0x74, 0x5F, 0xA3, 0xF0, 0x53, 0x91, 0xDF, 0x51, 0xA8, 0xE5, 0x21, 0x30, 0xE1, 0x02, 0x11, 0x6A, \r
-0xE5, 0x21, 0x30, 0xE2, 0x02, 0x71, 0x37, 0xE5, 0x21, 0x30, 0xE3, 0x02, 0x71, 0x73, 0xE5, 0x22, \r
-0x30, 0xE0, 0x02, 0x31, 0x93, 0xE5, 0x24, 0x30, 0xE1, 0x05, 0x7F, 0x03, 0x12, 0x47, 0x27, 0xE5, \r
-0x24, 0x30, 0xE4, 0x02, 0x11, 0x73, 0xE5, 0x24, 0x30, 0xE5, 0x02, 0x31, 0x16, 0xE5, 0x24, 0x30, \r
-0xE6, 0x02, 0x31, 0xCC, 0x74, 0xDD, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x5F, 0xA3, 0xF0, 0xD0, \r
-0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, \r
-0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x9D, 0xBA, 0xE0, 0x60, 0x02, \r
-0xB1, 0x0C, 0x22, 0x71, 0xAF, 0x90, 0x9D, 0xBF, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, \r
-0x7F, 0x02, 0x12, 0x57, 0xA9, 0x90, 0x9D, 0xCB, 0xE0, 0x30, 0xE0, 0x2D, 0x90, 0x9D, 0x36, 0xE0, \r
-0xB4, 0x01, 0x26, 0x90, 0x9E, 0xBA, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x9D, 0xCD, \r
-0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x9E, 0xBA, 0xF0, 0x90, 0x9D, 0xCD, 0xE0, 0xFF, 0x90, 0x9D, 0xCC, \r
-0xE0, 0xB5, 0x07, 0x05, 0xE4, 0xA3, 0xF0, 0x11, 0xBA, 0x22, 0xE4, 0xFF, 0x8F, 0x6F, 0x51, 0xD5, \r
-0xBF, 0x01, 0x1A, 0x90, 0x9C, 0x97, 0xE0, 0xFF, 0x7D, 0x01, 0x51, 0x0A, 0xAD, 0x07, 0xAC, 0x06, \r
-0xAF, 0x6F, 0x91, 0xC1, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, \r
-0x90, 0x9D, 0x36, 0xE0, 0x64, 0x01, 0x70, 0x2D, 0x90, 0x9D, 0xB8, 0xE0, 0x54, 0xFD, 0xF0, 0x90, \r
-0x05, 0x22, 0x74, 0x6F, 0xF0, 0x7F, 0x01, 0x11, 0xBC, 0xBF, 0x01, 0x0E, 0x90, 0x9D, 0xB7, 0xE0, \r
-0x44, 0x80, 0xF0, 0x90, 0x9D, 0xBC, 0x74, 0x0E, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, \r
-0x90, 0x01, 0xB8, 0x04, 0xF0, 0x22, 0x90, 0x9D, 0xB7, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, \r
-0x30, 0xE0, 0x27, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x9D, 0xB8, 0x30, 0xE0, \r
-0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x10, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, \r
-0xF0, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x12, 0x5F, 0xC4, 0xE4, 0xFF, 0x90, 0x9D, 0xCE, 0xE0, \r
-0x30, 0xE0, 0x3F, 0x90, 0x9D, 0xD2, 0xE0, 0xFD, 0x60, 0x38, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, \r
-0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, 0xE0, 0xE0, 0xFB, \r
-0xEF, 0x5B, 0x60, 0x06, 0xE4, 0x90, 0x9D, 0xD2, 0xF0, 0x22, 0x90, 0x9D, 0xD0, 0xE0, 0xB5, 0x05, \r
-0x09, 0x90, 0x01, 0xC7, 0xE0, 0x44, 0x10, 0xF0, 0x41, 0x73, 0x11, 0xBA, 0x90, 0x9D, 0xD2, 0xE0, \r
-0x04, 0xF0, 0x22, 0x91, 0x30, 0x90, 0x9E, 0x77, 0xEF, 0xF0, 0xE0, 0xFC, 0x54, 0x01, 0xFE, 0x90, \r
-0x9D, 0xB7, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEC, 0x30, 0xE6, 0x20, 0x90, 0x01, 0x00, 0xE0, 0xB4, \r
-0xEA, 0x09, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x32, 0x58, 0x80, 0xF0, 0x90, 0x01, 0x2F, 0xE0, 0x30, \r
-0xE7, 0x03, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x22, 0x90, 0x9D, 0xB7, 0xE0, \r
-0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x2C, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, \r
-0xE0, 0xE0, 0x90, 0x9D, 0xB8, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0F, 0xE0, 0x54, \r
-0xFD, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x90, 0x9D, 0xBA, \r
-0xE0, 0x60, 0x03, 0x12, 0x5F, 0xC4, 0x7F, 0x01, 0x21, 0x4C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x90, 0x9E, 0xAF, 0xED, 0xF0, 0x90, 0x9E, 0xAE, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x51, 0x8A, \r
-0x7C, 0x00, 0xAD, 0x07, 0x90, 0x9E, 0xAE, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x9E, 0xAF, 0xE0, \r
-0x60, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, \r
-0xAF, 0x05, 0x74, 0x08, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, \r
-0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x29, 0x2D, 0xF5, \r
-0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x9C, 0x94, 0xE0, 0x64, 0x02, \r
-0x60, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xE4, 0xFE, 0xEF, 0x25, 0xE0, 0xFD, \r
-0xEF, 0xC3, 0x94, 0x80, 0x90, 0xFD, 0x12, 0x50, 0x04, 0xE4, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, \r
-0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 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, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, \r
-0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, \r
-0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x90, 0x9D, 0xCE, 0xE0, 0x30, 0xE0, 0x2C, 0x90, 0x9D, 0xD1, 0xE0, 0x04, 0xF0, \r
-0xE0, 0xFF, 0x90, 0x9D, 0xCF, 0xE0, 0xB5, 0x07, 0x1D, 0x90, 0x06, 0x92, 0xE0, 0x54, 0x1C, 0x70, \r
-0x0A, 0x11, 0xBA, 0x90, 0x9D, 0xD2, 0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, 0x1C, \r
-0xF0, 0xE4, 0x90, 0x9D, 0xD1, 0xF0, 0x22, 0x90, 0x9D, 0xBA, 0xE0, 0x60, 0x35, 0x90, 0x06, 0x92, \r
-0xE0, 0x30, 0xE0, 0x24, 0xE4, 0xF5, 0x3B, 0x90, 0x9D, 0xC8, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0xF5, \r
-0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x2B, 0xF0, 0x90, 0x01, 0x5B, 0x74, 0x05, \r
-0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x9D, 0xB7, 0xE0, 0x54, 0xF7, 0xF0, 0x12, \r
-0x5F, 0xC4, 0x22, 0x90, 0x9D, 0xBA, 0xE0, 0x60, 0x35, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x24, \r
-0xE4, 0xF5, 0x3B, 0x90, 0x9D, 0xC8, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, \r
-0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x2B, 0xF0, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, \r
-0x74, 0x02, 0xF0, 0x22, 0x90, 0x9D, 0xB7, 0xE0, 0x54, 0xEF, 0xF0, 0x12, 0x5F, 0xC4, 0x22, 0x90, \r
-0x9D, 0xBA, 0xE0, 0x60, 0x39, 0x90, 0x9D, 0x36, 0xE0, 0x64, 0x01, 0x70, 0x31, 0x90, 0x9D, 0xC0, \r
-0xF0, 0x04, 0x60, 0x2A, 0x90, 0x9D, 0xBD, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x9D, \r
-0xC1, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x2B, 0xF0, 0x90, 0x01, \r
-0x57, 0x74, 0x05, 0xF0, 0x90, 0x9D, 0xBC, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x55, 0xF1, 0x22, 0xEF, \r
-0x60, 0x3D, 0x90, 0x9D, 0x36, 0xE0, 0x64, 0x01, 0x70, 0x35, 0x90, 0x9D, 0xB8, 0xE0, 0x54, 0xFE, \r
-0xF0, 0x90, 0x05, 0x22, 0x74, 0x0F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0xFF, \r
-0x11, 0xBC, 0xBF, 0x01, 0x0E, 0x90, 0x9D, 0xB7, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x9D, 0xBC, 0x74, \r
-0x06, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x22, \r
-0xE4, 0x90, 0x9E, 0x78, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0x90, 0x9E, 0x78, \r
-0xF0, 0x90, 0x00, 0x83, 0xE0, 0xFE, 0x90, 0x9E, 0x78, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, \r
-0x90, 0x9E, 0x7A, 0xE0, 0x94, 0x64, 0x90, 0x9E, 0x79, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, \r
-0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x9E, 0x78, 0xE0, 0xFF, 0x22, 0x90, 0x9E, 0x79, 0xE4, 0x75, \r
-0xF0, 0x01, 0x12, 0x48, 0x9F, 0x80, 0xC2, 0x90, 0x01, 0x5F, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, \r
-0x08, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x9D, 0xC8, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0xF5, 0x3C, 0xE4, \r
-0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x2B, 0xF0, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, \r
-0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x9D, 0xB7, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x9D, 0xBC, 0xE0, \r
-0xC3, 0x94, 0x0C, 0x50, 0x0B, 0xE4, 0xFD, 0x7F, 0x0C, 0x12, 0x55, 0xF5, 0xE4, 0xFF, 0x11, 0xBC, \r
-0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0xF0, 0xEF, \r
-0x60, 0x1D, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, \r
-0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x74, \r
-0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x09, 0x2D, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0x9D, 0xB7, 0xE0, \r
-0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0x9D, 0xBD, 0xE0, \r
-0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x42, 0x80, 0x3D, 0x90, 0x9D, 0xC2, 0xE0, 0x04, 0xF0, 0x90, \r
-0x9D, 0xBD, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x9D, 0xC2, 0xE0, 0xFF, 0xB4, 0x01, 0x02, 0x80, 0x04, \r
-0xEF, 0xB4, 0x02, 0x06, 0x90, 0x05, 0x58, 0xE0, 0x04, 0xF0, 0x90, 0x9D, 0xC6, 0xE0, 0xFF, 0x90, \r
-0x9D, 0xC2, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90, 0x9D, 0x36, 0xE0, 0xB4, 0x01, 0x0B, 0x90, 0x9D, \r
-0xB8, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x5F, 0xC4, 0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x9D, \r
-0xF7, 0xF0, 0xE0, 0x54, 0xC0, 0x70, 0x0D, 0x90, 0x9D, 0xBD, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, \r
-0xF0, 0x02, 0x5F, 0xC4, 0x90, 0x9D, 0xF7, 0xE0, 0x30, 0xE6, 0x22, 0x90, 0x9D, 0xBA, 0xE0, 0x64, \r
-0x01, 0x70, 0x21, 0x90, 0x9D, 0xBD, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x9D, 0xB9, 0xE0, 0x54, 0x0F, \r
-0x64, 0x02, 0x60, 0x05, 0x12, 0x5F, 0x57, 0x80, 0x0B, 0x91, 0x77, 0x80, 0x07, 0x90, 0x9D, 0xBD, \r
-0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x9D, 0xF7, 0xE0, 0x90, 0x9D, 0xBD, 0x30, 0xE7, 0x25, 0xE0, 0x44, \r
-0x02, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x9D, 0xC7, 0xE0, 0xF5, 0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, \r
-0x7E, 0x01, 0x12, 0x2B, 0xF0, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x9D, 0xB7, 0xE0, 0x44, \r
-0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x1F, 0x96, \r
-0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x9C, 0x95, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xAF, 0xFF, \r
-0xED, 0x2F, 0x90, 0x9C, 0x96, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xAF, 0xFF, 0xED, 0x2F, 0x90, \r
-0x9C, 0x97, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0xAF, 0xFF, 0xED, 0x2F, 0x90, 0x9C, 0x98, 0xF0, \r
-0x90, 0x00, 0x04, 0x12, 0x1F, 0xAF, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x9C, 0x99, 0xF0, 0x22, \r
-0x90, 0x9D, 0xE7, 0x12, 0x49, 0x39, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xAF, 0xFF, 0xFE, 0x12, 0x1F, \r
-0x96, 0xFD, 0xC3, 0x13, 0x30, 0xE0, 0x12, 0x90, 0x9D, 0xE7, 0x12, 0x49, 0x30, 0x90, 0x00, 0x02, \r
-0x12, 0x1F, 0xAF, 0x90, 0x9D, 0xEB, 0xF0, 0x80, 0x05, 0x90, 0x9D, 0xEB, 0xEF, 0xF0, 0x90, 0x9D, \r
-0xEA, 0xEE, 0xF0, 0x90, 0x9D, 0xEB, 0xE0, 0xFE, 0x90, 0x9D, 0xEA, 0xE0, 0xFF, 0xD3, 0x9E, 0x50, \r
-0x38, 0x90, 0x9D, 0xE7, 0x12, 0x49, 0x30, 0x12, 0x1F, 0x96, 0x54, 0x01, 0xFE, 0x74, 0x36, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x36, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
-0x9D, 0xF5, 0x83, 0xE0, 0x70, 0x04, 0xD1, 0xB9, 0x80, 0x07, 0x90, 0x9D, 0xEA, 0xE0, 0xFF, 0xD1, \r
-0xAA, 0x90, 0x9D, 0xEA, 0xE0, 0x04, 0xF0, 0x80, 0xBA, 0x22, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, \r
-0x05, 0x12, 0x49, 0x24, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, \r
-0x12, 0x49, 0x24, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, \r
-0x1F, 0x96, 0xFF, 0x90, 0x9D, 0xB6, 0xF0, 0xBF, 0x01, 0x12, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xAF, \r
-0x64, 0x01, 0x60, 0x17, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x0F, 0x90, 0x00, 0x01, 0x12, \r
-0x1F, 0xAF, 0x64, 0x01, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
-0x90, 0x00, 0x02, 0x12, 0x1F, 0xAF, 0xFF, 0x30, 0xE0, 0x26, 0x12, 0x1F, 0x96, 0x90, 0x9D, 0xC6, \r
-0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xAF, 0x90, 0x9D, 0xC7, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, \r
-0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0xAF, 0x90, 0x9D, 0xC9, 0xF0, 0x22, \r
-0x90, 0x9D, 0xC6, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, \r
-0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9D, 0xFA, \r
-0x12, 0x49, 0x39, 0x90, 0x9D, 0x30, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, \r
-0xEF, 0x14, 0xFF, 0x90, 0x9D, 0x31, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, \r
-0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x73, 0x90, 0x9D, 0x31, 0xE0, \r
-0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x9A, 0xF9, 0x74, 0x9C, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, \r
-0x90, 0x9D, 0xFA, 0x12, 0x49, 0x30, 0x7E, 0x00, 0x7F, 0x02, 0x12, 0x48, 0x79, 0x90, 0x9D, 0x31, \r
-0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x9C, 0xF9, 0x74, 0x9C, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, \r
-0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x9D, 0xFD, 0x12, 0x49, 0x30, 0x8B, 0x40, 0x8A, 0x41, 0x89, \r
-0x42, 0x90, 0x9D, 0xFA, 0x12, 0x49, 0x30, 0x12, 0x1F, 0x96, 0xFF, 0xC4, 0x54, 0x0F, 0xF5, 0x43, \r
-0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x2B, 0x33, 0x90, 0x9D, 0x31, 0xE0, 0x04, 0xF0, 0xE0, \r
-0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9D, 0x31, 0xF0, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x02, 0x90, 0x9D, 0xCA, 0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x10, \r
-0xEF, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0F, 0x80, 0xE6, \r
-0x7F, 0x01, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, \r
-0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, \r
-0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, \r
-0x90, 0x9D, 0xB9, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x49, 0xEF, 0x54, \r
-0x0F, 0x60, 0x3C, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0x11, 0x98, \r
-0xEF, 0x64, 0x01, 0x70, 0x32, 0xF5, 0x3B, 0x90, 0x9D, 0xC8, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0xF5, \r
-0x3C, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x2B, 0xF0, 0x90, 0x01, 0x5B, 0x74, 0x05, \r
-0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0x9D, 0xB7, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x11, \r
-0x98, 0xBF, 0x01, 0x03, 0x12, 0x5F, 0xC4, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, \r
-0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, \r
-0x22, 0x11, 0x98, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x54, \r
-0x90, 0x9D, 0xBD, 0xE0, 0xFF, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, \r
-0x43, 0x90, 0x9D, 0xBB, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, \r
-0xF0, 0x80, 0x31, 0xEF, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x25, 0x90, \r
-0x9D, 0xBD, 0xE0, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, 0x16, 0x90, 0x9D, \r
-0xB8, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x20, 0xF0, 0x80, \r
-0x03, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x9D, 0x36, \r
-0xE0, 0x64, 0x01, 0x70, 0x2A, 0x90, 0x9D, 0xBA, 0xE0, 0x60, 0x24, 0x90, 0x01, 0x57, 0xE4, 0xF0, \r
-0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0xE4, 0xF5, 0x3B, 0x90, 0x9D, 0xC7, 0xE0, 0xF5, 0x3C, 0xE4, \r
-0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x12, 0x2B, 0xF0, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x22, \r
-0x90, 0x9D, 0x36, 0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, 0x9D, 0xBA, 0xE0, 0x60, 0x20, 0x90, 0x01, \r
-0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x9D, 0xB7, 0xE0, 0x54, 0xFB, 0xF0, \r
-0x90, 0x9D, 0xBD, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x5F, 0xC4, 0x22, 0xE4, \r
-0x90, 0x9E, 0xB0, 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, 0xD3, 0x90, 0x9E, 0xB1, 0xE0, \r
-0x94, 0xE8, 0x90, 0x9E, 0xB0, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, \r
-0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x32, 0x58, 0x90, 0x9E, 0xB0, 0xE4, 0x75, \r
-0xF0, 0x01, 0x12, 0x48, 0x9F, 0x80, 0xBF, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x31, 0x7F, 0x90, \r
-0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x57, 0xA9, 0x31, 0xE3, 0xE4, 0x90, 0x9D, \r
-0xBC, 0xF0, 0x22, 0x31, 0x7F, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x12, 0x31, \r
-0xE4, 0x90, 0x00, 0x02, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x12, 0x31, 0xE4, 0x90, 0x00, 0x02, \r
-0xE0, 0x54, 0xFE, 0xF0, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x2C, 0xFF, 0xEF, 0x44, 0x40, 0xFF, 0xEC, \r
-0x90, 0x9E, 0xA4, 0x12, 0x20, 0xC0, 0x90, 0x9E, 0xA4, 0x12, 0x49, 0x18, 0x90, 0xAD, 0xBC, 0x12, \r
-0x20, 0xC0, 0x7F, 0xB4, 0x7E, 0x08, 0x12, 0x2E, 0x45, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, \r
-0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0x22, 0x90, 0x00, 0x10, 0xE0, \r
-0x44, 0x0C, 0xFD, 0x7F, 0x10, 0x12, 0x31, 0xE4, 0x90, 0x00, 0x72, 0xE0, 0x54, 0xF3, 0xFD, 0x7F, \r
-0x72, 0x12, 0x31, 0xE4, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, \r
-0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x7F, 0xB4, 0x7E, \r
-0x08, 0x12, 0x2C, 0xFF, 0xEF, 0x54, 0xBF, 0xFF, 0xEC, 0x90, 0x9E, 0xA0, 0x12, 0x20, 0xC0, 0x90, \r
-0x9E, 0xA0, 0x12, 0x49, 0x18, 0x90, 0xAD, 0xBC, 0x12, 0x20, 0xC0, 0x7F, 0xB4, 0x7E, 0x08, 0x12, \r
-0x2E, 0x45, 0x90, 0x00, 0x02, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x9E, 0xBB, 0xEF, 0xF0, 0x51, \r
-0x3C, 0x90, 0x9E, 0xBB, 0xE0, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x9D, 0xBC, 0x74, \r
-0x04, 0xF0, 0x22, 0x51, 0x3C, 0x90, 0x9D, 0xBC, 0x74, 0x0C, 0xF0, 0x22, 0x8F, 0x25, 0xE4, 0x90, \r
-0x9E, 0xB2, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, \r
-0xEF, 0x65, 0x25, 0x60, 0x3E, 0xC3, 0x90, 0x9E, 0xB3, 0xE0, 0x94, 0x88, 0x90, 0x9E, 0xB2, 0xE0, \r
-0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x9E, 0xB2, 0xE4, \r
-0x75, 0xF0, 0x01, 0x12, 0x48, 0x9F, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x32, 0x58, 0xD3, 0x90, 0x9E, \r
-0xB3, 0xE0, 0x94, 0x32, 0x90, 0x9E, 0xB2, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC6, 0xE0, \r
-0x30, 0xE0, 0xB2, 0x22, 0x71, 0x7C, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, \r
-0x31, 0xE4, 0xE4, 0xFF, 0x80, 0x96, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x71, 0x4F, 0x71, \r
-0x14, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9D, 0xBC, \r
-0xE0, 0x70, 0x07, 0x71, 0x84, 0xBF, 0x01, 0x02, 0x71, 0x26, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, \r
-0x9D, 0xC3, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x31, 0xE4, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, \r
-0x7F, 0x08, 0x12, 0x31, 0xE4, 0x7F, 0x01, 0x51, 0xBC, 0x90, 0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, \r
-0x7F, 0x90, 0x12, 0x31, 0xE4, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x32, 0x58, 0x90, 0x00, 0x90, 0xE0, \r
-0x20, 0xE0, 0xF9, 0x22, 0x90, 0x02, 0x87, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, \r
-0x80, 0x12, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, \r
-0x03, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x7F, 0x00, 0x22, 0xF5, 0x6D, 0x74, \r
-0x94, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE5, 0x6D, 0xF0, 0x75, 0xF0, 0x09, \r
-0xE5, 0x6B, 0x90, 0x94, 0x96, 0x12, 0x49, 0x24, 0xE0, 0xF5, 0x6A, 0xE4, 0xFB, 0xAD, 0x6D, 0xAF, \r
-0x6B, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xF9, 0xEF, \r
-0x54, 0x07, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x01, 0x12, 0x49, 0x24, 0xE0, 0xFC, 0xEB, \r
-0x70, 0x1F, 0x74, 0x81, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xFB, 0x74, 0x01, \r
-0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5B, 0xF0, 0x53, 0x04, 0x7F, 0x80, \r
-0x36, 0x74, 0x81, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xFC, 0x74, 0x01, 0xA8, \r
-0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4C, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, \r
-0x01, 0x12, 0x49, 0x24, 0xE0, 0x54, 0x07, 0xFC, 0xED, 0x90, 0x43, 0x71, 0x93, 0x33, 0x33, 0x33, \r
-0x54, 0xF8, 0x42, 0x04, 0x43, 0x04, 0x80, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0x12, 0x49, \r
-0x24, 0xED, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x01, 0x12, 0x49, 0x24, 0xEC, 0xF0, 0x75, \r
-0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x49, 0x24, 0xE0, 0x54, 0xFC, 0x45, 0x6A, 0xFE, 0x75, \r
-0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x49, 0x24, 0xEE, 0xF0, 0x7D, 0x01, 0x12, 0x76, 0x33, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x6B, 0x90, 0x9E, \r
-0x92, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x94, 0x95, 0x12, 0x49, 0x24, 0xE0, 0x90, \r
-0x9E, 0x9D, 0xF0, 0x12, 0x49, 0x42, 0x6C, 0xD7, 0x00, 0x6C, 0xD7, 0x01, 0x6C, 0xD7, 0x02, 0x6C, \r
-0xD7, 0x03, 0x6C, 0xD7, 0x04, 0x6C, 0xD7, 0x05, 0x6C, 0xD7, 0x06, 0x6C, 0xD7, 0x07, 0x6C, 0xD7, \r
-0x08, 0x6D, 0x39, 0x09, 0x6D, 0x3F, 0x0A, 0x6D, 0x45, 0x0B, 0x6D, 0x4B, 0x0C, 0x6D, 0x51, 0x0D, \r
-0x6D, 0x57, 0x0E, 0x00, 0x00, 0x6D, 0x5F, 0xE4, 0xF5, 0x6C, 0x75, 0xF0, 0x08, 0xE5, 0x6B, 0x90, \r
-0x89, 0x00, 0x12, 0x49, 0x24, 0xE5, 0x82, 0x25, 0x6C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, \r
-0xE0, 0xFF, 0x90, 0x9E, 0x9D, 0xE0, 0x75, 0xF0, 0x07, 0xA4, 0x24, 0x50, 0xF5, 0x82, 0xE4, 0x34, \r
-0x40, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x6C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0x93, \r
-0xFE, 0xEF, 0x5E, 0xFF, 0x90, 0x9E, 0x9F, 0xF0, 0x75, 0xF0, 0x08, 0xE5, 0x6B, 0x90, 0x89, 0x00, \r
-0x12, 0x49, 0x24, 0xE5, 0x82, 0x25, 0x6C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, \r
-0x05, 0x6C, 0xE5, 0x6C, 0xB4, 0x07, 0xA3, 0x80, 0x26, 0xAD, 0x6B, 0x7F, 0x44, 0x80, 0x1C, 0xAD, \r
-0x6B, 0x7F, 0x4C, 0x80, 0x16, 0xAD, 0x6B, 0x7F, 0x8C, 0x80, 0x10, 0xAD, 0x6B, 0x7F, 0x94, 0x80, \r
-0x0A, 0xAD, 0x6B, 0x7F, 0x9C, 0x80, 0x04, 0xAD, 0x6B, 0x7F, 0xA4, 0x7E, 0x04, 0xF1, 0xB4, 0x75, \r
-0xF0, 0x09, 0xE5, 0x6B, 0x90, 0x94, 0x99, 0x12, 0x49, 0x24, 0xE0, 0xFD, 0xE4, 0x90, 0x9E, 0x9B, \r
-0xF0, 0x7C, 0x06, 0x75, 0xF0, 0x08, 0xE5, 0x6B, 0x90, 0x89, 0x00, 0xBC, 0x06, 0x12, 0x12, 0x49, \r
-0x24, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x0E, \r
-0x12, 0x49, 0x24, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0x9E, \r
-0x9E, 0xF0, 0x90, 0x9E, 0x9E, 0xE0, 0x60, 0x64, 0x75, 0x6C, 0x07, 0x74, 0x01, 0x7E, 0x00, 0xA8, \r
-0x6C, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x9E, 0x9E, 0xE0, \r
-0xFB, 0xEF, 0x5B, 0x60, 0x3E, 0xEC, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x6C, 0x90, 0x9E, 0x9B, 0xF0, \r
-0xBD, 0x01, 0x0C, 0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x06, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x39, 0xBD, \r
-0x02, 0x0F, 0x90, 0x9E, 0x9B, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x06, 0xE0, 0x24, 0x18, 0xF0, 0x80, \r
-0x27, 0xBD, 0x03, 0x24, 0x90, 0x9E, 0x9B, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x1B, 0xE0, 0x24, 0x22, \r
-0xF0, 0x80, 0x15, 0x15, 0x6C, 0xE5, 0x6C, 0xC3, 0x94, 0x00, 0x50, 0x9F, 0xEC, 0x60, 0x09, 0x1C, \r
-0xEC, 0xC3, 0x94, 0x00, 0x40, 0x02, 0xA1, 0x73, 0xE4, 0x90, 0x9E, 0x9C, 0xF0, 0xFC, 0x75, 0xF0, \r
-0x08, 0xE5, 0x6B, 0x90, 0x89, 0x00, 0xBC, 0x06, 0x12, 0x12, 0x49, 0x24, 0xE5, 0x82, 0x2C, 0xF5, \r
-0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x0E, 0x12, 0x49, 0x24, 0xE5, 0x82, \r
-0x2C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0x9E, 0x9E, 0xF0, 0x90, 0x9E, 0x9E, \r
-0xE0, 0x60, 0x63, 0xE4, 0xF5, 0x6C, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x6C, 0x08, 0x80, 0x05, 0xC3, \r
-0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x9E, 0x9E, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x3E, \r
-0xEC, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x6C, 0x90, 0x9E, 0x9C, 0xF0, 0xBD, 0x01, 0x0C, 0xE0, 0xD3, \r
-0x94, 0x0B, 0x40, 0x06, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x34, 0xBD, 0x02, 0x0F, 0x90, 0x9E, 0x9C, \r
-0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x06, 0xE0, 0x24, 0x18, 0xF0, 0x80, 0x22, 0xBD, 0x03, 0x1F, 0x90, \r
-0x9E, 0x9C, 0xE0, 0xD3, 0x94, 0x1B, 0x40, 0x16, 0xE0, 0x24, 0x22, 0xF0, 0x80, 0x10, 0x05, 0x6C, \r
-0xE5, 0x6C, 0x64, 0x08, 0x70, 0xA0, 0x0C, 0xEC, 0x64, 0x07, 0x60, 0x02, 0xC1, 0x1E, 0x90, 0x9E, \r
-0x9B, 0xE0, 0xFF, 0x75, 0xF0, 0x09, 0xE5, 0x6B, 0x90, 0x94, 0x93, 0x12, 0x49, 0x24, 0xEF, 0xF0, \r
-0x90, 0x9E, 0x9C, 0xE0, 0xFE, 0x75, 0xF0, 0x09, 0xE5, 0x6B, 0x90, 0x94, 0x94, 0x12, 0x49, 0x24, \r
-0xEE, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x6B, 0x90, 0x81, 0x00, 0x12, 0x49, 0x24, 0xE0, 0xFE, 0x54, \r
-0x7F, 0xF5, 0x6D, 0xEE, 0x54, 0x80, 0xF5, 0x6E, 0xE5, 0x6D, 0xD3, 0x9F, 0x40, 0x08, 0x90, 0x9E, \r
-0x9B, 0xE0, 0x45, 0x6E, 0x71, 0xAD, 0x90, 0x9E, 0x9C, 0xE0, 0xFF, 0xE5, 0x6D, 0xC3, 0x9F, 0x50, \r
-0x05, 0xE5, 0x6E, 0x4F, 0x71, 0xAD, 0x75, 0xF0, 0x10, 0xE5, 0x6B, 0x90, 0x81, 0x03, 0x12, 0x49, \r
-0x24, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, 0x53, 0x90, 0x01, 0xC4, 0x74, 0x28, 0xF0, \r
-0x74, 0x6F, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x53, 0x90, 0x81, 0x05, 0x12, 0x49, 0x24, 0xE0, \r
-0x54, 0x03, 0xFD, 0x75, 0xF0, 0x09, 0xE5, 0x53, 0x90, 0x94, 0x93, 0x12, 0x49, 0x24, 0xE0, 0xFF, \r
-0x74, 0x14, 0x25, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0xF5, 0x54, \r
-0xD3, 0x9F, 0x40, 0x02, 0x8F, 0x54, 0xE5, 0x54, 0x25, 0xE0, 0x24, 0xBD, 0xF5, 0x82, 0xE4, 0x34, \r
-0x42, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE5, 0x54, 0x25, 0xE0, 0x24, 0x15, \r
-0xF5, 0x82, 0xE4, 0x34, 0x42, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, \r
-0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x93, \r
-0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x8D, 0x6A, 0xE4, 0xFB, 0xAD, 0x54, 0xAF, 0x53, 0x71, \r
-0xD1, 0xAF, 0x54, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8E, 0x5D, 0x8F, 0x5E, 0x7F, \r
-0x08, 0x78, 0x5F, 0xE4, 0xF6, 0x08, 0xDF, 0xFC, 0x75, 0xF0, 0x09, 0xED, 0x90, 0x94, 0x99, 0x12, \r
-0x49, 0x24, 0xE0, 0x90, 0x9E, 0xB6, 0xF0, 0x64, 0x01, 0x70, 0x43, 0x75, 0xF0, 0x08, 0xED, 0x90, \r
-0x89, 0x00, 0x12, 0x49, 0x24, 0xE0, 0xF5, 0x5F, 0x75, 0xF0, 0x08, 0xED, 0x90, 0x89, 0x01, 0x12, \r
-0x49, 0x24, 0xE0, 0xFE, 0x54, 0x0F, 0xF5, 0x60, 0xE4, 0xF5, 0x61, 0xF5, 0x62, 0xF5, 0x63, 0xEE, \r
-0x54, 0xF0, 0xF5, 0x64, 0x75, 0xF0, 0x08, 0xED, 0x90, 0x89, 0x02, 0x12, 0x49, 0x24, 0xE0, 0xF5, \r
-0x65, 0x75, 0xF0, 0x08, 0xED, 0x90, 0x89, 0x03, 0x12, 0x49, 0x24, 0xE0, 0xF5, 0x66, 0x90, 0x9E, \r
-0xB6, 0xE0, 0xFE, 0xC3, 0x94, 0x02, 0x40, 0x4A, 0x75, 0xF0, 0x08, 0xED, 0x90, 0x89, 0x00, 0x12, \r
-0x49, 0x24, 0xE0, 0xF5, 0x5F, 0x75, 0xF0, 0x08, 0xED, 0x90, 0x89, 0x01, 0x12, 0x49, 0x24, 0xE0, \r
-0xF5, 0x60, 0x75, 0xF0, 0x08, 0xED, 0x90, 0x89, 0x02, 0x12, 0x49, 0x24, 0xE0, 0xF5, 0x61, 0x75, \r
-0xF0, 0x08, 0xED, 0x90, 0x89, 0x03, 0x12, 0x49, 0x24, 0xE0, 0xFC, 0x54, 0x0F, 0xF5, 0x62, 0xEC, \r
-0x54, 0xF0, 0xF9, 0xEE, 0xB4, 0x03, 0x09, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0xF5, 0x66, 0x80, 0x02, \r
-0x89, 0x65, 0xE4, 0xFF, 0x74, 0x5F, 0x2F, 0xF8, 0xE6, 0xFE, 0xEF, 0x7A, 0x00, 0x25, 0x5E, 0xFB, \r
-0xEA, 0x35, 0x5D, 0x8B, 0x82, 0xF5, 0x83, 0xE0, 0x5E, 0xF6, 0x0F, 0xBF, 0x08, 0xE6, 0xE5, 0x64, \r
-0xC4, 0x54, 0x0F, 0x70, 0x08, 0xE5, 0x65, 0x70, 0x04, 0xE5, 0x66, 0x60, 0x24, 0x90, 0x9E, 0xB6, \r
-0xE0, 0xB4, 0x01, 0x1D, 0xE5, 0x60, 0x54, 0x0F, 0xF9, 0xE5, 0x64, 0x54, 0xF0, 0x42, 0x01, 0x89, \r
-0x60, 0x85, 0x65, 0x61, 0x85, 0x66, 0x62, 0xE4, 0xF5, 0x63, 0xF5, 0x64, 0xF5, 0x65, 0x75, 0x66, \r
-0x80, 0x90, 0x9E, 0xB6, 0xE0, 0xFE, 0xC3, 0x94, 0x02, 0x40, 0x15, 0xEE, 0xB4, 0x02, 0x06, 0xE5, \r
-0x65, 0x42, 0x62, 0x80, 0x08, 0xE5, 0x66, 0x13, 0x13, 0x54, 0x3F, 0x42, 0x62, 0x75, 0x66, 0x80, \r
-0xE4, 0xFF, 0x74, 0x5F, 0x2F, 0xF8, 0xE6, 0xFE, 0x75, 0xF0, 0x08, 0xED, 0x90, 0x89, 0x00, 0x12, \r
-0x49, 0x24, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xBF, \r
-0x08, 0xE0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, 0x5B, 0x90, 0x01, 0xC4, 0x74, 0x07, 0xF0, 0x74, \r
-0x71, 0xA3, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x5B, 0x90, 0x81, 0x00, 0x12, 0x49, 0x24, 0xE0, 0xF5, \r
-0x5C, 0x54, 0x7F, 0xFD, 0x75, 0xF0, 0x09, 0xE5, 0x5B, 0x90, 0x94, 0x93, 0x12, 0x49, 0x24, 0xE0, \r
-0xFF, 0x90, 0x9D, 0xFF, 0xF0, 0x75, 0xF0, 0x09, 0xE5, 0x5B, 0x90, 0x94, 0x99, 0x12, 0x49, 0x24, \r
-0xE0, 0x90, 0x9E, 0x00, 0xF0, 0xED, 0x25, 0xE0, 0x24, 0x15, 0xF5, 0x82, 0xE4, 0x34, 0x42, 0xF5, \r
-0x83, 0xE4, 0x93, 0xFA, 0x74, 0x01, 0x93, 0xFB, 0xE5, 0x5B, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, \r
-0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0x75, 0xF0, 0x09, 0xE5, 0x5B, 0x90, \r
-0x94, 0x96, 0x12, 0x49, 0x24, 0xE0, 0xF9, 0xED, 0xC3, 0x9F, 0x40, 0x02, 0x41, 0x9C, 0x74, 0x14, \r
-0x25, 0x5B, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xED, 0xF0, 0x90, 0x9E, 0x00, 0xE0, 0xFF, \r
-0xB4, 0x01, 0x0C, 0xED, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0x74, 0xE0, 0x2D, 0xFD, 0x80, 0x1E, 0xEF, \r
-0xB4, 0x02, 0x0C, 0xED, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0x74, 0xE8, 0x2D, 0xFD, 0x80, 0x0E, 0xEF, \r
-0xB4, 0x03, 0x0A, 0xED, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0x74, 0xDE, 0x2D, 0xFD, 0xEF, 0xB4, 0x01, \r
-0x0F, 0x90, 0x9D, 0xFF, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x2A, \r
-0x90, 0x9E, 0x00, 0xE0, 0xB4, 0x02, 0x0F, 0x90, 0x9D, 0xFF, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, \r
-0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x14, 0x90, 0x9E, 0x00, 0xE0, 0xB4, 0x03, 0x0D, 0x90, 0x9D, 0xFF, \r
-0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, 0xDE, 0xF0, 0xED, 0x04, 0xFC, 0x90, 0x9D, 0xFF, \r
-0xE0, 0xFF, 0xEC, 0xD3, 0x9F, 0x50, 0x46, 0xEC, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, \r
-0x08, 0xE5, 0x5B, 0x90, 0x89, 0x00, 0x12, 0x49, 0x24, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, \r
-0x83, 0xF5, 0x83, 0xE0, 0xFB, 0x7A, 0x00, 0xEC, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, \r
-0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5A, 0xFE, 0xEF, \r
-0x5B, 0x4E, 0x60, 0x06, 0xAD, 0x04, 0x8D, 0x5C, 0x80, 0x03, 0x0C, 0x80, 0xB0, 0x90, 0x9E, 0x00, \r
-0xE0, 0xFF, 0xB4, 0x01, 0x19, 0xE5, 0x5C, 0xD3, 0x94, 0x0B, 0x40, 0x12, 0xE5, 0x5C, 0x94, 0x34, \r
-0x50, 0x0C, 0x74, 0x20, 0x25, 0x5C, 0xF5, 0x5C, 0x74, 0x20, 0x2D, 0xFD, 0x80, 0x61, 0xEF, 0xB4, \r
-0x02, 0x13, 0xE5, 0x5C, 0xD3, 0x94, 0x1B, 0x40, 0x0C, 0x74, 0x18, 0x25, 0x5C, 0xF5, 0x5C, 0x74, \r
-0x18, 0x2D, 0xFD, 0x80, 0x4A, 0xEF, 0xB4, 0x03, 0x11, 0xE5, 0x5C, 0xD3, 0x94, 0x1B, 0x40, 0x3F, \r
-0x74, 0x22, 0x25, 0x5C, 0xF5, 0x5C, 0x74, 0x22, 0x2D, 0xFD, 0x80, 0x33, 0x90, 0x9D, 0xFF, 0xE0, \r
-0xFC, 0x6D, 0x70, 0x6C, 0x74, 0x14, 0x25, 0x5B, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xED, \r
-0xF0, 0x75, 0xF0, 0x09, 0xE5, 0x5B, 0x90, 0x94, 0x97, 0x12, 0x49, 0x24, 0xE0, 0xB4, 0x01, 0x0C, \r
-0xE5, 0x5C, 0x20, 0xE7, 0x07, 0xED, 0x44, 0x80, 0xF5, 0x5C, 0x80, 0x03, 0xAF, 0x5C, 0x22, 0xED, \r
-0x25, 0xE0, 0x24, 0xBD, 0xF5, 0x82, 0xE4, 0x34, 0x42, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, \r
-0x93, 0xFF, 0xED, 0x25, 0xE0, 0x24, 0x15, 0xF5, 0x82, 0xE4, 0x34, 0x42, 0xF5, 0x83, 0x74, 0x01, \r
-0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x3E, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xE5, 0x5B, 0x25, 0xE0, \r
-0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x5D, \r
-0xED, 0xD3, 0x9C, 0x40, 0x58, 0x90, 0x9D, 0xFF, 0xE0, 0xFF, 0x74, 0x14, 0x25, 0x5B, 0xF5, 0x82, \r
-0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xEF, 0xF0, 0xAD, 0x07, 0x8F, 0x5C, 0xED, 0x25, 0xE0, 0x24, 0xBD, \r
-0xF5, 0x82, 0xE4, 0x34, 0x42, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xED, 0x25, \r
-0xE0, 0x24, 0x15, 0xF5, 0x82, 0xE4, 0x34, 0x42, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, \r
-0x93, 0x3E, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xE5, 0x5B, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, \r
-0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0x5C, 0x22, 0x89, 0x6A, 0x7B, \r
-0x01, 0xAD, 0x5C, 0xAF, 0x5B, 0x12, 0x6B, 0xD1, 0xAF, 0x5C, 0x22, 0x90, 0x01, 0xC4, 0x74, 0x7B, \r
-0xF0, 0x74, 0x73, 0xA3, 0xF0, 0xE4, 0xF5, 0x52, 0x90, 0x9D, 0x36, 0xE0, 0x70, 0x02, 0xC1, 0x27, \r
-0x75, 0xF0, 0x09, 0xE5, 0x52, 0x90, 0x94, 0x98, 0x12, 0x49, 0x24, 0xE0, 0x64, 0x01, 0x60, 0x02, \r
-0xC1, 0x27, 0xE5, 0x52, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, \r
-0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0x02, 0xC1, 0x27, 0xE5, 0x52, 0x75, \r
-0xF0, 0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0x75, 0x56, 0x01, 0xF5, 0x57, 0x89, \r
-0x58, 0xE5, 0x52, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFF, \r
-0xA3, 0xE0, 0x90, 0x9D, 0xF9, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x93, 0x25, 0x52, 0xF5, 0x82, \r
-0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9D, 0xFB, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, \r
-0xF0, 0x10, 0xE5, 0x52, 0x90, 0x81, 0x00, 0x12, 0x49, 0x24, 0xE0, 0x54, 0x7F, 0x90, 0x9D, 0xF7, \r
-0xF0, 0x54, 0x7F, 0xA3, 0xF0, 0x75, 0xF0, 0x09, 0xE5, 0x52, 0x90, 0x94, 0x93, 0x12, 0x49, 0x24, \r
-0xE0, 0x90, 0x9D, 0xFE, 0xF0, 0x74, 0x14, 0x25, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, \r
-0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0xC1, 0x21, 0x90, 0x9D, 0xFE, 0xE0, 0xFF, 0x90, 0x9D, 0xF8, \r
-0xE0, 0x9F, 0x40, 0x13, 0x90, 0x9D, 0xFE, 0xE0, 0x90, 0x9D, 0xF8, 0xF0, 0x90, 0x9D, 0xF7, 0xE0, \r
-0x54, 0x80, 0xFE, 0xF0, 0xEF, 0x4E, 0xF0, 0x90, 0x9D, 0xF8, 0xE0, 0xFF, 0x90, 0x41, 0xC1, 0x93, \r
-0xFE, 0x74, 0x13, 0x25, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0xC3, 0x9E, 0x40, \r
-0x06, 0xEF, 0x90, 0x41, 0x19, 0x80, 0x07, 0x90, 0x9D, 0xF8, 0xE0, 0x90, 0x41, 0x6D, 0x93, 0x90, \r
-0x9D, 0xFD, 0xF0, 0x90, 0x9D, 0xFD, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x8F, 0xF9, 0x74, 0x40, \r
-0x35, 0xF0, 0x75, 0x53, 0xFF, 0xF5, 0x54, 0x89, 0x55, 0x90, 0x9D, 0xF7, 0xE0, 0x90, 0x43, 0xC5, \r
-0x93, 0xFF, 0xD3, 0x90, 0x9D, 0xFC, 0xE0, 0x9F, 0x90, 0x9D, 0xFB, 0xE0, 0x94, 0x00, 0x40, 0x02, \r
-0xC1, 0x1B, 0xE5, 0x52, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, \r
-0xF5, 0x59, 0xA3, 0xE0, 0xF5, 0x5A, 0xAB, 0x53, 0xAA, 0x54, 0xA9, 0x55, 0x12, 0x1F, 0x96, 0xFF, \r
-0x7E, 0x00, 0xAB, 0x56, 0xAA, 0x57, 0xA9, 0x58, 0x12, 0x48, 0xB5, 0xFD, 0xAC, 0xF0, 0x12, 0x20, \r
-0x10, 0xEF, 0x25, 0x5A, 0xF5, 0x5A, 0xEE, 0x35, 0x59, 0xF5, 0x59, 0xAB, 0x53, 0xAA, 0x54, 0xA9, \r
-0x55, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xAF, 0xFF, 0x7E, 0x00, 0xAB, 0x56, 0xAA, 0x57, 0xA9, 0x58, \r
-0x90, 0x00, 0x02, 0x12, 0x48, 0xE0, 0xFD, 0xAC, 0xF0, 0x12, 0x20, 0x10, 0xEF, 0x25, 0x5A, 0xF5, \r
-0x5A, 0xEE, 0x35, 0x59, 0xF5, 0x59, 0xAB, 0x53, 0xAA, 0x54, 0xA9, 0x55, 0x90, 0x00, 0x02, 0x12, \r
-0x1F, 0xAF, 0xFF, 0x7E, 0x00, 0xAB, 0x56, 0xAA, 0x57, 0xA9, 0x58, 0x90, 0x00, 0x04, 0x12, 0x48, \r
-0xE0, 0xFD, 0xAC, 0xF0, 0x12, 0x20, 0x10, 0xEF, 0x25, 0x5A, 0xF5, 0x5A, 0xEE, 0x35, 0x59, 0xF5, \r
-0x59, 0xAB, 0x53, 0xAA, 0x54, 0xA9, 0x55, 0x90, 0x00, 0x03, 0x12, 0x1F, 0xAF, 0xFF, 0x7E, 0x00, \r
-0xAB, 0x56, 0xAA, 0x57, 0xA9, 0x58, 0x90, 0x00, 0x06, 0x12, 0x48, 0xE0, 0xFD, 0xAC, 0xF0, 0x12, \r
-0x20, 0x10, 0xEF, 0x25, 0x5A, 0xF5, 0x5A, 0xEE, 0x35, 0x59, 0xF5, 0x59, 0xAB, 0x53, 0xAA, 0x54, \r
-0xA9, 0x55, 0x90, 0x00, 0x04, 0x12, 0x1F, 0xAF, 0xFF, 0x7E, 0x00, 0xAB, 0x56, 0xAA, 0x57, 0xA9, \r
-0x58, 0x90, 0x00, 0x08, 0x12, 0x48, 0xE0, 0xFD, 0xAC, 0xF0, 0x12, 0x20, 0x10, 0xEF, 0x25, 0x5A, \r
-0xF5, 0x5A, 0xEE, 0x35, 0x59, 0xF5, 0x59, 0xAB, 0x53, 0xAA, 0x54, 0xA9, 0x55, 0x90, 0x00, 0x05, \r
-0x12, 0x1F, 0xAF, 0xFF, 0x7E, 0x00, 0x90, 0x9D, 0xF9, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x20, \r
-0x10, 0xD3, 0xE5, 0x5A, 0x9F, 0xE5, 0x59, 0x9E, 0x40, 0x0C, 0xE5, 0x5A, 0x9F, 0xF5, 0x5A, 0xE5, \r
-0x59, 0x9E, 0xF5, 0x59, 0x80, 0x05, 0xE4, 0xF5, 0x59, 0xF5, 0x5A, 0xE5, 0x52, 0x25, 0xE0, 0x24, \r
-0x91, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE5, 0x59, 0xF0, 0xA3, 0xE5, 0x5A, 0xF0, 0x90, \r
-0x9D, 0xF7, 0xE0, 0x25, 0xE0, 0x24, 0x15, 0xF5, 0x82, 0xE4, 0x34, 0x42, 0xF5, 0x83, 0xC3, 0x74, \r
-0x01, 0x93, 0x95, 0x5A, 0xE4, 0x93, 0x95, 0x59, 0x50, 0x06, 0xAF, 0x52, 0x31, 0x07, 0x80, 0x21, \r
-0x90, 0x9D, 0xF7, 0xE0, 0x25, 0xE0, 0x24, 0xBD, 0xF5, 0x82, 0xE4, 0x34, 0x42, 0xF5, 0x83, 0xD3, \r
-0x74, 0x01, 0x93, 0x95, 0x5A, 0xE4, 0x93, 0x95, 0x59, 0x40, 0x06, 0x7D, 0x01, 0xAF, 0x52, 0xD1, \r
-0xC5, 0xE4, 0xFD, 0xAF, 0x52, 0xD1, 0x33, 0x05, 0x52, 0xE5, 0x52, 0xC3, 0x94, 0x80, 0x50, 0x02, \r
-0x61, 0x88, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xED, 0x60, 0x62, 0x75, 0xF0, 0x0A, \r
-0xEF, 0x90, 0x8D, 0x01, 0x12, 0x49, 0x24, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, \r
-0x8D, 0x03, 0x12, 0x49, 0x24, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x05, \r
-0x12, 0x49, 0x24, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x07, 0x12, 0x49, \r
-0x24, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x09, 0x12, 0x49, 0x24, 0xE4, \r
-0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, \r
-0xF0, 0xA3, 0xF0, 0x74, 0x93, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE4, 0xF0, 0x75, \r
-0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x49, 0x24, 0xE0, 0x54, 0xBF, 0x90, 0x9E, 0xB7, 0xF0, \r
-0x44, 0x80, 0xFE, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x49, 0x24, 0xEE, 0xF0, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, 0x5B, 0x90, 0x01, 0xC4, 0x74, 0xC5, 0xF0, 0x74, 0x76, 0xA3, \r
-0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x5B, 0x90, 0x81, 0x00, 0x12, 0x49, 0x24, 0xE0, 0xF5, 0x5C, 0x54, \r
-0x7F, 0xFF, 0x90, 0x9E, 0x01, 0xF0, 0x75, 0xF0, 0x09, 0xE5, 0x5B, 0x90, 0x94, 0x94, 0x12, 0x49, \r
-0x24, 0xE0, 0x90, 0x9E, 0x03, 0xF0, 0x75, 0xF0, 0x09, 0xE5, 0x5B, 0x90, 0x94, 0x93, 0x12, 0x49, \r
-0x24, 0xE0, 0xFE, 0x90, 0x9E, 0x04, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x5B, 0x90, 0x81, 0x05, 0x12, \r
-0x49, 0x24, 0xE0, 0x54, 0x03, 0xFC, 0x75, 0xF0, 0x09, 0xE5, 0x5B, 0x90, 0x94, 0x99, 0x12, 0x49, \r
-0x24, 0xE0, 0xFB, 0xEF, 0xD3, 0x9E, 0x40, 0x0A, 0x90, 0x9E, 0x04, 0xE0, 0x90, 0x9E, 0x01, 0xF0, \r
-0xF5, 0x5C, 0xED, 0x70, 0x03, 0x02, 0x78, 0xC8, 0x90, 0x9E, 0x02, 0xED, 0xF0, 0xE5, 0x5C, 0x30, \r
-0xE7, 0x0A, 0x90, 0x9E, 0x01, 0xE0, 0xF5, 0x5C, 0xA3, 0xE0, 0x14, 0xF0, 0x90, 0x9E, 0x02, 0xE0, \r
-0x70, 0x03, 0x02, 0x78, 0xC8, 0x90, 0x9E, 0x01, 0xE0, 0xFF, 0xB4, 0x2C, 0x08, 0xEC, 0x60, 0x05, \r
-0x1C, 0xA3, 0xE0, 0x14, 0xF0, 0x90, 0x9E, 0x02, 0xE0, 0x70, 0x03, 0x02, 0x78, 0xC8, 0x90, 0x9E, \r
-0x03, 0xE0, 0xFE, 0xEF, 0xD3, 0x9E, 0x50, 0x03, 0x02, 0x78, 0xC2, 0xE4, 0x90, 0x9E, 0x00, 0xF0, \r
-0xBB, 0x01, 0x0F, 0xA3, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x08, 0xE0, 0x24, 0xE0, 0xF0, 0x74, 0xE0, \r
-0x80, 0x26, 0xBB, 0x02, 0x11, 0x90, 0x9E, 0x01, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x08, 0xE0, 0x24, \r
-0xE8, 0xF0, 0x74, 0xE8, 0x80, 0x12, 0xBB, 0x03, 0x13, 0x90, 0x9E, 0x01, 0xE0, 0xC3, 0x94, 0x2C, \r
-0x40, 0x0A, 0xE0, 0x24, 0xDE, 0xF0, 0x74, 0xDE, 0x25, 0x5C, 0xF5, 0x5C, 0xBB, 0x01, 0x0F, 0xEE, \r
-0xC3, 0x94, 0x2C, 0x40, 0x09, 0x90, 0x9E, 0x03, 0xE0, 0x24, 0xE0, 0xF0, 0x80, 0x22, 0xBB, 0x02, \r
-0x0F, 0x90, 0x9E, 0x03, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x06, 0xE0, 0x24, 0xE8, 0xF0, 0x80, 0x10, \r
-0xBB, 0x03, 0x0D, 0x90, 0x9E, 0x03, 0xE0, 0xC3, 0x94, 0x2C, 0x40, 0x04, 0xE0, 0x24, 0xDE, 0xF0, \r
-0x90, 0x9E, 0x01, 0xE0, 0x14, 0x90, 0x9D, 0xFF, 0xF0, 0x90, 0x9E, 0x03, 0xE0, 0xFF, 0x90, 0x9D, \r
-0xFF, 0xE0, 0xF9, 0xC3, 0x9F, 0x40, 0x6A, 0xE9, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, \r
-0x08, 0xE5, 0x5B, 0x90, 0x89, 0x00, 0x12, 0x49, 0x24, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, \r
-0x83, 0xF5, 0x83, 0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xE9, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, \r
-0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x55, \r
-0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x29, 0x90, 0x9D, 0xFF, 0xE0, 0xF5, 0x5C, 0xA3, 0xE0, \r
-0x04, 0xF0, 0x90, 0x9E, 0x02, 0xE0, 0xFF, 0x90, 0x9E, 0x00, 0xE0, 0x6F, 0x60, 0x13, 0x90, 0x9E, \r
-0x03, 0xE0, 0xFF, 0xE5, 0x5C, 0xD3, 0x9F, 0x40, 0x08, 0x90, 0x9D, 0xFF, 0xE0, 0x14, 0xF0, 0x80, \r
-0x88, 0xBB, 0x01, 0x1C, 0xE5, 0x5C, 0xD3, 0x94, 0x0B, 0x40, 0x15, 0xE5, 0x5C, 0x94, 0x34, 0x50, \r
-0x0F, 0x74, 0x20, 0x25, 0x5C, 0xF5, 0x5C, 0x90, 0x9E, 0x01, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x38, \r
-0xBB, 0x02, 0x16, 0xE5, 0x5C, 0xD3, 0x94, 0x1B, 0x40, 0x0F, 0x74, 0x18, 0x25, 0x5C, 0xF5, 0x5C, \r
-0x90, 0x9E, 0x01, 0xE0, 0x24, 0x18, 0xF0, 0x80, 0x1F, 0xBB, 0x03, 0x1C, 0xE5, 0x5C, 0xD3, 0x94, \r
-0x1B, 0x40, 0x15, 0x74, 0x22, 0x25, 0x5C, 0xF5, 0x5C, 0x90, 0x9E, 0x01, 0xE0, 0x24, 0x22, 0xF0, \r
-0x80, 0x06, 0x90, 0x9E, 0x03, 0xE0, 0xF5, 0x5C, 0xE5, 0x5C, 0x25, 0xE0, 0x24, 0xBD, 0xF5, 0x82, \r
-0xE4, 0x34, 0x42, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE5, 0x5C, 0x25, 0xE0, \r
-0x24, 0x15, 0xF5, 0x82, 0xE4, 0x34, 0x42, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, \r
-0x3E, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xE5, 0x5B, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, \r
-0x34, 0x93, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x8C, 0x6A, 0xE4, 0xFB, 0xAD, 0x5C, 0xAF, \r
-0x5B, 0x12, 0x6B, 0xD1, 0xAF, 0x5C, 0x22, 0x12, 0x1F, 0x96, 0x54, 0x3F, 0xFF, 0x90, 0x00, 0x01, \r
-0x12, 0x1F, 0xAF, 0xFE, 0x54, 0x1F, 0xFD, 0xEE, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, \r
-0x90, 0x9D, 0xE7, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xAF, 0xFE, 0x54, 0x03, 0x90, 0x9D, 0xE8, \r
-0xF0, 0xEE, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0x90, 0x9D, 0xEA, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, \r
-0xAF, 0xFE, 0x54, 0x40, 0xFC, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x9D, 0xE9, 0xF0, 0xEE, 0x54, \r
-0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFE, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x94, 0x95, 0x12, \r
-0x49, 0x24, 0xED, 0xF0, 0x90, 0x9D, 0xE8, 0xE0, 0xFD, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x94, 0x96, \r
-0x12, 0x49, 0x24, 0xED, 0xF0, 0x90, 0x9D, 0xE7, 0xE0, 0xFD, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x94, \r
-0x97, 0x12, 0x49, 0x24, 0xED, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x94, 0x98, 0x12, 0x49, 0x24, \r
-0x74, 0x01, 0xF0, 0x90, 0x9D, 0xEA, 0xE0, 0xFD, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x94, 0x99, 0x12, \r
-0x49, 0x24, 0xED, 0xF0, 0x90, 0x9D, 0xE9, 0xE0, 0xFD, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x94, 0x9A, \r
-0x12, 0x49, 0x24, 0xED, 0xF0, 0x75, 0xF0, 0x09, 0xEF, 0x90, 0x94, 0x9B, 0x12, 0x49, 0x24, 0xEE, \r
-0xF0, 0xE4, 0xFE, 0xEE, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xA3, 0xA3, 0xA3, 0x12, 0x1F, 0xAF, 0xFD, \r
-0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89, 0x00, 0x12, 0x49, 0x24, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, \r
-0x35, 0x83, 0xF5, 0x83, 0xED, 0xF0, 0x0E, 0xEE, 0xB4, 0x04, 0xD8, 0x02, 0x6C, 0x85, 0x12, 0x1F, \r
-0x96, 0xF5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x15, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xAF, 0xFF, 0x74, \r
-0x13, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xE5, 0x51, 0xB4, \r
-0x80, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xAF, 0x90, 0x94, 0x91, 0xF0, 0x22, 0x74, 0x1D, 0x2F, \r
-0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, \r
-0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE5, 0x30, 0x90, 0x00, 0x8E, 0xE0, \r
-0x64, 0x05, 0x70, 0x28, 0xA3, 0xE0, 0x90, 0x9D, 0xD6, 0xF0, 0x90, 0x00, 0x8E, 0xE0, 0xFF, 0x90, \r
-0x9D, 0xD6, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x00, \r
-0x8F, 0xE0, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8E, 0x12, 0x31, 0xE4, 0x22, 0x12, 0x1F, 0x96, \r
-0xFF, 0x54, 0x01, 0xFE, 0x90, 0x9D, 0xCB, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, \r
-0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xAF, 0x90, 0x9D, 0xCC, 0xF0, 0x22, 0x12, 0x1F, 0x96, \r
-0xFF, 0x54, 0x01, 0xFE, 0x90, 0x9D, 0xCE, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, \r
-0xE0, 0x14, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xAF, 0x90, 0x9D, 0xCF, 0xF0, 0x90, 0x00, 0x02, 0x12, \r
-0x1F, 0xAF, 0x90, 0x9D, 0xD0, 0xF0, 0x22, 0x90, 0x9D, 0xB7, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, \r
-0x9D, 0xC2, 0xF0, 0x90, 0x9D, 0xBD, 0xF0, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0C, 0x04, 0x70, 0x28, \r
-0x90, 0x9D, 0xBF, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, 0x9D, 0xC9, 0xE0, \r
-0x90, 0x9D, 0xBF, 0xF0, 0x80, 0x05, 0x90, 0x9D, 0xBF, 0xED, 0xF0, 0x90, 0x9D, 0xBF, 0xE0, 0xA3, \r
-0xF0, 0x90, 0x9D, 0xB8, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, \r
-0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x9D, 0xBC, 0x74, 0x0C, 0xF0, 0x22, 0x90, 0x9D, 0xB8, 0xE0, \r
-0xC3, 0x13, 0x20, 0xE0, 0x08, 0x90, 0x9D, 0xBC, 0x74, 0x0C, 0xF0, 0x80, 0x11, 0x90, 0x06, 0x04, \r
-0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x9D, 0xBC, 0x74, 0x04, 0xF0, 0x90, 0x05, \r
-0x22, 0xE4, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, \r
-0xF0, 0x90, 0x9D, 0xBC, 0x74, 0x06, 0xF0, 0x22, 0x47, 0xF8, \r
+0x83, 0xE0, 0x38, 0xF0, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC, 0x48, \r
+0xFC, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xA4, 0x25, \r
+0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, \r
+0xE0, 0xF9, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, \r
+0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, \r
+0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, \r
+0x80, 0xDF, 0xEF, 0x4E, 0x60, 0x12, 0xEF, 0x60, 0x01, 0x0E, 0xED, 0xBB, 0x01, 0x0B, 0x89, 0x82, \r
+0x8A, 0x83, 0xF0, 0xA3, 0xDF, 0xFC, 0xDE, 0xFA, 0x22, 0x89, 0xF0, 0x50, 0x07, 0xF7, 0x09, 0xDF, \r
+0xFC, 0xA9, 0xF0, 0x22, 0xBB, 0xFE, 0xFC, 0xF3, 0x09, 0xDF, 0xFC, 0xA9, 0xF0, 0x22, 0x02, 0x45, \r
+0x7C, 0x02, 0x41, 0xDD, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, \r
+0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, \r
+0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, \r
+0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x45, 0xC1, 0xE4, \r
+0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, \r
+0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, \r
+0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, \r
+0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, \r
+0xBE, 0x41, 0x82, 0x67, 0x00, 0x41, 0x82, 0x68, 0x00, 0x41, 0x82, 0x6F, 0x00, 0x41, 0x82, 0x70, \r
+0x00, 0x41, 0x82, 0x7B, 0x00, 0x44, 0x82, 0x43, 0x41, 0x4E, 0x59, 0x00, 0x44, 0x82, 0x3F, 0x61, \r
+0x6E, 0x79, 0x00, 0x41, 0x82, 0x7C, 0x00, 0x00, 0x60, 0x40, 0x61, 0x40, 0x5A, 0x14, 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, 0xEE, \r
+0xF0, 0x74, 0x45, 0xA3, 0xF0, 0xD1, 0x5F, 0xE5, 0x3C, 0x30, 0xE7, 0x02, 0xD1, 0x44, 0x74, 0xEE, \r
+0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x45, 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, 0x32, 0x06, 0x90, 0x00, 0xF2, 0xE0, 0x20, \r
+0xE6, 0x0C, 0x90, 0x00, 0x05, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x05, 0x12, 0x32, 0x1E, 0x22, 0x90, \r
+0x00, 0x54, 0xE0, 0x55, 0x35, 0xF5, 0x39, 0xA3, 0xE0, 0x55, 0x36, 0xF5, 0x3A, 0xA3, 0xE0, 0x55, \r
+0x37, 0xF5, 0x3B, 0xA3, 0xE0, 0x55, 0x38, 0xF5, 0x3C, 0xAD, 0x39, 0x7F, 0x54, 0x12, 0x32, 0x1E, \r
+0xAD, 0x3A, 0x7F, 0x55, 0x12, 0x32, 0x1E, 0xAD, 0x3B, 0x7F, 0x56, 0x12, 0x32, 0x1E, 0xAD, 0x3C, \r
+0x7F, 0x57, 0x12, 0x32, 0x1E, 0x53, 0x91, 0xEF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, \r
+0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, \r
+0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x99, 0xF0, 0x74, 0x46, 0xA3, 0xF0, \r
+0x12, 0x69, 0x77, 0xE5, 0x41, 0x30, 0xE3, 0x02, 0xF1, 0x6A, 0xE5, 0x41, 0x30, 0xE4, 0x02, 0xF1, \r
+0x44, 0xE5, 0x43, 0x30, 0xE0, 0x02, 0xF1, 0x76, 0xE5, 0x43, 0x30, 0xE1, 0x03, 0x12, 0x5F, 0x7F, \r
+0xE5, 0x43, 0x30, 0xE2, 0x03, 0x12, 0x67, 0x98, 0xE5, 0x43, 0x30, 0xE3, 0x03, 0x12, 0x67, 0xAF, \r
+0xE5, 0x43, 0x30, 0xE4, 0x03, 0x12, 0x5E, 0x8C, 0xE5, 0x43, 0x30, 0xE5, 0x03, 0x12, 0x6A, 0x10, \r
+0xE5, 0x43, 0x30, 0xE6, 0x03, 0x12, 0x5E, 0x10, 0xE5, 0x43, 0x30, 0xE7, 0x03, 0x12, 0x6A, 0x2C, \r
+0xE5, 0x44, 0x30, 0xE0, 0x02, 0xF1, 0x60, 0xE5, 0x44, 0x30, 0xE1, 0x02, 0xF1, 0x57, 0x74, 0x99, \r
+0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x46, 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, 0x12, 0x58, 0x82, 0x7F, 0x02, 0x8F, 0x0D, 0x7F, 0x02, 0x71, 0x27, 0x90, \r
+0x80, 0x01, 0xE0, 0x45, 0x0D, 0xF0, 0x22, 0x90, 0x81, 0x2B, 0xE0, 0x60, 0x02, 0xF1, 0xA3, 0x22, \r
+0xF1, 0xEB, 0xFF, 0xBF, 0x03, 0x03, 0x12, 0x6A, 0x3D, 0x22, 0x90, 0x80, 0xFA, 0xE0, 0x30, 0xE0, \r
+0x04, 0x7F, 0x20, 0xF1, 0x49, 0x22, 0x12, 0x66, 0xED, 0x90, 0x80, 0xFA, 0xE0, 0x30, 0xE0, 0x03, \r
+0x12, 0x77, 0x3E, 0x90, 0x81, 0x6F, 0xE0, 0x30, 0xE0, 0x18, 0xF1, 0xC6, 0x12, 0x4E, 0x13, 0x90, \r
+0x81, 0x6F, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x7D, 0x0C, 0x7F, 0x01, 0x12, 0x4B, 0x11, 0xF1, \r
+0xE4, 0xF0, 0x22, 0x90, 0x81, 0x2B, 0xE0, 0x64, 0x01, 0x70, 0x19, 0xF1, 0xF3, 0x60, 0x08, 0x12, \r
+0x49, 0x1F, 0xF1, 0xC6, 0x02, 0x5C, 0x75, 0x90, 0x81, 0x2E, 0xE0, 0x70, 0x07, 0x7D, 0x01, 0x7F, \r
+0x04, 0x12, 0x49, 0x23, 0x22, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x4B, 0xAB, 0x12, 0x5C, 0x75, 0x90, \r
+0x81, 0x2E, 0xE0, 0x64, 0x0C, 0x60, 0x0C, 0x12, 0x49, 0x1F, 0xF1, 0xC6, 0x7D, 0x08, 0xE4, 0xFF, \r
+0x12, 0x4C, 0x1A, 0x22, 0x90, 0x81, 0x6F, 0xE0, 0x44, 0x04, 0x22, 0x90, 0x01, 0x02, 0xE0, 0x54, \r
+0x03, 0x22, 0xF0, 0x90, 0x81, 0x29, 0xE0, 0x54, 0x0F, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, \r
+0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, \r
+0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xFA, 0xF0, 0x74, 0x47, 0xA3, \r
+0xF0, 0x12, 0x69, 0xA4, 0xE5, 0x49, 0x30, 0xE1, 0x03, 0x12, 0x64, 0xD6, 0xE5, 0x49, 0x30, 0xE2, \r
+0x03, 0x12, 0x5C, 0x5D, 0xE5, 0x49, 0x30, 0xE3, 0x03, 0x12, 0x5E, 0xC7, 0xE5, 0x4A, 0x30, 0xE0, \r
+0x03, 0x12, 0x6A, 0x45, 0xE5, 0x4B, 0x30, 0xE5, 0x03, 0x12, 0x53, 0x0B, 0xE5, 0x4C, 0x30, 0xE1, \r
+0x05, 0x7F, 0x04, 0x12, 0x47, 0x49, 0xE5, 0x4C, 0x30, 0xE4, 0x02, 0x11, 0x93, 0xE5, 0x4C, 0x30, \r
+0xE5, 0x03, 0x12, 0x5D, 0xBE, 0xE5, 0x4C, 0x30, 0xE6, 0x03, 0x12, 0x5C, 0xA1, 0x74, 0xFA, 0x04, \r
+0x90, 0x01, 0xC4, 0xF0, 0x74, 0x47, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, \r
+0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, \r
+0xD0, 0xE0, 0x32, 0xF1, 0x9A, 0x7D, 0x02, 0x7F, 0x02, 0x74, 0x3D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, \r
+0xF6, 0x74, 0x30, 0x80, 0x34, 0x90, 0x81, 0x27, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x81, 0x34, \r
+0xF0, 0xA3, 0xF0, 0x90, 0x81, 0x2F, 0xF0, 0x90, 0x81, 0x28, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, \r
+0xF0, 0x7D, 0x01, 0x7F, 0x02, 0x11, 0x99, 0x7D, 0x02, 0x7F, 0x02, 0x11, 0x99, 0x7D, 0x10, 0x7F, \r
+0x03, 0x74, 0x45, 0xF1, 0xF1, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, \r
+0x83, 0xEE, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, \r
+0xFF, 0x11, 0x99, 0x7D, 0x02, 0x7F, 0x03, 0x11, 0x99, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0x12, \r
+0x67, 0x81, 0xE4, 0xFF, 0xB1, 0xB7, 0xBF, 0x01, 0x11, 0x12, 0x65, 0x52, 0xF0, 0x90, 0x81, 0x2E, \r
+0xE0, 0x20, 0xE2, 0x0A, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x09, 0x12, 0x66, 0x28, 0xF0, 0x22, 0xE4, \r
+0xFD, 0x7F, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x82, 0x78, 0xED, 0xF0, 0x90, \r
+0x81, 0x27, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x41, 0x6B, 0xEE, 0x12, \r
+0x5C, 0x56, 0x30, 0xE0, 0x02, 0x41, 0x6B, 0x90, 0x81, 0x2E, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x41, \r
+0x6B, 0xEF, 0x70, 0x02, 0x21, 0xDF, 0x24, 0xFE, 0x70, 0x02, 0x41, 0x18, 0x24, 0xFE, 0x60, 0x47, \r
+0x24, 0xFC, 0x70, 0x02, 0x41, 0x52, 0x24, 0xFC, 0x60, 0x02, 0x41, 0x64, 0xEE, 0xB4, 0x0E, 0x02, \r
+0x51, 0xC0, 0x90, 0x81, 0x2E, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0xFD, 0x90, 0x81, 0x2E, 0xE0, \r
+0xB4, 0x06, 0x02, 0x51, 0xDC, 0x90, 0x81, 0x2E, 0xE0, 0xB4, 0x04, 0x0D, 0x90, 0x82, 0x78, 0xE0, \r
+0xFF, 0x60, 0x04, 0x71, 0xE2, 0x80, 0x02, 0xD1, 0x7C, 0x90, 0x81, 0x2E, 0xE0, 0x64, 0x08, 0x60, \r
+0x02, 0x41, 0x64, 0x71, 0xCF, 0x41, 0x64, 0x90, 0x81, 0x2E, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, \r
+0xFD, 0x90, 0x81, 0x2E, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0xDC, 0x90, 0x81, 0x2E, 0xE0, 0xB4, 0x0E, \r
+0x07, 0x51, 0x70, 0xBF, 0x01, 0x02, 0x51, 0xC0, 0x90, 0x81, 0x2E, 0xE0, 0x64, 0x0C, 0x60, 0x02, \r
+0x41, 0x64, 0x51, 0x70, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x41, 0x64, 0x71, 0x79, 0x41, 0x64, 0x90, \r
+0x81, 0x2E, 0xE0, 0xB4, 0x0E, 0x07, 0x51, 0x70, 0xBF, 0x01, 0x02, 0x51, 0xC0, 0x90, 0x81, 0x2E, \r
+0xE0, 0xB4, 0x06, 0x02, 0x51, 0xDC, 0x90, 0x81, 0x2E, 0xE0, 0xB4, 0x0C, 0x07, 0x51, 0x70, 0xBF, \r
+0x01, 0x02, 0x71, 0x79, 0x90, 0x81, 0x2E, 0xE0, 0x64, 0x04, 0x70, 0x58, 0x12, 0x61, 0xBD, 0xEF, \r
+0x64, 0x01, 0x70, 0x50, 0x71, 0xB6, 0x80, 0x4C, 0x90, 0x81, 0x2E, 0xE0, 0xB4, 0x0E, 0x07, 0x51, \r
+0x70, 0xBF, 0x01, 0x02, 0x51, 0xC0, 0x90, 0x81, 0x2E, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0xDC, 0x90, \r
+0x81, 0x2E, 0xE0, 0xB4, 0x0C, 0x07, 0x51, 0x70, 0xBF, 0x01, 0x02, 0x71, 0x79, 0x90, 0x81, 0x2E, \r
+0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0xFD, 0x90, 0x81, 0x2E, 0xE0, 0xB4, 0x04, 0x16, 0xF1, 0xDC, \r
+0x80, 0x12, 0x90, 0x81, 0x2E, 0xE0, 0xB4, 0x0C, 0x0B, 0x90, 0x81, 0x28, 0x12, 0x65, 0x59, 0x30, \r
+0xE0, 0x02, 0x71, 0xD7, 0x90, 0x81, 0x2E, 0x12, 0x77, 0x8C, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x12, 0x62, 0x46, 0xEF, 0x64, 0x01, 0x60, 0x05, 0x12, 0x62, 0x34, 0x80, 0x3A, 0x12, 0x77, 0x99, \r
+0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x2C, 0x90, 0x81, 0x2D, 0xE0, 0xD3, \r
+0x94, 0x04, 0x40, 0x05, 0x12, 0x61, 0xB6, 0x80, 0x1E, 0x90, 0x81, 0x6F, 0xE0, 0x30, 0xE0, 0x0F, \r
+0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x11, 0xF0, 0x80, 0x08, 0x90, \r
+0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, \r
+0x90, 0x81, 0x28, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, 0x7D, 0x0C, 0x80, 0x06, 0x12, 0x6D, 0x10, \r
+0xF0, 0x7D, 0x04, 0x7F, 0x01, 0x71, 0x11, 0xE4, 0xFD, 0xFF, 0x61, 0xAB, 0x90, 0x81, 0x28, 0xE0, \r
+0x90, 0x06, 0x04, 0x20, 0xE0, 0x08, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x04, 0x80, 0x06, 0xE0, 0x54, \r
+0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0x71, 0x11, 0xE4, 0xFD, 0xFF, 0x61, 0xAB, 0x90, 0x82, 0x77, \r
+0xEF, 0xF0, 0xD1, 0x13, 0x90, 0x82, 0x77, 0xE0, 0x60, 0x03, 0x12, 0x47, 0xC6, 0x7D, 0x04, 0x7F, \r
+0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xAC, 0x07, 0xEF, 0x14, 0x60, 0x15, 0x14, 0x60, \r
+0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, 0x01, 0xFE, 0x90, 0x81, 0x27, 0xE0, 0x54, 0xFE, 0x4E, \r
+0xF0, 0x80, 0x0C, 0x90, 0x81, 0x2E, 0xED, 0xF0, 0x80, 0x05, 0x90, 0x81, 0x2D, 0xED, 0xF0, 0x90, \r
+0x00, 0x8F, 0xE0, 0x30, 0xE4, 0x2E, 0xEC, 0x14, 0x60, 0x07, 0x14, 0x60, 0x1D, 0x24, 0x02, 0x70, \r
+0x23, 0x90, 0x81, 0x27, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x90, 0x81, \r
+0x2E, 0xE0, 0x54, 0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, 0x81, 0x2D, 0xE0, 0xFD, 0x7F, \r
+0x89, 0x12, 0x32, 0x1E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF1, 0xD4, 0x70, 0x28, 0x90, 0x81, 0x28, \r
+0xE0, 0x54, 0xFD, 0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x71, 0xAB, 0x7D, 0x08, 0x7F, 0x01, 0x91, 0x1A, \r
+0xBF, 0x01, 0x0D, 0x90, 0x81, 0x27, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0x61, 0x11, \r
+0x12, 0x5D, 0xFB, 0x04, 0xF0, 0x22, 0xD1, 0x13, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, 0xF0, \r
+0x90, 0x80, 0x05, 0xED, 0xF0, 0x22, 0x7D, 0x2D, 0x12, 0x6B, 0x44, 0x90, 0x01, 0x37, 0x74, 0x02, \r
+0xF0, 0xFD, 0x7F, 0x03, 0x11, 0x99, 0x12, 0x64, 0x12, 0xE4, 0xFD, 0x7F, 0x01, 0x61, 0x11, 0x71, \r
+0xA6, 0x7D, 0x0C, 0x7F, 0x01, 0x61, 0x11, 0x7D, 0x2F, 0x12, 0x64, 0x0D, 0x7D, 0x08, 0x7F, 0x01, \r
+0x61, 0x11, 0xEF, 0x60, 0x34, 0xF1, 0xD4, 0x70, 0x30, 0x90, 0x81, 0x28, 0xE0, 0x54, 0xFE, 0xF0, \r
+0x7D, 0x2B, 0x7F, 0x0F, 0x71, 0xAB, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x7D, 0x08, 0xE4, \r
+0xFF, 0x91, 0x1A, 0xBF, 0x01, 0x0D, 0x90, 0x81, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0x7F, \r
+0x01, 0x61, 0x11, 0x12, 0x5D, 0xFB, 0x74, 0x08, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x90, 0x82, 0x53, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, \r
+0x04, 0x1D, 0xE0, 0x60, 0x22, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x82, 0x57, 0xF0, 0x7D, 0x26, 0x12, \r
+0x6B, 0x44, 0xEF, 0x64, 0x01, 0x70, 0x02, 0x91, 0x82, 0x90, 0x82, 0x57, 0xE0, 0xFF, 0x7D, 0x27, \r
+0x71, 0xAB, 0x12, 0x6C, 0xAC, 0x80, 0x05, 0x12, 0x6C, 0xAC, 0x91, 0x82, 0x12, 0x76, 0x9A, 0x7F, \r
+0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xB1, 0xAB, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x0A, 0xB1, 0x9E, \r
+0x44, 0x10, 0xB1, 0xAA, 0x44, 0x80, 0xF0, 0x22, 0xB1, 0x9E, 0x54, 0xEF, 0xB1, 0xAA, 0x44, 0x40, \r
+0xF0, 0x22, 0x90, 0x80, 0x09, 0xE0, 0xFF, 0x90, 0x82, 0x54, 0xE0, 0xFB, 0x7D, 0x01, 0xB1, 0x12, \r
+0x90, 0x82, 0x55, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x82, 0x53, 0xE0, 0xFF, 0x91, \r
+0x66, 0x90, 0x82, 0x55, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x04, 0x80, 0xE0, 0x54, 0x0F, 0xFD, \r
+0xAC, 0x07, 0x12, 0x77, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0x77, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, \r
+0xAC, 0x07, 0x74, 0x16, 0x2C, 0xB1, 0x96, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x15, 0x2C, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, 0x53, 0xE4, 0xF0, 0x90, 0x04, \r
+0x52, 0xF0, 0x90, 0x04, 0x51, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, 0x74, 0xFD, 0xF0, 0x74, 0x14, \r
+0x2C, 0x12, 0x77, 0xC0, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0x12, 0x77, 0xC0, 0xED, \r
+0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x82, 0x65, 0xED, 0xF0, 0xA3, 0xEB, \r
+0xF0, 0x90, 0x82, 0x64, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0x6D, 0x6C, 0x7C, 0x00, 0xAD, 0x07, \r
+0x90, 0x82, 0x64, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x82, 0x65, 0xE0, 0x60, 0x0E, 0x74, 0x0F, \r
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x08, \r
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0xAF, 0x05, 0xB1, 0x93, 0xE0, 0x54, 0x01, 0xFE, \r
+0x90, 0x82, 0x66, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0xB1, 0x93, \r
+0xEE, 0xF0, 0x74, 0x21, 0x2F, 0xB1, 0xA1, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x74, 0x21, \r
+0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF0, 0x74, 0x1F, 0x2D, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x12, 0x77, 0xAE, 0xFF, 0x12, 0x51, 0x52, 0xE0, 0xFD, \r
+0x7C, 0x00, 0x12, 0x5D, 0xF2, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, \r
+0x5C, 0xFE, 0xEF, 0x5D, 0x4E, 0x7F, 0x00, 0x60, 0x02, 0x7F, 0x01, 0x22, 0xEF, 0x70, 0x32, 0x7D, \r
+0x78, 0xF1, 0xEA, 0x7F, 0x03, 0xD1, 0x72, 0x7D, 0xC8, 0x7F, 0x02, 0x11, 0xD1, 0x12, 0x67, 0x8C, \r
+0xE4, 0xFF, 0xB1, 0xB7, 0xEF, 0x70, 0x0A, 0xD1, 0x88, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, \r
+0x06, 0x7D, 0x01, 0x7F, 0x0C, 0x31, 0x23, 0xD1, 0x8C, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, \r
+0x22, 0x01, 0xE4, 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, 0x64, 0x98, 0x54, 0x7F, 0xFC, 0x90, 0x82, 0x5C, 0x12, 0x20, 0xCE, 0x90, \r
+0x82, 0x5C, 0x12, 0x63, 0x85, 0x7F, 0x7C, 0x12, 0x64, 0x6D, 0x12, 0x20, 0xDA, 0xCC, 0xC0, 0x00, \r
+0xC0, 0x7F, 0x8C, 0x12, 0x64, 0x6D, 0x12, 0x20, 0xDA, 0x00, 0xC0, 0x00, 0x14, 0x12, 0x64, 0xA1, \r
+0x12, 0x20, 0xDA, 0x00, 0x03, 0x3E, 0x60, 0xE4, 0xFD, 0xFF, 0x12, 0x64, 0x76, 0xD0, 0xD0, 0x92, \r
+0xAF, 0x22, 0x74, 0x3D, 0xF1, 0xF1, 0xFE, 0xF6, 0x74, 0x30, 0x01, 0xD9, 0x12, 0x6C, 0xA5, 0x12, \r
+0x47, 0xC5, 0x7D, 0x0C, 0x7F, 0x01, 0x61, 0x11, 0xD1, 0x13, 0xD1, 0x7C, 0x90, 0x81, 0x27, 0xE0, \r
+0x54, 0xF7, 0xF0, 0x22, 0x8B, 0x1A, 0x8A, 0x1B, 0x89, 0x1C, 0x12, 0x55, 0xFA, 0xFF, 0xF5, 0x1E, \r
+0x12, 0x1F, 0xA4, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x56, 0x33, 0xF5, 0x1F, 0x80, 0x02, \r
+0x8F, 0x1F, 0x85, 0x1E, 0x1D, 0xE5, 0x1D, 0xD3, 0x95, 0x1F, 0x50, 0x24, 0xAB, 0x1A, 0xAA, 0x1B, \r
+0xA9, 0x1C, 0x12, 0x1F, 0xA4, 0x54, 0x01, 0xFD, 0xAF, 0x1D, 0x12, 0x51, 0x15, 0xAF, 0x1D, 0xB1, \r
+0xB7, 0xEF, 0xAF, 0x1D, 0x70, 0x04, 0xF1, 0xE9, 0x80, 0x02, 0xF1, 0xE8, 0x05, 0x1D, 0x80, 0xD5, \r
+0xE5, 0x1E, 0x70, 0x0E, 0xFF, 0xB1, 0xB7, 0xEF, 0x70, 0x08, 0xD1, 0x88, 0x54, 0xBF, 0xF0, 0x54, \r
+0x7F, 0xF0, 0x22, 0x90, 0x81, 0x9F, 0x12, 0x44, 0xE3, 0x90, 0x81, 0x9E, 0xEF, 0xF0, 0x12, 0x44, \r
+0xEC, 0x4F, 0x35, 0x00, 0x4F, 0x3A, 0x01, 0x4F, 0x3E, 0x02, 0x4F, 0x43, 0x03, 0x4F, 0x48, 0x04, \r
+0x4F, 0x4D, 0x08, 0x4F, 0x52, 0x09, 0x4F, 0x57, 0x0A, 0x4F, 0x5C, 0x12, 0x4F, 0x61, 0x13, 0x4F, \r
+0x66, 0x14, 0x4F, 0x6B, 0x20, 0x4F, 0x70, 0x21, 0x4F, 0x75, 0x23, 0x4F, 0x7A, 0x25, 0x4F, 0x7F, \r
+0x26, 0x00, 0x00, 0x4F, 0x84, 0xF1, 0x94, 0x02, 0x56, 0x6D, 0xF1, 0x94, 0xC1, 0x94, 0xF1, 0x94, \r
+0x02, 0x67, 0xC6, 0xF1, 0x94, 0x02, 0x66, 0xBD, 0xF1, 0x94, 0x02, 0x56, 0x39, 0xF1, 0x94, 0x02, \r
+0x54, 0x3B, 0xF1, 0x94, 0x02, 0x56, 0xB4, 0xF1, 0x94, 0x02, 0x56, 0xD7, 0xF1, 0x94, 0x02, 0x68, \r
+0x03, 0xF1, 0x94, 0x02, 0x57, 0x30, 0xF1, 0x94, 0x02, 0x68, 0xA8, 0xF1, 0x94, 0x02, 0x55, 0x3B, \r
+0xF1, 0x94, 0x02, 0x56, 0xF3, 0xF1, 0x94, 0x02, 0x68, 0xB7, 0xF1, 0x94, 0x02, 0x68, 0xBF, 0xF1, \r
+0x94, 0x02, 0x66, 0x2F, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x81, 0x9E, 0xE0, 0x90, \r
+0x01, 0xC2, 0xF0, 0x22, 0x90, 0x81, 0x9F, 0x02, 0x44, 0xDA, 0xE4, 0x90, 0x81, 0x88, 0xF0, 0x90, \r
+0x81, 0x2B, 0xE0, 0x60, 0x2E, 0xF1, 0xD4, 0x70, 0x2A, 0x12, 0x67, 0x78, 0x90, 0x81, 0x88, 0x74, \r
+0x01, 0xF0, 0xE4, 0x90, 0x81, 0x32, 0xF0, 0x04, 0x60, 0x19, 0x12, 0x67, 0x5F, 0xE4, 0xF5, 0x52, \r
+0x90, 0x81, 0x33, 0x12, 0x53, 0xCC, 0x90, 0x81, 0x2E, 0xE0, 0x20, 0xE2, 0x06, 0x7D, 0x01, 0x7F, \r
+0x04, 0x31, 0x23, 0x22, 0xE4, 0xFF, 0xB1, 0xB7, 0xEF, 0x64, 0x01, 0x22, 0x7D, 0x2E, 0x7F, 0x6F, \r
+0x71, 0xAB, 0x7D, 0x02, 0x7F, 0x01, 0x61, 0x11, 0x22, 0x22, 0x7F, 0x02, 0xD1, 0x72, 0x7D, 0x02, \r
+0x22, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0x22, 0x90, 0x00, 0xF7, 0xE0, 0x20, 0xE7, 0x09, \r
+0xE0, 0x7F, 0x01, 0x20, 0xE6, 0x0C, 0x7F, 0x02, 0x22, 0x90, 0x00, 0xF7, 0xE0, 0x30, 0xE6, 0x02, \r
+0x7F, 0x03, 0x22, 0x12, 0x4F, 0xF9, 0x90, 0x80, 0x06, 0xEF, 0xF0, 0x11, 0x34, 0x90, 0x01, 0x64, \r
+0x74, 0x01, 0xF0, 0x90, 0x00, 0x12, 0xE0, 0x54, 0xC7, 0x44, 0x20, 0xFD, 0x7F, 0x12, 0x12, 0x32, \r
+0x1E, 0x02, 0x2D, 0xA7, 0x11, 0x64, 0x11, 0xBC, 0x12, 0x69, 0x39, 0x12, 0x69, 0x58, 0xE4, 0xF5, \r
+0x35, 0xF5, 0x36, 0xF5, 0x37, 0x75, 0x38, 0x80, 0xAD, 0x35, 0x7F, 0x50, 0x12, 0x32, 0x1E, 0xAD, \r
+0x36, 0x7F, 0x51, 0x12, 0x32, 0x1E, 0xAD, 0x37, 0x7F, 0x52, 0x12, 0x32, 0x1E, 0xAD, 0x38, 0x7F, \r
+0x53, 0x02, 0x32, 0x1E, 0x90, 0x01, 0x30, 0xE4, 0x11, 0x94, 0x90, 0x01, 0x38, 0x11, 0x94, 0xFD, \r
+0x7F, 0x50, 0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x52, \r
+0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x53, 0x02, 0x32, 0x1E, 0xE4, 0x90, 0x81, 0xAA, 0xF0, 0x90, \r
+0x82, 0x15, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x80, 0xFA, 0xE0, \r
+0x54, 0xFE, 0x31, 0xC6, 0x90, 0x80, 0xFA, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, \r
+0xF0, 0x54, 0xEF, 0xF0, 0xE4, 0x90, 0x80, 0xFD, 0x11, 0x92, 0x80, 0xD9, 0x90, 0x01, 0x34, 0x74, \r
+0xFF, 0x11, 0x94, 0x90, 0x01, 0x3C, 0x11, 0x94, 0xFD, 0x7F, 0x54, 0x12, 0x32, 0x1E, 0x7D, 0xFF, \r
+0x7F, 0x55, 0x12, 0x32, 0x1E, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x32, 0x1E, 0x7D, 0xFF, 0x7F, 0x57, \r
+0x02, 0x32, 0x1E, 0x31, 0x12, 0x12, 0x68, 0xC7, 0x12, 0x6B, 0xF7, 0x12, 0x6D, 0x48, 0x31, 0xB3, \r
+0x12, 0x6F, 0xBA, 0x11, 0x9C, 0x90, 0x81, 0x7E, 0xE0, 0x54, 0x7F, 0xF0, 0x54, 0xBF, 0xF0, 0x54, \r
+0xDF, 0xF0, 0x54, 0xF0, 0xF0, 0xE4, 0x90, 0x81, 0x80, 0xF0, 0x90, 0x81, 0x7E, 0xE0, 0x54, 0xEF, \r
+0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x12, 0x77, 0xAE, 0xFF, 0xED, 0x70, 0x12, 0x31, 0x52, 0xC0, 0x83, \r
+0xC0, 0x82, 0x31, 0x4A, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5E, 0x80, 0x0F, 0x31, 0x52, \r
+0xC0, 0x83, 0xC0, 0x82, 0x31, 0x4A, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4E, 0xD0, 0x82, 0xD0, \r
+0x83, 0xF0, 0x31, 0x5D, 0x90, 0x81, 0x25, 0xEF, 0xF0, 0x22, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x07, \r
+0x08, 0x22, 0x74, 0x1D, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0x7D, 0x08, 0xED, 0x14, 0xF9, 0x24, 0x1D, 0x31, 0x55, 0xE0, 0x60, 0x3A, \r
+0x7C, 0x08, 0xEC, 0x14, 0x90, 0x82, 0x74, 0xF0, 0x74, 0x1D, 0x29, 0x31, 0x55, 0xE0, 0xFB, 0x7A, \r
+0x00, 0x90, 0x82, 0x74, 0x12, 0x5D, 0xF0, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, \r
+0xFF, 0xEE, 0x5A, 0xFE, 0xEF, 0x5B, 0x4E, 0x60, 0x0F, 0xE9, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, \r
+0x82, 0x74, 0xE0, 0x2F, 0x04, 0xFF, 0x80, 0x06, 0xDC, 0xC8, 0xDD, 0xBA, 0x7F, 0x00, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0x90, 0x81, 0x72, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xFB, 0xF0, \r
+0xA3, 0x74, 0x0A, 0x80, 0x01, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x82, 0x58, 0xEE, 0xF0, 0xA3, 0x31, 0xC5, 0x90, 0x82, 0x58, 0xE0, \r
+0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x24, 0xC3, 0x90, 0x82, 0x5B, 0xE0, 0x94, \r
+0xE8, 0x90, 0x82, 0x5A, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, \r
+0x7F, 0x00, 0x80, 0x0C, 0x90, 0x82, 0x5A, 0x51, 0x62, 0x12, 0x77, 0xB9, 0x80, 0xCE, 0x7F, 0x01, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x81, 0x9A, 0x31, 0xC5, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, \r
+0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0x81, 0x9A, 0xE0, 0x6F, 0x60, 0x35, 0xC3, 0x90, 0x81, 0x9C, \r
+0xE0, 0x94, 0x88, 0x90, 0x81, 0x9B, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, \r
+0x10, 0xF0, 0x22, 0x90, 0x81, 0x9B, 0x51, 0x62, 0x12, 0x60, 0xF2, 0xD3, 0x90, 0x81, 0x9C, 0xE0, \r
+0x94, 0x32, 0x90, 0x81, 0x9B, 0xE0, 0x94, 0x00, 0x40, 0xC0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, \r
+0xB9, 0x22, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x44, 0x9F, 0xE4, 0x90, 0x81, 0x8A, 0x11, 0x94, 0x90, \r
+0x00, 0x9E, 0xE0, 0x90, 0x81, 0x8E, 0xF0, 0x90, 0x00, 0x9F, 0xE0, 0x90, 0x81, 0x8F, 0xF0, 0xE0, \r
+0xFD, 0xFE, 0x90, 0x81, 0x8E, 0xE0, 0xFC, 0xFB, 0xEB, 0xFF, 0x90, 0x81, 0x8A, 0xEE, 0xF0, 0xA3, \r
+0xEF, 0xF0, 0x90, 0x00, 0x9E, 0xE0, 0xFF, 0xEC, 0xB5, 0x07, 0x09, 0xA3, 0xE0, 0xFF, 0xED, 0xB5, \r
+0x07, 0x02, 0x80, 0x12, 0xC3, 0x90, 0x81, 0x8D, 0xE0, 0x94, 0x64, 0x90, 0x81, 0x8C, 0xE0, 0x94, \r
+0x00, 0x40, 0x0C, 0x12, 0x6B, 0x3C, 0x90, 0x81, 0x8A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x90, \r
+0x81, 0x8C, 0x51, 0x62, 0x80, 0xA9, 0x12, 0x6B, 0x8D, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, \r
+0x7F, 0x08, 0x12, 0x32, 0x1E, 0xE4, 0xFF, 0x51, 0x15, 0x90, 0x81, 0x28, 0xE0, 0x54, 0xEF, 0xF0, \r
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x6B, 0xAA, 0x51, 0xC6, 0xD0, 0xD0, 0x92, \r
+0xAF, 0x22, 0x90, 0x81, 0x2E, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x0E, 0x12, 0x62, 0x5F, 0xBF, \r
+0x01, 0x08, 0x51, 0xE1, 0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, 0x22, 0x51, 0x69, 0x90, 0x81, 0x88, \r
+0xEE, 0xF0, 0xA3, 0xEF, 0xD1, 0x00, 0x30, 0xE0, 0x15, 0x90, 0x81, 0x89, 0xE0, 0x20, 0xE0, 0x0E, \r
+0x12, 0x5F, 0x10, 0x90, 0x02, 0x86, 0xE0, 0x30, 0xE2, 0x04, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0xE4, \r
+0x90, 0x82, 0x71, 0xF0, 0xA3, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x23, 0xC3, 0x90, 0x82, \r
+0x72, 0xE0, 0x94, 0xD0, 0x90, 0x82, 0x71, 0xE0, 0x94, 0x07, 0x40, 0x0A, 0x90, 0x01, 0xC1, 0xE0, \r
+0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x82, 0x71, 0x51, 0x62, 0x12, 0x77, 0xB9, 0x80, 0xD6, \r
+0x7F, 0x01, 0x22, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0x12, 0x77, 0x2F, 0x90, 0x80, \r
+0xF8, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xD1, 0x00, 0x30, 0xE0, 0x2A, \r
+0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x71, 0x2F, 0x90, 0x80, 0xFA, 0xE0, 0xBF, 0x01, 0x05, 0x54, 0xEF, \r
+0xF0, 0x80, 0x03, 0x44, 0x10, 0xF0, 0x90, 0x80, 0xFD, 0xE0, 0xFF, 0x60, 0x0D, 0xE4, 0xF5, 0x52, \r
+0x8F, 0x53, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x71, 0xD6, 0x90, 0x80, 0xFA, 0xE0, 0x44, 0x01, \r
+0xF0, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x48, 0x99, 0x90, 0x05, 0x52, 0xE0, 0x54, 0x07, 0x04, 0x90, \r
+0x81, 0x05, 0x31, 0xC6, 0x90, 0x04, 0x22, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0xE0, 0xF5, 0x53, 0xE4, \r
+0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8E, 0x4E, 0x8F, \r
+0x4F, 0xE5, 0x53, 0x91, 0x2B, 0x85, 0x4E, 0x83, 0x85, 0x4F, 0x82, 0xF0, 0xE5, 0x52, 0x91, 0x2B, \r
+0xFF, 0xE5, 0x53, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x4F, 0xA3, 0xF0, 0xEB, 0x91, 0x2B, 0xFF, 0xE5, \r
+0x52, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x4F, 0x91, 0x32, 0xF0, 0xBD, 0x01, 0x0D, 0x85, 0x4F, 0x82, \r
+0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0x74, 0x03, 0xF0, 0x80, 0x06, 0x91, 0x32, 0xA3, 0x74, 0x01, 0xF0, \r
+0x91, 0x32, 0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x54, 0x07, 0xC4, 0x33, 0x54, \r
+0xE0, 0x22, 0x85, 0x4F, 0x82, 0x85, 0x4E, 0x83, 0xA3, 0xA3, 0x22, 0xF1, 0x2A, 0x12, 0x1F, 0xA4, \r
+0xFC, 0x54, 0x02, 0xFE, 0x90, 0x80, 0xFA, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xE0, 0xFF, 0xC3, 0x13, \r
+0x30, 0xE0, 0x08, 0xB1, 0x35, 0xD1, 0xAE, 0x90, 0x80, 0xFD, 0xF0, 0xEC, 0x30, 0xE0, 0x13, 0x71, \r
+0x63, 0x90, 0x80, 0x06, 0xE0, 0x64, 0x01, 0x70, 0x20, 0x90, 0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, \r
+0x80, 0x17, 0x12, 0x5F, 0x10, 0x90, 0x80, 0xFA, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x0B, 0x90, 0x02, \r
+0x86, 0xE0, 0x30, 0xE2, 0x04, 0xE0, 0x54, 0xFB, 0xF0, 0xB1, 0x35, 0xB1, 0xFA, 0x90, 0x80, 0xFB, \r
+0xD1, 0x32, 0x90, 0x80, 0xFC, 0xD1, 0x00, 0x30, 0xE0, 0x36, 0xB1, 0x35, 0x12, 0x1F, 0xA4, 0xFE, \r
+0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x80, 0xFA, 0xF0, 0xEE, 0x54, 0x08, 0xFE, \r
+0xEF, 0x54, 0xF7, 0x4E, 0xD1, 0xD0, 0x90, 0x80, 0xFE, 0xF0, 0x70, 0x03, 0x74, 0x14, 0xF0, 0xB1, \r
+0x35, 0x90, 0x00, 0x05, 0x12, 0x1F, 0xBD, 0x90, 0x80, 0xFF, 0xB1, 0xF2, 0x90, 0x81, 0x00, 0xF0, \r
+0x90, 0x80, 0xFB, 0xE0, 0x54, 0x01, 0x90, 0x81, 0x08, 0xF0, 0x90, 0x80, 0xFB, 0xE0, 0x54, 0x02, \r
+0x90, 0x81, 0x09, 0xF0, 0x90, 0x80, 0xFB, 0xE0, 0x54, 0x04, 0x90, 0x81, 0x0A, 0xF0, 0x90, 0x80, \r
+0xFB, 0xE0, 0x54, 0x08, 0x90, 0x81, 0x0B, 0xF0, 0x90, 0x80, 0xFB, 0xE0, 0x54, 0x10, 0x90, 0x81, \r
+0x0C, 0xF0, 0x90, 0x80, 0xFC, 0xE0, 0x54, 0x01, 0x90, 0x81, 0x0D, 0xF0, 0x90, 0x80, 0xFC, 0xE0, \r
+0x54, 0x02, 0x90, 0x81, 0x0E, 0xF0, 0x90, 0x80, 0xFC, 0xE0, 0x54, 0x04, 0x90, 0x81, 0x0F, 0xF0, \r
+0x90, 0x80, 0xFC, 0xE0, 0x54, 0x08, 0x90, 0x81, 0x10, 0xF0, 0x90, 0x80, 0xFC, 0xE0, 0x54, 0x10, \r
+0x90, 0x81, 0x11, 0xF0, 0x22, 0x90, 0x81, 0xA2, 0x02, 0x44, 0xDA, 0xF1, 0x2A, 0x12, 0x1F, 0xA4, \r
+0xFF, 0x54, 0x7F, 0x90, 0x81, 0x2B, 0xF0, 0xEF, 0x12, 0x5C, 0x56, 0xA3, 0xB1, 0xF9, 0xFF, 0x54, \r
+0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x81, 0x29, 0xE0, 0x54, 0xF0, 0x4E, 0xD1, 0xAD, 0x54, 0x01, \r
+0x25, 0xE0, 0xFE, 0x90, 0x81, 0x27, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, \r
+0xF0, 0xFF, 0x12, 0x47, 0xF3, 0x4F, 0xD1, 0x32, 0x90, 0x81, 0x2A, 0xB1, 0xF2, 0x30, 0xE0, 0x52, \r
+0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x81, 0x3E, 0x50, 0x04, 0xEF, 0xF0, 0x80, \r
+0x2A, 0x74, 0x03, 0xF0, 0xB1, 0x35, 0xE9, 0x24, 0x06, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x1F, 0xA4, \r
+0xFF, 0x74, 0x03, 0x24, 0xFD, 0xFE, 0xEF, 0xC4, 0x54, 0x0F, 0xFD, 0xEF, 0x54, 0x0F, 0xFF, 0xED, \r
+0x2E, 0x54, 0x0F, 0xFE, 0xC4, 0x54, 0xF0, 0x4F, 0x12, 0x1F, 0xEA, 0xB1, 0x35, 0xB1, 0xF3, 0xC4, \r
+0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x81, 0x33, 0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02, \r
+0xEF, 0xF0, 0xB1, 0x35, 0xD1, 0xD1, 0xFD, 0x7F, 0x02, 0x12, 0x4B, 0x11, 0xB1, 0x35, 0xD1, 0x09, \r
+0x12, 0x5D, 0xFB, 0xF0, 0x90, 0x81, 0x2B, 0x12, 0x77, 0x8C, 0x12, 0x47, 0xF2, 0x90, 0x01, 0xBE, \r
+0xF0, 0x22, 0xF0, 0x90, 0x00, 0x06, 0x02, 0x1F, 0xBD, 0xF0, 0x90, 0x00, 0x01, 0x02, 0x1F, 0xBD, \r
+0xF0, 0x90, 0x80, 0xFA, 0xE0, 0xFF, 0xC3, 0x13, 0x22, 0x90, 0x81, 0xA5, 0x12, 0x44, 0xE3, 0x12, \r
+0x48, 0xA5, 0x90, 0x81, 0x2B, 0xE0, 0xFF, 0x12, 0x4D, 0xDC, 0x90, 0x81, 0x2B, 0xE0, 0x60, 0x11, \r
+0x90, 0x81, 0xA5, 0x12, 0x44, 0xDA, 0xB1, 0xFA, 0x54, 0x0F, 0xFF, 0xD1, 0x33, 0xFD, 0x12, 0x6D, \r
+0x1B, 0x22, 0xF0, 0x90, 0x00, 0x02, 0x02, 0x1F, 0xBD, 0xF1, 0x2A, 0x12, 0x6F, 0xBA, 0xB1, 0x35, \r
+0x12, 0x66, 0xB6, 0xFE, 0x12, 0x5D, 0x42, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x1D, 0xB1, \r
+0xFA, 0x90, 0x81, 0x77, 0xD1, 0x32, 0x90, 0x81, 0x78, 0xF0, 0x12, 0x1F, 0xA4, 0x54, 0x04, 0xFF, \r
+0x90, 0x81, 0x76, 0xE0, 0x54, 0xFB, 0xD1, 0xAC, 0x90, 0x81, 0x79, 0xF0, 0x22, 0x90, 0x02, 0x09, \r
+0xE0, 0xF5, 0x1A, 0x12, 0x1F, 0xA4, 0x25, 0x1A, 0x90, 0x80, 0x07, 0xB1, 0xF9, 0x25, 0x1A, 0x90, \r
+0x80, 0x08, 0xD1, 0x32, 0x25, 0x1A, 0x90, 0x80, 0x09, 0xD1, 0xAD, 0x25, 0x1A, 0x90, 0x80, 0x0A, \r
+0xD1, 0xD0, 0x25, 0x1A, 0x90, 0x80, 0x0B, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x1F, 0xBD, 0x25, 0x1A, \r
+0x90, 0x80, 0x0C, 0xB1, 0xF2, 0x25, 0x1A, 0x90, 0x80, 0x0D, 0xF0, 0x22, 0x4F, 0xF0, 0x90, 0x00, \r
+0x03, 0x02, 0x1F, 0xBD, 0x12, 0x1F, 0xA4, 0x90, 0x81, 0x12, 0xB1, 0xF9, 0x90, 0x81, 0x13, 0xD1, \r
+0x32, 0x90, 0x81, 0x14, 0xD1, 0xAD, 0x90, 0x81, 0x15, 0xD1, 0xD0, 0x90, 0x81, 0x16, 0xF0, 0x22, \r
+0xF0, 0x90, 0x00, 0x04, 0x02, 0x1F, 0xBD, 0x12, 0x1F, 0xA4, 0x90, 0x81, 0x17, 0xB1, 0xF9, 0x90, \r
+0x81, 0x18, 0xD1, 0x32, 0x90, 0x81, 0x19, 0xD1, 0xAD, 0x90, 0x81, 0x1A, 0xD1, 0xD0, 0x90, 0x81, \r
+0x1B, 0xF0, 0x22, 0xD1, 0x33, 0xFF, 0x30, 0xE0, 0x1B, 0x12, 0x1F, 0xA4, 0x90, 0x81, 0x68, 0xB1, \r
+0xF9, 0x90, 0x81, 0x69, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0xD1, 0xAC, 0x90, \r
+0x81, 0x6B, 0xF0, 0x22, 0x90, 0x81, 0x68, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xA3, 0xE0, \r
+0x54, 0x01, 0x44, 0x1E, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0x90, 0x81, 0xA2, 0x02, 0x44, 0xE3, \r
+0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x80, 0xFE, 0x90, 0x81, 0x7E, 0xE0, 0x54, 0x7F, 0x4E, 0xFE, 0xF0, \r
+0xEF, 0x54, 0x40, 0xFF, 0xEE, 0x54, 0xBF, 0x12, 0x67, 0x67, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, \r
+0x4D, 0xFF, 0x90, 0x81, 0x7E, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, \r
+0x12, 0x1F, 0xA4, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xF0, 0x4E, 0x90, 0x81, 0x7E, 0xB1, 0xF9, 0xFF, \r
+0x54, 0x7F, 0x90, 0x81, 0x80, 0xF0, 0xEF, 0x54, 0x80, 0x12, 0x5C, 0x56, 0xFF, 0x90, 0x81, 0x7F, \r
+0xE0, 0x54, 0xFE, 0x4F, 0xD1, 0x32, 0x90, 0x81, 0x81, 0xD1, 0xAD, 0x54, 0x01, 0x25, 0xE0, 0xFF, \r
+0x90, 0x81, 0x7F, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x5B, 0x96, 0x54, 0x03, 0x7D, 0x00, 0x20, \r
+0xE0, 0x02, 0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x82, 0x6E, 0xED, 0xF0, \r
+0x90, 0x82, 0x6D, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x50, 0x12, 0x58, 0x7A, 0x80, 0x02, 0xC3, \r
+0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x47, 0xE0, 0x5F, 0xFD, 0x7F, 0x47, 0x12, 0x58, 0x74, \r
+0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xFF, 0x90, 0x00, 0x46, 0xE0, 0x4F, 0xFD, 0x7F, 0x46, 0x12, \r
+0x59, 0xA5, 0x60, 0x11, 0x12, 0x58, 0x77, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xFF, 0x90, 0x00, \r
+0x45, 0xE0, 0x4F, 0x80, 0x10, 0x12, 0x58, 0x77, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, \r
+0x90, 0x00, 0x45, 0xE0, 0x5F, 0xFD, 0x7F, 0x45, 0x80, 0x62, 0x90, 0x82, 0x6D, 0xE0, 0x24, 0xF8, \r
+0xF0, 0xE0, 0x24, 0x04, 0x11, 0x7B, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, \r
+0x43, 0xE0, 0x5F, 0xFD, 0x7F, 0x43, 0x11, 0x74, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xFF, 0x90, \r
+0x00, 0x43, 0xE0, 0x4F, 0xFD, 0x7F, 0x43, 0x31, 0xA5, 0x60, 0x19, 0x90, 0x82, 0x6D, 0xE0, 0x24, \r
+0x04, 0x11, 0x7B, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xFF, 0x90, 0x00, 0x42, 0xE0, 0x4F, 0xFD, \r
+0x7F, 0x42, 0x80, 0x18, 0x90, 0x82, 0x6D, 0xE0, 0x24, 0x04, 0x11, 0x7B, 0x80, 0x02, 0xC3, 0x33, \r
+0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x42, 0xE0, 0x5F, 0xFD, 0x7F, 0x42, 0x12, 0x32, 0x1E, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0x12, 0x32, 0x1E, 0x90, 0x82, 0x6D, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, \r
+0x08, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x82, 0x69, 0xF0, 0x90, 0x82, 0x69, 0xE0, \r
+0xFD, 0x70, 0x02, 0x21, 0x7A, 0x90, 0x80, 0x5E, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, \r
+0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x80, 0x5F, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, \r
+0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x82, 0x67, \r
+0xB1, 0xF0, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, \r
+0x21, 0x5D, 0xE4, 0x90, 0x82, 0x6A, 0xF0, 0x90, 0x82, 0x6A, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, \r
+0x32, 0x31, 0x7C, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, \r
+0xD0, 0x31, 0x93, 0x90, 0x80, 0x0E, 0x31, 0x84, 0x31, 0x7B, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, \r
+0xFE, 0x74, 0xF0, 0x31, 0x93, 0x90, 0x80, 0x12, 0x31, 0x84, 0xF0, 0x90, 0x82, 0x6A, 0xE0, 0x04, \r
+0xF0, 0x80, 0xC4, 0x90, 0x82, 0x69, 0xE0, 0xFF, 0x90, 0x82, 0x67, 0xE0, 0xFE, 0x74, 0x01, 0xA8, \r
+0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x82, 0x69, 0xF0, 0x90, 0x82, \r
+0x67, 0x11, 0x7A, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x82, 0x67, \r
+0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x80, 0x5F, 0x51, 0x0D, 0xB4, 0x0A, 0x02, 0x7F, \r
+0x01, 0xEF, 0x70, 0x02, 0x01, 0x8C, 0xE4, 0x90, 0x80, 0x5F, 0xF0, 0x01, 0x8C, 0x90, 0x01, 0xC0, \r
+0xE0, 0x44, 0x02, 0xF0, 0x90, 0x82, 0x67, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0x31, 0x7B, 0x90, \r
+0x01, 0xD0, 0x12, 0x44, 0xCE, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0xF0, 0x90, 0x82, 0x67, 0xE0, \r
+0x75, 0xF0, 0x04, 0x22, 0x12, 0x44, 0xCE, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, \r
+0x83, 0xEF, 0x22, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x80, 0x5F, \r
+0xE0, 0x75, 0xF0, 0x08, 0x22, 0x12, 0x32, 0x1E, 0x90, 0x82, 0x6E, 0xE0, 0x22, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x80, 0x5F, 0xE0, 0xFF, 0x90, 0x80, 0x5E, 0xE0, 0xB5, 0x07, 0x04, \r
+0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x3F, 0x90, 0x80, 0x5E, 0xE0, 0xFE, 0x75, 0xF0, \r
+0x08, 0x90, 0x80, 0x0E, 0x12, 0x44, 0xCE, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x0F, \r
+0xF9, 0x74, 0x80, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x4E, 0xF3, 0x90, 0x80, 0x5E, \r
+0x51, 0x0D, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x80, 0x5E, 0xF0, 0x11, \r
+0x82, 0x90, 0x80, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0x04, 0xF0, \r
+0xE0, 0x7F, 0x00, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x43, 0x4E, 0x90, 0x81, 0x9D, \r
+0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x80, 0x01, 0xE0, 0xFF, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0xE5, 0xC2, \r
+0xAF, 0xEF, 0x30, 0xE1, 0x09, 0x90, 0x80, 0x01, 0xE0, 0x54, 0xFD, 0xF0, 0x31, 0xAD, 0x51, 0x5D, \r
+0x30, 0xE2, 0x05, 0x54, 0xFB, 0xF0, 0x51, 0x67, 0x51, 0x5D, 0x30, 0xE5, 0x0C, 0x54, 0xDF, 0xF0, \r
+0x12, 0x53, 0x2F, 0xBF, 0x01, 0x03, 0x12, 0x70, 0x08, 0xD2, 0xAF, 0x80, 0xC7, 0xD2, 0xAF, 0xC2, \r
+0xAF, 0x90, 0x80, 0x01, 0xE0, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, \r
+0x90, 0x80, 0xF7, 0xE0, 0xFE, 0x90, 0x80, 0xF6, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, \r
+0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x44, 0x90, 0x01, 0xAF, 0xE0, 0x70, 0x0D, 0xED, 0x71, \r
+0x30, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x12, 0x68, 0xD5, 0x7F, 0x01, 0xEF, 0x60, 0x2E, 0x90, 0x80, \r
+0xF6, 0x51, 0x0D, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x80, 0xF6, 0xF0, \r
+0x90, 0x80, 0xF7, 0xE0, 0xFF, 0x90, 0x80, 0xF6, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, \r
+0x7F, 0x00, 0xEF, 0x70, 0x07, 0x90, 0x80, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x80, 0xF6, 0xE0, 0xFF, 0x70, 0x06, 0xA3, \r
+0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x80, 0xF7, 0xE0, 0xB5, 0x07, 0x04, 0x7F, \r
+0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, \r
+0x2A, 0xC0, 0x01, 0x90, 0x80, 0xF7, 0xE0, 0x71, 0x30, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, \r
+0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x44, 0x79, 0x90, 0x80, 0xF7, 0x51, 0x0D, 0xB4, 0x0A, \r
+0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x80, 0xF7, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x60, 0xF9, 0x74, 0x80, 0x22, 0xE4, 0x90, 0x81, 0x8A, 0xF0, 0x90, \r
+0x81, 0x88, 0x74, 0x14, 0xF0, 0x90, 0x81, 0x96, 0x74, 0x01, 0xF0, 0xFB, 0x7A, 0x81, 0x79, 0x88, \r
+0x51, 0xD1, 0x7F, 0x04, 0x90, 0x82, 0x73, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x43, 0x27, 0x90, 0x80, \r
+0x01, 0xE0, 0xFF, 0x90, 0x82, 0x73, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x80, 0x01, 0xF0, 0x22, 0x90, \r
+0x81, 0x7E, 0x91, 0x54, 0x30, 0xE0, 0x1E, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0x71, 0x3A, \r
+0x90, 0x81, 0x7F, 0xE0, 0x30, 0xE0, 0x0E, 0x71, 0x96, 0x54, 0x03, 0x7D, 0x00, 0x20, 0xE0, 0x02, \r
+0x7D, 0x01, 0x12, 0x57, 0xA4, 0x22, 0x90, 0x81, 0x7E, 0xE0, 0xFE, 0x54, 0x0F, 0xFF, 0xEE, 0xC4, \r
+0x13, 0x13, 0x22, 0xAD, 0x07, 0x90, 0x81, 0x80, 0xE0, 0x75, 0xF0, 0x20, 0xA4, 0xFF, 0x90, 0x82, \r
+0x4D, 0xE5, 0xF0, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x81, 0x81, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0xAE, \r
+0xF0, 0x90, 0x82, 0x4F, 0xF0, 0xEE, 0xA3, 0xF0, 0x91, 0x40, 0x90, 0x82, 0x51, 0xF0, 0xEE, 0xA3, \r
+0xF0, 0xED, 0x64, 0x01, 0x60, 0x69, 0x90, 0x81, 0x7E, 0xE0, 0xFE, 0x91, 0x56, 0x30, 0xE0, 0x5F, \r
+0xEE, 0x71, 0x9B, 0x54, 0x03, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x12, 0x57, 0xA4, 0x71, \r
+0x96, 0x54, 0x01, 0xFD, 0x12, 0x57, 0xA4, 0x90, 0x81, 0x7E, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, \r
+0xE0, 0x27, 0xA3, 0xE0, 0x30, 0xE0, 0x0E, 0x90, 0x82, 0x52, 0xE0, 0xF5, 0x52, 0x90, 0x82, 0x51, \r
+0xE0, 0x91, 0x48, 0x80, 0x14, 0x91, 0x40, 0xFF, 0x12, 0x32, 0xAA, 0x71, 0x96, 0x54, 0x03, 0x7D, \r
+0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x12, 0x57, 0xA4, 0x90, 0x81, 0x7E, 0xE0, 0xC4, 0x54, 0x0F, \r
+0x30, 0xE0, 0x0C, 0x90, 0x82, 0x50, 0xE0, 0xF5, 0x52, 0x90, 0x82, 0x4F, 0xE0, 0x91, 0x48, 0x22, \r
+0x90, 0x82, 0x4D, 0xE0, 0xFE, 0xA3, 0xE0, 0x22, 0xF5, 0x53, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, \r
+0x01, 0x02, 0x53, 0xD6, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x22, 0x90, 0x81, 0x2B, \r
+0xE0, 0x60, 0x10, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x04, 0x91, 0x75, 0x80, 0x05, 0x12, 0x4E, \r
+0x8C, 0xB1, 0xB4, 0x61, 0x6F, 0x12, 0x77, 0x99, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, \r
+0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0xF5, 0x52, 0x90, \r
+0x81, 0x6A, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x91, 0x48, 0x90, 0x81, 0x27, 0xE0, 0x44, 0x08, 0xF0, \r
+0x22, 0x90, 0x81, 0x27, 0x91, 0x54, 0x30, 0xE0, 0x1D, 0xEF, 0x54, 0x7F, 0xB1, 0xE7, 0x30, 0xE1, \r
+0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x07, 0xE0, 0x54, 0xFD, 0xB1, 0xFA, 0x04, 0xF0, 0x90, 0x81, \r
+0x2B, 0xE0, 0x60, 0x02, 0xB1, 0xB4, 0x7F, 0x01, 0x90, 0x81, 0x76, 0xE0, 0x30, 0xE0, 0x38, 0x90, \r
+0x81, 0x7B, 0xE0, 0xFD, 0x60, 0x31, 0xB1, 0xF2, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, \r
+0xF9, 0xFF, 0x90, 0x04, 0xE0, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x0B, 0xE4, 0x90, 0x81, 0x7B, 0xF0, \r
+0x90, 0x81, 0x7D, 0x04, 0xF0, 0x22, 0x90, 0x81, 0x78, 0xE0, 0xD3, 0x9D, 0x50, 0x04, 0xB1, 0x38, \r
+0xF0, 0x22, 0x7D, 0x08, 0xE4, 0xD1, 0x05, 0x22, 0x90, 0x82, 0x7A, 0xEF, 0xF0, 0x90, 0x80, 0x06, \r
+0xE0, 0xB4, 0x02, 0x12, 0x90, 0x82, 0x7A, 0xE0, 0xFF, 0x64, 0x01, 0x60, 0x17, 0x90, 0x01, 0x4D, \r
+0xE0, 0x64, 0x80, 0xF0, 0x80, 0x0C, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x82, 0x7A, \r
+0xE0, 0xFF, 0x71, 0xA3, 0xB1, 0x42, 0xF0, 0x22, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0x7F, 0x01, \r
+0xB1, 0x08, 0x90, 0x81, 0x76, 0xE0, 0x54, 0xFE, 0x22, 0x90, 0x81, 0x76, 0xE0, 0x30, 0xE0, 0x63, \r
+0x90, 0x81, 0x7A, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x7D, 0xE0, 0x64, 0x01, 0x70, 0x20, 0x90, 0x81, \r
+0x76, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x15, 0x90, 0x81, 0x7C, 0xE0, 0x70, 0x0F, 0x90, \r
+0x81, 0x79, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x40, 0x04, 0xB1, 0x38, 0xF0, 0x22, 0x90, 0x81, \r
+0x7A, 0xE0, 0xFF, 0x90, 0x81, 0x77, 0xE0, 0xD3, 0x9F, 0x50, 0x28, 0x90, 0x06, 0x92, 0xE0, 0x20, \r
+0xE2, 0x12, 0x90, 0x81, 0x7C, 0xE0, 0x70, 0x0C, 0x7D, 0x08, 0xD1, 0x05, 0x90, 0x81, 0x75, 0xE0, \r
+0x04, 0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x81, 0x7A, 0xF0, 0x90, \r
+0x81, 0x7C, 0xF0, 0x22, 0x90, 0x81, 0x2D, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x49, 0x23, 0x90, 0x81, \r
+0x27, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x18, 0xEF, 0x54, 0xBF, 0xB1, 0xE7, \r
+0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x08, 0xE0, 0x54, 0xFE, 0xB1, 0xFA, 0x74, 0x04, \r
+0xF0, 0xB1, 0xB4, 0xE4, 0xFF, 0x81, 0xC8, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x81, 0x28, 0x22, \r
+0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x22, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, \r
+0xF0, 0x90, 0x01, 0xB8, 0x22, 0xFF, 0x12, 0x4C, 0x1A, 0x90, 0x81, 0x7B, 0xE0, 0x04, 0xF0, 0x22, \r
+0xE4, 0xFF, 0x12, 0x4D, 0xB7, 0xBF, 0x01, 0x0F, 0x90, 0x81, 0x2B, 0xE0, 0x60, 0x09, 0xD1, 0x28, \r
+0xF0, 0x54, 0x07, 0x70, 0x02, 0xB1, 0xB4, 0x22, 0x90, 0x81, 0x2F, 0xE0, 0x54, 0xFE, 0x22, 0xE4, \r
+0xF5, 0x19, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x19, 0x54, 0xC0, 0x70, 0x08, 0xD1, 0x28, 0xF0, 0x54, \r
+0xFD, 0xF0, 0xA1, 0xB4, 0xE5, 0x19, 0x30, 0xE6, 0x1E, 0x90, 0x81, 0x2B, 0xE0, 0x64, 0x01, 0x70, \r
+0x19, 0x90, 0x81, 0x2F, 0xE0, 0x44, 0x01, 0x12, 0x47, 0xF2, 0x64, 0x02, 0x60, 0x04, 0xD1, 0xA9, \r
+0x80, 0x08, 0x12, 0x47, 0xCC, 0x80, 0x03, 0xD1, 0x28, 0xF0, 0xE5, 0x19, 0x90, 0x81, 0x2F, 0x30, \r
+0xE7, 0x15, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xF5, 0x52, 0x90, 0x81, 0x69, 0x12, 0x53, 0xCC, 0x90, \r
+0x81, 0x27, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x12, 0x4F, 0xD4, 0x70, \r
+0x17, 0x90, 0x81, 0x2B, 0xE0, 0x60, 0x11, 0x12, 0x67, 0x8C, 0x90, 0x81, 0x27, 0xE0, 0x12, 0x65, \r
+0x60, 0xF0, 0x54, 0x07, 0x70, 0x02, 0xB1, 0xB4, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x17, 0x90, \r
+0x80, 0x08, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x12, 0x4D, 0x12, 0x90, 0x81, 0x86, 0xEE, 0xF0, \r
+0xA3, 0xEF, 0xF0, 0x12, 0x76, 0x9A, 0x22, 0x12, 0x56, 0x01, 0x30, 0xE0, 0x16, 0xE4, 0x90, 0x80, \r
+0xFD, 0xF0, 0x90, 0x80, 0xFA, 0xE0, 0x30, 0xE0, 0x0A, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x04, 0xD1, \r
+0xE4, 0xB1, 0x08, 0x22, 0xF1, 0x10, 0x90, 0x01, 0xC7, 0x74, 0x66, 0xF0, 0xE4, 0xFF, 0x22, 0x90, \r
+0x80, 0xFA, 0xE0, 0xFF, 0x30, 0xE0, 0x18, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x10, 0x90, \r
+0x80, 0xFE, 0xE0, 0x70, 0x04, 0xD1, 0xE4, 0xA1, 0x08, 0x90, 0x80, 0xFE, 0xE0, 0x14, 0xF0, 0x22, \r
+0xC2, 0xAF, 0x90, 0x80, 0xFA, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x4E, 0x72, \r
+0x90, 0x02, 0x09, 0xE0, 0x90, 0x04, 0x24, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x04, 0x25, 0xF0, \r
+0xE4, 0x90, 0x81, 0x06, 0xF0, 0xA3, 0xF0, 0xD2, 0xAF, 0x22, 0x90, 0x80, 0xFD, 0xE0, 0x60, 0x08, \r
+0x90, 0x80, 0xFA, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0xD1, 0xE4, 0xA1, 0x08, 0x90, 0x81, 0xAD, 0x74, \r
+0x12, 0xF0, 0x90, 0x81, 0xBB, 0x74, 0x05, 0xF0, 0x90, 0x81, 0xAF, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, \r
+0xA3, 0xEB, 0xF0, 0x90, 0x81, 0xAB, 0xE0, 0x90, 0x81, 0xB2, 0xF0, 0x90, 0x81, 0xAC, 0xE0, 0x90, \r
+0x81, 0xB3, 0xF0, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xAD, 0x51, 0xD1, 0x7F, 0x04, 0x61, 0x54, 0x90, \r
+0x81, 0x2B, 0xE0, 0x60, 0x35, 0x90, 0x81, 0x28, 0x12, 0x77, 0x9C, 0x30, 0xE0, 0x15, 0x90, 0x01, \r
+0x3B, 0xE0, 0x30, 0xE4, 0x0E, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x4E, 0x72, 0x7D, 0x01, 0x7F, 0x02, \r
+0x12, 0x4E, 0x72, 0x90, 0x82, 0x75, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x80, 0x40, 0x0B, 0x90, \r
+0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0x47, 0xEB, 0xFF, 0xBF, 0x03, \r
+0x0D, 0x90, 0x01, 0xB8, 0xE0, 0x04, 0xF0, 0x90, 0x05, 0x21, 0xE0, 0x44, 0x80, 0xF0, 0xB1, 0x49, \r
+0x12, 0x6F, 0x4E, 0xE4, 0x90, 0x81, 0x75, 0xF0, 0xD1, 0xEF, 0x90, 0x81, 0x6F, 0xE0, 0x30, 0xE0, \r
+0x0B, 0xE4, 0xF5, 0x52, 0xA3, 0x12, 0x53, 0xCC, 0x12, 0x47, 0xE4, 0xF0, 0x90, 0x81, 0x6F, 0xE0, \r
+0x30, 0xE0, 0x3C, 0x90, 0x82, 0x70, 0xE0, 0x70, 0x3F, 0x90, 0x82, 0x6F, 0xE0, 0x04, 0xF0, 0xE0, \r
+0xD3, 0x94, 0x06, 0x40, 0x33, 0x90, 0x81, 0x36, 0x74, 0xD0, 0xF0, 0x90, 0x82, 0x70, 0x74, 0x01, \r
+0xF0, 0x90, 0x81, 0x6F, 0xE0, 0xFF, 0x13, 0x30, 0xE0, 0x1E, 0xEF, 0xC4, 0x54, 0x0F, 0x20, 0xE0, \r
+0x17, 0x90, 0x81, 0x27, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x81, 0x36, 0x74, 0xD0, 0xF0, 0x22, 0xE4, \r
+0x90, 0x82, 0x70, 0xF0, 0x90, 0x82, 0x6F, 0xF0, 0x22, 0x75, 0xE8, 0x03, 0x75, 0xA8, 0x84, 0x22, \r
+0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x32, 0x1E, 0x90, 0xFD, 0x00, 0xE0, \r
+0x54, 0xBF, 0xF0, 0x31, 0x03, 0x12, 0x32, 0x77, 0x31, 0x10, 0x11, 0xEB, 0x7F, 0x01, 0x12, 0x42, \r
+0x15, 0x90, 0x81, 0x71, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x42, 0x15, 0x90, 0x81, 0x71, 0xE0, 0x04, \r
+0xF0, 0x12, 0x50, 0x13, 0x12, 0x50, 0xE3, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x80, \r
+0x12, 0x32, 0x1E, 0x75, 0x20, 0xFF, 0x11, 0x39, 0x11, 0x91, 0x11, 0xF9, 0xE4, 0xFF, 0x02, 0x42, \r
+0x9E, 0xE4, 0x90, 0x81, 0x97, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, 0xE0, 0x7F, 0x00, 0x30, 0xE4, \r
+0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3C, 0xC3, 0x90, 0x81, 0x98, 0xE0, 0x94, 0x88, 0x90, \r
+0x81, 0x97, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, \r
+0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x1E, 0x90, 0x81, 0x97, 0x12, 0x52, 0x62, 0x11, 0xF2, 0xD3, 0x90, \r
+0x81, 0x98, 0xE0, 0x94, 0x32, 0x90, 0x81, 0x97, 0xE0, 0x94, 0x00, 0x40, 0xBB, 0x90, 0x01, 0xC6, \r
+0xE0, 0x30, 0xE3, 0xB4, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0xE4, 0x90, 0x80, 0x01, 0x02, \r
+0x50, 0x92, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x32, 0xAA, 0x90, 0x01, 0xE4, 0x74, 0x14, 0xF0, 0xA3, \r
+0xE4, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, \r
+0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, \r
+0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, \r
+0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, \r
+0xE4, 0x90, 0x81, 0x99, 0xF0, 0x90, 0x81, 0x99, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0x40, 0x90, 0x01, \r
+0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0x90, 0x81, 0x2B, 0xE0, 0x60, 0x0F, 0x90, 0x81, 0x2E, 0xE0, \r
+0xFF, 0x90, 0x81, 0x2D, 0xE0, 0x6F, 0x60, 0x03, 0x12, 0x5D, 0xB4, 0xC2, 0xAF, 0x31, 0x7D, 0xBF, \r
+0x01, 0x02, 0x51, 0x3B, 0xD2, 0xAF, 0x31, 0xB5, 0x12, 0x41, 0x4D, 0x80, 0xC8, 0x7D, 0x02, 0x90, \r
+0x01, 0xC4, 0x74, 0x7D, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0x90, 0x81, 0x71, 0xE0, 0xFF, 0xED, 0xC3, \r
+0x9F, 0x50, 0x14, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x07, 0x31, 0xB6, 0xA3, \r
+0xF0, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE2, 0x74, 0x7D, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x61, \r
+0xA3, 0xF0, 0x7F, 0x01, 0x22, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x22, 0x51, 0x46, 0xEF, \r
+0x64, 0x01, 0x60, 0x04, 0x51, 0x34, 0x80, 0x63, 0x90, 0x81, 0x2F, 0xE0, 0xFF, 0x54, 0x03, 0x60, \r
+0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x52, 0x90, 0x81, 0x2D, 0xE0, 0xFE, 0xE4, 0xC3, \r
+0x9E, 0x50, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x40, 0xEF, 0x30, 0xE2, 0x04, 0x31, \r
+0xB6, 0x80, 0x38, 0x90, 0x81, 0x2F, 0xE0, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, \r
+0x80, 0x29, 0x90, 0x81, 0x28, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x08, 0x90, 0x01, 0xB8, \r
+0x74, 0x20, 0xF0, 0x80, 0x16, 0x90, 0x81, 0x6E, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x80, \r
+0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x04, \r
+0xF0, 0x7F, 0x00, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x81, 0x27, 0xE0, 0x30, \r
+0xE0, 0x03, 0x12, 0x52, 0xF2, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, \r
+0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, \r
+0x02, 0x87, 0xE0, 0x60, 0x04, 0x51, 0x34, 0x80, 0x25, 0x90, 0x02, 0x96, 0xE0, 0x60, 0x08, 0x90, \r
+0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, 0x17, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, \r
+0xB8, 0x74, 0x04, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, \r
+0xB9, 0x74, 0x08, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x82, 0x26, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, \r
+0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x90, 0x82, 0x34, 0xF0, 0x7F, 0x24, 0x7E, 0x08, \r
+0x12, 0x2D, 0x5C, 0x90, 0x82, 0x2C, 0x12, 0x20, 0xCE, 0x90, 0x82, 0x26, 0xE0, 0xFB, 0x70, 0x04, \r
+0x71, 0x7F, 0x80, 0x06, 0xEB, 0x71, 0x8E, 0x12, 0x2D, 0x5C, 0x90, 0x82, 0x30, 0x12, 0x20, 0xCE, \r
+0x90, 0x82, 0x27, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x17, 0x91, 0x03, 0xAB, 0x07, 0x90, \r
+0x82, 0x30, 0x12, 0x44, 0xC2, 0xED, 0x54, 0x7F, 0xFD, 0xEC, 0x54, 0x80, 0xFC, 0x12, 0x44, 0xB5, \r
+0xEC, 0x44, 0x80, 0xFC, 0x90, 0x82, 0x30, 0x12, 0x20, 0xCE, 0x71, 0x7F, 0xEC, 0x54, 0x7F, 0xFC, \r
+0x71, 0x88, 0x71, 0xA1, 0xE0, 0x71, 0x8E, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x82, 0x30, 0x71, 0x85, \r
+0xD0, 0x07, 0xD0, 0x06, 0x12, 0x2E, 0xA2, 0x71, 0x7F, 0xEC, 0x44, 0x80, 0xFC, 0x71, 0x88, 0x71, \r
+0xA1, 0xE0, 0x70, 0x04, 0x7F, 0x20, 0x80, 0x09, 0x90, 0x82, 0x26, 0xE0, 0xB4, 0x01, 0x16, 0x7F, \r
+0x28, 0x7E, 0x08, 0x12, 0x2D, 0x5C, 0x78, 0x08, 0x12, 0x20, 0xA8, 0xEF, 0x54, 0x01, 0xFF, 0xE4, \r
+0x90, 0x82, 0x34, 0xEF, 0xF0, 0x90, 0x82, 0x34, 0xE0, 0x90, 0x82, 0x26, 0x60, 0x0E, 0xE0, 0x75, \r
+0xF0, 0x08, 0xA4, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0x80, 0x0C, 0xE0, 0x75, 0xF0, 0x08, \r
+0xA4, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0x71, 0x99, 0x12, 0x2D, 0x5C, 0xED, 0x54, 0x0F, \r
+0xFD, 0xE4, 0xFC, 0x90, 0x82, 0x28, 0x12, 0x20, 0xCE, 0x90, 0x82, 0x28, 0x02, 0x44, 0xC2, 0x90, \r
+0x82, 0x2C, 0x02, 0x44, 0xC2, 0x12, 0x44, 0xC2, 0x90, 0x85, 0xBB, 0x02, 0x20, 0xCE, 0x75, 0xF0, \r
+0x08, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, \r
+0x22, 0x7F, 0x24, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x82, 0x26, 0x22, 0x90, 0x82, 0x35, 0xEF, \r
+0xF0, 0xAB, 0x05, 0x90, 0x82, 0x3B, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x03, 0xE4, \r
+0xFC, 0xFD, 0xFE, 0x78, 0x14, 0x91, 0x03, 0xAB, 0x07, 0x90, 0x82, 0x37, 0x12, 0x44, 0xC2, 0xED, \r
+0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x12, 0x44, 0xB5, 0xEC, 0x54, 0x0F, 0xFC, 0x90, 0x82, 0x3B, 0x12, \r
+0x20, 0xCE, 0x90, 0x82, 0x35, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x60, 0xF5, 0x82, 0xE4, 0x34, \r
+0x87, 0x71, 0x99, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x82, 0x3B, 0x71, 0x85, 0xD0, 0x07, 0xD0, 0x06, \r
+0x02, 0x2E, 0xA2, 0x12, 0x20, 0xBB, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0x22, 0x7F, 0xFF, 0x12, \r
+0x4B, 0xAB, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x6B, 0x49, 0x90, 0x85, 0xBB, 0x12, \r
+0x20, 0xDA, 0xCC, 0xF0, 0x00, 0xC0, 0x7F, 0x8C, 0x91, 0x6D, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, \r
+0x14, 0x91, 0xA1, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xFD, 0xFF, 0x91, 0x76, 0x91, \r
+0x98, 0x44, 0x80, 0xFC, 0x90, 0x82, 0x60, 0x12, 0x20, 0xCE, 0x90, 0x82, 0x60, 0x71, 0x85, 0x7F, \r
+0x7C, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, \r
+0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7E, 0x08, 0x12, \r
+0x2E, 0xA2, 0x90, 0x85, 0xBB, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, 0x07, 0xC0, \r
+0x05, 0x90, 0x82, 0x49, 0x12, 0x44, 0xC2, 0x90, 0x82, 0x37, 0x12, 0x20, 0xCE, 0xD0, 0x05, 0xD0, \r
+0x07, 0x71, 0xAC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2D, 0x5C, 0xEC, \r
+0x22, 0x7F, 0x70, 0x7E, 0x0E, 0x12, 0x2E, 0xA2, 0x90, 0x82, 0x49, 0x22, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0x51, 0x97, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x81, 0x6F, 0xE0, 0x30, 0xE0, \r
+0x14, 0x54, 0xFB, 0xF0, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x7D, 0x04, 0x7F, 0x01, 0x02, 0x4B, \r
+0x11, 0x7D, 0x31, 0x91, 0x0D, 0x22, 0x90, 0x81, 0x2B, 0xE0, 0x60, 0x02, 0x91, 0xE0, 0x80, 0xDA, \r
+0xD1, 0x1D, 0x30, 0xE0, 0x10, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x07, 0x7D, 0x02, \r
+0x7F, 0x02, 0x12, 0x4E, 0x72, 0x90, 0x81, 0x27, 0xB1, 0x59, 0x30, 0xE0, 0x0A, 0xEF, 0xB1, 0x60, \r
+0xF0, 0x54, 0x07, 0x70, 0x4C, 0x80, 0x47, 0x90, 0x81, 0x34, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x2F, \r
+0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x81, 0x68, 0xE0, 0xFF, 0x90, 0x81, 0x34, 0xE0, 0xD3, 0x9F, 0x40, \r
+0x2D, 0x12, 0x4F, 0xD4, 0x70, 0x2B, 0x12, 0x47, 0xF3, 0x70, 0x04, 0xB1, 0x52, 0xF0, 0x22, 0x90, \r
+0x81, 0x35, 0xE0, 0x04, 0xF0, 0xE0, 0xD3, 0x94, 0x02, 0x40, 0x0A, 0xB1, 0x52, 0xF0, 0xE4, 0x90, \r
+0x81, 0x35, 0xF0, 0x80, 0x03, 0x12, 0x47, 0xCC, 0xE4, 0x90, 0x81, 0x34, 0xF0, 0x22, 0x12, 0x5D, \r
+0xB4, 0x22, 0x90, 0x81, 0x28, 0xE0, 0x54, 0xFB, 0x22, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x22, \r
+0x54, 0xFB, 0xF0, 0x90, 0x81, 0x2F, 0xE0, 0x54, 0xFD, 0x22, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, \r
+0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, \r
+0x81, 0x84, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x4F, 0xD4, 0x60, 0x02, 0xC1, 0x1C, 0x90, 0x81, \r
+0x2B, 0xE0, 0x70, 0x02, 0xC1, 0x1C, 0xD1, 0xE5, 0x64, 0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, \r
+0x90, 0x81, 0x32, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x81, 0x31, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, \r
+0x08, 0x90, 0x81, 0x31, 0xE0, 0xFE, 0xFF, 0x80, 0x00, 0x90, 0x81, 0x32, 0xEF, 0xF0, 0xD1, 0x28, \r
+0xF0, 0xE4, 0x90, 0x81, 0x34, 0xF1, 0x81, 0xF1, 0x8C, 0xB1, 0x63, 0xF0, 0x54, 0xEF, 0xF0, 0x90, \r
+0x81, 0x29, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x5E, 0x2F, \r
+0xD1, 0x1D, 0x30, 0xE0, 0x37, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x2E, 0x90, 0x81, \r
+0x31, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x24, 0x90, 0x81, 0x28, 0xE0, 0x44, 0x40, 0xF0, 0xF1, \r
+0x78, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0xF1, 0x6F, 0x7D, 0x01, 0x12, 0x4F, \r
+0xEA, 0x7F, 0x02, 0x12, 0x4E, 0x72, 0x90, 0x81, 0x32, 0xE0, 0x14, 0xF0, 0x22, 0x90, 0x81, 0x28, \r
+0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, 0x90, 0x81, 0x28, 0xE0, 0x44, 0x04, 0x22, 0xD1, \r
+0xB6, 0xFE, 0x90, 0x81, 0x6F, 0xD1, 0xDD, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0xF1, 0x67, 0x54, \r
+0x04, 0x25, 0xE0, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0x81, 0x6F, 0xF0, 0xEE, 0x54, 0x08, \r
+0x25, 0xE0, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0x12, 0x55, 0xF9, 0xFF, 0x90, 0x05, 0x54, 0xE0, 0xC3, \r
+0x9F, 0x90, 0x81, 0x70, 0xF0, 0x12, 0x1F, 0xA4, 0x20, 0xE0, 0x0A, 0x12, 0x4B, 0xA6, 0x90, 0x01, \r
+0x57, 0xE4, 0xF0, 0x80, 0x0B, 0x7D, 0x0C, 0x7F, 0x01, 0x12, 0x4B, 0x11, 0x12, 0x47, 0xE4, 0xF0, \r
+0x90, 0x81, 0x6F, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x15, 0x90, 0x81, 0x2B, 0x74, 0x01, 0xF0, 0xE4, \r
+0x90, 0x81, 0x2D, 0xF0, 0xD1, 0x28, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x05, 0xF0, 0x22, 0xE4, 0x90, \r
+0x81, 0x2B, 0xF0, 0x90, 0x81, 0x2D, 0x74, 0x0C, 0xF0, 0x90, 0x81, 0x27, 0xE0, 0x54, 0xFE, 0xF0, \r
+0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x01, 0x22, 0xD1, 0xB6, 0xFE, \r
+0x90, 0x81, 0x72, 0xD1, 0xDD, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xF0, 0x12, 0x1F, 0xA4, \r
+0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x55, 0xFA, 0x90, 0x81, 0x73, 0xF0, 0x22, 0xE0, 0x54, 0xFE, \r
+0x4E, 0xFE, 0xF0, 0xEF, 0x22, 0x90, 0x81, 0x29, 0xE0, 0xC4, 0x54, 0x0F, 0x22, 0xE4, 0xF5, 0x19, \r
+0x90, 0x81, 0x2B, 0xE0, 0x60, 0x60, 0x12, 0x4F, 0xD4, 0x70, 0x5B, 0xD1, 0xE5, 0x60, 0x22, 0x24, \r
+0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0x81, 0x32, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, \r
+0x90, 0x81, 0x34, 0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0x81, 0x31, 0xE0, 0xA3, 0xF0, 0x80, \r
+0x00, 0x75, 0x19, 0x01, 0xE5, 0x19, 0x60, 0x2E, 0xF1, 0x5F, 0x90, 0x81, 0x34, 0xE0, 0x60, 0x03, \r
+0xB4, 0x01, 0x04, 0xF1, 0x57, 0x80, 0x08, 0xF1, 0x57, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, \r
+0x90, 0x81, 0x33, 0xE0, 0x2F, 0x12, 0x53, 0xCD, 0x90, 0x81, 0x2E, 0xE0, 0x20, 0xE2, 0x07, 0x7D, \r
+0x01, 0x7F, 0x04, 0x12, 0x49, 0x23, 0x22, 0xE4, 0xF5, 0x52, 0x90, 0x81, 0x34, 0xE0, 0x22, 0x90, \r
+0x81, 0x2F, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x4F, 0xFF, 0xF0, 0x12, 0x1F, 0xA4, 0xFE, 0x22, 0x74, \r
+0x45, 0x2F, 0xF8, 0xE6, 0x4D, 0x02, 0x48, 0xD5, 0x90, 0x81, 0x31, 0xE0, 0x90, 0x05, 0x73, 0xF0, \r
+0x22, 0xF0, 0x90, 0x81, 0x37, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x90, 0x01, 0x57, 0xE4, \r
+0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x81, 0x7C, 0xE0, 0x04, 0xF0, 0x90, 0x81, \r
+0x2E, 0xE0, 0x64, 0x02, 0x60, 0x08, 0xB1, 0x6A, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x22, 0x12, \r
+0x4F, 0xD4, 0x70, 0x11, 0x90, 0x81, 0x2B, 0xE0, 0x60, 0x0B, 0xF1, 0x8C, 0xE4, 0xF5, 0x52, 0x90, \r
+0x81, 0x69, 0x12, 0x53, 0xCC, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x1A, 0x8A, \r
+0x1B, 0x89, 0x1C, 0x12, 0x1F, 0xA4, 0xFF, 0x90, 0x81, 0x26, 0xF0, 0xBF, 0x01, 0x0D, 0x12, 0x55, \r
+0xFA, 0x64, 0x01, 0x60, 0x19, 0x7D, 0x13, 0x7F, 0x6F, 0x80, 0x10, 0xAB, 0x1A, 0xAA, 0x1B, 0xA9, \r
+0x1C, 0x12, 0x55, 0xFA, 0x64, 0x01, 0x60, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x4B, 0xAB, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0x12, 0x1F, 0xA4, 0xFF, 0x90, 0x81, 0x1C, 0xF0, 0xBF, 0x01, 0x07, 0x11, 0x16, \r
+0xE4, 0x90, 0x81, 0x1C, 0xF0, 0x22, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xA2, 0x7F, 0xF5, 0x7E, 0x00, \r
+0x12, 0x2B, 0x27, 0xBF, 0x01, 0x06, 0x90, 0x81, 0xA2, 0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x81, \r
+0x79, 0xA2, 0x7F, 0xF6, 0x7E, 0x00, 0x12, 0x2B, 0x27, 0xBF, 0x01, 0x08, 0x90, 0x81, 0xA2, 0xE0, \r
+0x90, 0x81, 0xA4, 0xF0, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xA2, 0x7F, 0xF4, 0x7E, 0x00, 0x12, 0x2B, \r
+0x27, 0xBF, 0x01, 0x08, 0x90, 0x81, 0xA2, 0xE0, 0x90, 0x81, 0xA5, 0xF0, 0x7B, 0x01, 0x7A, 0x81, \r
+0x79, 0xA2, 0x7F, 0xF3, 0x7E, 0x00, 0x12, 0x2B, 0x27, 0xBF, 0x01, 0x08, 0x90, 0x81, 0xA2, 0xE0, \r
+0x90, 0x81, 0xA6, 0xF0, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xA2, 0x7F, 0xF2, 0x7E, 0x00, 0x12, 0x2B, \r
+0x27, 0xBF, 0x01, 0x08, 0x90, 0x81, 0xA2, 0xE0, 0x90, 0x81, 0xA7, 0xF0, 0x90, 0x81, 0xA3, 0xE0, \r
+0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x81, 0xAB, 0xF0, 0x90, 0x81, 0xA7, \r
+0xE0, 0x90, 0x81, 0xAC, 0xF0, 0x02, 0x5F, 0x4C, 0x12, 0x1F, 0xA4, 0x54, 0x01, 0xFF, 0x90, 0x81, \r
+0x83, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x12, 0x1F, 0xA4, 0x90, 0x81, 0x36, 0xF0, 0x22, 0x12, \r
+0x1F, 0xA4, 0x90, 0x81, 0x6E, 0xF0, 0x22, 0xE4, 0x90, 0x80, 0xF6, 0xF0, 0xA3, 0xF0, 0x90, 0x80, \r
+0x5E, 0xF0, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x81, 0x9E, 0x12, \r
+0x44, 0xE3, 0x90, 0x82, 0x68, 0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x1F, 0xFC, \r
+0x7F, 0xAF, 0x7E, 0x01, 0x12, 0x51, 0xCD, 0xEF, 0x60, 0x3A, 0x90, 0x81, 0x9E, 0x12, 0x44, 0xDA, \r
+0x8B, 0x13, 0x8A, 0x14, 0x89, 0x15, 0x90, 0x00, 0x0E, 0x12, 0x1F, 0xBD, 0x24, 0x02, 0xF5, 0x16, \r
+0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x2B, 0xED, 0x90, 0x81, 0x9E, 0x12, 0x44, 0xDA, 0x90, \r
+0x00, 0x0E, 0x12, 0x1F, 0xBD, 0x90, 0x01, 0xAE, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, \r
+0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0x3D, 0x10, 0xE4, 0xF5, 0x3E, 0x75, \r
+0x3F, 0x87, 0x75, 0x40, 0x03, 0x90, 0x01, 0x30, 0xE5, 0x3D, 0xF0, 0xA3, 0xE5, 0x3E, 0xF0, 0xA3, \r
+0xE5, 0x3F, 0xF0, 0xA3, 0xE5, 0x40, 0xF0, 0x22, 0x75, 0x45, 0x0E, 0x75, 0x46, 0x01, 0x75, 0x47, \r
+0x23, 0x75, 0x48, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x45, 0xF0, 0xA3, 0xE5, 0x46, 0xF0, 0xA3, 0xE5, \r
+0x47, 0xF0, 0xA3, 0xE5, 0x48, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x3D, 0xF5, 0x41, 0xA3, \r
+0xE0, 0x55, 0x3E, 0xF5, 0x42, 0xA3, 0xE0, 0x55, 0x3F, 0xF5, 0x43, 0xA3, 0xE0, 0x55, 0x40, 0xF5, \r
+0x44, 0x90, 0x01, 0x34, 0xE5, 0x41, 0xF0, 0xA3, 0xE5, 0x42, 0xF0, 0xA3, 0xE5, 0x43, 0xF0, 0xA3, \r
+0xE5, 0x44, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x45, 0xF5, 0x49, 0xA3, 0xE0, 0x55, 0x46, \r
+0xF5, 0x4A, 0xA3, 0xE0, 0x55, 0x47, 0xF5, 0x4B, 0xA3, 0xE0, 0x55, 0x48, 0xF5, 0x4C, 0x90, 0x01, \r
+0x3C, 0xE5, 0x49, 0xF0, 0xA3, 0xE5, 0x4A, 0xF0, 0xA3, 0xE5, 0x4B, 0xF0, 0xA3, 0xE5, 0x4C, 0xF0, \r
+0x53, 0x91, 0xDF, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0x82, 0x76, 0xF0, 0xE0, 0xFF, 0x30, 0xE0, \r
+0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x23, 0x90, 0x01, 0xCF, 0xE0, \r
+0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x12, 0x50, \r
+0x64, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x32, 0x1E, 0x80, 0xFE, 0x22, \r
+0xE4, 0xFF, 0x12, 0x4D, 0xB7, 0xBF, 0x01, 0x13, 0x90, 0x81, 0x2B, 0xE0, 0x60, 0x0D, 0x12, 0x47, \r
+0xF3, 0x64, 0x02, 0x60, 0x03, 0x02, 0x5E, 0xA9, 0x12, 0x47, 0xCC, 0x22, 0x90, 0x05, 0x50, 0xE0, \r
+0x44, 0x01, 0xF0, 0x12, 0x47, 0xEB, 0xFF, 0xBF, 0x03, 0x02, 0x51, 0x3D, 0x22, 0x90, 0x05, 0x21, \r
+0xE0, 0x54, 0x7F, 0xF0, 0x22, 0x51, 0xFE, 0x90, 0x81, 0x88, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, \r
+0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x4B, 0x11, 0x90, 0x81, 0x88, 0xE0, 0x30, 0xE6, \r
+0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, \r
+0x80, 0xF0, 0x90, 0x81, 0x27, 0xE0, 0x90, 0x04, 0xEC, 0x30, 0xE0, 0x06, 0xE0, 0x54, 0xDD, 0xF0, \r
+0x80, 0x04, 0xE0, 0x44, 0x22, 0xF0, 0x90, 0x81, 0x3D, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0x81, \r
+0x44, 0xE0, 0xFB, 0xAC, 0x07, 0x90, 0x81, 0x27, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x81, 0x61, 0xE0, \r
+0x24, 0x04, 0x90, 0x81, 0x40, 0xF0, 0x90, 0x81, 0x61, 0xE0, 0x24, 0x03, 0x90, 0x81, 0x3F, 0xF0, \r
+0x80, 0x0B, 0x90, 0x81, 0x40, 0x74, 0x02, 0xF0, 0x90, 0x81, 0x3F, 0x14, 0xF0, 0x90, 0x81, 0x3F, \r
+0xE0, 0xFA, 0x90, 0x81, 0x3E, 0xE0, 0xD3, 0x9A, 0x50, 0x09, 0x90, 0x81, 0x33, 0xEB, 0x51, 0xF6, \r
+0x2C, 0x80, 0x0B, 0xAD, 0x02, 0xC3, 0xED, 0x9D, 0x2B, 0x90, 0x81, 0x33, 0x51, 0xF6, 0x90, 0x81, \r
+0x43, 0xF0, 0x90, 0x81, 0x43, 0xE0, 0xFF, 0x7E, 0x00, 0x90, 0x81, 0x37, 0xEE, 0xF0, 0xA3, 0xEF, \r
+0xF0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0xF0, 0x90, 0x81, 0x40, 0xE0, 0xC3, 0x9D, 0x22, 0xE4, 0x90, \r
+0x81, 0x89, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0x90, 0x81, 0x89, 0xF0, 0x90, \r
+0x00, 0x83, 0xE0, 0xFE, 0x90, 0x81, 0x89, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x81, \r
+0x8B, 0xE0, 0x94, 0x64, 0x90, 0x81, 0x8A, 0xE0, 0x94, 0x00, 0x40, 0x08, 0x71, 0x3C, 0x90, 0x81, \r
+0x89, 0xE0, 0xFF, 0x22, 0x90, 0x81, 0x8A, 0x12, 0x52, 0x62, 0x80, 0xCB, 0x90, 0x01, 0xC0, 0xE0, \r
+0x44, 0x40, 0xF0, 0x22, 0x7F, 0xFF, 0x12, 0x4B, 0xAB, 0xE4, 0x90, 0x82, 0x6B, 0xF0, 0xA3, 0xF0, \r
+0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, \r
+0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x82, 0x6C, 0xE0, 0x94, 0xE8, 0x90, 0x82, 0x6B, 0xE0, \r
+0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, \r
+0x7E, 0x00, 0x12, 0x32, 0xAA, 0x90, 0x82, 0x6B, 0x12, 0x52, 0x62, 0x80, 0xC3, 0x90, 0x01, 0xC4, \r
+0x74, 0x8D, 0xF0, 0x74, 0x6B, 0xA3, 0xF0, 0x90, 0x00, 0x90, 0xE0, 0x20, 0xE0, 0xF9, 0x74, 0x8D, \r
+0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x6B, 0xA3, 0xF0, 0x22, 0x90, 0x81, 0x28, 0xE0, 0x44, 0x10, \r
+0xF0, 0x90, 0x81, 0x36, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x32, 0x1E, 0x90, 0x81, 0x2C, 0xE0, 0x60, \r
+0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, \r
+0x74, 0x90, 0xF0, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, 0x32, 0x1E, 0x7F, \r
+0x01, 0x12, 0x52, 0x15, 0x90, 0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x32, 0x1E, \r
+0x7F, 0x14, 0x7E, 0x00, 0x02, 0x32, 0xAA, 0x7E, 0x00, 0x7F, 0x41, 0x7D, 0x00, 0x7B, 0x01, 0x7A, \r
+0x81, 0x79, 0x27, 0x12, 0x45, 0x12, 0x90, 0x81, 0x2A, 0x74, 0x02, 0xF0, 0x90, 0x81, 0x31, 0x14, \r
+0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0x81, 0x37, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, \r
+0x91, 0x97, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x4B, 0x11, 0x7D, 0x0C, 0x7F, 0x02, 0x12, 0x4B, 0x11, \r
+0x7D, 0x0C, 0x7F, 0x01, 0x12, 0x4B, 0x11, 0x90, 0x80, 0x06, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, \r
+0x81, 0x36, 0x74, 0x99, 0xF0, 0x80, 0x29, 0xEF, 0xB4, 0x03, 0x08, 0x90, 0x81, 0x36, 0x74, 0x90, \r
+0xF0, 0x80, 0x1D, 0x90, 0x81, 0x36, 0x74, 0x40, 0xF0, 0x90, 0x00, 0x2C, 0xE0, 0x54, 0x0F, 0xFF, \r
+0xBF, 0x05, 0x08, 0x90, 0x81, 0x61, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x81, 0x61, 0xF0, \r
+0x12, 0x57, 0x14, 0x91, 0x97, 0xF0, 0x7E, 0x00, 0x7F, 0x02, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x81, \r
+0x79, 0x6C, 0x12, 0x45, 0x12, 0x91, 0xA5, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0x12, 0x47, \r
+0xC5, 0xE4, 0x90, 0x81, 0x6E, 0xF0, 0x22, 0x90, 0x81, 0x61, 0xE0, 0x24, 0x04, 0x90, 0x81, 0x43, \r
+0xF0, 0xA3, 0x74, 0x08, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0x22, 0x90, 0x82, 0x53, 0xE0, \r
+0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x82, 0x79, 0xEF, 0xF0, 0x90, 0x80, 0x09, \r
+0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x42, 0x90, 0x81, 0x2E, 0xE0, 0x64, 0x0E, 0x70, \r
+0x19, 0x90, 0x82, 0x79, 0xE0, 0x70, 0x34, 0x90, 0x81, 0x27, 0xE0, 0x54, 0x7F, 0xF0, 0x91, 0xA5, \r
+0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0x12, 0x4B, 0x11, 0x80, 0x1E, 0x90, 0x81, 0x2E, 0xE0, 0x64, 0x06, \r
+0x70, 0x19, 0x90, 0x82, 0x79, 0xE0, 0x60, 0x13, 0x90, 0x81, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0xB1, \r
+0x10, 0xF0, 0x90, 0x81, 0x2E, 0x74, 0x04, 0xF0, 0x12, 0x47, 0xC6, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0B, \r
+0x04, 0x70, 0x24, 0x90, 0x81, 0x31, 0x74, 0x02, 0xF0, 0x80, 0x13, 0xED, 0x70, 0x06, 0x90, 0x81, \r
+0x6B, 0xE0, 0x80, 0x02, 0xED, 0x14, 0x90, 0x81, 0x31, 0xF0, 0x90, 0x81, 0x31, 0xE0, 0xA3, 0xF0, \r
+0x90, 0x81, 0x28, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x81, 0x6F, 0xE0, 0x54, 0xFE, 0xF0, 0x54, \r
+0xFD, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x81, 0x6F, 0xE0, 0x54, 0xFB, 0xF0, 0x54, 0xEF, 0xF0, 0x22, \r
+0x74, 0x01, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFE, 0xEF, 0xC3, \r
+0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, \r
+0x24, 0x07, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, \r
+0x3A, 0xFA, 0xC3, 0x90, 0x80, 0xF9, 0xE0, 0x9B, 0x90, 0x80, 0xF8, 0xE0, 0x9A, 0x50, 0x09, 0xA3, \r
+0xF1, 0x01, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, 0x03, 0x74, \r
+0x00, 0x2F, 0xD1, 0xE4, 0xFF, 0x22, 0xD1, 0x61, 0xC0, 0x07, 0xD1, 0x55, 0xAD, 0x07, 0xD0, 0x07, \r
+0xD1, 0x4B, 0xD1, 0x05, 0x24, 0x06, 0xB1, 0x82, 0xEF, 0x64, 0x08, 0x70, 0x30, 0xD1, 0x00, 0xB1, \r
+0x80, 0xEF, 0x70, 0x29, 0xD1, 0x00, 0x24, 0x1D, 0xB1, 0x82, 0xBF, 0x44, 0x0B, 0xD1, 0x00, 0x24, \r
+0x1F, 0xB1, 0x82, 0xEF, 0x64, 0x43, 0x60, 0x12, 0xD1, 0x00, 0x24, 0x1D, 0xB1, 0x82, 0xBF, 0x43, \r
+0x0C, 0xD1, 0x00, 0x24, 0x1F, 0xB1, 0x82, 0xBF, 0x44, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, \r
+0x90, 0x82, 0x21, 0xE0, 0xFF, 0x90, 0x82, 0x20, 0xE0, 0x2F, 0xFF, 0x90, 0x82, 0x1F, 0xE0, 0x34, \r
+0x00, 0xCF, 0x22, 0xD1, 0x61, 0xC0, 0x07, 0xD1, 0x55, 0xAD, 0x07, 0xD0, 0x07, 0xD1, 0x4B, 0xD1, \r
+0x05, 0x24, 0x06, 0xB1, 0x82, 0xEF, 0x64, 0x08, 0x70, 0x1E, 0xD1, 0x00, 0xB1, 0x80, 0xEF, 0x64, \r
+0x06, 0x70, 0x15, 0xD1, 0x00, 0x24, 0x0E, 0xB1, 0x82, 0xEF, 0x70, 0x0C, 0xD1, 0x00, 0x24, 0x0F, \r
+0xB1, 0x82, 0xBF, 0x01, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xE4, 0xFB, 0xD1, 0x6D, 0x90, \r
+0x82, 0x21, 0xEF, 0xF0, 0x22, 0x90, 0x82, 0x1F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x01, 0xA1, \r
+0x88, 0x90, 0x82, 0x1F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0xA1, 0x88, 0xEF, 0x30, 0xE7, \r
+0x04, 0x7E, 0x02, 0x80, 0x02, 0xE4, 0xFE, 0xED, 0x30, 0xE6, 0x12, 0xEB, 0x20, 0xE0, 0x07, 0x90, \r
+0x80, 0xFF, 0xE0, 0xFC, 0x80, 0x09, 0x90, 0x81, 0x00, 0xE0, 0xFC, 0x80, 0x02, 0xE4, 0xFC, 0xEE, \r
+0x24, 0x18, 0x2C, 0xFF, 0x22, 0xFC, 0xED, 0x2C, 0xFD, 0xA1, 0x88, 0x90, 0x82, 0x1F, 0xEE, 0xF0, \r
+0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xB1, 0x88, 0xEF, 0x54, 0x0C, 0x64, 0x08, 0x70, 0x2B, 0x90, \r
+0x82, 0x22, 0xF0, 0x90, 0x82, 0x22, 0xE0, 0xFD, 0xC3, 0x94, 0x06, 0x50, 0x1D, 0x90, 0x82, 0x1F, \r
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x24, 0x10, 0xD1, 0x95, 0xEF, 0xF4, 0x60, 0x03, 0x7F, \r
+0x01, 0x22, 0x90, 0x82, 0x22, 0xE0, 0x04, 0xF0, 0x80, 0xD9, 0x7F, 0x00, 0x22, 0x24, 0x18, 0xFD, \r
+0xB1, 0x88, 0xEF, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x22, 0x24, 0x19, 0xFD, \r
+0xB1, 0x88, 0x90, 0x81, 0xBF, 0x22, 0x24, 0x04, 0xFD, 0x90, 0x81, 0xA8, 0xE0, 0x2D, 0xFD, 0xA1, \r
+0x88, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x80, 0xF8, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0x22, 0x24, 0x1A, \r
+0xFC, 0xED, 0x2C, 0xFD, 0xB1, 0x88, 0x90, 0x81, 0xA8, 0xE0, 0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34, \r
+0x81, 0x22, 0x24, 0x0A, 0xFC, 0xED, 0x2C, 0xFD, 0xB1, 0x88, 0x90, 0x81, 0xA2, 0xA3, 0xE0, 0xFE, \r
+0x90, 0x81, 0xA8, 0xE0, 0x2E, 0x24, 0x24, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, \r
+0x90, 0x81, 0xA8, 0xE0, 0x04, 0xF0, 0x22, 0x7D, 0x08, 0xE4, 0xFF, 0x02, 0x4C, 0x1A, 0x90, 0x81, \r
+0x72, 0xE0, 0x30, 0xE0, 0x34, 0x12, 0x4F, 0xD4, 0x70, 0x2F, 0x90, 0x82, 0x7B, 0xE0, 0x04, 0xF0, \r
+0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x81, 0x74, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x82, 0x7B, 0xF0, 0x90, \r
+0x81, 0x74, 0xE0, 0xFF, 0x90, 0x81, 0x73, 0xE0, 0xD3, 0x9F, 0x50, 0x0D, 0x90, 0x81, 0x75, 0xE0, \r
+0x70, 0x07, 0xE4, 0x90, 0x81, 0x74, 0xF0, 0xF1, 0x47, 0x22, 0x90, 0x02, 0x84, 0xEF, 0xF0, 0xEE, \r
+0xA3, 0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x7D, 0x7F, 0xEF, 0x5D, 0xC3, 0x60, 0x0A, 0xF1, \r
+0xAD, 0x24, 0x80, 0xFF, 0xE4, 0x3E, 0xFE, 0x80, 0x03, 0xF1, 0xAD, 0xFF, 0x22, 0x74, 0xFF, 0x9D, \r
+0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, 0x22, 0x7E, 0x00, 0x7F, 0x08, 0x7D, 0x00, \r
+0x7B, 0x01, 0x7A, 0x81, 0x79, 0x76, 0x12, 0x45, 0x12, 0x90, 0x81, 0x77, 0x74, 0x08, 0xF0, 0xA3, \r
+0x74, 0x03, 0xF0, 0x22, 0x90, 0x82, 0x1F, 0x12, 0x44, 0xE3, 0xE4, 0xFF, 0x90, 0x82, 0x25, 0xE0, \r
+0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x14, 0x90, 0x82, 0x22, 0xF1, 0xFD, 0xFE, 0x90, 0x82, 0x1F, 0xF1, \r
+0xFD, 0x6E, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x0F, 0x80, 0xE2, 0x7F, 0x01, 0x22, 0x12, 0x44, 0xDA, \r
+0x8F, 0x82, 0x75, 0x83, 0x00, 0x02, 0x1F, 0xBD, 0x12, 0x56, 0x01, 0x30, 0xE0, 0x09, 0xEF, 0xC4, \r
+0x54, 0x0F, 0x30, 0xE0, 0x02, 0xA1, 0xD7, 0x90, 0x81, 0x17, 0xE0, 0x90, 0x82, 0x01, 0xF0, 0x90, \r
+0x81, 0x18, 0xE0, 0x90, 0x82, 0x02, 0xF0, 0x90, 0x81, 0x19, 0xE0, 0x90, 0x82, 0x03, 0xF0, 0x90, \r
+0x81, 0x1A, 0xE0, 0x90, 0x82, 0x04, 0xF0, 0x90, 0x81, 0x1B, 0xE0, 0x90, 0x82, 0x05, 0xF0, 0x90, \r
+0x81, 0x08, 0xE0, 0x90, 0x82, 0x06, 0xF0, 0x90, 0x81, 0x09, 0xE0, 0x90, 0x82, 0x07, 0xF0, 0x90, \r
+0x81, 0x0A, 0xE0, 0x90, 0x82, 0x08, 0xF0, 0x90, 0x81, 0x0B, 0xE0, 0x90, 0x82, 0x09, 0xF0, 0x90, \r
+0x81, 0x0C, 0xE0, 0x90, 0x82, 0x0A, 0xF0, 0x90, 0x81, 0x0D, 0xE0, 0x90, 0x82, 0x0B, 0xF0, 0x90, \r
+0x81, 0x0E, 0xE0, 0x90, 0x82, 0x0C, 0xF0, 0x90, 0x81, 0x0F, 0xE0, 0x90, 0x82, 0x0D, 0xF0, 0x90, \r
+0x81, 0x10, 0xE0, 0x90, 0x82, 0x0E, 0xF0, 0x90, 0x81, 0x11, 0xE0, 0x90, 0x82, 0x0F, 0xF0, 0x12, \r
+0x50, 0x8A, 0x90, 0x81, 0xA9, 0xF0, 0xB1, 0xE5, 0x50, 0x04, 0xB1, 0xF2, 0x80, 0xF8, 0x90, 0x01, \r
+0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0xF1, 0x2F, 0x90, 0x81, 0x9E, 0xF0, 0xA3, 0xD1, 0xA1, 0xB1, \r
+0xE5, 0x50, 0x4B, 0x12, 0x6D, 0x60, 0x90, 0x81, 0xA9, 0xE0, 0xFE, 0x24, 0x10, 0xF5, 0x82, 0xE4, \r
+0x34, 0x82, 0xD1, 0x7C, 0xE0, 0x24, 0x45, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, \r
+0x74, 0xAB, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xD1, 0x7C, 0xE0, 0x24, 0x46, 0xF9, 0xE4, 0x34, \r
+0xFC, 0xFA, 0x7B, 0x01, 0xEE, 0xD1, 0x8C, 0x12, 0x44, 0xE3, 0xD1, 0x80, 0xE0, 0x24, 0x30, 0xF9, \r
+0xE4, 0x34, 0xFC, 0xFA, 0xEE, 0xD1, 0x27, 0x12, 0x44, 0xE3, 0xB1, 0xFF, 0x80, 0xB1, 0x90, 0x02, \r
+0x87, 0xE0, 0x70, 0x02, 0xA1, 0xD7, 0x90, 0x80, 0xFA, 0xE0, 0x20, 0xE0, 0x02, 0xA1, 0xD7, 0xC3, \r
+0x13, 0x30, 0xE0, 0x09, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0xA1, 0xD7, 0xE4, 0x90, 0x82, \r
+0x1A, 0x12, 0x50, 0x92, 0x90, 0x81, 0x9E, 0xE0, 0xFF, 0xA3, 0xE0, 0xA3, 0xCF, 0xF0, 0xA3, 0xEF, \r
+0xF0, 0x90, 0x81, 0xA0, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0x90, 0xFD, 0x11, 0xF0, 0x74, 0x01, \r
+0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0x12, 0x6E, 0xE4, \r
+0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0x90, 0x81, 0xA2, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, \r
+0x54, 0xF8, 0x90, 0x81, 0xA5, 0xF0, 0xFC, 0x74, 0x07, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, \r
+0x83, 0xE0, 0x54, 0xC0, 0x90, 0x81, 0xA7, 0xF0, 0xEC, 0x24, 0x18, 0x90, 0x81, 0xA4, 0xF0, 0xFD, \r
+0x90, 0x81, 0xA0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x6D, 0x88, 0xEF, 0x54, 0xFC, 0x90, 0x81, \r
+0xA6, 0xF0, 0x90, 0x81, 0xA5, 0xE0, 0x24, 0x18, 0xFF, 0xE4, 0x33, 0x90, 0x81, 0xA2, 0x8F, 0xF0, \r
+0x12, 0x44, 0x9F, 0x90, 0x81, 0xA2, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x6F, 0x98, 0x90, 0x81, \r
+0x9E, 0xEE, 0x8F, 0xF0, 0x12, 0x44, 0x9F, 0x90, 0x80, 0xF8, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, \r
+0x81, 0x9E, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x9F, 0xEC, 0x9E, 0x40, 0x12, 0x90, 0x80, 0xF9, \r
+0x12, 0x6F, 0x01, 0xED, 0x9F, 0xFF, 0xEC, 0x9E, 0x90, 0x81, 0x9E, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, \r
+0x81, 0x6F, 0xE0, 0x30, 0xE0, 0x09, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x02, 0xA1, 0xD0, 0x90, \r
+0x80, 0xFA, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0x61, 0xDE, 0xE4, 0x90, 0x81, 0xAA, 0xF0, 0x90, \r
+0x81, 0xA9, 0xF0, 0xB1, 0xE5, 0x50, 0x3A, 0x12, 0x6D, 0x60, 0xE4, 0x90, 0x81, 0xA8, 0xF0, 0xD1, \r
+0x19, 0x94, 0x06, 0x50, 0x19, 0xB1, 0xD8, 0x24, 0x04, 0x12, 0x6E, 0x95, 0x90, 0x81, 0xA9, 0xE0, \r
+0xD1, 0x27, 0xD1, 0xC4, 0x11, 0x02, 0xB5, 0x07, 0x05, 0x12, 0x6F, 0x40, 0x80, 0xE1, 0x90, 0x81, \r
+0xA8, 0xE0, 0xB4, 0x06, 0x08, 0x90, 0x81, 0xAA, 0x74, 0x01, 0xF0, 0x80, 0x04, 0xB1, 0xFF, 0x80, \r
+0xC2, 0x90, 0x81, 0xA6, 0xE0, 0x24, 0x60, 0x70, 0x02, 0x61, 0x90, 0x24, 0xFC, 0x70, 0x02, 0x61, \r
+0x90, 0x24, 0xF4, 0x70, 0x02, 0x61, 0x85, 0x24, 0xF0, 0x70, 0x02, 0x61, 0x90, 0x24, 0x80, 0x60, \r
+0x02, 0x61, 0xA4, 0xB1, 0xD8, 0x12, 0x6E, 0xDD, 0x60, 0x02, 0x81, 0xF6, 0xB1, 0xD8, 0x12, 0x6E, \r
+0xED, 0xD1, 0x74, 0xD1, 0x14, 0x9F, 0x50, 0x0A, 0xB1, 0xD8, 0x12, 0x6F, 0x0E, 0x12, 0x6F, 0x3C, \r
+0x80, 0xF1, 0x90, 0x81, 0xBF, 0xE0, 0x60, 0x7C, 0xE4, 0x90, 0x81, 0xA9, 0xF0, 0xB1, 0xE5, 0x50, \r
+0x5B, 0x12, 0x6D, 0x60, 0xF1, 0x17, 0x70, 0x1B, 0xD1, 0x8B, 0x12, 0x44, 0xDA, 0xC0, 0x03, 0xC0, \r
+0x02, 0xC0, 0x01, 0xD1, 0xF2, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x6F, 0xD4, 0xEF, 0x60, \r
+0x02, 0x80, 0x24, 0x90, 0x81, 0xBF, 0xE0, 0x64, 0x03, 0x70, 0x27, 0xD1, 0x45, 0xD1, 0xA9, 0x70, \r
+0x06, 0xD1, 0x45, 0xD1, 0xB2, 0x60, 0x17, 0xD1, 0xE3, 0xE0, 0x60, 0x02, 0x80, 0x04, 0xD1, 0x35, \r
+0x60, 0x05, 0x74, 0x1A, 0x2F, 0x80, 0x0D, 0xD1, 0x06, 0x74, 0x01, 0xF0, 0x80, 0x0A, 0xD1, 0x20, \r
+0x80, 0x02, 0xD1, 0x20, 0xD1, 0x0C, 0xE4, 0xF0, 0xB1, 0xFF, 0x80, 0xA1, 0x90, 0x82, 0x1A, 0xE0, \r
+0x70, 0x4F, 0xA3, 0xE0, 0x70, 0x4B, 0xA3, 0xE0, 0x70, 0x47, 0xA3, 0xE0, 0x70, 0x43, 0xA3, 0xE0, \r
+0x70, 0x3F, 0x81, 0xF6, 0xE4, 0x90, 0x81, 0xA9, 0xF0, 0xB1, 0xE5, 0x50, 0x1C, 0x74, 0x06, 0x2E, \r
+0xD1, 0x3C, 0x60, 0x09, 0x74, 0x1A, 0x2E, 0xD1, 0x0C, 0xE4, 0xF0, 0x80, 0x08, 0x74, 0x1A, 0x2E, \r
+0xD1, 0x0C, 0x74, 0x01, 0xF0, 0xB1, 0xFF, 0x80, 0xE0, 0x90, 0x82, 0x1A, 0xE0, 0x70, 0x12, 0xA3, \r
+0xE0, 0x70, 0x0E, 0xA3, 0xE0, 0x70, 0x0A, 0xA3, 0xE0, 0x70, 0x06, 0xA3, 0xE0, 0x70, 0x02, 0x81, \r
+0xF6, 0xE4, 0x90, 0x81, 0xA9, 0xF0, 0xB1, 0xE5, 0x40, 0x02, 0x81, 0xF6, 0x12, 0x6D, 0x60, 0xD1, \r
+0x06, 0xE0, 0x60, 0x1D, 0xD1, 0xD8, 0xE0, 0x70, 0x15, 0xD1, 0x58, 0xD1, 0x19, 0x94, 0x06, 0x50, \r
+0x07, 0xB1, 0xD8, 0x12, 0x6F, 0x22, 0x80, 0xF3, 0xD1, 0x9A, 0x90, 0x06, 0x35, 0xF0, 0x12, 0x47, \r
+0xC6, 0xB1, 0xFF, 0x80, 0xD1, 0x90, 0x81, 0xAA, 0xE0, 0xB4, 0x01, 0x02, 0x80, 0x49, 0xA1, 0xD0, \r
+0x90, 0x81, 0xAA, 0xE0, 0xB4, 0x01, 0x0B, 0x90, 0x80, 0xFA, 0x12, 0x65, 0x59, 0x30, 0xE0, 0x02, \r
+0x80, 0x35, 0xA1, 0xD0, 0x90, 0x81, 0xA7, 0xE0, 0x70, 0x12, 0x90, 0x81, 0xAA, 0xE0, 0xB4, 0x01, \r
+0x0B, 0x90, 0x80, 0xFA, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x02, 0xA1, 0xD0, 0xB1, 0xD8, \r
+0xFD, 0x12, 0x6E, 0x9B, 0xEF, 0x70, 0x10, 0xF1, 0x04, 0x12, 0x6E, 0x13, 0xEF, 0x70, 0x08, 0xF1, \r
+0x04, 0x12, 0x6D, 0xB6, 0xEF, 0x60, 0x05, 0x12, 0x5F, 0x3A, 0x01, 0xFE, 0xA1, 0xD0, 0x90, 0x81, \r
+0xA6, 0xE0, 0x24, 0xC0, 0x60, 0x02, 0xA1, 0x03, 0xB1, 0xD8, 0x12, 0x6E, 0xDD, 0x60, 0x02, 0x81, \r
+0xF6, 0xB1, 0xD8, 0x12, 0x6E, 0xED, 0xD1, 0x74, 0xD1, 0x14, 0x9F, 0x50, 0x0A, 0xB1, 0xD8, 0x12, \r
+0x6F, 0x0E, 0x12, 0x6F, 0x3C, 0x80, 0xF1, 0x90, 0x81, 0xBF, 0xE0, 0x60, 0x7C, 0xE4, 0x90, 0x81, \r
+0xA9, 0xF0, 0xB1, 0xE5, 0x50, 0x5B, 0x12, 0x6D, 0x60, 0xF1, 0x17, 0x70, 0x1B, 0xD1, 0x8B, 0x12, \r
+0x44, 0xDA, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xD1, 0xF2, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, \r
+0x12, 0x6F, 0xD4, 0xEF, 0x60, 0x02, 0x80, 0x24, 0x90, 0x81, 0xBF, 0xE0, 0x64, 0x03, 0x70, 0x27, \r
+0xD1, 0x45, 0xD1, 0xA9, 0x70, 0x06, 0xD1, 0x45, 0xD1, 0xB2, 0x60, 0x17, 0xD1, 0xE3, 0xE0, 0x60, \r
+0x02, 0x80, 0x04, 0xD1, 0x35, 0x60, 0x05, 0x74, 0x1A, 0x2F, 0x80, 0x0D, 0xD1, 0x06, 0x74, 0x01, \r
+0xF0, 0x80, 0x0A, 0xD1, 0x20, 0x80, 0x02, 0xD1, 0x20, 0xD1, 0x0C, 0xE4, 0xF0, 0xB1, 0xFF, 0x80, \r
+0xA1, 0x90, 0x82, 0x1A, 0xE0, 0x70, 0x4D, 0xA3, 0xE0, 0x70, 0x49, 0xA3, 0xE0, 0x70, 0x45, 0xA3, \r
+0xE0, 0x70, 0x41, 0xA3, 0xE0, 0x70, 0x3D, 0x80, 0x6D, 0xE4, 0x90, 0x81, 0xA9, 0xF0, 0xB1, 0xE5, \r
+0x50, 0x1C, 0x74, 0x06, 0x2E, 0xD1, 0x3C, 0x60, 0x09, 0x74, 0x1A, 0x2E, 0xD1, 0x0C, 0xE4, 0xF0, \r
+0x80, 0x08, 0x74, 0x1A, 0x2E, 0xD1, 0x0C, 0x74, 0x01, 0xF0, 0xB1, 0xFF, 0x80, 0xE0, 0x90, 0x82, \r
+0x1A, 0xE0, 0x70, 0x10, 0xA3, 0xE0, 0x70, 0x0C, 0xA3, 0xE0, 0x70, 0x08, 0xA3, 0xE0, 0x70, 0x04, \r
+0xA3, 0xE0, 0x60, 0x32, 0xE4, 0x90, 0x81, 0xA9, 0xF0, 0xB1, 0xE5, 0x50, 0x29, 0x12, 0x6D, 0x60, \r
+0xD1, 0x06, 0xE0, 0x60, 0x1D, 0xD1, 0xD8, 0xE0, 0x70, 0x15, 0xD1, 0x58, 0xD1, 0x19, 0x94, 0x06, \r
+0x50, 0x07, 0xB1, 0xD8, 0x12, 0x6F, 0x22, 0x80, 0xF3, 0xD1, 0x9A, 0x90, 0x06, 0x35, 0xF0, 0x12, \r
+0x47, 0xC6, 0xB1, 0xFF, 0x80, 0xD3, 0xD1, 0xBB, 0x12, 0x6F, 0x8A, 0x90, 0x06, 0x36, 0x74, 0xDD, \r
+0xF0, 0x01, 0xFE, 0x90, 0x81, 0xA7, 0xE0, 0x60, 0x02, 0xA1, 0xD0, 0xB1, 0xD8, 0x24, 0x16, 0xFD, \r
+0x12, 0x6D, 0x88, 0x90, 0x06, 0x34, 0xEF, 0xF0, 0xB1, 0xD8, 0x24, 0x17, 0xFD, 0x12, 0x6D, 0x88, \r
+0x90, 0x06, 0x37, 0xD1, 0xA1, 0xB1, 0xE5, 0x50, 0x64, 0x12, 0x6D, 0x60, 0xE4, 0x90, 0x81, 0xA8, \r
+0xF0, 0x90, 0x81, 0xA8, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x4E, 0xEF, 0x60, 0x04, 0x64, 0x01, \r
+0x70, 0x21, 0xB1, 0xD8, 0x12, 0x6E, 0xF6, 0x90, 0x81, 0xA8, 0xE0, 0xFE, 0x24, 0x44, 0xD1, 0xCE, \r
+0x90, 0x81, 0xA9, 0xE0, 0xD1, 0x27, 0x12, 0x44, 0xDA, 0x8E, 0x82, 0x11, 0x02, 0xFF, 0x74, 0x46, \r
+0x2E, 0xD1, 0xCE, 0xB1, 0xD8, 0x12, 0x6E, 0xF6, 0x90, 0x81, 0xA9, 0xE0, 0xFE, 0xD1, 0x27, 0xD1, \r
+0xC4, 0x11, 0x02, 0x6F, 0x60, 0x0E, 0x74, 0x15, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, \r
+0xE4, 0xF0, 0x80, 0x05, 0x12, 0x6F, 0x40, 0x80, 0xA8, 0xB1, 0xFF, 0x80, 0x98, 0x90, 0x82, 0x15, \r
+0xE0, 0x64, 0x01, 0x60, 0x17, 0xA3, 0xE0, 0x64, 0x01, 0x60, 0x11, 0xA3, 0xE0, 0x64, 0x01, 0x60, \r
+0x0B, 0xA3, 0xE0, 0x64, 0x01, 0x60, 0x05, 0xA3, 0xE0, 0xB4, 0x01, 0x06, 0x90, 0x81, 0xAA, 0x74, \r
+0x01, 0xF0, 0x90, 0x81, 0xAA, 0xE0, 0xB4, 0x01, 0x08, 0x12, 0x5E, 0xE4, 0x12, 0x5D, 0x08, 0x01, \r
+0xFE, 0x12, 0x50, 0x8A, 0x90, 0x81, 0xA9, 0xF0, 0xB1, 0xE5, 0x50, 0x04, 0xB1, 0xF2, 0x80, 0xF8, \r
+0xD1, 0xBB, 0x12, 0x6F, 0x8A, 0x01, 0xFE, 0x22, 0x90, 0x81, 0xA0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, \r
+0x90, 0x81, 0xA4, 0xE0, 0x22, 0x90, 0x81, 0x05, 0xE0, 0xFF, 0x90, 0x81, 0xA9, 0xE0, 0xFE, 0xC3, \r
+0x9F, 0x22, 0x74, 0x15, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, \r
+0x81, 0xA9, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x81, 0xA9, 0xE0, 0x24, 0x1A, 0xF5, 0x82, 0xE4, 0x34, \r
+0x82, 0xF5, 0x83, 0x22, 0x90, 0x81, 0xBF, 0xE0, 0xFF, 0x90, 0x81, 0xA8, 0xE0, 0xFD, 0xC3, 0x22, \r
+0x90, 0x81, 0xA9, 0xE0, 0x24, 0x1A, 0x22, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xF2, 0xF5, 0x82, 0xE4, \r
+0x34, 0x81, 0xF5, 0x83, 0x22, 0x90, 0x81, 0xA9, 0xE0, 0xFF, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, \r
+0x82, 0xF5, 0x83, 0xE0, 0x22, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xC0, 0x90, 0x82, 0x22, 0x12, 0x44, \r
+0xE3, 0x90, 0x82, 0x25, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x81, 0xA9, 0xE0, 0x24, 0x01, 0xF5, 0x82, \r
+0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0x12, 0x4D, 0x12, 0x90, 0x81, \r
+0xA2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x81, 0xA8, 0xF0, 0x22, 0xF5, 0x83, 0xEF, 0xF0, \r
+0x74, 0x10, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0x22, 0xEF, 0x75, 0xF0, 0x03, 0xA4, \r
+0x24, 0xB0, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, \r
+0x22, 0xEF, 0xF0, 0xE4, 0x90, 0x81, 0xA9, 0xF0, 0x22, 0x7A, 0x82, 0x79, 0x43, 0x12, 0x6F, 0xD4, \r
+0xEF, 0x22, 0x7A, 0x82, 0x79, 0x3F, 0x12, 0x6F, 0xD4, 0xEF, 0x22, 0x90, 0x81, 0x9E, 0xE0, 0xFE, \r
+0xA3, 0xE0, 0xFF, 0x22, 0x12, 0x44, 0xDA, 0x90, 0x81, 0xA8, 0xE0, 0xF5, 0x82, 0x22, 0xF5, 0x82, \r
+0xE4, 0x34, 0x04, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x7D, 0x43, 0x7F, 0xFF, 0x12, 0x4B, 0xAB, 0x90, \r
+0x04, 0x1D, 0x22, 0x90, 0x81, 0xA9, 0xE0, 0xFF, 0x24, 0x0B, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, \r
+0x83, 0x22, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xC0, 0x90, 0x82, 0x22, 0x12, 0x44, 0xE3, 0x90, 0x82, \r
+0x25, 0xED, 0xF0, 0x22, 0x90, 0x81, 0xA4, 0xE0, 0xFF, 0x90, 0x81, 0xA1, 0xE0, 0x2F, 0xFF, 0x90, \r
+0x81, 0xA0, 0xE0, 0x34, 0x00, 0xFE, 0x22, 0x90, 0x81, 0xA9, 0xE0, 0xFF, 0x24, 0xAB, 0xF5, 0x82, \r
+0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0x81, 0xBF, 0xE0, 0xFD, 0xEE, 0x6D, 0x22, 0xE0, \r
+0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x22, 0x90, 0x04, 0x24, 0xEF, 0xF0, 0x22, 0x90, 0x81, \r
+0x05, 0xE0, 0xFD, 0x7C, 0x00, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x20, 0x30, 0xED, 0x4C, \r
+0x70, 0x05, 0x90, 0x81, 0x12, 0x80, 0x2A, 0xED, 0x64, 0x01, 0x4C, 0x70, 0x05, 0x90, 0x81, 0x13, \r
+0x80, 0x1F, 0xED, 0x64, 0x02, 0x4C, 0x70, 0x05, 0x90, 0x81, 0x14, 0x80, 0x14, 0xED, 0x64, 0x03, \r
+0x4C, 0x70, 0x05, 0x90, 0x81, 0x15, 0x80, 0x09, 0xED, 0x64, 0x04, 0x4C, 0x70, 0x0D, 0x90, 0x81, \r
+0x16, 0xE0, 0xFF, 0xF1, 0x38, 0x90, 0x81, 0x06, 0x12, 0x52, 0x62, 0x22, 0xE0, 0x90, 0x01, 0xBA, \r
+0xF0, 0x90, 0x81, 0x2D, 0xE0, 0x90, 0x01, 0xBB, 0x22, 0x90, 0x81, 0x27, 0xE0, 0x13, 0x13, 0x13, \r
+0x54, 0x1F, 0x22, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xEF, 0x13, \r
+0x13, 0x13, 0x54, 0x1F, 0xFE, 0xEF, 0x54, 0x07, 0x22, 0x7F, 0x0A, 0x7E, 0x00, 0x02, 0x32, 0xAA, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF1, 0xCA,  \r
 };\r
-u4Byte ArrayLength_MP_8188E_FW_AP = 15226;\r
+u4Byte ArrayLength_MP_8188E_FW_AP = 14314;\r
 \r
 \r
 void\r
@@ -997,126 +940,14 @@ ODM_ReadFirmware_MP_8188E_FW_AP(
 #else\r
 \r
 \r
-u1Byte Array_MP_8188E_FW_NIC_S[] = {\r
-0xE2, 0x88, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x02, 0x22, 0x10, 0x14, 0xF6, 0x3D, 0x02, 0x00, \r
-0xCD, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x02, 0x4B, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x4C, 0x6F, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x4B, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x50, 0x15, 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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
+u1Byte Array_MP_8188E_FW_NIC[] = {\r
+0xE1, 0x88, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x09, 0x11, 0x20, 0x12, 0x0A, 0x38, 0x00, 0x00, \r
+0xEE, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x02, 0x45, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0xC1, 0xB9, 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
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0xC1, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xFC, 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
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
@@ -1128,898 +959,915 @@ u1Byte Array_MP_8188E_FW_NIC_S[] = {
 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
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x48, 0x04, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, \r
+0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x41, 0x04, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, \r
 0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, \r
-0xEC, 0x24, 0x89, 0xF8, 0xE6, 0xBC, 0x03, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, \r
-0x40, 0xCE, 0x79, 0x04, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, \r
+0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, \r
+0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, \r
 0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, \r
-0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x04, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, \r
-0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x88, 0x25, 0x0C, 0xF8, \r
-0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x03, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, \r
+0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, \r
+0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, \r
+0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, \r
 0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, \r
-0x0C, 0x24, 0x89, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x03, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, \r
-0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x88\r
+0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, \r
+0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86\r
 0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, \r
 0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, \r
-0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x88, 0xA6, \r
-0x81, 0x74, 0x03, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x04, 0xE4, 0x78, 0x80, \r
-0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x4B, 0xDE, 0x74, 0x01, 0x93, \r
+0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, \r
+0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, \r
+0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x46, 0x08, 0x74, 0x01, 0x93, \r
 0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, \r
-0x8C, 0xD2, 0xAF, 0x22, 0x03, 0xEF, 0xD3, 0x94, 0x03, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, \r
+0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, \r
 0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, \r
-0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x88, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, \r
-0xBE, 0x03, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, \r
+0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, \r
+0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, \r
 0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, \r
-0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x88, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, \r
+0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, \r
 0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, \r
-0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x88, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, \r
-0x04, 0x90, 0x4B, 0xDE, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, \r
-0x94, 0x03, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, \r
-0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x88, 0x2F, \r
-0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x48, 0x4D, 0x50, 0x2E, 0x74, 0x89, 0x2F, 0xF8, 0xE6, 0xBF, 0x03\r
-0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x88, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, \r
+0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, \r
+0x04, 0x90, 0x46, 0x08, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, \r
+0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, \r
+0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, \r
+0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x41, 0x4D, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02\r
+0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, \r
 0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, \r
-0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x89, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, \r
-0x0F, 0x74, 0x88, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, \r
+0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, \r
+0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, \r
 0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, \r
-0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x03, 0x40, 0x03, 0x7F, 0xFF, 0x22, \r
+0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, \r
 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, \r
-0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x48, 0x4C, 0x8F, 0xF0, \r
+0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x41, 0x4C, 0x8F, 0xF0, \r
 0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, \r
 0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, \r
 0x60, 0x25, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30, \r
 0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC, \r
-0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x48, 0x4D, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, \r
-0x56, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, \r
-0xC5, 0xF0, 0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xEF, \r
-0x5B, 0xFF, 0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, \r
-0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, \r
-0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xE2, 0xFC, 0x08, 0xE2, 0xFD, 0x08, 0xE2, 0xFE, 0x08, 0xE2, 0xFF, \r
-0x22, 0xE2, 0xFB, 0x08, 0xE2, 0xF9, 0x08, 0xE2, 0xFA, 0x08, 0xE2, 0xCB, 0xF8, 0x22, 0xEC, 0xF2, \r
-0x08, 0xED, 0xF2, 0x08, 0xEE, 0xF2, 0x08, 0xEF, 0xF2, 0x22, 0xA4, 0x25, 0x82, 0xF5, 0x82, 0xE5, \r
-0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, \r
-0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, \r
-0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, \r
-0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0x02, 0x4B, \r
-0x8C, 0x02, 0x48, 0xDD, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, \r
-0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, \r
-0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, \r
-0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x4B, 0xD1, 0xE4, \r
-0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, \r
-0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, \r
-0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, \r
-0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, \r
-0xBE, 0x00, 0x41, 0x82, 0x12, 0x00, 0x41, 0x82, 0x13, 0x00, 0x41, 0x82, 0x1F, 0x00, 0x58, 0xF0, \r
-0x5F, 0xDD, 0x69, 0x7E, 0x6A, 0xC2, 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, 0xE6, 0xF0, 0x74, 0x4B, 0xA3, 0xF0, 0x91, 0x35, 0x74, \r
-0xE6, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x4B, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, \r
-0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, \r
-0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x00, 0x54, 0xE0, 0x55, 0x35, 0xF5, 0x39, 0xA3, 0xE0, 0x55, \r
-0x36, 0xF5, 0x3A, 0xA3, 0xE0, 0x55, 0x37, 0xF5, 0x3B, 0xA3, 0xE0, 0x55, 0x38, 0xF5, 0x3C, 0xAD, \r
-0x39, 0x7F, 0x54, 0x12, 0x32, 0x1E, 0xAD, 0x3A, 0x7F, 0x55, 0x12, 0x32, 0x1E, 0xAD, 0x3B, 0x7F, \r
-0x56, 0x12, 0x32, 0x1E, 0xAD, 0x3C, 0x7F, 0x57, 0x12, 0x32, 0x1E, 0x53, 0x91, 0xEF, 0x22, 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
-0x6F, 0xF0, 0x74, 0x4C, 0xA3, 0xF0, 0x12, 0x72, 0x41, 0xE5, 0x41, 0x30, 0xE4, 0x04, 0x7F, 0x02, \r
-0x51, 0x27, 0xE5, 0x41, 0x30, 0xE6, 0x02, 0xF1, 0xEF, 0xE5, 0x43, 0x30, 0xE0, 0x03, 0x12, 0x72, \r
-0x9E, 0xE5, 0x43, 0x30, 0xE1, 0x03, 0x12, 0x54, 0x43, 0xE5, 0x43, 0x30, 0xE2, 0x03, 0x12, 0x53, \r
-0xF7, 0xE5, 0x43, 0x30, 0xE3, 0x03, 0x12, 0x6F, 0xB0, 0xE5, 0x43, 0x30, 0xE4, 0x03, 0x12, 0x74, \r
-0xA9, 0xE5, 0x43, 0x30, 0xE5, 0x03, 0x12, 0x6F, 0x58, 0xE5, 0x43, 0x30, 0xE6, 0x02, 0xB1, 0x0E, \r
-0xE5, 0x44, 0x30, 0xE1, 0x03, 0x12, 0x74, 0xD8, 0x74, 0x6F, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, \r
-0x4C, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, \r
-0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x80, \r
-0xDE, 0xE0, 0xB4, 0x01, 0x13, 0x90, 0x81, 0x27, 0xE0, 0x60, 0x0D, 0x90, 0x81, 0x2B, 0xE0, 0x54, \r
-0xFE, 0xF0, 0x54, 0x07, 0x70, 0x02, 0xB1, 0x29, 0x22, 0x90, 0x81, 0x1F, 0xE0, 0x90, 0x81, 0x29, \r
-0x30, 0xE0, 0x04, 0xE0, 0xFF, 0xE1, 0x6E, 0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x04, 0xE4, 0xFD, 0x7F, \r
-0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x82, 0x1D, 0xED, 0xF0, 0x90, 0x81, 0x24, \r
-0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xC1, 0x8E, 0xEE, 0xC4, 0x13, 0x13, \r
-0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xC1, 0x8E, 0x90, 0x81, 0x2A, 0xE0, 0xFE, 0x6F, 0x70, 0x02, \r
-0xC1, 0x8E, 0xEF, 0x70, 0x02, 0xC1, 0x03, 0x24, 0xFE, 0x70, 0x02, 0xC1, 0x3D, 0x24, 0xFE, 0x60, \r
-0x4A, 0x24, 0xFC, 0x70, 0x02, 0xC1, 0x78, 0x24, 0xFC, 0x60, 0x02, 0xC1, 0x8E, 0xEE, 0xB4, 0x0E, \r
-0x02, 0xF1, 0x39, 0x90, 0x81, 0x2A, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0xF1, 0x1B, 0x90, 0x81, 0x2A, \r
-0xE0, 0xB4, 0x06, 0x02, 0xD1, 0xE8, 0x90, 0x81, 0x2A, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x82, 0x1D, \r
-0xE0, 0xFF, 0x60, 0x05, 0x12, 0x7A, 0xBA, 0x80, 0x03, 0x12, 0x5F, 0xB4, 0x90, 0x81, 0x2A, 0xE0, \r
-0x64, 0x08, 0x60, 0x02, 0xC1, 0x8E, 0x12, 0x5B, 0xEB, 0xC1, 0x8E, 0x90, 0x81, 0x2A, 0xE0, 0x70, \r
-0x04, 0x7F, 0x01, 0xF1, 0x1B, 0x90, 0x81, 0x2A, 0xE0, 0xB4, 0x06, 0x02, 0xD1, 0xE8, 0x90, 0x81, \r
-0x2A, 0xE0, 0xB4, 0x0E, 0x07, 0xD1, 0x93, 0xBF, 0x01, 0x02, 0xF1, 0x39, 0x90, 0x81, 0x2A, 0xE0, \r
-0x64, 0x0C, 0x60, 0x02, 0xC1, 0x8E, 0xD1, 0x93, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xC1, 0x8E, 0xF1, \r
-0x8D, 0xC1, 0x8E, 0x90, 0x81, 0x2A, 0xE0, 0xB4, 0x0E, 0x07, 0xD1, 0x93, 0xBF, 0x01, 0x02, 0xF1, \r
-0x39, 0x90, 0x81, 0x2A, 0xE0, 0xB4, 0x06, 0x02, 0xD1, 0xE8, 0x90, 0x81, 0x2A, 0xE0, 0xB4, 0x0C, \r
-0x07, 0xD1, 0x93, 0xBF, 0x01, 0x02, 0xF1, 0x8D, 0x90, 0x81, 0x2A, 0xE0, 0x64, 0x04, 0x70, 0x5E, \r
-0x12, 0x7A, 0x0C, 0xEF, 0x64, 0x01, 0x70, 0x56, 0x12, 0x5D, 0x5A, 0x80, 0x51, 0x90, 0x81, 0x2A, \r
-0xE0, 0xB4, 0x0E, 0x07, 0xD1, 0x93, 0xBF, 0x01, 0x02, 0xF1, 0x39, 0x90, 0x81, 0x2A, 0xE0, 0xB4, \r
-0x06, 0x02, 0xD1, 0xE8, 0x90, 0x81, 0x2A, 0xE0, 0xB4, 0x0C, 0x07, 0xD1, 0x93, 0xBF, 0x01, 0x02, \r
-0xF1, 0x8D, 0x90, 0x81, 0x2A, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0xF1, 0x1B, 0x90, 0x81, 0x2A, 0xE0, \r
-0xB4, 0x04, 0x1B, 0x12, 0x7B, 0x00, 0x80, 0x16, 0x90, 0x81, 0x2A, 0xE0, 0xB4, 0x0C, 0x0F, 0x90, \r
-0x81, 0x25, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x5F, 0x55, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0xF1, 0xFC, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, \r
-0x80, 0x3D, 0x90, 0x81, 0x24, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, \r
-0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x28, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x08, 0x90, 0x01, \r
-0xB8, 0x74, 0x04, 0xF0, 0x80, 0x19, 0x90, 0x81, 0x29, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x08, 0x90, \r
-0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, \r
-0x01, 0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x81, 0x25, 0xE0, 0x90, 0x06, 0x04, 0x20, \r
-0xE0, 0x0C, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x81, 0x2A, 0x74, 0x04, 0xF0, 0x80, 0x17, 0xE0, 0x54, \r
-0x7F, 0xF0, 0x90, 0x81, 0x2A, 0x74, 0x0C, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x54, 0x7F, 0xF0, 0x90, \r
-0x81, 0x23, 0x74, 0x0C, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0x82, 0x1C, 0xEF, 0xF0, \r
-0x12, 0x5B, 0xFD, 0x90, 0x82, 0x1C, 0xE0, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x81, \r
-0x2A, 0x74, 0x04, 0xF0, 0x90, 0x81, 0x23, 0xF0, 0x22, 0x90, 0x81, 0x25, 0xE0, 0xC3, 0x13, 0x20, \r
-0xE0, 0x08, 0x90, 0x81, 0x2A, 0x74, 0x0C, 0xF0, 0x80, 0x1E, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, \r
-0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x81, 0x2A, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x44, \r
-0x80, 0xF0, 0x90, 0x81, 0x23, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0xAE, 0x07, \r
-0xF1, 0xE3, 0xBF, 0x01, 0x15, 0x90, 0x81, 0x1F, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, \r
-0x09, 0xAF, 0x06, 0x7D, 0x01, 0xB1, 0x41, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x80, 0xDE, \r
-0xE0, 0x64, 0x01, 0x70, 0x32, 0x90, 0x81, 0x25, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x22, 0x74, \r
-0x6F, 0xF0, 0x7F, 0x01, 0x12, 0x56, 0xA8, 0xBF, 0x01, 0x12, 0x90, 0x81, 0x24, 0xE0, 0x44, 0x80, \r
-0xF0, 0x90, 0x81, 0x2A, 0x74, 0x0E, 0xF0, 0x90, 0x81, 0x23, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, \r
-0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x22, 0x90, 0x81, 0x27, 0xE0, 0x64, 0x02, 0x60, 0x12, \r
-0x90, 0x81, 0x26, 0xE0, 0x54, 0x0F, 0x60, 0x0A, 0xF1, 0xFC, 0xEF, 0x70, 0x05, 0xFD, 0x7F, 0x0C, \r
-0xB1, 0x41, 0x22, 0x90, 0x05, 0x43, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0x90, \r
-0x81, 0x1F, 0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 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, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, \r
-0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, \r
-0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x15, 0xF0, 0x74, 0x50, 0xA3, 0xF0, 0x12, 0x72, 0x6E, 0xE5, \r
-0x49, 0x30, 0xE1, 0x02, 0x11, 0xC5, 0xE5, 0x49, 0x30, 0xE2, 0x03, 0x12, 0x75, 0x58, 0xE5, 0x49, \r
-0x30, 0xE3, 0x03, 0x12, 0x75, 0x94, 0xE5, 0x4A, 0x30, 0xE0, 0x03, 0x12, 0x75, 0xD0, 0xE5, 0x4A, \r
-0x30, 0xE4, 0x03, 0x12, 0x76, 0x6F, 0xE5, 0x4B, 0x30, 0xE1, 0x03, 0x12, 0x73, 0x3B, 0xE5, 0x4B, \r
-0x30, 0xE0, 0x03, 0x12, 0x72, 0xF5, 0xE5, 0x4B, 0x30, 0xE3, 0x03, 0x12, 0x76, 0x85, 0xE5, 0x4C, \r
-0x30, 0xE1, 0x05, 0x7F, 0x03, 0x12, 0x4A, 0x27, 0xE5, 0x4C, 0x30, 0xE4, 0x02, 0x11, 0xD9, 0xE5, \r
-0x4C, 0x30, 0xE5, 0x03, 0x12, 0x76, 0x86, 0xE5, 0x4C, 0x30, 0xE6, 0x03, 0x12, 0x77, 0x1C, 0x74, \r
-0x15, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x50, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, \r
-0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, \r
-0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x81, 0x27, 0xE0, 0x60, 0x03, 0x12, 0x7B, 0x98, 0x90, 0x81, \r
-0x40, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x5C, 0xEA, 0x22, 0x12, 0x7B, 0x33, 0x90, 0x81, 0x2D, 0xE0, \r
-0x14, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0x31, 0x31, 0x91, 0xBC, 0x90, 0x81, 0x42, \r
-0xE0, 0x30, 0xE0, 0x33, 0x90, 0x81, 0x44, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x81, 0x45, 0xE0, \r
-0x60, 0x05, 0x14, 0xF0, 0x02, 0x5F, 0x55, 0x90, 0x81, 0x43, 0xE0, 0x14, 0x90, 0x81, 0x45, 0xF0, \r
-0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0x12, 0x5B, 0xBB, 0x7D, 0x02, 0x7F, 0x02, 0x31, \r
-0x31, 0x7D, 0x01, 0x7F, 0x02, 0x31, 0x31, 0x22, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, \r
-0xFF, 0x74, 0x3D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
-0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x05, 0x27, \r
-0xE0, 0x90, 0x81, 0xD0, 0xF0, 0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x81, 0x1F, 0xE0, \r
-0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, \r
-0x1F, 0xA4, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x81, 0x1F, 0xF0, 0xEE, \r
-0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, 0x1F, 0xA4, 0xFE, 0x54, 0x10, 0xFD, \r
-0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x81, 0x1F, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, \r
-0x4E, 0xFF, 0xF0, 0x12, 0x1F, 0xA4, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0x90, 0x81, \r
-0x1F, 0xF0, 0xEE, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0x41, 0x77, 0xE0, 0xFF, 0x20, 0xE0, 0x02, 0x41, \r
-0x5E, 0x90, 0x81, 0xD0, 0x74, 0x21, 0xF0, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0B, 0x31, \r
-0x28, 0x90, 0x81, 0xD0, 0xE0, 0x44, 0x08, 0xF0, 0x80, 0x0C, 0xE4, 0x90, 0x81, 0x20, 0xF0, 0xA3, \r
-0xF0, 0x7D, 0x40, 0xFF, 0x71, 0x5C, 0x90, 0x81, 0x1F, 0xE0, 0xFD, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
-0x30, 0xE0, 0x07, 0x90, 0x81, 0xD0, 0xE0, 0x44, 0x12, 0xF0, 0xED, 0xC4, 0x54, 0x0F, 0x30, 0xE0, \r
-0x07, 0x90, 0x81, 0xD0, 0xE0, 0x44, 0x14, 0xF0, 0x90, 0x81, 0x1F, 0xE0, 0xC4, 0x13, 0x54, 0x07, \r
-0x30, 0xE0, 0x07, 0x90, 0x81, 0xD0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x81, 0x1F, 0xE0, 0xC4, 0x13, \r
-0x13, 0x54, 0x03, 0x30, 0xE0, 0x07, 0x90, 0x81, 0xD0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x81, 0xD0, \r
-0xE0, 0x90, 0x05, 0x27, 0xF0, 0x90, 0x81, 0x22, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0xB1, 0xA3, 0x90, \r
-0x81, 0x1F, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x04, 0x7F, 0x04, 0x80, 0x23, \r
-0x12, 0x4F, 0xE3, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80, 0x19, 0x7F, 0x02, 0x80, 0x15, 0x90, 0x81, \r
-0xD0, 0x74, 0x01, 0xF0, 0x90, 0x05, 0x27, 0xF0, 0x90, 0x81, 0x22, 0xE0, 0x64, 0x04, 0x60, 0x02, \r
-0x61, 0x4D, 0xFF, 0xB1, 0xA3, 0x61, 0x4D, 0x90, 0x81, 0x1F, 0xE0, 0xFD, 0x20, 0xE0, 0x02, 0x61, \r
-0x18, 0x90, 0x81, 0xD0, 0xE0, 0x44, 0x31, 0xF0, 0xED, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0B, \r
-0x31, 0x28, 0x90, 0x81, 0xD0, 0xE0, 0x44, 0x08, 0xF0, 0x80, 0x06, 0x7D, 0x40, 0xE4, 0xFF, 0x71, \r
-0x5C, 0x90, 0x81, 0x1F, 0xE0, 0xFD, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x81, \r
-0xD0, 0xE0, 0x44, 0x02, 0xF0, 0xED, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x81, 0xD0, 0xE0, \r
-0x44, 0x04, 0xF0, 0x90, 0x81, 0xD0, 0xE0, 0x90, 0x05, 0x27, 0xF0, 0x90, 0x81, 0x1F, 0xE0, 0xFF, \r
-0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x90, 0x81, 0x23, 0xE0, 0x64, 0x02, 0x60, 0x6D, \r
-0xE4, 0xFD, 0x7F, 0x02, 0x80, 0x23, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x81, 0x23, \r
-0xE0, 0xB4, 0x02, 0x1A, 0x12, 0x7B, 0x1A, 0x12, 0x4F, 0xE3, 0xBF, 0x01, 0x09, 0x90, 0x81, 0x29, \r
-0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x03, 0xE4, 0xFD, 0xFF, 0x12, 0x4D, 0x41, 0x80, 0x3F, 0x90, 0x81, \r
-0x2A, 0xE0, 0x90, 0x81, 0x23, 0xF0, 0x80, 0x35, 0x90, 0x81, 0xD0, 0x74, 0x01, 0xF0, 0x90, 0x05, \r
-0x27, 0xF0, 0x90, 0x81, 0x23, 0xE0, 0xB4, 0x02, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, \r
-0x81, 0x23, 0xE0, 0xB4, 0x08, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x4D, 0x41, 0x12, 0x75, 0x4F, \r
-0x90, 0x81, 0x29, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x4D, 0x41, 0x12, 0x5A, 0x64, 0xD0, 0xD0, 0x92, \r
-0xAF, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x71, 0x5C, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x3D, 0x2F, 0xF8, \r
-0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, \r
-0x83, 0xEE, 0xF0, 0x22, 0xEF, 0x70, 0x37, 0x7D, 0x78, 0x7F, 0x02, 0x71, 0x5C, 0x7D, 0x02, 0x7F, \r
-0x03, 0x71, 0x5C, 0x7D, 0xC8, 0x7F, 0x02, 0x12, 0x77, 0xE2, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, \r
-0x01, 0x3C, 0x74, 0x02, 0xF0, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x4D, 0x41, 0x90, 0x81, 0x24, 0xE0, \r
-0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, \r
-0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0x31, 0x31, 0x7D, 0x02, 0x7F, \r
-0x03, 0x31, 0x31, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x90, 0x81, 0x32, 0xA3, 0xE0, 0x90, \r
-0x05, 0x58, 0xF0, 0x90, 0x80, 0xDE, 0xE0, 0xB4, 0x01, 0x15, 0x90, 0x81, 0x25, 0xE0, 0x54, 0xFB, \r
-0xF0, 0x90, 0x81, 0x2A, 0xE0, 0x20, 0xE2, 0x0E, 0x7D, 0x01, 0x7F, 0x04, 0x02, 0x4D, 0x41, 0x90, \r
-0x81, 0x25, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x81, 0x1F, 0xE0, 0xFF, 0x30, 0xE0, 0x08, 0x90, \r
-0x81, 0x23, 0xE0, 0x64, 0x02, 0x60, 0x3B, 0x90, 0x81, 0x27, 0xE0, 0x70, 0x04, 0xEF, 0x30, 0xE0, \r
-0x0A, 0x90, 0x81, 0x2A, 0xE0, 0x64, 0x02, 0x60, 0x29, 0x91, 0xF1, 0x90, 0x81, 0x25, 0xE0, 0x13, \r
-0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x15, 0x90, 0x81, 0x2D, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, \r
-0x0B, 0x12, 0x77, 0xBE, 0x71, 0x52, 0x90, 0x81, 0x2E, 0xE0, 0x14, 0xF0, 0x90, 0x01, 0xE6, 0xE0, \r
-0x04, 0xF0, 0x22, 0x90, 0x81, 0x1F, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x81, 0x21, 0x74, 0x01, 0xF0, \r
-0x90, 0x81, 0x27, 0xE0, 0x60, 0x45, 0x90, 0x81, 0x25, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
-0x30, 0xE0, 0x12, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0x71, 0x52, 0x90, 0x81, 0x2D, 0xE0, \r
-0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x82, 0x14, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x4A, 0xA9, 0xC3, \r
-0x90, 0x82, 0x15, 0xE0, 0x94, 0x80, 0x90, 0x82, 0x14, 0xE0, 0x64, 0x80, 0x94, 0x80, 0x40, 0x0B, \r
-0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0x7D, 0xBE, 0x91, 0xBC, \r
-0x12, 0x6F, 0x96, 0x90, 0x81, 0x42, 0xE0, 0x30, 0xE0, 0x11, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, \r
-0x0A, 0x71, 0x52, 0x90, 0x81, 0x44, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x90, 0x81, 0x47, 0xE0, \r
-0x30, 0xE0, 0x2D, 0x90, 0x80, 0xDE, 0xE0, 0xB4, 0x01, 0x26, 0x90, 0x82, 0x1F, 0xE0, 0x04, 0xF0, \r
-0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x81, 0x49, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x82, 0x1F, 0xF0, 0x90, \r
-0x81, 0x49, 0xE0, 0xFF, 0x90, 0x81, 0x48, 0xE0, 0xB5, 0x07, 0x05, 0xE4, 0xA3, 0xF0, 0xD1, 0xA6, \r
-0x22, 0x90, 0x80, 0xDE, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x92, 0x90, 0x81, 0x27, 0xE0, 0x70, \r
-0x02, 0xA1, 0x92, 0x90, 0x81, 0x26, 0xE0, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x22, 0x90, 0x06, \r
-0xAB, 0xE0, 0x90, 0x81, 0x2E, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x81, 0x2D, 0xF0, 0xA3, 0xE0, \r
-0xFF, 0x70, 0x08, 0x90, 0x81, 0x2D, 0xE0, 0xFE, 0xFF, 0x80, 0x00, 0x90, 0x81, 0x2E, 0xEF, 0xF0, \r
-0x90, 0x81, 0x25, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0x90, 0x81, 0x30, 0xF0, 0x90, 0x81, 0x32, 0xA3, \r
-0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, \r
-0x90, 0x81, 0x2B, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, 0xF0, 0x90, 0x81, 0x26, 0xE0, 0xFF, 0xC4, \r
-0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x0F, 0x90, 0x81, 0x1F, 0xE0, 0x30, 0xE0, 0x05, 0x12, \r
-0x6E, 0xB1, 0x80, 0x03, 0x12, 0x6D, 0xFF, 0x90, 0x81, 0x25, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
-0x30, 0xE0, 0x0F, 0x90, 0x81, 0x2D, 0xE0, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x05, 0x12, 0x77, 0xBE, \r
-0x71, 0x58, 0x90, 0x81, 0x1F, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x07, 0x90, 0x81, 0x25, 0xE0, 0x44, \r
-0x04, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x81, 0x22, 0xE0, 0x90, 0x82, \r
-0x1E, 0xF0, 0x6F, 0x70, 0x02, 0xC1, 0xA1, 0xEF, 0x14, 0x60, 0x40, 0x14, 0x60, 0x68, 0x14, 0x70, \r
-0x02, 0xC1, 0x53, 0x14, 0x70, 0x02, 0xC1, 0x7B, 0x24, 0x04, 0x60, 0x02, 0xC1, 0xA1, 0x90, 0x82, \r
-0x1E, 0xE0, 0xFF, 0xB4, 0x04, 0x05, 0x12, 0x7C, 0x16, 0xC1, 0xA1, 0xEF, 0xB4, 0x02, 0x04, 0xF1, \r
-0xE3, 0xC1, 0xA1, 0x90, 0x82, 0x1E, 0xE0, 0xFF, 0xB4, 0x03, 0x05, 0x12, 0x7C, 0x3A, 0xC1, 0xA1, \r
-0xEF, 0x64, 0x01, 0x60, 0x02, 0xC1, 0xA1, 0xF1, 0xE5, 0xC1, 0xA1, 0x90, 0x82, 0x1E, 0xE0, 0xFF, \r
-0xB4, 0x04, 0x05, 0x12, 0x7C, 0x03, 0xC1, 0xA1, 0xEF, 0xB4, 0x02, 0x04, 0xF1, 0xD5, 0xC1, 0xA1, \r
-0x90, 0x82, 0x1E, 0xE0, 0xFF, 0xB4, 0x03, 0x05, 0x12, 0x7C, 0x2F, 0xC1, 0xA1, 0xEF, 0x60, 0x02, \r
-0xC1, 0xA1, 0xF1, 0xA9, 0x80, 0x7B, 0x90, 0x82, 0x1E, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0x5F, 0x92, \r
-0x80, 0x6F, 0x90, 0x82, 0x1E, 0xE0, 0xB4, 0x01, 0x04, 0xF1, 0x9B, 0x80, 0x64, 0x90, 0x82, 0x1E, \r
-0xE0, 0xB4, 0x03, 0x05, 0x12, 0x5F, 0x4C, 0x80, 0x58, 0x90, 0x82, 0x1E, 0xE0, 0x70, 0x52, 0xF1, \r
-0xA5, 0x80, 0x4E, 0x90, 0x82, 0x1E, 0xE0, 0xFF, 0xB4, 0x04, 0x05, 0x12, 0x7C, 0x1B, 0x80, 0x41, \r
-0xEF, 0xB4, 0x01, 0x04, 0xF1, 0xC8, 0x80, 0x39, 0xEF, 0xB4, 0x02, 0x05, 0x12, 0x5F, 0x43, 0x80, \r
-0x30, 0x90, 0x82, 0x1E, 0xE0, 0x70, 0x2A, 0xF1, 0xC6, 0x80, 0x26, 0x90, 0x82, 0x1E, 0xE0, 0xFF, \r
-0xB4, 0x03, 0x05, 0x12, 0x7C, 0x3F, 0x80, 0x19, 0xEF, 0xB4, 0x01, 0x04, 0xF1, 0xB2, 0x80, 0x11, \r
-0xEF, 0xB4, 0x02, 0x05, 0x12, 0x5F, 0xC7, 0x80, 0x08, 0x90, 0x82, 0x1E, 0xE0, 0x70, 0x02, 0xF1, \r
-0xB0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, \r
-0x53, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1F, 0x90, 0x05, 0x22, 0xE0, 0xF5, 0x56, 0x74, 0xFF, 0xF0, \r
-0x12, 0x5D, 0x7A, 0xBF, 0x01, 0x08, 0xAF, 0x53, 0x12, 0x7C, 0xFF, 0x12, 0x7C, 0x60, 0x90, 0x05, \r
-0x22, 0xE5, 0x56, 0xF0, 0x80, 0x03, 0x12, 0x7C, 0x60, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, \r
-0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x74, 0x1F, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
-0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x1D, 0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
-0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x1F, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
-0x44, 0x80, 0xF0, 0x22, 0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, \r
-0xEF, 0xF0, 0x74, 0x1F, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, \r
-0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x82, 0x17, 0xED, 0xF0, 0x90, 0x82, 0x16, \r
-0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0x7D, 0x4C, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0x82, 0x16, 0xE0, \r
-0x90, 0x04, 0x25, 0xF0, 0x90, 0x82, 0x17, 0xE0, 0x60, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x08, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
-0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, \r
-0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x5C, 0xEA, 0x90, 0x81, \r
-0x22, 0x74, 0x02, 0xF0, 0x22, 0xF1, 0xA9, 0x80, 0xF2, 0x90, 0x81, 0x22, 0x74, 0x01, 0xF0, 0x22, \r
-0xF1, 0xA9, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, \r
-0x81, 0x22, 0x74, 0x04, 0xF0, 0x22, 0xF1, 0xA9, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x90, 0x81, \r
-0x22, 0x74, 0x03, 0xF0, 0x22, 0x12, 0x5B, 0xFD, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x81, 0x22, \r
-0x04, 0xF0, 0x22, 0xF1, 0xD5, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0x81, 0x22, \r
-0xF0, 0x22, 0x90, 0x01, 0xC8, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x81, 0x79, \r
-0x56, 0x7F, 0xFF, 0xFE, 0x12, 0x2B, 0x27, 0xBF, 0x01, 0x09, 0x90, 0x81, 0x56, 0xE0, 0x64, 0x03, \r
-0x60, 0x03, 0x22, 0x01, 0xB4, 0xE4, 0x90, 0x81, 0x5B, 0xF0, 0x90, 0x81, 0x5B, 0xE0, 0xFF, 0xC3, \r
-0x94, 0x02, 0x40, 0x02, 0x01, 0xEF, 0xC3, 0x74, 0xFE, 0x9F, 0xFF, 0xE4, 0x94, 0x00, 0xFE, 0x7B, \r
-0x01, 0x7A, 0x81, 0x79, 0x57, 0x12, 0x2B, 0x27, 0xEF, 0x64, 0x01, 0x70, 0x77, 0x90, 0x81, 0x57, \r
-0xE0, 0xFF, 0x54, 0xC0, 0xFE, 0x60, 0x05, 0xEF, 0x54, 0x0C, 0x70, 0x16, 0x90, 0x81, 0x57, 0xE0, \r
-0xFF, 0x54, 0x30, 0x60, 0x67, 0xEF, 0x54, 0x03, 0x60, 0x62, 0x90, 0x81, 0x58, 0x74, 0x01, 0xF0, \r
-0x80, 0x05, 0xE4, 0x90, 0x81, 0x58, 0xF0, 0x90, 0x81, 0x58, 0xE0, 0x90, 0x81, 0x57, 0x70, 0x16, \r
-0xE0, 0xFF, 0xEE, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x81, 0x59, 0xF0, 0xEF, 0x54, 0x0C, 0x13, 0x13, \r
-0x54, 0x3F, 0xA3, 0xF0, 0x80, 0x0D, 0xE0, 0xFE, 0x54, 0x30, 0x90, 0x81, 0x59, 0xF0, 0xEE, 0x54, \r
-0x03, 0xA3, 0xF0, 0x90, 0x81, 0x59, 0xE0, 0x64, 0x30, 0x70, 0x54, 0xA3, 0xE0, 0x64, 0x02, 0x70, \r
-0x4E, 0x90, 0x00, 0xF5, 0xE0, 0x54, 0x40, 0x90, 0x81, 0x5C, 0xF0, 0xE0, 0x70, 0x41, 0xA3, 0x74, \r
-0x02, 0xF0, 0x80, 0x10, 0x90, 0x81, 0x5D, 0x74, 0x01, 0xF0, 0x80, 0x08, 0x90, 0x81, 0x5B, 0xE0, \r
-0x04, 0xF0, 0x01, 0x1A, 0x90, 0x01, 0xC4, 0x74, 0xF2, 0xF0, 0x74, 0x57, 0xA3, 0xF0, 0x90, 0x81, \r
-0x5D, 0xE0, 0x90, 0x01, 0xC8, 0xF0, 0x90, 0x81, 0x57, 0xE0, 0x90, 0x01, 0xC9, 0xF0, 0x90, 0x81, \r
-0x58, 0xE0, 0x90, 0x01, 0xCA, 0xF0, 0xE4, 0xFD, 0x7F, 0x1F, 0x12, 0x32, 0x1E, 0x80, 0xD5, 0x22, \r
-0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x32, 0x1E, 0x90, 0xFD, 0x00, 0xE0, \r
-0x54, 0xBF, 0xF0, 0x12, 0x57, 0xF2, 0x31, 0xCB, 0x12, 0x32, 0x77, 0x12, 0x71, 0x94, 0x31, 0xB2, \r
-0x7F, 0x01, 0x12, 0x49, 0x15, 0x90, 0x81, 0x46, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x49, 0x15, 0x90, \r
-0x81, 0x46, 0xE0, 0x04, 0xF0, 0x7F, 0x03, 0x12, 0x49, 0x15, 0x90, 0x81, 0x46, 0xE0, 0x04, 0xF0, \r
-0x31, 0x4F, 0x31, 0x90, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x32, 0x1E, \r
-0x75, 0x20, 0xFF, 0x31, 0xBC, 0x12, 0x71, 0xC4, 0x31, 0xD3, 0xE4, 0xFF, 0x02, 0x49, 0x9E, 0x51, \r
-0x09, 0x90, 0x80, 0x3C, 0xEF, 0xF0, 0x31, 0x61, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x02, 0x2D, \r
-0xA7, 0x12, 0x71, 0x33, 0x12, 0x71, 0x63, 0x51, 0x23, 0x51, 0x42, 0xE4, 0xF5, 0x35, 0xF5, 0x36, \r
-0xF5, 0x37, 0xF5, 0x38, 0xAD, 0x35, 0x7F, 0x50, 0x12, 0x32, 0x1E, 0xAD, 0x36, 0x7F, 0x51, 0x12, \r
-0x32, 0x1E, 0xAD, 0x37, 0x7F, 0x52, 0x12, 0x32, 0x1E, 0xAD, 0x38, 0x7F, 0x53, 0x02, 0x32, 0x1E, \r
-0x31, 0xB6, 0x31, 0xC3, 0x51, 0x64, 0x12, 0x79, 0x06, 0x31, 0xDD, 0x31, 0xE8, 0x31, 0xF7, 0x90, \r
-0x81, 0x4A, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0x22, 0xE4, 0xF5, 0x4D, 0x22, 0xE4, 0x90, 0x80, 0xDE, 0xF0, 0x22, 0x75, 0xE8, 0x03, 0x75, \r
-0xA8, 0x84, 0x22, 0xE4, 0x90, 0x80, 0xD8, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, \r
-0x01, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x0C, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x81, 0x40, \r
-0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0x90, 0x81, 0x42, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, \r
-0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x81, 0x47, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, \r
-0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0x90, 0x00, 0xF7, 0xE0, 0x20, 0xE7, 0x09, \r
-0xE0, 0x7F, 0x01, 0x20, 0xE6, 0x0C, 0x7F, 0x02, 0x22, 0x90, 0x00, 0xF7, 0xE0, 0x30, 0xE6, 0x02, \r
-0x7F, 0x03, 0x22, 0x75, 0x3D, 0x10, 0xE4, 0xF5, 0x3E, 0x75, 0x3F, 0x07, 0x75, 0x40, 0x02, 0x90, \r
-0x01, 0x30, 0xE5, 0x3D, 0xF0, 0xA3, 0xE5, 0x3E, 0xF0, 0xA3, 0xE5, 0x3F, 0xF0, 0xA3, 0xE5, 0x40, \r
-0xF0, 0x22, 0x75, 0x45, 0x0E, 0x75, 0x46, 0x01, 0x43, 0x46, 0x10, 0x75, 0x47, 0x03, 0x75, 0x48, \r
-0x62, 0x90, 0x01, 0x38, 0xE5, 0x45, 0xF0, 0xA3, 0xE5, 0x46, 0xF0, 0xA3, 0xE5, 0x47, 0xF0, 0xA3, \r
-0xE5, 0x48, 0xF0, 0x22, 0x90, 0x81, 0x1F, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, \r
-0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0xE4, 0xA3, 0xF0, \r
-0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x0C, 0xF0, 0x22, 0x31, 0x9F, 0x12, 0x1F, 0xA4, 0xFF, 0x54, \r
-0x01, 0xFE, 0x90, 0x81, 0x4A, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x14, \r
-0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x90, 0x81, 0x4B, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, \r
-0x90, 0x81, 0x4C, 0xF0, 0x22, 0x90, 0x81, 0xCD, 0x12, 0x4B, 0x1F, 0xEF, 0x12, 0x4B, 0x28, 0x5A, \r
-0xEA, 0x00, 0x5A, 0xF3, 0x01, 0x5A, 0xFB, 0x02, 0x5B, 0x03, 0x03, 0x5B, 0x0C, 0x04, 0x5B, 0x14, \r
-0x20, 0x5B, 0x1C, 0x21, 0x5B, 0x25, 0x23, 0x5B, 0x2D, 0x24, 0x5B, 0x36, 0x25, 0x5B, 0x3E, 0x26, \r
-0x5B, 0x46, 0x27, 0x5B, 0x4E, 0xC0, 0x00, 0x00, 0x5B, 0x56, 0x90, 0x81, 0xCD, 0x12, 0x4B, 0x16, \r
-0x02, 0x70, 0x9E, 0x90, 0x81, 0xCD, 0x12, 0x4B, 0x16, 0xC1, 0x95, 0x90, 0x81, 0xCD, 0x12, 0x4B, \r
-0x16, 0x81, 0x9A, 0x90, 0x81, 0xCD, 0x12, 0x4B, 0x16, 0x02, 0x7D, 0x9E, 0x90, 0x81, 0xCD, 0x12, \r
-0x4B, 0x16, 0x41, 0x89, 0x90, 0x81, 0xCD, 0x12, 0x4B, 0x16, 0xA1, 0xC2, 0x90, 0x81, 0xCD, 0x12, \r
-0x4B, 0x16, 0x02, 0x70, 0xE6, 0x90, 0x81, 0xCD, 0x12, 0x4B, 0x16, 0xE1, 0x3B, 0x90, 0x81, 0xCD, \r
-0x12, 0x4B, 0x16, 0x02, 0x51, 0x46, 0x90, 0x81, 0xCD, 0x12, 0x4B, 0x16, 0xE1, 0x62, 0x90, 0x81, \r
-0xCD, 0x12, 0x4B, 0x16, 0x80, 0x18, 0x90, 0x81, 0xCD, 0x12, 0x4B, 0x16, 0x80, 0x3C, 0x90, 0x81, \r
-0xCD, 0x12, 0x4B, 0x16, 0xE1, 0xA2, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x12, 0x1F, \r
-0xA4, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x81, 0x40, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0x90, 0x00, 0x01, \r
-0x12, 0x1F, 0xBD, 0xFE, 0x90, 0x05, 0x54, 0xE0, 0xC3, 0x9E, 0x90, 0x81, 0x41, 0xF0, 0xEF, 0x20, \r
-0xE0, 0x07, 0x71, 0xFD, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x22, 0x12, 0x1F, 0xA4, 0x54, 0x01, 0xFF, \r
-0x90, 0x81, 0x42, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x90, 0x81, \r
-0x43, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0x90, 0x81, 0x44, 0xF0, 0x90, 0x81, 0x43, 0xE0, \r
-0x90, 0x81, 0x45, 0xF0, 0x90, 0x81, 0x42, 0xE0, 0x54, 0x01, 0xFF, 0xAC, 0x07, 0xEF, 0x54, 0x01, \r
-0xFE, 0x90, 0x81, 0x42, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x90, 0x01, 0x53, 0xB4, 0x01, 0x12, \r
-0xE4, 0xF0, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x77, 0xCD, 0x90, 0x81, 0x44, 0xE0, 0x90, 0x05, 0x73, \r
-0xF0, 0x22, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, 0x12, 0x77, 0xE2, 0x71, 0xFD, 0x90, 0x05, 0x22, \r
-0xE4, 0xF0, 0x90, 0x81, 0x2A, 0x74, 0x0C, 0xF0, 0x90, 0x81, 0x23, 0xF0, 0x22, 0xD3, 0x10, 0xAF, \r
-0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, \r
-0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x7F, 0x7C, 0x7E, \r
-0x08, 0x12, 0x2D, 0x5C, 0xEC, 0x54, 0x7F, 0xFC, 0x90, 0x82, 0x0A, 0x12, 0x20, 0xCE, 0x90, 0x82, \r
-0x0A, 0x12, 0x4A, 0xD9, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xCE, 0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2E, \r
-0xA2, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xDA, 0xCC, 0xC0, 0x00, 0xC0, 0x7F, 0x8C, 0x7E, 0x08, 0x12, \r
-0x2E, 0xA2, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xDA, 0x00, 0xC0, 0x00, 0x14, 0x7F, 0x70, 0x7E, 0x0E, \r
-0x12, 0x2E, 0xA2, 0x90, 0x82, 0x02, 0x12, 0x20, 0xDA, 0x00, 0x03, 0x3E, 0x60, 0xE4, 0xFD, 0xFF, \r
-0x91, 0x77, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, 0x07, \r
-0xC0, 0x05, 0x90, 0x82, 0x02, 0x12, 0x4A, 0xD9, 0x90, 0x81, 0xEE, 0x12, 0x20, 0xCE, 0xD0, 0x05, \r
-0xD0, 0x07, 0x12, 0x6D, 0x26, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x90, 0x81, 0xD0, 0x12, 0x4B, 0x1F, 0x12, 0x1F, 0xA4, 0xFF, 0x90, 0x81, 0x1E, 0xF0, 0xBF, \r
-0x01, 0x12, 0x90, 0x81, 0xD0, 0x12, 0x4B, 0x16, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x64, 0x01, \r
-0x60, 0x23, 0x80, 0x1E, 0x90, 0x81, 0xD0, 0x12, 0x4B, 0x16, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, \r
-0x64, 0x01, 0x60, 0x11, 0x90, 0x81, 0x1F, 0xE0, 0x20, 0xE0, 0x07, 0xE4, 0xFF, 0x12, 0x55, 0xA3, \r
-0x80, 0x03, 0x12, 0x72, 0xCF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, \r
-0xB1, 0x7A, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xDA, 0xCC, 0xF0, 0x00, 0xC0, 0x7F, 0x8C, 0x7E, 0x08, \r
-0x12, 0x2E, 0xA2, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x14, 0x7F, 0x70, 0x7E, \r
-0x0E, 0x12, 0x2E, 0xA2, 0x90, 0x82, 0x02, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xFD, \r
-0xFF, 0x91, 0x77, 0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2D, 0x5C, 0xEC, 0x44, 0x80, 0xFC, 0x90, 0x82, \r
-0x0E, 0x12, 0x20, 0xCE, 0x90, 0x82, 0x0E, 0x12, 0x4A, 0xD9, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xCE, \r
-0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, \r
-0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0x22, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, \r
-0xB1, 0x7A, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x51, 0x31, 0x91, 0xF0, \r
-0xE4, 0x90, 0x81, 0x2A, 0xF0, 0x90, 0x81, 0x23, 0xF0, 0x22, 0xE4, 0x90, 0x82, 0x18, 0xF0, 0xA3, \r
-0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, \r
-0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x82, 0x19, 0xE0, 0x94, 0xE8, 0x90, 0x82, 0x18, \r
-0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, \r
-0x32, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0x90, 0x82, 0x18, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x4A, 0xA9, \r
-0x80, 0xBF, 0x90, 0x81, 0xD0, 0x12, 0x4B, 0x1F, 0x90, 0x81, 0xD0, 0x12, 0x4B, 0x16, 0x90, 0x81, \r
-0xD3, 0x12, 0x4B, 0x1F, 0x90, 0x81, 0xD0, 0x12, 0x4B, 0x16, 0x90, 0x00, 0x05, 0x12, 0x1F, 0xBD, \r
-0x90, 0x81, 0x3F, 0xF0, 0x90, 0x81, 0xD3, 0x12, 0x4B, 0x16, 0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x7F, \r
-0x90, 0x81, 0x27, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90, 0x00, 0x01, \r
-0x12, 0x1F, 0xBD, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x81, 0x26, 0xE0, 0x54, 0xF0, \r
-0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0xBD, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0x81, 0x24, \r
-0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x81, 0x26, 0xE0, \r
-0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0xBD, 0x90, 0x81, 0x29, 0xF0, 0xD1, 0x65, \r
-0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x90, 0x81, 0x27, 0xE0, 0x90, 0x01, \r
-0xBA, 0xF0, 0x90, 0x81, 0x29, 0xE0, 0x90, 0x01, 0xBB, 0xF0, 0x90, 0x81, 0x26, 0xE0, 0x54, 0x0F, \r
-0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0x81, 0xD6, 0x12, 0x4B, 0x1F, 0xF1, 0x81, 0x90, 0x81, 0x27, \r
-0xE0, 0xFF, 0x12, 0x53, 0x74, 0x90, 0x81, 0x27, 0xE0, 0x60, 0x19, 0x90, 0x81, 0xD6, 0x12, 0x4B, \r
-0x16, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x54, 0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, \r
-0xFD, 0x12, 0x79, 0xDB, 0x22, 0x90, 0x81, 0xD0, 0x12, 0x4B, 0x1F, 0x90, 0x00, 0x01, 0x12, 0x1F, \r
-0xBD, 0xFF, 0xFE, 0x12, 0x1F, 0xA4, 0xFD, 0xC3, 0x13, 0x30, 0xE0, 0x12, 0x90, 0x81, 0xD0, 0x12, \r
-0x4B, 0x16, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0x90, 0x81, 0xD4, 0xF0, 0x80, 0x05, 0x90, 0x81, \r
-0xD4, 0xEF, 0xF0, 0x90, 0x81, 0xD3, 0xEE, 0xF0, 0x90, 0x81, 0xD4, 0xE0, 0xFE, 0x90, 0x81, 0xD3, \r
-0xE0, 0xFF, 0xD3, 0x9E, 0x50, 0x38, 0x90, 0x81, 0xD0, 0x12, 0x4B, 0x16, 0x12, 0x1F, 0xA4, 0x54, \r
-0x01, 0xFE, 0x74, 0xDE, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0xDE, \r
-0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE0, 0x70, 0x04, 0xF1, 0x3A, 0x80, 0x07, 0x90, \r
-0x81, 0xD3, 0xE0, 0xFF, 0xF1, 0x39, 0x90, 0x81, 0xD3, 0xE0, 0x04, 0xF0, 0x80, 0xBA, 0x90, 0x80, \r
-0xDE, 0xE0, 0x70, 0x24, 0x90, 0x81, 0x2A, 0xE0, 0x70, 0x04, 0xFF, 0x12, 0x4F, 0x1B, 0x90, 0x81, \r
-0x2A, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0xF1, 0xB4, 0x90, 0x81, 0x24, 0xE0, 0x54, 0xF7, 0xF0, 0x54, \r
-0xEF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x22, 0x22, 0x12, 0x1F, 0xA4, 0x90, 0x81, \r
-0x31, 0xF0, 0x22, 0x71, 0xFD, 0x90, 0x81, 0x22, 0x74, 0x03, 0xF0, 0x22, 0x91, 0xF0, 0x90, 0x81, \r
-0x22, 0x74, 0x02, 0xF0, 0x22, 0x91, 0xEA, 0x90, 0x81, 0x2A, 0x74, 0x08, 0xF0, 0x90, 0x81, 0x23, \r
-0xF0, 0x22, 0x12, 0x1F, 0xA4, 0x90, 0x81, 0x3E, 0xF0, 0x90, 0x81, 0x3E, 0xE0, 0x90, 0x01, 0xE7, \r
-0xF0, 0x22, 0x90, 0x81, 0x40, 0xE0, 0x30, 0xE0, 0x07, 0x71, 0xFD, 0x90, 0x05, 0x22, 0xE4, 0xF0, \r
-0x22, 0x90, 0x81, 0x24, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x81, 0x30, 0xF0, 0x90, 0x81, 0x2B, \r
-0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x91, 0xEA, 0x90, 0x81, 0x22, 0x74, 0x02, \r
-0xF0, 0x22, 0x12, 0x1F, 0xA4, 0x90, 0x81, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x90, \r
-0x81, 0x50, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, \r
-0x90, 0x81, 0x2A, 0x74, 0x0C, 0xF0, 0x22, 0x71, 0xFD, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, \r
-0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x81, 0x22, 0x74, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0x81, \r
-0x5E, 0xF0, 0x90, 0x81, 0x5E, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xDD, 0x90, 0x01, 0xC4, 0xF0, 0x74, \r
-0x5F, 0xA3, 0xF0, 0x90, 0x81, 0x27, 0xE0, 0x60, 0x0F, 0x90, 0x81, 0x2A, 0xE0, 0xFF, 0x90, 0x81, \r
-0x29, 0xE0, 0x6F, 0x60, 0x03, 0x12, 0x4D, 0x29, 0xC2, 0xAF, 0x12, 0x72, 0x1A, 0xBF, 0x01, 0x02, \r
-0x11, 0x23, 0xD2, 0xAF, 0xF1, 0xD6, 0x12, 0x32, 0x9E, 0xBF, 0x01, 0x02, 0x31, 0x24, 0x12, 0x48, \r
-0x4D, 0x80, 0xBF, 0x90, 0x81, 0x24, 0xE0, 0x30, 0xE0, 0x23, 0x90, 0x81, 0x1F, 0xE0, 0xFF, 0x30, \r
-0xE0, 0x19, 0xC3, 0x13, 0x30, 0xE0, 0x08, 0x12, 0x7C, 0x53, 0xBF, 0x01, 0x10, 0x80, 0x0A, 0x90, \r
-0x81, 0x23, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x04, 0x80, 0x03, 0x11, 0x5E, 0x22, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x11, 0xDF, 0x11, 0x77, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x81, \r
-0x2A, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x0E, 0x12, 0x7A, 0x8C, 0xBF, 0x01, 0x08, 0x11, 0x4E, \r
-0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, 0x22, 0xF1, 0xD7, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, \r
-0x7F, 0x08, 0x12, 0x32, 0x1E, 0xE4, 0xFF, 0x8F, 0x50, 0xE4, 0x90, 0x81, 0x5F, 0xF0, 0xA3, 0xF0, \r
-0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0xEF, 0x65, 0x50, 0x60, 0x3E, \r
-0xC3, 0x90, 0x81, 0x60, 0xE0, 0x94, 0x88, 0x90, 0x81, 0x5F, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, \r
-0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x81, 0x5F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x4A, \r
-0xA9, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0xD3, 0x90, 0x81, 0x60, 0xE0, 0x94, 0x32, 0x90, \r
-0x81, 0x5F, 0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB2, 0x22, 0x90, \r
-0x81, 0x31, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x32, 0x1E, 0x90, 0x81, 0x28, 0xE0, 0x60, 0x12, 0x90, \r
-0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, \r
-0xF0, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, 0x32, 0x1E, 0x7F, 0x01, 0x11, \r
-0x87, 0x90, 0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x32, 0x1E, 0x7F, 0x14, 0x7E, \r
-0x00, 0x02, 0x32, 0xAA, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x2D, 0xA7, 0xE4, 0xF5, \r
-0x52, 0x12, 0x32, 0x9E, 0xEF, 0x60, 0x71, 0x63, 0x52, 0x01, 0xE5, 0x52, 0x24, 0x24, 0x90, 0x01, \r
-0xC4, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0x90, 0x00, 0x88, 0xE0, 0xF5, 0x50, 0xF5, 0x51, 0x54, 0x0F, \r
-0x60, 0xDF, 0xE5, 0x50, 0x30, 0xE0, 0x0B, 0x20, 0xE4, 0x03, 0x12, 0x29, 0xC5, 0x53, 0x51, 0xEE, \r
-0x80, 0x3D, 0xE5, 0x50, 0x30, 0xE1, 0x16, 0x20, 0xE5, 0x0E, 0x12, 0x11, 0xBD, 0xEF, 0x70, 0x03, \r
-0x43, 0x51, 0x20, 0x90, 0x01, 0x06, 0xE4, 0xF0, 0x53, 0x51, 0xFD, 0x80, 0x22, 0xE5, 0x50, 0x30, \r
-0xE2, 0x0A, 0x20, 0xE6, 0x02, 0x91, 0x2F, 0x53, 0x51, 0xFB, 0x80, 0x13, 0xE5, 0x50, 0x30, 0xE3, \r
-0x0E, 0x20, 0xE7, 0x08, 0x31, 0xAD, 0xEF, 0x70, 0x03, 0x43, 0x51, 0x80, 0x53, 0x51, 0xF7, 0xAD, \r
-0x51, 0x7F, 0x88, 0x12, 0x32, 0x1E, 0x80, 0x89, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x78, 0x10, 0x74, \r
-0x01, 0xF2, 0x90, 0x02, 0x09, 0xE0, 0x78, 0x00, 0xF2, 0x08, 0x74, 0x20, 0xF2, 0x18, 0xE2, 0xFF, \r
-0x30, 0xE0, 0x05, 0x08, 0xE2, 0x24, 0x80, 0xF2, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x78, \r
-0x01, 0xE2, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x78, 0x03, 0xF2, 0x64, \r
-0x04, 0x60, 0x0D, 0xE2, 0xFF, 0x64, 0x08, 0x60, 0x07, 0xEF, 0x64, 0x0C, 0x60, 0x02, 0x81, 0x1D, \r
-0xE4, 0x78, 0x02, 0xF2, 0x78, 0x03, 0xE2, 0xFF, 0x18, 0xE2, 0xC3, 0x9F, 0x50, 0x2D, 0xE2, 0xFD, \r
-0x18, 0xE2, 0x2D, 0x90, 0x81, 0x5F, 0xF0, 0xE0, 0xFF, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
-0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x04, 0x2D, 0xF8, 0xEE, 0xF2, 0xEF, 0xB4, 0xFF, 0x06, 0x90, 0xFD, \r
-0x10, 0xE0, 0x04, 0xF0, 0x78, 0x02, 0xE2, 0x04, 0xF2, 0x80, 0xC9, 0x78, 0x04, 0xE2, 0x78, 0x12, \r
-0xF2, 0xFF, 0x78, 0x05, 0xE2, 0x78, 0x11, 0xF2, 0x78, 0x06, 0xE2, 0x78, 0x13, 0xF2, 0x78, 0x07, \r
-0xE2, 0x78, 0x14, 0xF2, 0x78, 0x08, 0xE2, 0x78, 0x33, 0xF2, 0x78, 0x09, 0xE2, 0x78, 0x34, 0xF2, \r
-0x78, 0x0A, 0xE2, 0x78, 0x35, 0xF2, 0x78, 0x0B, 0xE2, 0x78, 0x36, 0xF2, 0x78, 0x0C, 0xE2, 0x78, \r
-0x37, 0xF2, 0x78, 0x0D, 0xE2, 0x78, 0x38, 0xF2, 0x78, 0x0E, 0xE2, 0x78, 0x39, 0xF2, 0x78, 0x0F, \r
-0xE2, 0x78, 0x3A, 0xF2, 0xE4, 0x78, 0x15, 0xF2, 0xEF, 0x24, 0xF8, 0x60, 0x75, 0x24, 0xFC, 0x60, \r
-0x6C, 0x24, 0x08, 0x60, 0x02, 0x61, 0xFF, 0x78, 0x11, 0xE2, 0xB4, 0x01, 0x05, 0x12, 0x29, 0xC5, \r
-0x81, 0x04, 0x78, 0x11, 0xE2, 0xB4, 0x02, 0x05, 0x12, 0x11, 0xBD, 0x81, 0x04, 0x78, 0x11, 0xE2, \r
-0xB4, 0x03, 0x04, 0x91, 0x2F, 0x81, 0x04, 0x78, 0x11, 0xE2, 0xB4, 0x10, 0x17, 0x78, 0x14, 0xE2, \r
-0xFE, 0x18, 0xE2, 0xFD, 0xED, 0xFF, 0x78, 0x16, 0xEE, 0xF2, 0xFE, 0x08, 0xEF, 0xF2, 0xFF, 0x12, \r
-0x32, 0xAA, 0x81, 0x04, 0x78, 0x11, 0xE2, 0xB4, 0x11, 0x17, 0x78, 0x14, 0xE2, 0xFE, 0x18, 0xE2, \r
-0xFD, 0xED, 0xFF, 0x78, 0x16, 0xEE, 0xF2, 0xFE, 0x08, 0xEF, 0xF2, 0xFF, 0x12, 0x32, 0x06, 0x81, \r
-0x04, 0x78, 0x11, 0xE2, 0xF4, 0x60, 0x02, 0x81, 0x04, 0x18, 0xF2, 0x81, 0x04, 0x78, 0x15, 0x74, \r
-0x01, 0xF2, 0x78, 0x11, 0xE2, 0x64, 0x07, 0x60, 0x02, 0x61, 0xE9, 0x78, 0x34, 0xE2, 0xFF, 0xE4, \r
-0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12, 0x20, 0xBB, 0xC0, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, \r
-0x78, 0x33, 0xE2, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xD0, 0x00, 0x12, 0x4A, 0xCC, 0xC0, 0x04, 0xC0, \r
-0x05, 0xC0, 0x06, 0xC0, 0x07, 0x78, 0x35, 0xE2, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x10, 0x12, \r
-0x20, 0xBB, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x4A, 0xCC, 0x78, 0x18, 0x12, \r
-0x4A, 0xFE, 0x78, 0x15, 0xE2, 0x70, 0x02, 0x61, 0xD2, 0x18, 0xE2, 0xFF, 0x18, 0xE2, 0xFD, 0x91, \r
-0x20, 0x78, 0x1C, 0x12, 0x4A, 0xFE, 0x78, 0x38, 0xE2, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, \r
-0x12, 0x20, 0xBB, 0xC0, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x78, 0x37, 0xE2, 0xFF, 0xE4, \r
-0xFC, 0xFD, 0xFE, 0xD0, 0x00, 0x12, 0x4A, 0xCC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, \r
-0x78, 0x39, 0xE2, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x10, 0x12, 0x20, 0xBB, 0xD0, 0x03, 0xD0, \r
-0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x4A, 0xCC, 0x78, 0x20, 0x12, 0x4A, 0xFE, 0x78, 0x20, 0x12, \r
-0x4A, 0xE5, 0x12, 0x20, 0x9B, 0x78, 0x1C, 0x12, 0x4A, 0xF1, 0x12, 0x4A, 0xBF, 0xC0, 0x04, 0xC0, \r
-0x05, 0xC0, 0x06, 0xC0, 0x07, 0x78, 0x18, 0x12, 0x4A, 0xE5, 0x78, 0x20, 0x12, 0x4A, 0xF1, 0x12, \r
-0x4A, 0xBF, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x4A, 0xCC, 0x78, 0x18, 0x12, \r
-0x4A, 0xFE, 0x78, 0x18, 0x12, 0x4A, 0xE5, 0x90, 0x82, 0x02, 0x12, 0x20, 0xCE, 0x78, 0x13, 0xE2, \r
-0xFD, 0x08, 0xE2, 0xFF, 0x12, 0x5C, 0x77, 0x80, 0x1B, 0x78, 0x13, 0xE2, 0xFF, 0x08, 0xE2, 0xFD, \r
-0x78, 0x11, 0xE2, 0xFB, 0x78, 0x15, 0xE2, 0x90, 0x81, 0xC1, 0xF0, 0xF1, 0xDF, 0x80, 0x05, 0x78, \r
-0x10, 0x74, 0x02, 0xF2, 0x78, 0x10, 0xE2, 0xFF, 0xC3, 0x94, 0x02, 0x50, 0x10, 0xEF, 0x60, 0x0A, \r
-0x78, 0x02, 0xE2, 0xFF, 0x18, 0xE2, 0x2F, 0xF2, 0x21, 0xCF, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x6B, 0xE7, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, \r
-0x90, 0x81, 0x6F, 0xF0, 0x90, 0x87, 0x5F, 0xE0, 0x90, 0x81, 0x6E, 0xF0, 0xE4, 0x90, 0x81, 0x7B, \r
-0xF0, 0x90, 0x81, 0x6B, 0xF0, 0x90, 0x81, 0x6B, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x15, 0x74, \r
-0x7E, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x90, 0x81, 0x6B, 0xE0, \r
-0x04, 0xF0, 0x80, 0xE1, 0xE4, 0x90, 0x81, 0x6B, 0xF0, 0x90, 0x81, 0x6E, 0xE0, 0xFF, 0x90, 0x81, \r
-0x6B, 0xE0, 0xFE, 0xC3, 0x9F, 0x40, 0x02, 0xA1, 0x39, 0x74, 0xDF, 0x2E, 0xF9, 0xE4, 0x34, 0x86, \r
-0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, 0x0A, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0x60, \r
-0x12, 0x2B, 0xED, 0x90, 0x81, 0x61, 0xE0, 0xFF, 0x12, 0x2F, 0x27, 0xEF, 0x04, 0x90, 0x81, 0x7B, \r
-0xF0, 0x90, 0x81, 0x60, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x31, 0xEA, 0xEF, 0x24, 0xC8, 0x90, \r
-0x81, 0x7D, 0xF0, 0x75, 0xF0, 0x08, 0xA4, 0xF0, 0x90, 0x81, 0x61, 0xE0, 0x54, 0x0F, 0x90, 0x81, \r
-0x7C, 0xF0, 0xE4, 0x90, 0x81, 0x6A, 0xF0, 0x90, 0x81, 0x6C, 0xF0, 0x90, 0x81, 0x6C, 0xE0, 0xFF, \r
-0xC3, 0x94, 0x04, 0x50, 0x57, 0x90, 0x81, 0x7C, 0xE0, 0xFE, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, \r
-0x13, 0xD8, 0xFC, 0x20, 0xE0, 0x3E, 0x90, 0x81, 0x6C, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0x81, 0x7D, \r
-0xE0, 0x2F, 0x24, 0x7E, 0xF9, 0xE4, 0x34, 0x81, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x01, 0x90, \r
-0x81, 0x6A, 0xE0, 0x75, 0xF0, 0x02, 0xA4, 0x24, 0x62, 0xF9, 0x74, 0x81, 0x35, 0xF0, 0x8B, 0x13, \r
-0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, 0x02, 0xD0, 0x01, 0xD0, 0x03, 0x12, 0x2B, 0xED, 0x90, 0x81, \r
-0x6A, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x6C, 0xE0, 0x04, 0xF0, 0x80, 0x9F, 0x90, 0x81, 0x7B, 0xE0, \r
-0xFF, 0x90, 0x81, 0x6B, 0xE0, 0x2F, 0xF0, 0x81, 0x69, 0xE4, 0x90, 0x81, 0x6F, 0xF0, 0x90, 0x81, \r
-0x6F, 0xE0, 0xC3, 0x94, 0x40, 0x40, 0x02, 0xE1, 0xD5, 0xE0, 0xFF, 0x24, 0x7E, 0xF5, 0x82, 0xE4, \r
-0x34, 0x81, 0xF5, 0x83, 0xE0, 0x90, 0x81, 0x71, 0xF0, 0xE0, 0xFE, 0x54, 0xF0, 0xC4, 0x54, 0x0F, \r
-0xFD, 0x90, 0x81, 0x70, 0xF0, 0xEE, 0x54, 0x0F, 0xFE, 0xA3, 0xF0, 0x74, 0x7F, 0x2F, 0xF5, 0x82, \r
-0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0x90, 0x81, 0x72, 0xF0, 0xFC, 0xEE, 0xFE, 0xEC, 0xFB, 0xEB, \r
-0xFF, 0x90, 0x81, 0x77, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xED, 0x12, 0x4B, 0x28, 0x65, 0xB2, 0x00, \r
-0x65, 0xE9, 0x01, 0x66, 0x9A, 0x02, 0x67, 0xC6, 0x03, 0x66, 0xB5, 0x04, 0x66, 0xD6, 0x05, 0x66, \r
-0xD6, 0x06, 0x66, 0xD6, 0x07, 0x66, 0xD6, 0x08, 0x67, 0x5A, 0x09, 0x67, 0x90, 0x0A, 0x00, 0x00, \r
-0x67, 0xD5, 0x90, 0x81, 0x6F, 0xE0, 0xFD, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, \r
-0xE0, 0xFE, 0x74, 0x80, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0xFD, 0xED, 0xFF, \r
-0x90, 0x81, 0x79, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0x90, 0x81, 0x72, 0xE0, 0xFF, 0x12, 0x2F, \r
-0x96, 0x90, 0x81, 0x6D, 0x74, 0x02, 0xF0, 0xE1, 0xC6, 0x90, 0x81, 0x6F, 0xE0, 0x24, 0x81, 0xF5, \r
-0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12, 0x20, \r
-0xBB, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x81, 0x6F, 0xE0, 0x24, 0x80, 0xF5, \r
-0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x12, 0x4A, 0xCC, 0xC0, \r
-0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x81, 0x6F, 0xE0, 0x24, 0x82, 0xF5, 0x82, 0xE4, \r
-0x34, 0x81, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x10, 0x12, 0x20, 0xBB, 0xD0, \r
-0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x4A, 0xCC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, \r
-0xC0, 0x07, 0x90, 0x81, 0x6F, 0xE0, 0x24, 0x83, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, \r
-0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x18, 0x12, 0x20, 0xBB, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, \r
-0xD0, 0x00, 0x12, 0x4A, 0xCC, 0x90, 0x81, 0x73, 0x12, 0x20, 0xCE, 0x90, 0x81, 0x73, 0x12, 0x4A, \r
-0xD9, 0x90, 0x85, 0x96, 0x12, 0x20, 0xCE, 0x90, 0x81, 0x77, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, \r
-0x2E, 0xE4, 0x90, 0x81, 0x6D, 0x74, 0x04, 0xF0, 0xE1, 0xC6, 0x90, 0x81, 0x72, 0xE0, 0xFD, 0x90, \r
-0x81, 0x6F, 0xE0, 0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, \r
-0x12, 0x30, 0xC7, 0x80, 0x19, 0x90, 0x81, 0x72, 0xE0, 0xFD, 0x90, 0x81, 0x6F, 0xE0, 0x24, 0x80, \r
-0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x30, 0x6A, 0x90, 0x81, \r
-0x6D, 0x74, 0x01, 0xF0, 0xE1, 0xC6, 0x90, 0x81, 0x6D, 0x74, 0x02, 0xF0, 0x90, 0x81, 0x6F, 0xE0, \r
-0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, \r
-0x08, 0x12, 0x20, 0xBB, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x81, 0x6F, 0xE0, \r
-0x24, 0x80, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x12, \r
-0x4A, 0xCC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x81, 0x71, 0xE0, 0xFF, 0xE4, \r
-0xFC, 0xFD, 0xFE, 0x78, 0x10, 0x12, 0x20, 0xBB, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, \r
-0x12, 0x4A, 0xCC, 0x90, 0x81, 0x73, 0x12, 0x20, 0xCE, 0x90, 0x81, 0x70, 0xE0, 0x24, 0xFB, 0xFF, \r
-0xC0, 0x07, 0x90, 0x81, 0x73, 0x12, 0x4A, 0xD9, 0x90, 0x82, 0x02, 0x12, 0x20, 0xCE, 0x90, 0x81, \r
-0x72, 0xE0, 0xFD, 0xD0, 0x07, 0x12, 0x5C, 0x77, 0x80, 0x6C, 0x90, 0x81, 0x6D, 0x74, 0x01, 0xF0, \r
-0x90, 0x81, 0x6F, 0xE0, 0x24, 0x80, 0xF9, 0xE4, 0x34, 0x81, 0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, \r
-0x15, 0x75, 0x16, 0x01, 0x7B, 0xFE, 0x7A, 0x80, 0x79, 0x33, 0x12, 0x2B, 0xED, 0x90, 0x81, 0x72, \r
-0xE0, 0xFF, 0x90, 0x81, 0x71, 0xE0, 0xFD, 0xE4, 0x90, 0x81, 0xC1, 0xF0, 0x7B, 0x04, 0x80, 0x34, \r
-0x90, 0x81, 0x6D, 0x74, 0x04, 0xF0, 0x90, 0x81, 0x6F, 0xE0, 0x24, 0x80, 0xF9, 0xE4, 0x34, 0x81, \r
-0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, 0x04, 0x7B, 0xFE, 0x7A, 0x80, 0x79, 0x33, \r
-0x12, 0x2B, 0xED, 0x90, 0x81, 0x72, 0xE0, 0xFF, 0x90, 0x81, 0x71, 0xE0, 0xFD, 0xE4, 0x90, 0x81, \r
-0xC1, 0xF0, 0x7B, 0x06, 0xF1, 0xDF, 0x90, 0x81, 0x6D, 0xE0, 0x24, 0x02, 0xFF, 0x90, 0x81, 0x6F, \r
-0xE0, 0x2F, 0xF0, 0xA1, 0x3E, 0x22, 0x22, 0x90, 0x00, 0x90, 0xE0, 0x20, 0xE0, 0xF9, 0x22, 0xAC, \r
-0x07, 0xED, 0xAD, 0x04, 0x78, 0x24, 0xF2, 0xED, 0x08, 0xF2, 0xEB, 0xB4, 0x04, 0x07, 0x78, 0x27, \r
-0x74, 0x01, 0xF2, 0x80, 0x0E, 0xEB, 0x78, 0x27, 0xB4, 0x05, 0x05, 0x74, 0x02, 0xF2, 0x80, 0x03, \r
-0x74, 0x04, 0xF2, 0xD3, 0x78, 0x25, 0xE2, 0x94, 0xFF, 0x18, 0xE2, 0x94, 0x00, 0x50, 0x63, 0xE4, \r
-0x78, 0x26, 0xF2, 0x78, 0x27, 0xE2, 0xFF, 0x18, 0xE2, 0xFE, 0xC3, 0x9F, 0x40, 0x02, 0x21, 0x7D, \r
-0x74, 0x33, 0x2E, 0xF8, 0xE2, 0x78, 0x28, 0xF2, 0x90, 0x81, 0xC1, 0xE0, 0x60, 0x2D, 0x74, 0x37, \r
-0x2E, 0xF8, 0xE2, 0x78, 0x32, 0xF2, 0xEE, 0xFF, 0x78, 0x25, 0xE2, 0x2F, 0xFF, 0x18, 0xE2, 0x34, \r
-0x00, 0x8F, 0x82, 0xF5, 0x83, 0xE0, 0x78, 0x29, 0xF2, 0x78, 0x32, 0xE2, 0xFF, 0xF4, 0xFE, 0x78, \r
-0x29, 0xE2, 0x5E, 0xFE, 0x18, 0xE2, 0xFD, 0xEF, 0x5D, 0x4E, 0xF2, 0x78, 0x24, 0x08, 0xE2, 0xFF, \r
-0x08, 0xE2, 0x2F, 0xFF, 0x78, 0x28, 0xE2, 0xFD, 0x12, 0x32, 0x1E, 0x78, 0x26, 0xE2, 0x04, 0xF2, \r
-0x80, 0xA1, 0xD3, 0x78, 0x25, 0xE2, 0x94, 0xFF, 0x18, 0xE2, 0x94, 0x07, 0x50, 0x69, 0xE4, 0x78, \r
-0x26, 0xF2, 0x78, 0x27, 0xE2, 0xFF, 0x18, 0xE2, 0xFE, 0xC3, 0x9F, 0x40, 0x02, 0x21, 0x7D, 0x74, \r
-0x33, 0x2E, 0xF8, 0xE2, 0x78, 0x28, 0xF2, 0x90, 0x81, 0xC1, 0xE0, 0x60, 0x2D, 0x78, 0x26, 0xE2, \r
-0xFF, 0xFD, 0x18, 0xE2, 0x2D, 0xFD, 0x18, 0xE2, 0x34, 0x00, 0x8D, 0x82, 0xF5, 0x83, 0xE0, 0x78, \r
-0x29, 0xF2, 0x74, 0x37, 0x2F, 0xF8, 0xE2, 0x78, 0x32, 0xF2, 0xE2, 0xFF, 0xF4, 0xFE, 0x78, 0x29, \r
-0xE2, 0x5E, 0xFE, 0x18, 0xE2, 0xFD, 0xEF, 0x5D, 0x4E, 0xF2, 0x78, 0x28, 0xE2, 0xFF, 0x78, 0x26, \r
-0xE2, 0xFD, 0x18, 0xE2, 0x2D, 0xFD, 0x18, 0xE2, 0x34, 0x00, 0x8D, 0x82, 0xF5, 0x83, 0xEF, 0xF0, \r
-0x78, 0x26, 0xE2, 0x04, 0xF2, 0x80, 0x9B, 0x90, 0x81, 0xC1, 0xE0, 0x60, 0x0F, 0x78, 0x24, 0xE2, \r
-0xFE, 0x08, 0xE2, 0xFF, 0x12, 0x2D, 0x5C, 0x78, 0x2E, 0x12, 0x4A, 0xFE, 0xE4, 0x78, 0x26, 0xF2, \r
-0x78, 0x27, 0xE2, 0xFF, 0x18, 0xE2, 0xFE, 0xC3, 0x9F, 0x50, 0x5D, 0x74, 0x33, 0x2E, 0xF8, 0xE2, \r
-0x78, 0x28, 0xF2, 0x90, 0x81, 0xC1, 0xE0, 0x60, 0x2B, 0x78, 0x2E, 0x12, 0x4A, 0xE5, 0x78, 0x26, \r
-0xE2, 0xFB, 0x75, 0xF0, 0x08, 0xA4, 0xF9, 0xF8, 0x12, 0x20, 0xA8, 0x78, 0x29, 0xEF, 0xF2, 0x74, \r
-0x37, 0x2B, 0xF8, 0xE2, 0x78, 0x32, 0xF2, 0xE2, 0xFE, 0xF4, 0x5F, 0xFF, 0x78, 0x28, 0xE2, 0xFD, \r
-0xEE, 0x5D, 0x4F, 0xF2, 0x78, 0x28, 0xE2, 0xFF, 0x78, 0x26, 0xE2, 0xFD, 0xC3, 0x74, 0x03, 0x9D, \r
-0xFD, 0xE4, 0x94, 0x00, 0xFC, 0x7B, 0xFE, 0x74, 0x2A, 0x2D, 0xF9, 0x74, 0x80, 0x3C, 0xFA, 0xEF, \r
-0x12, 0x1F, 0xEA, 0xE2, 0x04, 0xF2, 0x80, 0x98, 0x78, 0x2A, 0x12, 0x4A, 0xE5, 0x90, 0x85, 0xBB, \r
-0x12, 0x20, 0xCE, 0x78, 0x24, 0xE2, 0xFE, 0x08, 0xE2, 0xFF, 0x12, 0x2E, 0xA2, 0x22, 0xE4, 0xFB, \r
-0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x4A, 0x4E, 0x90, 0x81, 0xC2, 0xEF, 0xF0, 0x60, 0xF0, 0x31, 0x92, \r
-0x80, 0xEC, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, \r
-0x81, 0xC3, 0xF0, 0x90, 0x81, 0xC3, 0xE0, 0xFD, 0x70, 0x02, 0x41, 0xBD, 0x90, 0x82, 0x12, 0xE0, \r
-0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, \r
-0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x41, 0xB6, 0x90, 0x82, 0x12, 0xE0, 0x75, 0xF0, 0x04, 0x90, \r
-0x01, 0xD0, 0x12, 0x4B, 0x0A, 0xE0, 0x90, 0x81, 0xC4, 0xF0, 0x75, 0x13, 0x01, 0x75, 0x14, 0x81, \r
-0x75, 0x15, 0xC4, 0x75, 0x16, 0x01, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xC5, 0x12, 0x2B, 0xED, 0x90, \r
-0x82, 0x12, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x4B, 0x0A, 0xE0, 0x90, 0x81, 0xC6, \r
-0xF0, 0x90, 0x82, 0x12, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x4B, 0x0A, 0xE0, 0x90, \r
-0x81, 0xC7, 0xF0, 0x90, 0x82, 0x12, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x4B, 0x0A, \r
-0xE0, 0x90, 0x81, 0xC8, 0xF0, 0x90, 0x82, 0x12, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF0, 0x12, \r
-0x4B, 0x0A, 0xE0, 0x90, 0x81, 0xC9, 0xF0, 0x90, 0x82, 0x12, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, \r
-0xF1, 0x12, 0x4B, 0x0A, 0xE0, 0x90, 0x81, 0xCA, 0xF0, 0x90, 0x82, 0x12, 0xE0, 0x75, 0xF0, 0x04, \r
-0x90, 0x01, 0xF2, 0x12, 0x4B, 0x0A, 0xE0, 0x90, 0x81, 0xCB, 0xF0, 0x90, 0x82, 0x12, 0xE0, 0x75, \r
-0xF0, 0x04, 0x90, 0x01, 0xF3, 0x12, 0x4B, 0x0A, 0xE0, 0x90, 0x81, 0xCC, 0xF0, 0x90, 0x81, 0xC3, \r
-0xE0, 0xFF, 0x90, 0x82, 0x12, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, \r
-0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x81, 0xC3, 0xF0, 0x90, 0x82, 0x12, 0xE0, 0xFF, 0x74, 0x01, 0xA8, \r
-0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x81, 0xC5, 0xE0, \r
-0xFF, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xC6, 0x12, 0x5A, 0xB5, 0x90, 0x82, 0x12, 0xE0, 0x04, 0xF0, \r
-0xE0, 0x54, 0x03, 0xF0, 0x21, 0xA3, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, \r
-0xAF, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x4A, 0x4E, 0x90, 0x81, 0xD9, 0xEF, 0xF0, \r
-0x60, 0xF0, 0x51, 0xD6, 0x80, 0xEC, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, \r
-0x80, 0xD9, 0xE0, 0xFE, 0x90, 0x80, 0xD8, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, \r
-0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x32, 0x90, 0x01, 0xAF, 0xE0, 0x70, 0x13, 0xED, 0x75, 0xF0, \r
-0x0F, 0xA4, 0x24, 0x42, 0xF9, 0x74, 0x80, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x71, 0x2E, 0x7F, 0x01, \r
-0xEF, 0x60, 0x16, 0x90, 0x80, 0xD8, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, \r
-0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x80, 0xD8, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x81, 0xDA, 0x12, 0x4B, 0x1F, 0x90, 0x82, 0x13, 0xE0, 0xFF, \r
-0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x1F, 0xFC, 0x7F, 0xAF, 0x7E, 0x01, 0x71, 0x91, 0xEF, \r
-0x60, 0x3A, 0x90, 0x81, 0xDA, 0x12, 0x4B, 0x16, 0x8B, 0x13, 0x8A, 0x14, 0x89, 0x15, 0x90, 0x00, \r
-0x0E, 0x12, 0x1F, 0xBD, 0x24, 0x02, 0xF5, 0x16, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x2B, \r
-0xED, 0x90, 0x81, 0xDA, 0x12, 0x4B, 0x16, 0x90, 0x00, 0x0E, 0x12, 0x1F, 0xBD, 0x90, 0x01, 0xAE, \r
-0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x82, 0x06, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
-0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x82, 0x06, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, \r
-0xE0, 0x60, 0x2D, 0xC3, 0x90, 0x82, 0x09, 0xE0, 0x94, 0xE8, 0x90, 0x82, 0x08, 0xE0, 0x94, 0x03, \r
-0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, 0x82, 0x08, \r
-0xE4, 0x75, 0xF0, 0x01, 0x12, 0x4A, 0xA9, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0x80, 0xC5, \r
-0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x81, 0xDD, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, \r
-0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x90, 0x81, 0xEB, 0xF0, 0x7F, 0x24, 0x7E, 0x08, \r
-0x12, 0x2D, 0x5C, 0x90, 0x81, 0xE3, 0x12, 0x20, 0xCE, 0x90, 0x81, 0xDD, 0xE0, 0xFB, 0x70, 0x08, \r
-0x90, 0x81, 0xE3, 0x12, 0x4A, 0xD9, 0x80, 0x16, 0xEB, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x62, 0xF5, \r
-0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x2D, 0x5C, 0x90, 0x81, \r
-0xE7, 0x12, 0x20, 0xCE, 0x90, 0x81, 0xDE, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x17, 0x12, \r
-0x20, 0xBB, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x81, 0xE7, 0x12, 0x4A, 0xD9, \r
-0xED, 0x54, 0x7F, 0xFD, 0xEC, 0x54, 0x80, 0xFC, 0x12, 0x4A, 0xCC, 0xEC, 0x44, 0x80, 0xFC, 0x90, \r
-0x81, 0xE7, 0x12, 0x20, 0xCE, 0x90, 0x81, 0xE3, 0x12, 0x4A, 0xD9, 0xEC, 0x54, 0x7F, 0xFC, 0x90, \r
-0x85, 0xBB, 0x12, 0x20, 0xCE, 0x7F, 0x24, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x81, 0xDD, 0xE0, \r
-0x75, 0xF0, 0x08, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, \r
-0xE0, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x81, 0xE7, 0x12, 0x4A, 0xD9, 0x90, 0x85, 0xBB, 0x12, \r
-0x20, 0xCE, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x2E, 0xA2, 0x90, 0x81, 0xE3, 0x12, 0x4A, 0xD9, 0xEC, \r
-0x44, 0x80, 0xFC, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xCE, 0x7F, 0x24, 0x7E, 0x08, 0x12, 0x2E, 0xA2, \r
-0x90, 0x81, 0xDD, 0xE0, 0x70, 0x04, 0x7F, 0x20, 0x80, 0x09, 0x90, 0x81, 0xDD, 0xE0, 0xB4, 0x01, \r
+0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x41, 0x4D, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, \r
+0x56, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xE7, 0x09, 0xF6, 0x08, 0xDF, 0xFA, 0x80, \r
+0x46, 0xE7, 0x09, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x3E, 0x88, 0x82, 0x8C, 0x83, 0xE7, 0x09, 0xF0, \r
+0xA3, 0xDF, 0xFA, 0x80, 0x32, 0xE3, 0x09, 0xF6, 0x08, 0xDF, 0xFA, 0x80, 0x78, 0xE3, 0x09, 0xF2, \r
+0x08, 0xDF, 0xFA, 0x80, 0x70, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0x09, 0xF0, 0xA3, 0xDF, 0xFA, 0x80, \r
+0x64, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xA3, 0xF6, 0x08, 0xDF, 0xFA, 0x80, 0x58, 0x89, 0x82, 0x8A, \r
+0x83, 0xE0, 0xA3, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x4C, 0x80, 0xD2, 0x80, 0xFA, 0x80, 0xC6, 0x80, \r
+0xD4, 0x80, 0x69, 0x80, 0xF2, 0x80, 0x33, 0x80, 0x10, 0x80, 0xA6, 0x80, 0xEA, 0x80, 0x9A, 0x80, \r
+0xA8, 0x80, 0xDA, 0x80, 0xE2, 0x80, 0xCA, 0x80, 0x33, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4, \r
+0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, \r
+0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0x0D, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, \r
+0xA3, 0xF6, 0x08, 0xDF, 0xF9, 0xEC, 0xFA, 0xA9, 0xF0, 0xED, 0xFB, 0x22, 0x89, 0x82, 0x8A, 0x83, \r
+0xEC, 0xFA, 0xE0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xF0, 0xA3, 0xC8, 0xC5, \r
+0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xEA, 0xDE, 0xE8, 0x80, 0xDB, 0x89, 0x82, 0x8A, 0x83, \r
+0xE4, 0x93, 0xA3, 0xF2, 0x08, 0xDF, 0xF9, 0x80, 0xCC, 0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, \r
+0x60, 0xC3, 0x88, 0xF0, 0xED, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0xB9, 0xF5, 0x82, 0xEB, 0x24, \r
+0x02, 0xB4, 0x04, 0x00, 0x50, 0xAF, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x43, 0xF9, 0x73, 0xC5, \r
+0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, 0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, \r
+0x83, 0xE0, 0x38, 0xF0, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58, \r
+0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xE0, \r
+0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xE2, 0xFC, 0x08, 0xE2, 0xFD, \r
+0x08, 0xE2, 0xFE, 0x08, 0xE2, 0xFF, 0x22, 0xE2, 0xFB, 0x08, 0xE2, 0xF9, 0x08, 0xE2, 0xFA, 0x08, \r
+0xE2, 0xCB, 0xF8, 0x22, 0xEC, 0xF2, 0x08, 0xED, 0xF2, 0x08, 0xEE, 0xF2, 0x08, 0xEF, 0xF2, 0x22, \r
+0xA4, 0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, \r
+0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, \r
+0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, \r
+0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, \r
+0xA3, 0xA3, 0x80, 0xDF, 0xEF, 0x4E, 0x60, 0x12, 0xEF, 0x60, 0x01, 0x0E, 0xED, 0xBB, 0x01, 0x0B, \r
+0x89, 0x82, 0x8A, 0x83, 0xF0, 0xA3, 0xDF, 0xFC, 0xDE, 0xFA, 0x22, 0x89, 0xF0, 0x50, 0x07, 0xF7, \r
+0x09, 0xDF, 0xFC, 0xA9, 0xF0, 0x22, 0xBB, 0xFE, 0xFC, 0xF3, 0x09, 0xDF, 0xFC, 0xA9, 0xF0, 0x22, \r
+0x02, 0x45, 0xAE, 0x02, 0x41, 0xDD, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, \r
+0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, \r
+0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, \r
+0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x45, \r
+0xF3, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, \r
+0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, \r
+0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, \r
+0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, \r
+0xE7, 0x80, 0xBE, 0x41, 0x82, 0xC9, 0x00, 0x41, 0x82, 0xCA, 0x00, 0x41, 0x82, 0xCF, 0x00, 0x41, \r
+0x82, 0xD0, 0x00, 0x41, 0x82, 0xD9, 0x00, 0x00, 0x50, 0xFC, 0x58, 0x0E, 0x5F, 0xDA, 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, 0x0E, \r
+0xF0, 0x74, 0x46, 0xA3, 0xF0, 0xD1, 0x7F, 0xE5, 0x3C, 0x30, 0xE7, 0x02, 0xD1, 0x64, 0x74, 0x0E, \r
+0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x46, 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, 0x32, 0x06, 0x90, 0x00, 0xF2, 0xE0, 0x20, \r
+0xE6, 0x0C, 0x90, 0x00, 0x05, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x05, 0x12, 0x32, 0x1E, 0x22, 0x90, \r
+0x00, 0x54, 0xE0, 0x55, 0x35, 0xF5, 0x39, 0xA3, 0xE0, 0x55, 0x36, 0xF5, 0x3A, 0xA3, 0xE0, 0x55, \r
+0x37, 0xF5, 0x3B, 0xA3, 0xE0, 0x55, 0x38, 0xF5, 0x3C, 0xAD, 0x39, 0x7F, 0x54, 0x12, 0x32, 0x1E, \r
+0xAD, 0x3A, 0x7F, 0x55, 0x12, 0x32, 0x1E, 0xAD, 0x3B, 0x7F, 0x56, 0x12, 0x32, 0x1E, 0xAD, 0x3C, \r
+0x7F, 0x57, 0x12, 0x32, 0x1E, 0x53, 0x91, 0xEF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, \r
+0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, \r
+0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xB9, 0xF0, 0x74, 0x46, 0xA3, 0xF0, \r
+0x12, 0x6E, 0xF4, 0xE5, 0x41, 0x30, 0xE4, 0x02, 0xF1, 0x57, 0xE5, 0x41, 0x30, 0xE6, 0x03, 0x12, \r
+0x6F, 0x8D, 0xE5, 0x43, 0x30, 0xE0, 0x03, 0x12, 0x6F, 0x9A, 0xE5, 0x43, 0x30, 0xE1, 0x03, 0x12, \r
+0x70, 0x43, 0xE5, 0x43, 0x30, 0xE2, 0x03, 0x12, 0x75, 0x86, 0xE5, 0x43, 0x30, 0xE3, 0x02, 0xF1, \r
+0x6A, 0xE5, 0x43, 0x30, 0xE4, 0x03, 0x12, 0x5B, 0x4F, 0xE5, 0x43, 0x30, 0xE5, 0x03, 0x12, 0x54, \r
+0x68, 0xE5, 0x43, 0x30, 0xE6, 0x03, 0x12, 0x58, 0x7F, 0xE5, 0x44, 0x30, 0xE1, 0x03, 0x12, 0x5B, \r
+0x6C, 0x74, 0xB9, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x46, 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, 0x12, 0x60, 0x79, 0x7F, 0x02, 0x8F, 0x0D, 0x7F, 0x02, \r
+0x71, 0x27, 0x90, 0x80, 0x3C, 0xE0, 0x45, 0x0D, 0xF0, 0x22, 0xF1, 0xF3, 0x70, 0x0B, 0x90, 0x81, \r
+0x49, 0xE0, 0x60, 0x05, 0x12, 0x57, 0xAA, 0xF1, 0x7D, 0x22, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xF5, \r
+0x1D, 0x90, 0x81, 0xEE, 0xE0, 0xF5, 0x1E, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8E, 0x19, 0x8F, 0x1A, 0xE5, 0x1E, 0xF1, 0xE3, 0x85, 0x19, 0x83, \r
+0x85, 0x1A, 0x82, 0xF0, 0xE5, 0x1D, 0xF1, 0xE3, 0xFF, 0xE5, 0x1E, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
+0x4F, 0xA3, 0xF0, 0xEB, 0xF1, 0xE3, 0xFF, 0xE5, 0x1D, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x4F, 0xF1, \r
+0xEA, 0xF0, 0xBD, 0x01, 0x0D, 0x85, 0x1A, 0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0x74, 0x03, 0xF0, \r
+0x80, 0x06, 0xF1, 0xEA, 0xA3, 0x74, 0x01, 0xF0, 0xF1, 0xEA, 0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0x54, 0x07, 0xC4, 0x33, 0x54, 0xE0, 0x22, 0x85, 0x1A, 0x82, 0x85, 0x19, 0x83, \r
+0xA3, 0xA3, 0x22, 0xE4, 0xFF, 0x12, 0x52, 0xD1, 0xEF, 0x64, 0x01, 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
+0x47, 0xA3, 0xF0, 0x12, 0x6F, 0x21, 0xE5, 0x49, 0x30, 0xE1, 0x02, 0x11, 0xA4, 0xE5, 0x49, 0x30, \r
+0xE2, 0x03, 0x12, 0x58, 0x69, 0xE5, 0x4A, 0x30, 0xE0, 0x03, 0x12, 0x72, 0xE1, 0xE5, 0x4A, 0x30, \r
+0xE4, 0x03, 0x12, 0x75, 0xAF, 0xE5, 0x4B, 0x30, 0xE1, 0x03, 0x12, 0x76, 0x0D, 0xE5, 0x4B, 0x30, \r
+0xE0, 0x03, 0x12, 0x75, 0xC5, 0xE5, 0x4B, 0x30, 0xE3, 0x03, 0x12, 0x76, 0x56, 0xE5, 0x4C, 0x30, \r
+0xE1, 0x05, 0x7F, 0x04, 0x12, 0x47, 0x5C, 0xE5, 0x4C, 0x30, 0xE4, 0x02, 0x11, 0xCD, 0xE5, 0x4C, \r
+0x30, 0xE5, 0x03, 0x12, 0x5B, 0xCE, 0xE5, 0x4C, 0x30, 0xE6, 0x03, 0x12, 0x76, 0x57, 0x74, 0xFC, \r
+0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x47, 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, 0x81, 0x49, 0xE0, 0x60, 0x03, 0x12, 0x70, 0xBC, 0x90, 0x81, 0xF4, \r
+0xE0, 0x30, 0xE0, 0x18, 0x54, 0xFB, 0xF0, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x06, 0x7D, 0x04, 0x7F, \r
+0x01, 0xA1, 0xFD, 0x7D, 0x31, 0x7F, 0xFF, 0xB1, 0xA9, 0x12, 0x5D, 0xA2, 0x22, 0x12, 0x74, 0x31, \r
+0x7D, 0x02, 0x7F, 0x02, 0x31, 0x0A, 0x90, 0x81, 0xF6, 0xE0, 0x30, 0xE0, 0x22, 0x12, 0x73, 0xF6, \r
+0x90, 0x81, 0xF9, 0xE0, 0x60, 0x04, 0x14, 0xF0, 0xA1, 0xE4, 0x90, 0x81, 0xF7, 0xE0, 0x14, 0x90, \r
+0x81, 0xF9, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0x31, 0x16, 0x31, 0x00, 0x22, \r
+0x7D, 0x02, 0x7F, 0x02, 0x31, 0x0A, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x3D, 0x2F, 0xF8, 0xE6, 0x4D, \r
+0xFE, 0xF6, 0x74, 0x30, 0x80, 0x5B, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xAC, 0x07, 0xEF, \r
+0x54, 0x01, 0xFE, 0x12, 0x77, 0xF0, 0xF0, 0xEF, 0x64, 0x01, 0x70, 0x20, 0x90, 0x01, 0x53, 0xF0, \r
+0x90, 0x81, 0xF8, 0xE0, 0x60, 0x0B, 0x7D, 0x10, 0x7F, 0x03, 0x31, 0x67, 0x12, 0x73, 0xF6, 0x80, \r
+0x13, 0x31, 0x59, 0x12, 0x57, 0xBC, 0x31, 0x7C, 0xB1, 0xE4, 0x80, 0x08, 0x31, 0x59, 0x31, 0x67, \r
+0x31, 0x00, 0xF1, 0x35, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x53, 0x74, 0x03, 0xF0, 0x7D, \r
+0x10, 0xFF, 0x22, 0x7D, 0x03, 0x7F, 0x02, 0x74, 0x45, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, \r
+0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x7D, 0x02, 0x7F, 0x02, \r
+0x31, 0x86, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x3D, 0x12, 0x77, 0xF8, 0xFE, 0xF6, 0x74, 0x30, 0x80, \r
+0xE0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x57, 0xB5, 0x90, 0x05, 0x27, 0xE0, 0xF5, \r
+0x55, 0x12, 0x57, 0xC4, 0x90, 0x81, 0x40, 0x12, 0x77, 0xAC, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, \r
+0x12, 0x78, 0x00, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0x12, 0x77, 0xBA, 0x54, 0x10, 0xFD, \r
+0xEF, 0x54, 0xEF, 0x12, 0x78, 0x00, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0x12, 0x77, 0xBA, \r
+0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0x90, 0x81, 0x40, 0xF0, 0xEE, 0xC3, 0x13, 0x20, 0xE0, \r
+0x02, 0x41, 0x74, 0xE0, 0x30, 0xE0, 0x78, 0x31, 0x63, 0x75, 0x55, 0x21, 0x90, 0x81, 0x40, 0xE0, \r
+0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0xF1, 0xDF, 0x43, 0x55, 0x08, 0x80, 0x0C, 0xE4, 0x90, \r
+0x81, 0x41, 0xF0, 0xA3, 0xF0, 0x7D, 0x40, 0xFF, 0x31, 0x86, 0x90, 0x81, 0x40, 0x12, 0x70, 0xB4, \r
+0x30, 0xE0, 0x03, 0x43, 0x55, 0x12, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x55, 0x14, \r
+0x90, 0x81, 0x40, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x43, 0x55, 0x80, 0x12, 0x5F, \r
+0xD0, 0x20, 0xE0, 0x03, 0x43, 0x55, 0x40, 0x71, 0xB3, 0x90, 0x81, 0x43, 0xE0, 0x70, 0x05, 0x7F, \r
+0x01, 0x12, 0x5C, 0x81, 0x12, 0x5B, 0xC3, 0x30, 0xE0, 0x04, 0x7F, 0x04, 0x80, 0x0C, 0x12, 0x5B, \r
+0x43, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0x5C, 0x81, 0x41, 0xEC, 0x75, \r
+0x55, 0x01, 0x71, 0xB3, 0x90, 0x81, 0x43, 0xE0, 0x64, 0x04, 0x60, 0x02, 0x61, 0x1F, 0xFF, 0x12, \r
+0x5C, 0x81, 0x61, 0x1F, 0x90, 0x81, 0x40, 0xE0, 0x30, 0xE0, 0x79, 0x31, 0x63, 0x43, 0x55, 0x31, \r
+0x90, 0x81, 0x40, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0xF1, 0xDF, 0x43, 0x55, 0x08, \r
+0x80, 0x06, 0x7D, 0x40, 0xE4, 0xFF, 0x31, 0x86, 0x90, 0x81, 0x40, 0x12, 0x70, 0xB4, 0x30, 0xE0, \r
+0x03, 0x43, 0x55, 0x02, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x55, 0x04, 0x71, 0xB3, \r
+0x12, 0x5B, 0xC3, 0x30, 0xE0, 0x0B, 0x12, 0x5B, 0xBC, 0x60, 0x31, 0xE4, 0xFD, 0x7F, 0x02, 0x80, \r
+0x1F, 0x12, 0x5E, 0x8E, 0x90, 0x81, 0x44, 0xE0, 0xB4, 0x02, 0x19, 0x12, 0x77, 0x66, 0x12, 0x5B, \r
+0x43, 0xBF, 0x01, 0x09, 0x90, 0x81, 0x4B, 0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x03, 0xE4, 0xFD, 0xFF, \r
+0x71, 0xBE, 0x80, 0x08, 0x90, 0x81, 0x4C, 0xE0, 0x90, 0x81, 0x44, 0xF0, 0x90, 0x05, 0x40, 0x74, \r
+0x22, 0xF0, 0x80, 0x2B, 0x75, 0x55, 0x01, 0x71, 0xB3, 0x90, 0x81, 0x44, 0xE0, 0xB4, 0x02, 0x06, \r
+0x7D, 0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, 0x81, 0x44, 0xE0, 0xB4, 0x08, 0x06, 0x7D, 0x01, 0x7F, \r
+0x0C, 0x71, 0xBE, 0x12, 0x6E, 0xE1, 0x90, 0x81, 0x4B, 0x12, 0x58, 0x62, 0x12, 0x52, 0x16, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0x90, 0x82, 0x75, 0x12, 0x45, 0x15, 0x90, 0x82, 0x74, 0xEF, 0xF0, 0x12, \r
+0x45, 0x1E, 0x4B, 0x5D, 0x00, 0x4B, 0x62, 0x01, 0x4B, 0x67, 0x02, 0x4B, 0x6C, 0x12, 0x4B, 0x71, \r
+0x14, 0x4B, 0x76, 0x20, 0x4B, 0x7B, 0x21, 0x4B, 0x80, 0x23, 0x4B, 0x85, 0x24, 0x4B, 0x89, 0x25, \r
+0x4B, 0x8E, 0x26, 0x4B, 0x93, 0x27, 0x4B, 0x98, 0xC0, 0x00, 0x00, 0x4B, 0x9D, 0x71, 0xAD, 0x02, \r
+0x54, 0xB1, 0x71, 0xAD, 0x02, 0x52, 0xF3, 0x71, 0xAD, 0x02, 0x53, 0x52, 0x71, 0xAD, 0x02, 0x65, \r
+0x08, 0x71, 0xAD, 0x02, 0x6D, 0x15, 0x71, 0xAD, 0x02, 0x53, 0x90, 0x71, 0xAD, 0x02, 0x54, 0xF5, \r
+0x71, 0xAD, 0x02, 0x6D, 0x24, 0x71, 0xAD, 0x21, 0x91, 0x71, 0xAD, 0x02, 0x6D, 0x2C, 0x71, 0xAD, \r
+0x02, 0x56, 0x4B, 0x71, 0xAD, 0x02, 0x55, 0x34, 0x71, 0xAD, 0x02, 0x6D, 0x34, 0x90, 0x01, 0xC0, \r
+0xE0, 0x44, 0x01, 0xF0, 0x90, 0x82, 0x74, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0x90, 0x82, 0x75, \r
+0x02, 0x45, 0x0C, 0x90, 0x05, 0x27, 0xE5, 0x55, 0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x82, 0xD6, 0xED, 0xF0, 0x90, 0x81, 0x45, 0xE0, 0xFE, 0xC4, \r
+0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xA1, 0x07, 0xEE, 0x12, 0x76, 0x86, 0x30, 0xE0, 0x02, \r
+0xA1, 0x07, 0x90, 0x81, 0x4C, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xA1, 0x07, 0xEF, 0x70, 0x02, 0x81, \r
+0x7A, 0x24, 0xFE, 0x70, 0x02, 0x81, 0xB3, 0x24, 0xFE, 0x60, 0x47, 0x24, 0xFC, 0x70, 0x02, 0x81, \r
+0xEE, 0x24, 0xFC, 0x60, 0x02, 0xA1, 0x00, 0xEE, 0xB4, 0x0E, 0x02, 0xB1, 0x57, 0x90, 0x81, 0x4C, \r
+0xE0, 0x70, 0x04, 0x7F, 0x01, 0xD1, 0x65, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x06, 0x02, 0xB1, 0x7B, \r
+0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x04, 0x0D, 0x90, 0x82, 0xD6, 0xE0, 0xFF, 0x60, 0x04, 0xD1, 0xA4, \r
+0x80, 0x02, 0xF1, 0xA2, 0x90, 0x81, 0x4C, 0xE0, 0x64, 0x08, 0x60, 0x02, 0xA1, 0x00, 0xF1, 0x35, \r
+0xA1, 0x00, 0x90, 0x81, 0x4C, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0xD1, 0x65, 0x90, 0x81, 0x4C, 0xE0, \r
+0xB4, 0x06, 0x02, 0xB1, 0x7B, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x0E, 0x07, 0xB1, 0x0C, 0xBF, 0x01, \r
+0x02, 0xB1, 0x57, 0x90, 0x81, 0x4C, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0xA1, 0x00, 0xB1, 0x0C, 0xEF, \r
+0x64, 0x01, 0x60, 0x02, 0xA1, 0x00, 0xB1, 0xB4, 0xA1, 0x00, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x0E, \r
+0x07, 0xB1, 0x0C, 0xBF, 0x01, 0x02, 0xB1, 0x57, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x06, 0x02, 0xB1, \r
+0x7B, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x0C, 0x07, 0xB1, 0x0C, 0xBF, 0x01, 0x02, 0xB1, 0xB4, 0x90, \r
+0x81, 0x4C, 0xE0, 0x64, 0x04, 0x70, 0x59, 0x12, 0x6E, 0x0D, 0xEF, 0x64, 0x01, 0x70, 0x51, 0xD1, \r
+0x7D, 0x80, 0x4D, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x0E, 0x07, 0xB1, 0x0C, 0xBF, 0x01, 0x02, 0xB1, \r
+0x57, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x06, 0x02, 0xB1, 0x7B, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x0C, \r
+0x07, 0xB1, 0x0C, 0xBF, 0x01, 0x02, 0xB1, 0xB4, 0x90, 0x81, 0x4C, 0xE0, 0x70, 0x04, 0x7F, 0x01, \r
+0xD1, 0x65, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x04, 0x17, 0x12, 0x77, 0x4E, 0x80, 0x12, 0x90, 0x81, \r
+0x4C, 0xE0, 0xB4, 0x0C, 0x0B, 0x90, 0x81, 0x46, 0x12, 0x74, 0x02, 0x30, 0xE0, 0x02, 0xB1, 0xE4, \r
+0x90, 0x81, 0x4C, 0x12, 0x77, 0xC1, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x6E, 0xC8, 0xEF, \r
+0x64, 0x01, 0x60, 0x05, 0x12, 0x6E, 0x7E, 0x80, 0x35, 0x12, 0x76, 0xEA, 0x30, 0xE0, 0x08, 0x90, \r
+0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x27, 0x90, 0x81, 0x4B, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x05, \r
+0x12, 0x6E, 0x06, 0x80, 0x19, 0x90, 0x81, 0xF4, 0xE0, 0x30, 0xE0, 0x0F, 0x13, 0x13, 0x54, 0x3F, \r
+0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x11, 0xF0, 0x80, 0x03, 0x02, 0x6E, 0xC0, 0x90, 0x01, \r
+0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x81, 0x46, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, \r
+0xB1, 0xF9, 0x80, 0x12, 0x12, 0x77, 0xDA, 0xF1, 0xD8, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x80, 0xF0, \r
+0x90, 0x81, 0x44, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x80, 0x2E, 0x90, 0x81, 0x46, 0xE0, 0x90, \r
+0x06, 0x04, 0x20, 0xE0, 0x07, 0xE0, 0x44, 0x40, 0xF1, 0xD8, 0x80, 0x0F, 0xB1, 0xF5, 0x90, 0x05, \r
+0x27, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x81, 0x44, 0x74, 0x0C, 0xF0, 0xE4, 0xFD, 0xFF, 0x80, 0x09, \r
+0xE4, 0xFD, 0x7F, 0x0C, 0x71, 0xBE, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, 0xF0, 0x90, 0x80, \r
+0x40, 0xED, 0xF0, 0x22, 0x12, 0x47, 0xF3, 0x70, 0x2A, 0x90, 0x81, 0x46, 0xE0, 0x54, 0xFD, 0xF0, \r
+0x7D, 0x2C, 0x7F, 0x6F, 0xB1, 0xA9, 0x7D, 0x08, 0x7F, 0x01, 0xD1, 0xDF, 0xBF, 0x01, 0x0F, 0x90, \r
+0x81, 0x45, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0xD1, 0x9C, 0x74, 0x0E, 0xF0, 0x22, 0x12, 0x76, \r
+0x8E, 0x04, 0xF0, 0x22, 0x7D, 0x2F, 0x7F, 0xFF, 0xB1, 0xA9, 0x12, 0x5D, 0xA2, 0x7D, 0x08, 0xD1, \r
+0x9C, 0x74, 0x08, 0xF0, 0x22, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0xAC, 0x07, 0xEF, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, \r
+0x1A, 0xED, 0x54, 0x01, 0xFE, 0x90, 0x81, 0x45, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0x80, 0x0C, 0x90, \r
+0x81, 0x4C, 0xED, 0xF0, 0x80, 0x05, 0x90, 0x81, 0x4B, 0xED, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, \r
+0xE4, 0x2E, 0xEC, 0x14, 0x60, 0x07, 0x14, 0x60, 0x1D, 0x24, 0x02, 0x70, 0x23, 0x90, 0x81, 0x45, \r
+0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x90, 0x81, 0x4C, 0xE0, 0x54, 0x7F, \r
+0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, 0x81, 0x4B, 0xE0, 0xFD, 0x7F, 0x89, 0x12, 0x32, 0x1E, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x82, 0xD5, 0xEF, 0xF0, 0x12, 0x55, 0xE4, 0x90, 0x82, 0xD5, \r
+0xE0, 0x60, 0x02, 0xF1, 0x43, 0x7D, 0x04, 0xD1, 0x9C, 0x74, 0x04, 0xF0, 0x22, 0x7D, 0x2D, 0x12, \r
+0x5E, 0x06, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x31, 0x0A, 0x12, 0x5D, 0xA2, \r
+0xE4, 0xFD, 0x7F, 0x01, 0xB1, 0xFD, 0xE4, 0x90, 0x81, 0x44, 0xF0, 0x22, 0x7F, 0x01, 0xB1, 0xFD, \r
+0x90, 0x81, 0x44, 0x22, 0xEF, 0x60, 0x33, 0x12, 0x47, 0xF3, 0x70, 0x2E, 0x90, 0x81, 0x46, 0xE0, \r
+0x54, 0xFE, 0xF0, 0x7D, 0x2B, 0x7F, 0x0F, 0xB1, 0xA9, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, \r
+0xD1, 0xDB, 0xBF, 0x01, 0x0F, 0x90, 0x81, 0x45, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0xD1, 0x9C, \r
+0x74, 0x06, 0xF0, 0x22, 0x12, 0x76, 0x8E, 0x74, 0x08, 0xF0, 0x22, 0x7D, 0x08, 0xE4, 0xFF, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x82, 0xB1, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x80, \r
+0x3E, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x27, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x82, \r
+0xB5, 0xF0, 0x7D, 0x26, 0x12, 0x5E, 0x06, 0xEF, 0x64, 0x01, 0x70, 0x03, 0x12, 0x5A, 0x72, 0x90, \r
+0x82, 0xB5, 0xE0, 0xFF, 0x7D, 0x27, 0xB1, 0xA9, 0x90, 0x82, 0xB1, 0xE0, 0xFF, 0xF1, 0x48, 0x80, \r
+0x0A, 0x90, 0x82, 0xB1, 0xE0, 0xFF, 0xF1, 0x48, 0x12, 0x5A, 0x72, 0x12, 0x5B, 0x1B, 0x7F, 0x01, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF1, 0x40, 0xB1, 0xF9, 0x90, 0x81, 0x44, 0x74, 0x0C, 0xF0, 0x22, \r
+0x12, 0x55, 0xE4, 0xE4, 0xFD, 0xFF, 0xA1, 0xA9, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
+0x82, 0xD8, 0xEF, 0xF0, 0x90, 0x80, 0x44, 0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x3D, \r
+0x90, 0x81, 0x4C, 0xE0, 0x64, 0x0E, 0x70, 0x14, 0x90, 0x82, 0xD8, 0xE0, 0x70, 0x2F, 0x90, 0x81, \r
+0x45, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0xB1, 0xF5, 0x80, 0x1F, 0x90, 0x81, 0x4C, 0xE0, \r
+0x64, 0x06, 0x70, 0x19, 0x90, 0x82, 0xD8, 0xE0, 0x60, 0x13, 0x90, 0x81, 0x45, 0xE0, 0x54, 0xBF, \r
+0xF0, 0x12, 0x77, 0xDA, 0xF0, 0x90, 0x81, 0x4C, 0x74, 0x04, 0xF0, 0xF1, 0x43, 0xD0, 0xD0, 0x92, \r
+0xAF, 0x22, 0x12, 0x73, 0xEE, 0xF1, 0x43, 0x7D, 0x0C, 0x7F, 0x01, 0xA1, 0xFD, 0x12, 0x76, 0xB5, \r
+0x90, 0x81, 0x4C, 0xE0, 0x64, 0x0C, 0x60, 0x04, 0xB1, 0xA0, 0xD1, 0xDB, 0x22, 0x90, 0x81, 0x49, \r
+0xE0, 0x64, 0x01, 0x70, 0x12, 0x12, 0x54, 0x61, 0x60, 0x05, 0xB1, 0xA0, 0x02, 0x76, 0xB5, 0x90, \r
+0x81, 0x4C, 0xE0, 0x70, 0x02, 0x71, 0xBA, 0x22, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0xA1, 0xFD, 0x90, \r
+0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x21, 0x0A, 0x7D, 0x1F, 0x7F, 0x6F, 0xB1, 0xA9, \r
+0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x81, 0x43, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x01, \r
+0xC8, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x07, 0x7F, 0xFF, 0xFE, \r
+0x12, 0x2B, 0x27, 0xBF, 0x01, 0x09, 0x90, 0x82, 0x07, 0xE0, 0x64, 0x03, 0x60, 0x03, 0x22, 0x01, \r
+0xC0, 0xE4, 0x90, 0x82, 0x0C, 0xF0, 0x90, 0x82, 0x0C, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, 0x02, \r
+0x01, 0xFB, 0xC3, 0x74, 0xFE, 0x9F, 0xFF, 0xE4, 0x94, 0x00, 0xFE, 0x7B, 0x01, 0x7A, 0x82, 0x79, \r
+0x08, 0x12, 0x2B, 0x27, 0xEF, 0x64, 0x01, 0x70, 0x77, 0x90, 0x82, 0x08, 0xE0, 0xFF, 0x54, 0xC0, \r
+0xFE, 0x60, 0x05, 0xEF, 0x54, 0x0C, 0x70, 0x16, 0x90, 0x82, 0x08, 0xE0, 0xFF, 0x54, 0x30, 0x60, \r
+0x67, 0xEF, 0x54, 0x03, 0x60, 0x62, 0x90, 0x82, 0x09, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, \r
+0x82, 0x09, 0xF0, 0x90, 0x82, 0x09, 0xE0, 0x90, 0x82, 0x08, 0x70, 0x16, 0xE0, 0xFF, 0xEE, 0x13, \r
+0x13, 0x54, 0x3F, 0x90, 0x82, 0x0A, 0xF0, 0xEF, 0x54, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0xA3, 0xF0, \r
+0x80, 0x0D, 0xE0, 0xFE, 0x54, 0x30, 0x90, 0x82, 0x0A, 0xF0, 0xEE, 0x54, 0x03, 0xA3, 0xF0, 0x90, \r
+0x82, 0x0A, 0xE0, 0x64, 0x30, 0x70, 0x54, 0xA3, 0xE0, 0x64, 0x02, 0x70, 0x4E, 0x90, 0x00, 0xF5, \r
+0xE0, 0x54, 0x40, 0x90, 0x82, 0x0D, 0xF0, 0xE0, 0x70, 0x41, 0xA3, 0x74, 0x02, 0xF0, 0x80, 0x10, \r
+0x90, 0x82, 0x0E, 0x74, 0x01, 0xF0, 0x80, 0x08, 0x90, 0x82, 0x0C, 0xE0, 0x04, 0xF0, 0x01, 0x26, \r
+0x90, 0x01, 0xC4, 0x74, 0xFE, 0xF0, 0x74, 0x4F, 0xA3, 0xF0, 0x90, 0x82, 0x0E, 0xE0, 0x90, 0x01, \r
+0xC8, 0xF0, 0x90, 0x82, 0x08, 0xE0, 0x90, 0x01, 0xC9, 0xF0, 0x90, 0x82, 0x09, 0xE0, 0x90, 0x01, \r
+0xCA, 0xF0, 0xE4, 0xFD, 0x7F, 0x1F, 0x12, 0x32, 0x1E, 0x80, 0xD5, 0x22, 0x90, 0x00, 0x80, 0xE0, \r
+0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x32, 0x1E, 0x90, 0xFD, 0x00, 0xE0, 0x54, 0xBF, 0xF0, 0x12, \r
+0x4F, 0xFE, 0x12, 0x6D, 0x91, 0x12, 0x32, 0x77, 0x12, 0x6D, 0x9E, 0x31, 0x53, 0x7F, 0x01, 0x12, \r
+0x42, 0x15, 0x90, 0x81, 0xFA, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x42, 0x15, 0x90, 0x81, 0xFA, 0xE0, \r
+0x04, 0xF0, 0x51, 0x34, 0x31, 0x64, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, \r
+0x32, 0x1E, 0x75, 0x20, 0xFF, 0x12, 0x58, 0x07, 0x12, 0x64, 0x1D, 0x12, 0x6E, 0xEA, 0xE4, 0xFF, \r
+0x02, 0x42, 0x9E, 0xE4, 0x90, 0x80, 0x3C, 0x31, 0x5C, 0xA3, 0xF0, 0x22, 0xF0, 0xA3, 0xF0, 0xA3, \r
+0xF0, 0xA3, 0xF0, 0x22, 0x31, 0x77, 0x12, 0x6D, 0x42, 0x51, 0x16, 0x12, 0x73, 0x34, 0x12, 0x77, \r
+0x76, 0x12, 0x74, 0x15, 0x02, 0x45, 0x44, 0xE4, 0xFD, 0xFF, 0x12, 0x77, 0xCE, 0xED, 0x70, 0x12, \r
+0x31, 0xB6, 0xC0, 0x83, 0xC0, 0x82, 0x31, 0xAE, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5E, \r
+0x80, 0x0F, 0x31, 0xB6, 0xC0, 0x83, 0xC0, 0x82, 0x31, 0xAE, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, \r
+0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x31, 0xC1, 0x90, 0x81, 0x3E, 0xEF, 0xF0, 0x22, 0xE0, 0xFE, \r
+0x74, 0x01, 0xA8, 0x07, 0x08, 0x22, 0x74, 0x36, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, \r
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7D, 0x08, 0xED, 0x14, 0xF9, 0x24, 0x36, 0x31, \r
+0xB9, 0xE0, 0x60, 0x39, 0x7C, 0x08, 0xEC, 0x14, 0x90, 0x82, 0xD2, 0xF0, 0x74, 0x36, 0x29, 0x31, \r
+0xB9, 0xE0, 0xFB, 0x7A, 0x00, 0x90, 0x82, 0xD2, 0xF1, 0xD4, 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, 0x82, 0xD2, 0xE0, 0x2F, 0x04, 0xFF, 0x80, 0x06, 0xDC, 0xC9, 0xDD, 0xBB, 0x7F, \r
+0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7E, 0x00, 0x7F, 0x01, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x81, \r
+0x79, 0x40, 0x12, 0x45, 0x44, 0x90, 0x81, 0x40, 0xE0, 0x54, 0xFD, 0xF0, 0xE4, 0x31, 0x5D, 0xA3, \r
+0x74, 0x0C, 0xF0, 0x22, 0xF1, 0xED, 0x90, 0x80, 0x41, 0xEF, 0xF0, 0x51, 0x54, 0x90, 0x01, 0x64, \r
+0x74, 0x01, 0xF0, 0x90, 0x00, 0x12, 0xE0, 0x54, 0xC7, 0x44, 0x20, 0xFD, 0x7F, 0x12, 0x12, 0x32, \r
+0x1E, 0x02, 0x2D, 0xA7, 0x51, 0x84, 0x51, 0xAA, 0x12, 0x6D, 0x50, 0x12, 0x6D, 0x6F, 0xE4, 0xF5, \r
+0x35, 0xF5, 0x36, 0xF5, 0x37, 0x75, 0x38, 0x80, 0xAD, 0x35, 0x7F, 0x50, 0x12, 0x32, 0x1E, 0xAD, \r
+0x36, 0x7F, 0x51, 0x12, 0x32, 0x1E, 0xAD, 0x37, 0x7F, 0x52, 0x12, 0x32, 0x1E, 0xAD, 0x38, 0x7F, \r
+0x53, 0x02, 0x32, 0x1E, 0x90, 0x01, 0x30, 0xE4, 0x31, 0x5C, 0x90, 0x01, 0x38, 0x31, 0x5C, 0xFD, \r
+0x7F, 0x50, 0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x52, \r
+0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x53, 0x02, 0x32, 0x1E, 0x90, 0x01, 0x34, 0x74, 0xFF, 0x31, \r
+0x5C, 0x90, 0x01, 0x3C, 0x31, 0x5C, 0xFD, 0x7F, 0x54, 0x12, 0x32, 0x1E, 0x7D, 0xFF, 0x7F, 0x55, \r
+0x12, 0x32, 0x1E, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x32, 0x1E, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x32, \r
+0x1E, 0x12, 0x77, 0xCE, 0x31, 0xB6, 0xE0, 0xFD, 0x7C, 0x00, 0xF1, 0xD6, 0x80, 0x05, 0xC3, 0x33, \r
+0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, 0x5D, 0x4E, 0x7F, 0x00, 0x60, 0x02, \r
+0x7F, 0x01, 0x22, 0xF1, 0xB5, 0x71, 0x4C, 0xFF, 0xF5, 0x56, 0x12, 0x1F, 0xA4, 0xFE, 0xC3, 0x13, \r
+0x30, 0xE0, 0x06, 0x91, 0xAB, 0xF5, 0x57, 0x80, 0x02, 0x8F, 0x57, 0x85, 0x56, 0x55, 0xE5, 0x55, \r
+0xD3, 0x95, 0x57, 0x50, 0x23, 0xAB, 0x52, 0xAA, 0x53, 0xA9, 0x54, 0x12, 0x1F, 0xA4, 0x54, 0x01, \r
+0xFD, 0xAF, 0x55, 0x31, 0x7A, 0xAF, 0x55, 0x51, 0xD1, 0xEF, 0xAF, 0x55, 0x70, 0x04, 0xF1, 0xDF, \r
+0x80, 0x02, 0xF1, 0xDE, 0x05, 0x55, 0x80, 0xD6, 0xE5, 0x56, 0x70, 0x0E, 0xFF, 0x51, 0xD1, 0xEF, \r
+0x70, 0x08, 0xB1, 0xD7, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0xF0, 0x90, 0x00, 0x01, 0x02, \r
+0x1F, 0xBD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0xB5, 0x12, 0x1F, 0xA4, 0xFF, 0x90, \r
+0x81, 0x3F, 0xF0, 0xBF, 0x01, 0x08, 0x71, 0x4C, 0x64, 0x01, 0x60, 0x1F, 0x80, 0x1A, 0xAB, 0x52, \r
+0xAA, 0x53, 0xA9, 0x54, 0x71, 0x4C, 0x64, 0x01, 0x60, 0x11, 0x90, 0x81, 0x40, 0xE0, 0x20, 0xE0, \r
+0x07, 0xE4, 0xFF, 0x12, 0x5C, 0x81, 0x80, 0x03, 0x12, 0x5C, 0x5D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x90, 0x82, 0x78, 0x12, 0x45, 0x15, 0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x7F, 0x90, 0x81, 0x49, 0xF0, \r
+0xEF, 0x12, 0x76, 0x86, 0xA3, 0x71, 0x4B, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x81, \r
+0x47, 0xE0, 0x54, 0xF0, 0x4E, 0xB1, 0x2D, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0x81, 0x45, 0xE0, \r
+0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x91, 0x61, 0x4F, 0x91, 0xAA, \r
+0x90, 0x81, 0x48, 0x91, 0x53, 0x30, 0xE0, 0x52, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, \r
+0x90, 0x81, 0x5C, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x2A, 0x74, 0x03, 0xF0, 0x91, 0x4D, 0xE9, 0x24, \r
+0x06, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x1F, 0xA4, 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, 0x1F, 0xEA, 0x91, 0x4D, 0x91, 0x54, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x81, \r
+0x51, 0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x91, 0x4D, 0x90, 0x00, 0x04, 0x12, \r
+0x1F, 0xBD, 0xFD, 0x7F, 0x02, 0x12, 0x4D, 0xFD, 0x91, 0x4D, 0x91, 0x82, 0x12, 0x76, 0x8E, 0xF0, \r
+0x90, 0x81, 0x49, 0x12, 0x77, 0xC1, 0x91, 0x60, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0x82, 0x78, \r
+0x02, 0x45, 0x0C, 0xF0, 0x90, 0x00, 0x06, 0x02, 0x1F, 0xBD, 0x90, 0x81, 0x4D, 0xE0, 0x44, 0x01, \r
+0xF0, 0x90, 0x81, 0x47, 0xE0, 0x54, 0x0F, 0x22, 0xE4, 0xFF, 0x51, 0xD1, 0xBF, 0x01, 0x12, 0x90, \r
+0x81, 0x49, 0xE0, 0x60, 0x0C, 0x91, 0x61, 0x64, 0x02, 0x60, 0x03, 0x02, 0x59, 0x4E, 0x12, 0x4F, \r
+0xAD, 0x22, 0x90, 0x82, 0x7B, 0x12, 0x45, 0x15, 0x12, 0x76, 0xF4, 0x90, 0x81, 0x49, 0xE0, 0xFF, \r
+0xB1, 0x60, 0x90, 0x81, 0x49, 0xE0, 0x60, 0x11, 0x90, 0x82, 0x7B, 0x12, 0x45, 0x0C, 0x71, 0x4C, \r
+0x54, 0x0F, 0xFF, 0x91, 0xAB, 0xFD, 0x12, 0x77, 0x21, 0x22, 0xF0, 0x90, 0x00, 0x02, 0x02, 0x1F, \r
+0xBD, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x52, 0x12, 0x1F, 0xA4, 0x25, 0x52, 0x90, 0x80, 0x42, 0x71, \r
+0x4B, 0x25, 0x52, 0x90, 0x80, 0x43, 0x91, 0xAA, 0x25, 0x52, 0x90, 0x80, 0x44, 0xB1, 0x2D, 0x25, \r
+0x52, 0x90, 0x80, 0x45, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0xBD, 0x25, 0x52, 0x90, 0x80, 0x46, \r
+0xF0, 0x90, 0x00, 0x05, 0x12, 0x1F, 0xBD, 0x25, 0x52, 0x90, 0x80, 0x47, 0x91, 0x53, 0x25, 0x52, \r
+0x90, 0x80, 0x48, 0xF0, 0x22, 0x91, 0xAB, 0xFF, 0x30, 0xE0, 0x1C, 0x12, 0x1F, 0xA4, 0x90, 0x81, \r
+0xED, 0x71, 0x4B, 0x90, 0x81, 0xEE, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, \r
+0xB1, 0x2D, 0x90, 0x81, 0xF0, 0xF0, 0x22, 0x90, 0x81, 0xED, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x0A, \r
+0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x1E, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xF0, 0x90, 0x00, \r
+0x03, 0x02, 0x1F, 0xBD, 0xF1, 0xC4, 0x12, 0x77, 0xF0, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, \r
+0x54, 0xFD, 0x4F, 0x71, 0x4B, 0x90, 0x81, 0xF7, 0x91, 0xAA, 0x90, 0x81, 0xF8, 0xF0, 0x90, 0x81, \r
+0xF7, 0xE0, 0x90, 0x81, 0xF9, 0xF0, 0x90, 0x81, 0xF6, 0xE0, 0x54, 0x01, 0xFF, 0x02, 0x49, 0x16, \r
+0xEF, 0x70, 0x39, 0x7D, 0x78, 0x7F, 0x02, 0x12, 0x49, 0x86, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x49, \r
+0x86, 0x7D, 0xC8, 0x7F, 0x02, 0xF1, 0xBC, 0xF1, 0xAA, 0xF0, 0xE4, 0xFF, 0x51, 0xD1, 0xEF, 0x70, \r
+0x0A, 0xB1, 0xD7, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, \r
+0x4B, 0xBE, 0xB1, 0xDC, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, \r
+0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0x12, 0x49, 0x0A, 0x7D, 0x02, 0x7F, 0x03, \r
+0x12, 0x49, 0x0A, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF1, 0xE2, 0xE4, 0xFF, 0x51, 0xD1, 0xBF, \r
+0x01, 0x11, 0xF1, 0x81, 0xF0, 0x90, 0x81, 0x4C, 0xE0, 0x20, 0xE2, 0x0A, 0x7D, 0x01, 0x7F, 0x04, \r
+0x02, 0x4B, 0xBE, 0xD1, 0xA9, 0xF0, 0x22, 0xB1, 0xE4, 0x12, 0x4F, 0xA2, 0x90, 0x81, 0x45, 0xE0, \r
+0x54, 0xF7, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0x01, 0xE0, 0x44, \r
+0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, \r
+0xB4, 0x74, 0x86, 0xF0, 0x12, 0x5F, 0xB9, 0xEC, 0x54, 0x7F, 0xFC, 0x90, 0x82, 0xBA, 0x12, 0x20, \r
+0xCE, 0x90, 0x82, 0xBA, 0x12, 0x5E, 0x96, 0x7F, 0x7C, 0xD1, 0x42, 0x12, 0x20, 0xDA, 0xCC, 0xC0, \r
+0x00, 0xC0, 0x7F, 0x8C, 0xD1, 0x42, 0x12, 0x20, 0xDA, 0x00, 0xC0, 0x00, 0x14, 0x12, 0x77, 0xE5, \r
+0x12, 0x20, 0xDA, 0x00, 0x03, 0x3E, 0x60, 0xE4, 0xFD, 0xFF, 0x12, 0x67, 0xD3, 0xD0, 0xD0, 0x92, \r
+0xAF, 0x22, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x85, 0xBB, 0x22, 0xF1, 0xC4, 0x90, 0x81, 0xF4, \r
+0x12, 0x77, 0xAC, 0x54, 0x04, 0x25, 0xE0, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0x90, 0x81, 0xF4, 0x71, \r
+0x4B, 0xFF, 0x90, 0x05, 0x54, 0xE0, 0xC3, 0x9F, 0x90, 0x81, 0xF5, 0xF0, 0xEE, 0x20, 0xE0, 0x03, \r
+0x12, 0x4F, 0x40, 0x90, 0x81, 0xF4, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x15, 0x90, 0x81, 0x49, 0x74, \r
+0x01, 0xF0, 0xE4, 0x90, 0x81, 0x4B, 0xF0, 0xD1, 0xA9, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x05, 0xF0, \r
+0x22, 0xE4, 0x90, 0x81, 0x49, 0xF0, 0x90, 0x81, 0x4B, 0x74, 0x0C, 0xF0, 0x90, 0x81, 0x45, 0xE0, \r
+0x54, 0xFE, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x90, 0x81, 0x46, 0xE0, 0x44, 0x04, 0x22, \r
+0x12, 0x74, 0x23, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x81, 0xFE, 0xEE, 0xF0, \r
+0xA3, 0xEF, 0xF0, 0x12, 0x47, 0xF3, 0x60, 0x02, 0xE1, 0x60, 0x90, 0x81, 0x49, 0xE0, 0x70, 0x02, \r
+0xE1, 0x60, 0xF1, 0x6E, 0x64, 0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x81, 0x50, 0xF0, \r
+0x90, 0x06, 0xAA, 0xE0, 0x90, 0x81, 0x4F, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x81, 0x4F, \r
+0xE0, 0xFE, 0xFF, 0x80, 0x00, 0x90, 0x81, 0x50, 0xEF, 0xF0, 0x12, 0x71, 0xBC, 0xD1, 0xA9, 0xF0, \r
+0xE4, 0x90, 0x81, 0x52, 0xF1, 0xE2, 0xF1, 0xAA, 0x12, 0x74, 0x0C, 0x54, 0xEF, 0xF1, 0x6D, 0x24, \r
+0xFD, 0x50, 0x02, 0x80, 0x0F, 0x90, 0x81, 0x40, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0x58, 0xE3, 0x80, \r
+0x03, 0x12, 0x58, 0x9E, 0x12, 0x70, 0xB1, 0x30, 0xE0, 0x36, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, \r
+0x20, 0xE0, 0x2D, 0x90, 0x81, 0x4F, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x23, 0x90, 0x81, 0x46, \r
+0xE0, 0x44, 0x40, 0xF0, 0x12, 0x75, 0x3B, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, \r
+0x03, 0x12, 0x49, 0x67, 0x12, 0x49, 0x82, 0x12, 0x73, 0xE7, 0x90, 0x81, 0x50, 0xE0, 0x14, 0xF0, \r
+0x90, 0x81, 0x40, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x03, 0xD1, 0xA9, 0xF0, 0x22, 0xF0, 0x90, 0x81, \r
+0x47, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x22, 0x12, 0x4F, 0x40, 0x90, 0x81, 0x43, 0x74, 0x01, 0xF0, \r
+0x22, 0x90, 0x81, 0x46, 0xE0, 0x54, 0xFB, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x1B, 0xF1, 0xAD, \r
+0xF0, 0x12, 0x73, 0xFF, 0x30, 0xE0, 0x03, 0x02, 0x74, 0x09, 0x12, 0x71, 0x38, 0x40, 0x0A, 0xE4, \r
+0xFF, 0x51, 0xD1, 0xBF, 0x01, 0x03, 0xF1, 0x81, 0xF0, 0x22, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, \r
+0x01, 0x3C, 0x74, 0x02, 0x22, 0x8B, 0x52, 0x8A, 0x53, 0x89, 0x54, 0x22, 0x74, 0x45, 0x12, 0x77, \r
+0xF8, 0x02, 0x49, 0x6D, 0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x01, 0xFE, 0x22, 0x12, 0x4F, 0x43, 0x12, \r
+0x5E, 0x8E, 0x80, 0xA6, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x22, 0x22, 0x22, \r
+0x80, 0x98, 0xF0, 0x90, 0x81, 0x55, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x90, 0x00, 0xF7, \r
+0xE0, 0x20, 0xE7, 0x09, 0xE0, 0x7F, 0x01, 0x20, 0xE6, 0x0C, 0x7F, 0x02, 0x22, 0x90, 0x00, 0xF7, \r
+0xE0, 0x30, 0xE6, 0x02, 0x7F, 0x03, 0x22, 0x75, 0xE8, 0x03, 0x75, 0xA8, 0x84, 0x22, 0xE4, 0x90, \r
+0x82, 0x0F, 0xF0, 0x90, 0x82, 0x0F, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0x0E, 0x90, 0x01, 0xC4, 0xF0, \r
+0x74, 0x58, 0xA3, 0xF0, 0x90, 0x81, 0x49, 0xE0, 0x60, 0x0E, 0x90, 0x81, 0x4C, 0xE0, 0xFF, 0x90, \r
+0x81, 0x4B, 0xE0, 0x6F, 0x60, 0x02, 0x11, 0x54, 0xC2, 0xAF, 0x12, 0x6D, 0xCE, 0xBF, 0x01, 0x02, \r
+0x71, 0xF6, 0xD2, 0xAF, 0xF1, 0xA6, 0x12, 0x32, 0x9E, 0xBF, 0x01, 0x03, 0x12, 0x6C, 0x8B, 0x12, \r
+0x41, 0x4D, 0x80, 0xBF, 0x90, 0x81, 0x40, 0xE0, 0x90, 0x81, 0x4B, 0x30, 0xE0, 0x04, 0xE0, 0xFF, \r
+0x61, 0x2A, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x4B, 0xBE, 0x90, 0x81, 0x49, 0xE0, 0x60, 0x0F, 0x90, \r
+0x06, 0x92, 0xE0, 0x30, 0xE1, 0x03, 0x02, 0x76, 0xB5, 0x12, 0x55, 0xDC, 0x11, 0x54, 0x22, 0xE4, \r
+0xFF, 0x12, 0x52, 0xD1, 0xBF, 0x01, 0x0E, 0x90, 0x81, 0x49, 0xE0, 0x60, 0x08, 0x11, 0x96, 0x54, \r
+0x07, 0x70, 0x02, 0x11, 0x54, 0x22, 0x90, 0x81, 0x4D, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xE4, 0xF5, \r
+0x4E, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x4E, 0x54, 0xC0, 0x70, 0x07, 0x11, 0x96, 0x54, 0xFD, 0xF0, \r
+0x80, 0xA2, 0xE5, 0x4E, 0x30, 0xE6, 0x18, 0x90, 0x81, 0x49, 0xE0, 0x64, 0x01, 0x70, 0x12, 0x12, \r
+0x54, 0x5A, 0x64, 0x02, 0x60, 0x04, 0x31, 0x4E, 0x80, 0x07, 0x12, 0x4F, 0xAD, 0x80, 0x02, 0x11, \r
+0x96, 0xE5, 0x4E, 0x90, 0x81, 0x4D, 0x30, 0xE7, 0x05, 0x12, 0x47, 0x7A, 0x61, 0x22, 0xE0, 0x54, \r
+0xFD, 0xF0, 0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x82, 0x00, 0xF0, 0xE0, 0xFD, 0x54, 0xC0, 0x70, \r
+0x04, 0x11, 0x96, 0x80, 0x55, 0xED, 0x30, 0xE6, 0x3F, 0x90, 0x81, 0x49, 0xE0, 0x64, 0x02, 0x70, \r
+0x27, 0x90, 0x81, 0x45, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x09, 0x90, 0x81, 0x4D, 0xE0, 0x44, \r
+0x01, 0xF0, 0x80, 0x1B, 0x12, 0x54, 0x61, 0x64, 0x01, 0x70, 0x1F, 0x90, 0x81, 0x4D, 0xE0, 0x44, \r
+0x04, 0xF0, 0x7F, 0x01, 0x31, 0xEB, 0x80, 0x12, 0x12, 0x54, 0x5A, 0x64, 0x02, 0x60, 0x04, 0x31, \r
+0x4E, 0x80, 0x07, 0x12, 0x4F, 0xAD, 0x80, 0x02, 0x11, 0x96, 0x90, 0x82, 0x00, 0xE0, 0x90, 0x81, \r
+0x4D, 0x30, 0xE7, 0x05, 0x12, 0x47, 0x7A, 0x61, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x04, \r
+0x1D, 0xE0, 0x70, 0x15, 0x90, 0x80, 0x43, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x31, 0x6A, 0x90, \r
+0x82, 0x01, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x71, 0x1B, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x90, 0x82, 0xC7, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x82, 0xC6, 0xEF, 0xF0, 0xE4, 0xFD, \r
+0xFC, 0x12, 0x77, 0x98, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0x82, 0xC6, 0xE0, 0x90, 0x04, 0x25, 0xF0, \r
+0x90, 0x82, 0xC7, 0xE0, 0x60, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
+0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x08, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
+0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, \r
+0xAF, 0x05, 0x51, 0xFC, 0xE0, 0x54, 0x01, 0xFE, 0x90, 0x82, 0xC8, 0xE0, 0x25, 0xE0, 0x25, 0xE0, \r
+0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x51, 0xFC, 0xEE, 0xF0, 0x74, 0x21, 0x2F, 0x51, 0x5C, 0x54, \r
+0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
+0xC0, 0xD0, 0x90, 0x82, 0xC2, 0xEF, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1D, 0x90, 0x05, 0x22, \r
+0xE0, 0x90, 0x82, 0xC5, 0xF0, 0x7D, 0x29, 0xD1, 0x06, 0xBF, 0x01, 0x02, 0x51, 0x23, 0x90, 0x82, \r
+0xC5, 0xE0, 0xFF, 0x7D, 0x2A, 0x12, 0x4D, 0xA9, 0x80, 0x02, 0x51, 0x23, 0x71, 0x1B, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0x90, 0x80, 0x45, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0x31, 0x6A, 0x90, 0x82, \r
+0xC3, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x82, 0xC2, 0xE0, 0xFF, 0x51, 0x66, 0x54, \r
+0x3F, 0xF0, 0xEF, 0x60, 0x0A, 0x51, 0x59, 0x44, 0x10, 0x51, 0x65, 0x44, 0x80, 0xF0, 0x22, 0x51, \r
+0x59, 0x54, 0xEF, 0x51, 0x65, 0x44, 0x40, 0xF0, 0x22, 0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF0, 0x74, 0x1F, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
+0xE0, 0x22, 0x90, 0x80, 0x44, 0xE0, 0xFF, 0x90, 0x82, 0xB2, 0xE0, 0xFB, 0x7D, 0x01, 0x31, 0x6A, \r
+0x90, 0x82, 0xB3, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x82, 0xB1, 0xE0, 0xFF, 0x51, \r
+0x3D, 0x90, 0x82, 0xB3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x04, 0x80, 0xE0, 0x54, 0x0F, 0xFD, \r
+0xAC, 0x07, 0x71, 0x0F, 0x44, 0x01, 0xF0, 0x71, 0x0F, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x16, \r
+0x2C, 0x51, 0xFF, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
+0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
+0x83, 0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, 0x53, 0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, \r
+0x51, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0x71, 0x07, 0xE0, \r
+0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0x71, 0x07, 0xED, 0xF0, 0x22, 0x74, 0x16, 0x2F, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x74, \r
+0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x90, 0x04, 0x1F, 0x74, 0x20, \r
+0xF0, 0x22, 0x90, 0x81, 0x45, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xAE, 0x07, 0x71, 0x43, 0xBF, 0x01, \r
+0x0F, 0xF1, 0xD0, 0x20, 0xE0, 0x0A, 0xAF, 0x06, 0x7D, 0x01, 0x12, 0x4B, 0xBE, 0x7F, 0x01, 0x22, \r
+0x7F, 0x00, 0x22, 0x90, 0x05, 0x43, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0x12, \r
+0x47, 0xF3, 0x70, 0x17, 0x90, 0x81, 0x49, 0xE0, 0x60, 0x11, 0x12, 0x57, 0xAA, 0xF0, 0x90, 0x81, \r
+0x45, 0xE0, 0x12, 0x74, 0x0A, 0x54, 0x07, 0x70, 0x02, 0x11, 0x54, 0x22, 0x90, 0x81, 0x49, 0xE0, \r
+0x70, 0x07, 0x90, 0x81, 0x40, 0xE0, 0x30, 0xE0, 0x11, 0x90, 0x81, 0x40, 0xE0, 0x30, 0xE0, 0x07, \r
+0x71, 0x43, 0xBF, 0x01, 0x05, 0x80, 0x04, 0x12, 0x4F, 0xBD, 0x22, 0x90, 0x81, 0x49, 0xE0, 0x64, \r
+0x02, 0x60, 0x11, 0x12, 0x54, 0x61, 0x60, 0x0C, 0x12, 0x6E, 0xC8, 0xEF, 0x70, 0x06, 0xFD, 0x7F, \r
+0x0C, 0x12, 0x4B, 0xBE, 0x22, 0x71, 0xC3, 0x30, 0xE0, 0x0B, 0x71, 0xBC, 0x60, 0x07, 0x7D, 0x01, \r
+0x7F, 0x02, 0x12, 0x4B, 0xBE, 0x71, 0xBC, 0x60, 0x02, 0x71, 0x8B, 0x22, 0x90, 0x81, 0x44, 0xE0, \r
+0x64, 0x02, 0x22, 0x90, 0x81, 0x40, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0x90, 0x81, \r
+0x45, 0x71, 0xC6, 0x30, 0xE0, 0x1F, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x81, \r
+0x46, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x09, 0xE0, 0x54, 0xFE, 0x12, 0x76, 0x8D, \r
+0x74, 0x04, 0xF0, 0x11, 0x54, 0x22, 0x90, 0x81, 0x45, 0xE0, 0x30, 0xE0, 0x19, 0x90, 0x81, 0x40, \r
+0xE0, 0xFF, 0x30, 0xE0, 0x0F, 0xC3, 0x13, 0x30, 0xE0, 0x08, 0x12, 0x77, 0x8B, 0xBF, 0x01, 0x06, \r
+0x80, 0x02, 0x80, 0x00, 0x91, 0x17, 0x22, 0x90, 0x81, 0x4C, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, \r
+0x0E, 0x12, 0x6E, 0x85, 0xBF, 0x01, 0x08, 0x91, 0x30, 0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, 0x22, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x63, 0xD1, 0x91, 0x41, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0x12, 0x76, 0x98, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x32, 0x1E, \r
+0xE4, 0xFF, 0x12, 0x63, 0x7D, 0x90, 0x81, 0x46, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x81, 0x3F, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x04, 0x80, 0x0B, 0x71, \r
+0x43, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x91, 0x81, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x81, 0x43, 0xE0, 0x90, 0x82, 0xD7, 0xF0, \r
+0x6F, 0x70, 0x02, 0xA1, 0x8B, 0xEF, 0x14, 0x60, 0x42, 0x14, 0x60, 0x6F, 0x14, 0x70, 0x02, 0xA1, \r
+0x36, 0x14, 0x70, 0x02, 0xA1, 0x61, 0x24, 0x04, 0x60, 0x02, 0xA1, 0x8B, 0x90, 0x82, 0xD7, 0xE0, \r
+0xB4, 0x04, 0x04, 0xD1, 0x6F, 0xA1, 0x8B, 0x90, 0x82, 0xD7, 0xE0, 0xB4, 0x02, 0x04, 0xD1, 0x7E, \r
+0xA1, 0x8B, 0x90, 0x82, 0xD7, 0xE0, 0xB4, 0x03, 0x04, 0xD1, 0x7A, 0xA1, 0x8B, 0x90, 0x82, 0xD7, \r
+0xE0, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x8B, 0xD1, 0x72, 0xA1, 0x8B, 0x90, 0x82, 0xD7, 0xE0, 0xB4, \r
+0x04, 0x05, 0x12, 0x57, 0xCC, 0xA1, 0x8B, 0x90, 0x82, 0xD7, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0x57, \r
+0x77, 0xA1, 0x8B, 0x90, 0x82, 0xD7, 0xE0, 0xB4, 0x03, 0x04, 0xD1, 0x88, 0xA1, 0x8B, 0x90, 0x82, \r
+0xD7, 0xE0, 0x60, 0x02, 0xA1, 0x8B, 0x12, 0x57, 0xE0, 0xA1, 0x8B, 0x90, 0x82, 0xD7, 0xE0, 0xB4, \r
+0x04, 0x04, 0xD1, 0x00, 0x80, 0x75, 0x90, 0x82, 0xD7, 0xE0, 0xB4, 0x01, 0x04, 0xB1, 0x92, 0x80, \r
+0x6A, 0x90, 0x82, 0xD7, 0xE0, 0xB4, 0x03, 0x04, 0xB1, 0x90, 0x80, 0x5F, 0x90, 0x82, 0xD7, 0xE0, \r
+0x70, 0x59, 0xD1, 0x4E, 0x80, 0x55, 0x90, 0x82, 0xD7, 0xE0, 0xB4, 0x04, 0x04, 0xD1, 0x64, 0x80, \r
+0x4A, 0x90, 0x82, 0xD7, 0xE0, 0xB4, 0x01, 0x04, 0xD1, 0x56, 0x80, 0x3F, 0x90, 0x82, 0xD7, 0xE0, \r
+0xB4, 0x02, 0x04, 0xD1, 0x83, 0x80, 0x34, 0x90, 0x82, 0xD7, 0xE0, 0x70, 0x2E, 0xD1, 0x53, 0x80, \r
+0x2A, 0x90, 0x82, 0xD7, 0xE0, 0xB4, 0x03, 0x04, 0xF1, 0xA7, 0x80, 0x1F, 0x90, 0x82, 0xD7, 0xE0, \r
+0xB4, 0x01, 0x05, 0x12, 0x4F, 0xEA, 0x80, 0x13, 0x90, 0x82, 0xD7, 0xE0, 0xB4, 0x02, 0x04, 0xF1, \r
+0xC0, 0x80, 0x08, 0x90, 0x82, 0xD7, 0xE0, 0x70, 0x02, 0xF1, 0xAC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x80, 0x07, 0x7D, 0x20, 0x7F, 0xFF, 0x12, 0x4D, 0xA9, 0xB1, 0xA2, 0x90, 0x81, 0x43, 0x74, 0x02, \r
+0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xD1, 0x0B, 0x90, 0x85, 0xBB, 0x12, 0x20, \r
+0xDA, 0xCC, 0xF0, 0x00, 0xC0, 0x7F, 0x8C, 0x12, 0x56, 0x42, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, \r
+0x14, 0x12, 0x77, 0xE5, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xFD, 0xFF, 0x12, 0x67, \r
+0xD3, 0xF1, 0xB9, 0xEC, 0x44, 0x80, 0xFC, 0x90, 0x82, 0xBE, 0x12, 0x20, 0xCE, 0x90, 0x82, 0xBE, \r
+0xD1, 0x96, 0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, \r
+0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0xD1, 0x8E, 0x7D, 0x23, 0x80, 0x8E, 0x7F, 0xFF, 0x12, 0x4D, 0xA9, 0xE4, 0x90, 0x82, 0xCD, 0xF0, \r
+0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, \r
+0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x82, 0xCE, 0xE0, 0x94, 0xE8, 0x90, 0x82, \r
+0xCD, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, \r
+0x7F, 0x32, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0x90, 0x82, 0xCD, 0xF1, 0xB2, 0x80, 0xC4, 0x12, 0x57, \r
+0xE0, 0xA1, 0x92, 0x12, 0x57, 0xE0, 0x7D, 0x21, 0x7F, 0xFF, 0x12, 0x4D, 0xA9, 0x90, 0x81, 0x43, \r
+0x74, 0x03, 0xF0, 0x22, 0x7D, 0x22, 0x7F, 0xFF, 0x12, 0x4D, 0xA9, 0xD1, 0x8E, 0x80, 0xEE, 0x12, \r
+0x57, 0xCC, 0xF1, 0xC8, 0xE4, 0x90, 0x81, 0x43, 0xF0, 0x22, 0xD1, 0x88, 0x80, 0xF4, 0x12, 0x57, \r
+0x77, 0x80, 0xEF, 0x12, 0x55, 0xE4, 0x80, 0xD5, 0x12, 0x4F, 0x43, 0x02, 0x57, 0x7A, 0x90, 0x05, \r
+0x27, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x12, 0x44, 0xCF, 0x90, 0x85, 0xBB, 0x02, 0x20, 0xCE, 0x90, \r
+0x82, 0x92, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xE4, \r
+0x90, 0x82, 0xA0, 0xF0, 0x7F, 0x24, 0x7E, 0x08, 0x12, 0x2D, 0x5C, 0x90, 0x82, 0x98, 0x12, 0x20, \r
+0xCE, 0x90, 0x82, 0x92, 0xE0, 0xFB, 0x70, 0x04, 0xF1, 0x81, 0x80, 0x06, 0xEB, 0xF1, 0x87, 0x12, \r
+0x2D, 0x5C, 0x90, 0x82, 0x9C, 0x12, 0x20, 0xCE, 0x90, 0x82, 0x93, 0x12, 0x6B, 0xFE, 0x78, 0x17, \r
+0x12, 0x65, 0x72, 0x90, 0x82, 0x9C, 0x12, 0x44, 0xCF, 0xED, 0x54, 0x7F, 0xFD, 0xEC, 0x54, 0x80, \r
+0xFC, 0x12, 0x44, 0xC2, 0xEC, 0x44, 0x80, 0xFC, 0x90, 0x82, 0x9C, 0x12, 0x20, 0xCE, 0xF1, 0x81, \r
+0xEC, 0x54, 0x7F, 0xFC, 0xD1, 0x99, 0xF1, 0x9A, 0xF1, 0x87, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x82, \r
+0x9C, 0xD1, 0x96, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x2E, 0xA2, 0xF1, 0x81, 0xEC, 0x44, 0x80, 0xFC, \r
+0xD1, 0x99, 0xF1, 0x9A, 0x70, 0x04, 0x7F, 0x20, 0x80, 0x09, 0x90, 0x82, 0x92, 0xE0, 0xB4, 0x01, \r
 0x16, 0x7F, 0x28, 0x7E, 0x08, 0x12, 0x2D, 0x5C, 0x78, 0x08, 0x12, 0x20, 0xA8, 0xEF, 0x54, 0x01, \r
-0xFF, 0xE4, 0x90, 0x81, 0xEB, 0xEF, 0xF0, 0x90, 0x81, 0xEB, 0xE0, 0x90, 0x81, 0xDD, 0x60, 0x0E, \r
+0xFF, 0xE4, 0x90, 0x82, 0xA0, 0xEF, 0xF0, 0x90, 0x82, 0xA0, 0xE0, 0x90, 0x82, 0x92, 0x60, 0x0E, \r
 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0x80, 0x0C, 0xE0, 0x75, \r
-0xF0, 0x08, 0xA4, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, \r
-0xFF, 0x12, 0x2D, 0x5C, 0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x90, 0x81, 0xDF, 0x12, 0x20, 0xCE, \r
-0x90, 0x81, 0xDF, 0x02, 0x4A, 0xD9, 0x90, 0x81, 0xEC, 0xEF, 0xF0, 0xAB, 0x05, 0x90, 0x81, 0xF2, \r
-0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x03, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x14, 0x12, \r
-0x20, 0xBB, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x81, 0xEE, 0x12, 0x4A, 0xD9, \r
-0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x12, 0x4A, 0xCC, 0xEC, 0x54, 0x0F, 0xFC, 0x90, 0x81, 0xF2, \r
-0x12, 0x20, 0xCE, 0x90, 0x81, 0xEC, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x60, 0xF5, 0x82, 0xE4, \r
-0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x81, 0xF2, \r
-0x12, 0x4A, 0xD9, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xCE, 0xD0, 0x07, 0xD0, 0x06, 0x02, 0x2E, 0xA2, \r
-0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xF5, 0x1D, 0x90, 0x81, 0x39, 0xE0, 0xF5, 0x1E, 0xE4, 0xFB, 0xFD, \r
-0x7F, 0x54, 0x7E, 0x01, 0x8E, 0x19, 0x8F, 0x1A, 0xE5, 0x1E, 0x54, 0x07, 0xC4, 0x33, 0x54, 0xE0, \r
-0x85, 0x19, 0x83, 0x85, 0x1A, 0x82, 0xF0, 0xE5, 0x1D, 0x54, 0x07, 0xC4, 0x33, 0x54, 0xE0, 0xFF, \r
-0xE5, 0x1E, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x4F, 0xA3, 0xF0, 0xEB, 0x54, 0x07, 0xC4, 0x33, 0x54, \r
-0xE0, 0xFF, 0xE5, 0x1D, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x4F, 0x85, 0x1A, 0x82, 0x85, 0x19, 0x83, \r
-0xA3, 0xA3, 0xF0, 0xBD, 0x01, 0x0C, 0x85, 0x1A, 0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0x74, 0x03, \r
-0xF0, 0x22, 0x85, 0x1A, 0x82, 0x85, 0x19, 0x83, 0xA3, 0xA3, 0xA3, 0x74, 0x01, 0xF0, 0x22, 0xE4, \r
-0x90, 0x81, 0x51, 0xF0, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x81, 0x51, 0xF0, 0xE0, 0x54, 0xC0, 0x70, \r
-0x0D, 0x90, 0x81, 0x2B, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x02, 0x4D, 0x29, 0x90, 0x81, \r
-0x51, 0xE0, 0x30, 0xE6, 0x21, 0x90, 0x81, 0x27, 0xE0, 0x64, 0x01, 0x70, 0x20, 0x90, 0x81, 0x2B, \r
-0xE0, 0x44, 0x01, 0xF0, 0x90, 0x81, 0x26, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x04, 0xF1, 0x3D, \r
-0x80, 0x0B, 0xD1, 0x6C, 0x80, 0x07, 0x90, 0x81, 0x2B, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x81, 0x51, \r
-0xE0, 0x90, 0x81, 0x2B, 0x30, 0xE7, 0x10, 0xB1, 0x90, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, \r
-0x81, 0x24, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x01, 0x5F, 0xE4, \r
-0xF0, 0x90, 0x01, 0x3C, 0x74, 0x08, 0xF0, 0xE4, 0xF5, 0x1D, 0x90, 0x81, 0x3A, 0xE0, 0xC3, 0x13, \r
-0x54, 0x7F, 0xF5, 0x1E, 0xE4, 0xFB, 0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0xB1, 0xA4, 0x90, 0x01, 0x5F, \r
-0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x81, 0x24, 0xE0, 0x44, 0x10, 0xF0, \r
-0x90, 0x81, 0x2A, 0xE0, 0x64, 0x0C, 0x60, 0x08, 0x12, 0x4D, 0x3D, 0xE4, 0xFF, 0x12, 0x56, 0xA8, \r
-0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x81, 0x51, 0xF0, 0xE0, 0xFD, 0x54, 0xC0, 0x70, 0x09, 0x90, \r
-0x81, 0x2B, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x71, 0xED, 0x30, 0xE6, 0x4B, 0x90, 0x81, 0x27, 0xE0, \r
-0x64, 0x02, 0x70, 0x2A, 0x90, 0x81, 0x24, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x09, 0x90, 0x81, \r
-0x2B, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x28, 0x90, 0x81, 0x26, 0xE0, 0x54, 0x0F, 0x64, 0x01, 0x70, \r
-0x2D, 0x90, 0x81, 0x2B, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x01, 0xF1, 0x74, 0x80, 0x20, 0x90, 0x81, \r
-0x2B, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x81, 0x26, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x04, 0xF1, \r
-0x3D, 0x80, 0x0B, 0xD1, 0x6C, 0x80, 0x07, 0x90, 0x81, 0x2B, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x81, \r
-0x51, 0xE0, 0x90, 0x81, 0x2B, 0x30, 0xE7, 0x10, 0xB1, 0x90, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, \r
-0x90, 0x81, 0x24, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x04, 0x1D, \r
-0xE0, 0x70, 0x14, 0x90, 0x80, 0x3E, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x57, 0x31, 0x8E, 0x4E, 0x8F, \r
-0x4F, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x80, 0xDE, 0xE0, 0xB4, 0x01, 0x14, 0x90, \r
-0x81, 0x27, 0xE0, 0x60, 0x0E, 0x90, 0x81, 0x26, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x02, 0x80, \r
-0xCC, 0xD1, 0x6C, 0x22, 0x8F, 0x4E, 0x12, 0x77, 0x5A, 0xBF, 0x01, 0x19, 0x90, 0x80, 0x40, 0xE0, \r
-0xFF, 0x7D, 0x01, 0x12, 0x57, 0x31, 0xAD, 0x07, 0xAC, 0x06, 0xAF, 0x4E, 0x12, 0x56, 0xE6, 0x90, \r
-0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x81, 0x40, 0xE0, 0x30, 0xE0, 0x0C, 0xE4, 0xF5, 0x1D, \r
-0xA3, 0xB1, 0x9A, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x01, 0xBE, 0xE0, 0x04, 0xF0, 0x22, \r
-0x90, 0x80, 0xDE, 0xE0, 0x64, 0x01, 0x70, 0x18, 0x90, 0x81, 0x27, 0xE0, 0x60, 0x12, 0x90, 0x01, \r
-0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xB1, 0x93, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, \r
-0x22, 0x90, 0x81, 0xF6, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xAD, 0x03, 0xAC, 0x02, 0xE4, 0x90, 0x81, \r
-0xFE, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xC4, 0x74, 0xD1, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0xEC, 0x54, \r
-0x3F, 0xFC, 0x90, 0x01, 0x40, 0xED, 0xF0, 0xAE, 0x04, 0xEE, 0xA3, 0xF0, 0x90, 0x81, 0xF6, 0xE0, \r
-0x24, 0x81, 0x60, 0x34, 0x24, 0xDA, 0x60, 0x1C, 0x24, 0x3C, 0x70, 0x41, 0x90, 0x81, 0xF7, 0xE0, \r
-0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0x90, 0x81, 0xFB, 0xF0, 0xA3, 0x74, 0x69, 0xF0, 0xA3, 0x74, \r
-0x80, 0xF0, 0x80, 0x2C, 0x90, 0x81, 0xF7, 0xE0, 0x54, 0x01, 0x90, 0x81, 0xFB, 0xF0, 0xA3, 0x74, \r
-0xA5, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0x80, 0x18, 0x90, 0x81, 0xF7, 0xE0, 0xC4, 0x54, 0x10, 0x90, \r
-0x81, 0xFB, 0xF0, 0xA3, 0x74, 0x7F, 0xF0, 0xA3, 0x74, 0x10, 0xF0, 0x80, 0x03, 0x7F, 0x00, 0x22, \r
-0x90, 0x81, 0xFC, 0xE0, 0x90, 0x01, 0x06, 0xF0, 0x90, 0x81, 0xFB, 0xE0, 0x60, 0x0E, 0x90, 0x01, \r
-0x42, 0xF0, 0x90, 0x81, 0xFA, 0xE0, 0x90, 0x01, 0x43, 0xF0, 0x80, 0x0D, 0x90, 0x01, 0x43, 0xE4, \r
-0xF0, 0x90, 0x81, 0xFB, 0xE0, 0x90, 0x01, 0x42, 0xF0, 0x90, 0x81, 0xFD, 0xE0, 0xFF, 0x90, 0x01, \r
-0x42, 0xE0, 0x5F, 0xFF, 0x90, 0x81, 0xFB, 0xE0, 0x6F, 0x60, 0xEE, 0x74, 0xD1, 0x04, 0x90, 0x01, \r
-0xC4, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0x90, 0x01, 0x43, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x02, \r
-0x09, 0xE0, 0xFD, 0x12, 0x1F, 0xA4, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x80, 0x3D, 0xF0, 0x90, \r
-0x00, 0x01, 0x12, 0x1F, 0xBD, 0xFF, 0xED, 0x2F, 0x90, 0x80, 0x3E, 0xF0, 0x90, 0x00, 0x02, 0x12, \r
-0x1F, 0xBD, 0xFF, 0xED, 0x2F, 0x90, 0x80, 0x3F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0xBD, 0xFF, \r
-0xED, 0x2F, 0x90, 0x80, 0x40, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0xBD, 0xFF, 0xAE, 0x05, 0xED, \r
-0x2F, 0x90, 0x80, 0x41, 0xF0, 0x22, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0xFF, 0x30, 0xE0, 0x26, \r
-0x12, 0x1F, 0xA4, 0x90, 0x81, 0x38, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x90, 0x81, 0x39, \r
-0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, \r
-0xBD, 0x90, 0x81, 0x3B, 0xF0, 0x22, 0x90, 0x81, 0x38, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x05, 0xF0, \r
-0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0x8F, 0x0D, 0x22, 0x8F, \r
-0x0E, 0x22, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, \r
-0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x32, 0x1E, 0xE4, 0xFD, \r
-0x7F, 0x51, 0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x53, \r
-0x02, 0x32, 0x1E, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, \r
-0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x12, 0x32, 0x1E, 0x7D, \r
-0xFF, 0x7F, 0x55, 0x12, 0x32, 0x1E, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x32, 0x1E, 0x7D, 0xFF, 0x7F, \r
-0x57, 0x02, 0x32, 0x1E, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, 0x7E, \r
-0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, 0x9B, \r
-0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, 0x01, \r
-0x98, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0x81, 0x56, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, 0xE0, 0x7F, \r
-0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3E, 0xC3, 0x90, 0x81, 0x57, 0xE0, \r
-0x94, 0x88, 0x90, 0x81, 0x56, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, \r
-0xF0, 0x22, 0x90, 0x81, 0x56, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x4A, 0xA9, 0x7F, 0x14, 0x7E, 0x00, \r
-0x12, 0x32, 0xAA, 0xD3, 0x90, 0x81, 0x57, 0xE0, 0x94, 0x32, 0x90, 0x81, 0x56, 0xE0, 0x94, 0x00, \r
-0x40, 0xB9, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xB2, 0x22, 0x7F, 0x02, 0x90, 0x81, 0x46, 0xE0, \r
-0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x18, 0xEF, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x0B, \r
-0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0F, 0x80, 0xDE, 0x7F, 0x01, \r
-0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x3D, 0xF5, 0x41, 0xA3, 0xE0, 0x55, 0x3E, 0xF5, 0x42, 0xA3, \r
-0xE0, 0x55, 0x3F, 0xF5, 0x43, 0xA3, 0xE0, 0x55, 0x40, 0xF5, 0x44, 0x90, 0x01, 0x34, 0xE5, 0x41, \r
-0xF0, 0xA3, 0xE5, 0x42, 0xF0, 0xA3, 0xE5, 0x43, 0xF0, 0xA3, 0xE5, 0x44, 0xF0, 0x22, 0x90, 0x01, \r
-0x3C, 0xE0, 0x55, 0x45, 0xF5, 0x49, 0xA3, 0xE0, 0x55, 0x46, 0xF5, 0x4A, 0xA3, 0xE0, 0x55, 0x47, \r
-0xF5, 0x4B, 0xA3, 0xE0, 0x55, 0x48, 0xF5, 0x4C, 0x90, 0x01, 0x3C, 0xE5, 0x49, 0xF0, 0xA3, 0xE5, \r
-0x4A, 0xF0, 0xA3, 0xE5, 0x4B, 0xF0, 0xA3, 0xE5, 0x4C, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0x81, \r
-0x50, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, \r
-0xE0, 0x04, 0xF0, 0x90, 0x81, 0x1F, 0xE0, 0x30, 0xE0, 0x10, 0xA3, 0x74, 0x01, 0xF0, 0x90, 0x81, \r
-0x1F, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x51, 0xCF, 0x71, 0xF9, 0x02, 0x5F, 0x72, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x81, 0x1E, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x04, 0x80, \r
-0x0C, 0x12, 0x4F, 0xE3, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0x55, 0xA3, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x81, 0x1F, 0xE0, 0xFF, 0x30, 0xE0, 0x3D, 0x90, 0x81, 0x23, \r
-0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0x81, 0x22, 0xE0, 0x7D, 0x00, 0xB4, 0x04, \r
-0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x23, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x80, 0xB0, 0x71, \r
-0x82, 0x90, 0x81, 0x23, 0xE0, 0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F, 0x0C, 0x80, 0x09, 0x90, 0x81, \r
-0x23, 0xE0, 0x70, 0x06, 0xFD, 0x7F, 0x04, 0x12, 0x4D, 0x41, 0x22, 0x90, 0x81, 0x1F, 0xE0, 0xFF, \r
-0x30, 0xE0, 0x3E, 0x90, 0x81, 0x23, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0x81, \r
-0x22, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x24, 0xEF, 0xC3, 0x13, \r
-0x30, 0xE0, 0x02, 0x41, 0xCF, 0x71, 0xAA, 0x90, 0x81, 0x23, 0xE0, 0xB4, 0x0C, 0x06, 0xE4, 0xFD, \r
-0x7F, 0x08, 0x80, 0x0A, 0x90, 0x81, 0x23, 0xE0, 0xB4, 0x04, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x4D, \r
-0x41, 0x22, 0x90, 0x81, 0x1F, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0F, 0x90, \r
-0x81, 0x23, 0xE0, 0x64, 0x02, 0x60, 0x07, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x4D, 0x41, 0x90, 0x81, \r
-0x23, 0xE0, 0x64, 0x02, 0x60, 0x03, 0x12, 0x4F, 0xC8, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x48, \r
-0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x81, 0x24, 0xE0, 0xFF, 0x13, 0x13, 0x54, \r
-0x3F, 0x30, 0xE0, 0x0C, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0x81, 0x2B, 0xE0, 0x54, 0xFD, 0xF0, 0x22, \r
-0x90, 0x81, 0x30, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x2B, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x81, 0x38, \r
-0xE0, 0xFF, 0x90, 0x81, 0x30, 0xE0, 0xD3, 0x9F, 0x40, 0x0E, 0x90, 0x80, 0xDE, 0xE0, 0xB4, 0x01, \r
-0x07, 0x90, 0x81, 0x25, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0xE4, 0x90, 0x81, 0x51, 0xF0, 0x90, 0x81, \r
-0x27, 0xE0, 0x70, 0x02, 0x81, 0xA8, 0x90, 0x80, 0xDE, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0xA8, \r
-0x90, 0x81, 0x26, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, \r
-0x21, 0x90, 0x81, 0x2E, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x81, 0x30, 0xE0, 0x60, \r
-0x11, 0xEF, 0x70, 0x08, 0x90, 0x81, 0x2D, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x90, 0x81, 0x51, 0x74, \r
-0x01, 0xF0, 0x90, 0x81, 0x1F, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x81, 0x23, 0xE0, 0xB4, 0x02, 0x05, \r
-0xE4, 0x90, 0x81, 0x51, 0xF0, 0x12, 0x4F, 0xE3, 0xEF, 0x70, 0x04, 0x90, 0x81, 0x51, 0xF0, 0x90, \r
-0x81, 0x51, 0xE0, 0x60, 0x43, 0x90, 0x81, 0x2B, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x81, 0x30, 0xE0, \r
-0x60, 0x03, 0xB4, 0x01, 0x09, 0xE4, 0xF5, 0x1D, 0x90, 0x81, 0x30, 0xE0, 0x80, 0x0D, 0xE4, 0xF5, \r
-0x1D, 0x90, 0x81, 0x30, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x81, 0x2F, 0xE0, \r
-0x2F, 0x12, 0x6D, 0x9B, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x81, 0x2A, 0xE0, 0x20, 0xE2, \r
-0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4D, 0x41, 0x22, 0x90, 0x80, 0xDE, 0xE0, 0x64, 0x01, 0x70, \r
-0x26, 0x90, 0x81, 0x27, 0xE0, 0x60, 0x20, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, \r
-0x02, 0xF0, 0x90, 0x81, 0x24, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x81, 0x2B, 0xE0, 0x54, 0xFD, 0xF0, \r
-0x54, 0x07, 0x70, 0x03, 0x12, 0x4D, 0x29, 0x22, 0x90, 0x81, 0x27, 0xE0, 0x70, 0x07, 0x90, 0x81, \r
-0x1F, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0x81, 0x1F, 0xE0, 0x30, 0xE0, 0x09, 0x12, 0x4F, 0xE3, 0xBF, \r
-0x01, 0x05, 0x02, 0x4F, 0xC8, 0x91, 0xF8, 0x22, 0x90, 0x81, 0x27, 0xE0, 0x64, 0x01, 0x70, 0x4E, \r
-0x90, 0x81, 0x26, 0xE0, 0x54, 0x0F, 0x60, 0x39, 0x12, 0x4D, 0x3D, 0x90, 0x01, 0x5B, 0xE4, 0xF0, \r
-0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0xF5, 0x1D, 0x90, 0x81, 0x3A, 0xE0, 0xC3, 0x13, 0x54, \r
-0x7F, 0xF5, 0x1E, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x6D, 0xA4, 0x90, 0x01, 0x5B, \r
-0x74, 0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x24, 0xE0, 0x44, 0x08, 0xF0, \r
-0x22, 0x90, 0x81, 0x2A, 0xE0, 0x70, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4D, 0x41, 0x22, 0x12, \r
-0x4F, 0xFC, 0xEF, 0x70, 0x02, 0x91, 0xF8, 0x22, 0x90, 0x81, 0x27, 0xE0, 0x60, 0x35, 0x90, 0x06, \r
-0x92, 0xE0, 0x30, 0xE0, 0x24, 0xE4, 0xF5, 0x1D, 0x90, 0x81, 0x3A, 0xE0, 0xC3, 0x13, 0x54, 0x7F, \r
-0xF5, 0x1E, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x6D, 0xA4, 0x90, 0x01, 0x5B, 0x74, \r
-0x05, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x81, 0x24, 0xE0, 0x54, 0xF7, 0xF0, \r
-0x12, 0x4D, 0x29, 0x22, 0x90, 0x81, 0x27, 0xE0, 0x60, 0x35, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, \r
-0x24, 0xE4, 0xF5, 0x1D, 0x90, 0x81, 0x3A, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0xF5, 0x1E, 0xE4, 0xFB, \r
-0xFD, 0x7F, 0x5C, 0x7E, 0x01, 0x12, 0x6D, 0xA4, 0x90, 0x01, 0x5F, 0x74, 0x05, 0xF0, 0x90, 0x06, \r
-0x92, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x81, 0x24, 0xE0, 0x54, 0xEF, 0xF0, 0x12, 0x4D, 0x29, 0x22, \r
-0xD1, 0x28, 0x90, 0x81, 0x52, 0xEF, 0xF0, 0x90, 0x81, 0x24, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, \r
-0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x81, 0x52, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, \r
-0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90, \r
-0x81, 0x24, 0xE0, 0x30, 0xE0, 0x1A, 0x90, 0x81, 0x32, 0xE4, 0xF0, 0xA3, 0x74, 0x07, 0xF0, 0x90, \r
-0x81, 0x32, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x04, 0xEC, 0xE0, 0x54, 0xDD, 0xF0, 0x22, \r
-0x90, 0x04, 0xEC, 0xE0, 0x44, 0x22, 0xF0, 0x22, 0xE4, 0x90, 0x81, 0x53, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0x90, 0x00, 0x83, 0xE0, 0x90, 0x81, 0x53, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xFE, 0x90, 0x81, \r
-0x53, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x81, 0x55, 0xE0, 0x94, 0x64, 0x90, 0x81, \r
-0x54, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x81, 0x53, \r
-0xE0, 0xFF, 0x22, 0x90, 0x81, 0x54, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x4A, 0xA9, 0x80, 0xC2, 0x90, \r
-0x81, 0x4F, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, \r
-0xFD, 0xE0, 0x04, 0xF0, 0x22, 0x22, 0x90, 0x81, 0x24, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, \r
-0x30, 0xE0, 0x27, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x81, 0x25, 0x30, 0xE0, \r
-0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x10, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, \r
-0xF0, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x12, 0x4D, 0x29, 0xE4, 0xFF, 0x90, 0x81, 0x4A, 0xE0, \r
-0x30, 0xE0, 0x48, 0x90, 0x81, 0x4E, 0xE0, 0xFD, 0x60, 0x41, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, \r
-0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, 0xE0, 0xE0, 0xFB, \r
-0xEF, 0x5B, 0x60, 0x06, 0xE4, 0x90, 0x81, 0x4E, 0xF0, 0x22, 0x90, 0x81, 0x4C, 0xE0, 0xD3, 0x9D, \r
-0x50, 0x10, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0xF1, 0x0C, 0x90, 0x81, 0x4A, 0xE0, 0x54, 0xFE, \r
-0xF0, 0x22, 0x12, 0x56, 0xA6, 0x90, 0x81, 0x4E, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x80, 0x3C, 0xE0, \r
-0x64, 0x02, 0x60, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x81, 0x24, 0xE0, \r
-0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x2C, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, \r
-0xE0, 0xE0, 0x90, 0x81, 0x25, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0F, 0xE0, 0x54, \r
-0xFD, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x90, 0x81, 0x27, \r
-0xE0, 0x60, 0x03, 0x12, 0x4D, 0x29, 0x7F, 0x01, 0xC1, 0xBC, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, \r
-0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, \r
-0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, 0x0D, 0xED, \r
-0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x1E, 0x90, \r
-0xFD, 0x11, 0xE0, 0xB5, 0x05, 0x14, 0x90, 0x01, 0x17, 0xE0, 0xB5, 0x05, 0x07, 0x90, 0xFD, 0x11, \r
-0xE4, 0xF0, 0x80, 0x06, 0xED, 0x04, 0x90, 0xFD, 0x11, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xEF, 0x14, \r
-0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x45, 0x2F, \r
-0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, \r
-0xF0, 0x22, 0x74, 0x45, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x90, 0x82, 0x1B, 0xED, 0xF0, 0x90, 0x82, 0x1A, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x70, \r
-0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, \r
-0x00, 0x47, 0xE0, 0x5F, 0xFD, 0x7F, 0x47, 0x12, 0x32, 0x1E, 0x90, 0x82, 0x1A, 0xE0, 0xFF, 0x74, \r
-0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xFF, 0x90, 0x00, 0x46, 0xE0, 0x4F, \r
-0xFD, 0x7F, 0x46, 0x12, 0x32, 0x1E, 0x90, 0x82, 0x1B, 0xE0, 0x60, 0x18, 0x90, 0x82, 0x1A, 0xE0, \r
-0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xFF, 0x90, 0x00, 0x45, \r
-0xE0, 0x4F, 0x80, 0x17, 0x90, 0x82, 0x1A, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, \r
-0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x45, 0xE0, 0x5F, 0xFD, 0x7F, 0x45, 0x80, 0x7E, \r
-0x90, 0x82, 0x1A, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0x24, 0x04, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, \r
-0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x43, 0xE0, 0x5F, 0xFD, 0x7F, 0x43, \r
-0x12, 0x32, 0x1E, 0x90, 0x82, 0x1A, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, \r
-0x33, 0xD8, 0xFC, 0xFF, 0x90, 0x00, 0x43, 0xE0, 0x4F, 0xFD, 0x7F, 0x43, 0x12, 0x32, 0x1E, 0x90, \r
-0x82, 0x1B, 0xE0, 0x60, 0x1D, 0x90, 0x82, 0x1A, 0xE0, 0x24, 0x04, 0xFF, 0x74, 0x01, 0xA8, 0x07, \r
-0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xFF, 0x90, 0x00, 0x42, 0xE0, 0x4F, 0xFD, 0x7F, 0x42, \r
-0x80, 0x1C, 0x90, 0x82, 0x1A, 0xE0, 0x24, 0x04, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, \r
-0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x42, 0xE0, 0x5F, 0xFD, 0x7F, 0x42, 0x12, 0x32, \r
-0x1E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x81, 0x27, 0xF0, 0xA3, 0xF0, 0x90, 0x81, 0x26, \r
-0xE0, 0x54, 0x0F, 0xF0, 0x54, 0xF0, 0xF0, 0x90, 0x81, 0x24, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, \r
-0xF0, 0x54, 0xEF, 0xF0, 0x90, 0x81, 0x2D, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x90, 0x81, 0x24, 0xE0, \r
-0x54, 0xFB, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x81, 0x30, 0xF0, 0x90, 0x81, 0x2F, \r
-0x74, 0x07, 0xF0, 0x90, 0x81, 0x32, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0x81, 0x2B, \r
-0xF0, 0x90, 0x81, 0x24, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x81, 0x29, 0x74, 0x0C, 0xF0, 0x90, 0x81, \r
-0x24, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x81, 0x2A, 0x74, 0x0C, 0xF0, 0x90, 0x81, 0x24, 0xE0, 0x54, \r
-0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, \r
-0x90, 0x81, 0x34, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x90, 0x80, 0x3C, 0xE0, 0xB4, 0x01, \r
-0x08, 0x90, 0x81, 0x31, 0x74, 0x99, 0xF0, 0x80, 0x12, 0x90, 0x80, 0x3C, 0xE0, 0x90, 0x81, 0x31, \r
-0xB4, 0x03, 0x05, 0x74, 0x90, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x90, 0x81, 0x38, 0x74, 0x01, \r
-0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, \r
-0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, \r
-0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0C, \r
-0x04, 0x70, 0x28, 0x90, 0x81, 0x2D, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x22, 0xED, 0x70, 0x0A, 0x90, \r
-0x81, 0x3B, 0xE0, 0x90, 0x81, 0x2D, 0xF0, 0x80, 0x05, 0x90, 0x81, 0x2D, 0xED, 0xF0, 0x90, 0x81, \r
-0x2D, 0xE0, 0xA3, 0xF0, 0x90, 0x81, 0x25, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x12, 0x4F, 0xFC, 0xEF, \r
-0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x67, 0x90, 0x81, 0x2B, 0xE0, \r
-0xFF, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x56, 0x90, 0x81, 0x29, \r
-0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x44, 0xEF, \r
-0x30, 0xE2, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x38, 0x90, 0x81, 0x2B, 0xE0, 0x30, \r
-0xE4, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, 0x29, 0x90, 0x81, 0x25, 0xE0, 0x13, 0x13, \r
-0x54, 0x3F, 0x20, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x20, 0xF0, 0x80, 0x16, 0x90, 0x81, 0x3E, \r
-0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x80, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, \r
-0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x02, 0x87, 0xE0, \r
-0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x17, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, \r
-0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, \r
-0x22, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x7F, 0x00, 0x22, 0xEF, 0x60, 0x42, 0x90, 0x80, 0xDE, \r
-0xE0, 0x64, 0x01, 0x70, 0x3A, 0x90, 0x81, 0x25, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x05, 0x22, 0x74, \r
-0x0F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0xFF, 0x12, 0x56, 0xA8, 0xBF, 0x01, \r
-0x12, 0x90, 0x81, 0x24, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x81, 0x2A, 0x74, 0x06, 0xF0, 0x90, 0x81, \r
-0x23, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x22, \r
-0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x81, 0x2A, 0x74, 0x02, 0xF0, 0x90, 0x05, 0x27, 0xE0, \r
-0x54, 0xBF, 0xF0, 0x90, 0x81, 0x23, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, \r
-0x81, 0x2A, 0x74, 0x04, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x81, 0x23, 0x74, \r
-0x04, 0xF0, 0x22, 0xE4, 0x90, 0x81, 0x52, 0xF0, 0x90, 0x81, 0x27, 0xE0, 0x60, 0x59, 0x90, 0x80, \r
-0xDE, 0xE0, 0x64, 0x01, 0x70, 0x51, 0x90, 0x81, 0x52, 0x04, 0xF0, 0xE4, 0x90, 0x81, 0x2E, 0xF0, \r
-0x90, 0x81, 0x1F, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x81, 0x23, 0xE0, 0xB4, 0x02, 0x05, 0xE4, 0x90, \r
-0x81, 0x52, 0xF0, 0x12, 0x4F, 0xE3, 0xEF, 0x70, 0x04, 0x90, 0x81, 0x52, 0xF0, 0x90, 0x81, 0x52, \r
-0xE0, 0x60, 0x24, 0x90, 0x81, 0x2B, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0xF5, 0x1D, 0x90, 0x81, 0x2F, \r
-0x12, 0x6D, 0x9A, 0x90, 0x01, 0x57, 0x74, 0x05, 0xF0, 0x90, 0x81, 0x2A, 0xE0, 0x20, 0xE2, 0x07, \r
-0x7D, 0x01, 0x7F, 0x04, 0x12, 0x4D, 0x41, 0x22, 0x90, 0x81, 0x24, 0xE0, 0xFF, 0x13, 0x13, 0x54, \r
-0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0x81, 0x2B, 0xE0, 0x54, 0xFD, 0xF0, 0x54, \r
-0x07, 0x70, 0x42, 0x80, 0x3D, 0x90, 0x81, 0x30, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x2B, 0xE0, 0x54, \r
-0xEF, 0xF0, 0x90, 0x81, 0x30, 0xE0, 0xFF, 0xB4, 0x01, 0x02, 0x80, 0x04, 0xEF, 0xB4, 0x02, 0x06, \r
-0x90, 0x05, 0x58, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x38, 0xE0, 0xFF, 0x90, 0x81, 0x30, 0xE0, 0xD3, \r
-0x9F, 0x40, 0x0F, 0x90, 0x80, 0xDE, 0xE0, 0xB4, 0x01, 0x0B, 0x90, 0x81, 0x25, 0xE0, 0x54, 0xFB, \r
-0xF0, 0x22, 0x12, 0x4D, 0x29, 0x22, 0x22, 0x90, 0x05, 0x2B, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, \r
-0x7F, 0x01, 0x22, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, \r
-0x81, 0x22, 0x74, 0x01, 0xF0, 0x22, 0x91, 0x03, 0x02, 0x57, 0xE5, 0x90, 0x05, 0x22, 0x74, 0xFF, \r
-0xF0, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x81, 0x22, 0x74, 0x03, 0xF0, 0x22, 0x90, \r
-0x05, 0x22, 0xE4, 0xF0, 0x90, 0x81, 0x22, 0x04, 0xF0, 0x22, 0x91, 0x2F, 0x02, 0x57, 0xE5, 0x90, \r
-0x05, 0x22, 0x74, 0x6F, 0xF0, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x81, 0x22, 0x74, \r
-0x04, 0xF0, 0x22, 0x90, 0x81, 0x22, 0xE0, 0x64, 0x02, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, \r
-0x90, 0x80, 0x3F, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x57, 0x31, 0x8E, 0x54, 0x8F, 0x55, 0xAD, 0x55, \r
-0xAC, 0x54, 0xAF, 0x53, 0x12, 0x56, 0xE6, 0xAF, 0x55, 0xAE, 0x54, 0x90, 0x04, 0x80, 0xE0, 0x54, \r
-0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, \r
-0x01, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, \r
-0xAC, 0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, \r
-0x74, 0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, \r
-0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, \r
-0x53, 0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, \r
-0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, \r
-0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0x90, \r
-0x80, 0x3F, 0xE0, 0xFE, 0x90, 0x04, 0x1C, 0xE0, 0x6E, 0x70, 0x40, 0x90, 0x81, 0x2A, 0xE0, 0xFE, \r
-0x64, 0x0E, 0x70, 0x1C, 0xEF, 0x70, 0x34, 0x90, 0x81, 0x24, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, \r
-0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x81, 0x2A, 0x74, 0x04, 0xF0, 0x22, \r
-0xEE, 0xB4, 0x06, 0x17, 0xEF, 0x60, 0x14, 0x90, 0x81, 0x24, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x06, \r
-0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x81, 0x2A, 0x74, 0x0C, 0xF0, 0x22, 0xE4, 0xFE, 0xEF, 0xC3, \r
-0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, \r
-0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0x90, 0x80, 0xDB, 0xE0, 0x9B, \r
-0x90, 0x80, 0xDA, 0xE0, 0x9A, 0x50, 0x13, 0xA3, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x80, 0xDA, 0xE0, \r
-0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, \r
-0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x22, 0x12, 0x1F, \r
-0xA4, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x81, 0x47, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, \r
-0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x90, 0x81, 0x48, 0xF0, 0x22, 0x90, 0x81, \r
-0x4A, 0xE0, 0x30, 0xE0, 0x2D, 0x90, 0x81, 0x4D, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x90, 0x81, 0x4B, \r
-0xE0, 0xB5, 0x07, 0x1E, 0x90, 0x06, 0x92, 0xE0, 0x54, 0x1C, 0x70, 0x0B, 0x12, 0x56, 0xA6, 0x90, \r
-0x81, 0x4E, 0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, 0x1C, 0xF0, 0xE4, 0x90, 0x81, \r
-0x4D, 0xF0, 0x22, 0x00, 0x74, 0x53, \r
+0xF0, 0x08, 0xA4, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF1, 0x92, 0x12, 0x2D, 0x5C, 0xED, \r
+0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x90, 0x82, 0x94, 0x12, 0x20, 0xCE, 0x90, 0x82, 0x94, 0x02, 0x44, \r
+0xCF, 0x90, 0x82, 0x98, 0x02, 0x44, 0xCF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, \r
+0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x7F, 0x24, 0x7E, 0x08, 0x12, 0x2E, \r
+0xA2, 0x90, 0x82, 0x92, 0xE0, 0x22, 0x22, 0x7D, 0x25, 0x02, 0x4F, 0xEC, 0x12, 0x57, 0xE0, 0x02, \r
+0x4F, 0xEA, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x44, 0x9F, 0x7F, 0x7C, 0x7E, 0x08, 0x02, 0x2D, 0x5C, \r
+0x12, 0x55, 0xE4, 0x7D, 0x24, 0x02, 0x4F, 0xEC, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x22, \r
+0x90, 0x81, 0x40, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, \r
+0x12, 0x43, 0x4E, 0x90, 0x82, 0x73, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x80, 0x3C, 0xE0, 0xFF, 0x70, \r
+0x04, 0xA3, 0xE0, 0x60, 0xE5, 0xC2, 0xAF, 0xEF, 0x30, 0xE1, 0x09, 0x90, 0x80, 0x3C, 0xE0, 0x54, \r
+0xFD, 0xF0, 0x11, 0x19, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x80, 0x3C, 0xE0, 0xFF, 0x30, 0xE2, 0x05, \r
+0x54, 0xFB, 0xF0, 0x31, 0xA9, 0xD2, 0xAF, 0x80, 0xD1, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0x90, 0x80, 0x9A, 0xE0, 0xFF, 0x90, 0x80, 0x99, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, \r
+0x7F, 0x00, 0xEF, 0x70, 0x3F, 0x90, 0x80, 0x99, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x80, 0x49, \r
+0x12, 0x45, 0x00, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x4A, 0xF9, 0x74, 0x80, 0x35, \r
+0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x4B, 0x24, 0x90, 0x80, 0x99, 0x31, 0xA2, 0xB4, 0x0A, \r
+0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x80, 0x99, 0xF0, 0x11, 0x79, 0x90, 0x80, 0x3C, \r
+0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, \r
+0x82, 0xCB, 0xF0, 0x90, 0x82, 0xCB, 0xE0, 0xFD, 0x70, 0x02, 0x21, 0x77, 0x90, 0x80, 0x99, 0xE0, \r
+0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x80, 0x9A, 0xE0, \r
+0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, \r
+0x44, 0x01, 0xF0, 0x22, 0x90, 0x82, 0xC9, 0x12, 0x57, 0xD4, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, \r
+0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x21, 0x5A, 0xE4, 0x90, 0x82, 0xCC, 0xF0, 0x90, \r
+0x82, 0xCC, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x32, 0x31, 0x79, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, \r
+0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0x31, 0x90, 0x90, 0x80, 0x49, 0x31, 0x81, \r
+0x31, 0x78, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xF0, 0x31, 0x90, 0x90, 0x80, 0x4D, \r
+0x31, 0x81, 0xF0, 0x90, 0x82, 0xCC, 0xE0, 0x04, 0xF0, 0x80, 0xC4, 0x90, 0x82, 0xCB, 0xE0, 0xFF, \r
+0x90, 0x82, 0xC9, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, \r
+0xF4, 0x5F, 0x90, 0x82, 0xCB, 0xF0, 0x90, 0x82, 0xC9, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, \r
+0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x82, 0xC9, 0xE0, 0x04, 0xF0, \r
+0xE0, 0x54, 0x03, 0xF0, 0x90, 0x80, 0x9A, 0x31, 0xA2, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, \r
+0x02, 0x01, 0x83, 0xE4, 0x90, 0x80, 0x9A, 0xF0, 0x01, 0x83, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, \r
+0xF0, 0x90, 0x82, 0xC9, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0x31, 0x78, 0x90, 0x01, 0xD0, 0x12, \r
+0x45, 0x00, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0xF0, 0x90, 0x82, 0xC9, 0xE0, 0x75, 0xF0, 0x04, \r
+0x22, 0x12, 0x45, 0x00, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0x22, \r
+0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x80, 0x9A, 0xE0, 0x75, 0xF0, \r
+0x08, 0x22, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0xE4, 0xFF, 0x90, 0x81, 0x32, 0xE0, 0xFE, 0x90, 0x81, 0x31, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, \r
+0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x41, 0x90, 0x01, 0xAF, 0xE0, 0x70, 0x0A, \r
+0xED, 0x51, 0x6D, 0xFA, 0x7B, 0x01, 0x51, 0xC5, 0x7F, 0x01, 0xEF, 0x60, 0x2E, 0x90, 0x81, 0x31, \r
+0x31, 0xA2, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x81, 0x31, 0xF0, 0x90, \r
+0x81, 0x32, 0xE0, 0xFF, 0x90, 0x81, 0x31, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, \r
+0x00, 0xEF, 0x70, 0x07, 0x90, 0x80, 0x3C, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x81, 0x31, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, \r
+0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x81, 0x32, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, \r
+0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x28, \r
+0xC0, 0x01, 0x90, 0x81, 0x32, 0xE0, 0x51, 0x6D, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, \r
+0x00, 0x7F, 0x0F, 0x12, 0x44, 0x79, 0x90, 0x81, 0x32, 0x31, 0xA2, 0xB4, 0x0A, 0x02, 0x7F, 0x01, \r
+0xEF, 0x60, 0x05, 0xE4, 0x90, 0x81, 0x32, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0xF0, 0x0F, \r
+0xA4, 0x24, 0x9B, 0xF9, 0x74, 0x80, 0x35, 0xF0, 0x22, 0x90, 0x82, 0x83, 0x74, 0x12, 0xF0, 0x90, \r
+0x82, 0x91, 0x74, 0x05, 0xF0, 0x90, 0x82, 0x85, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, \r
+0x90, 0x82, 0x81, 0xE0, 0x90, 0x82, 0x88, 0xF0, 0x90, 0x82, 0x82, 0xE0, 0x90, 0x82, 0x89, 0xF0, \r
+0x7B, 0x01, 0x7A, 0x82, 0x79, 0x83, 0x51, 0x10, 0x7F, 0x04, 0x90, 0x82, 0xD1, 0xEF, 0xF0, 0x7F, \r
+0x02, 0x12, 0x43, 0x27, 0x90, 0x80, 0x3C, 0xE0, 0xFF, 0x90, 0x82, 0xD1, 0xE0, 0xFE, 0xEF, 0x4E, \r
+0x90, 0x80, 0x3C, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x82, 0x74, 0x12, \r
+0x45, 0x15, 0x90, 0x82, 0xCA, 0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x1F, 0xFC, \r
+0x7F, 0xAF, 0x7E, 0x01, 0x71, 0x28, 0xEF, 0x60, 0x3A, 0x90, 0x82, 0x74, 0x12, 0x45, 0x0C, 0x8B, \r
+0x13, 0x8A, 0x14, 0x89, 0x15, 0x90, 0x00, 0x0E, 0x12, 0x1F, 0xBD, 0x24, 0x02, 0xF5, 0x16, 0x7B, \r
+0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x2B, 0xED, 0x90, 0x82, 0x74, 0x12, 0x45, 0x0C, 0x90, 0x00, \r
+0x0E, 0x12, 0x1F, 0xBD, 0x90, 0x01, 0xAE, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, \r
+0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
+0x82, 0xB6, 0xEE, 0xF0, 0xA3, 0x71, 0x75, 0x90, 0x82, 0xB6, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, \r
+0x8E, 0x83, 0xE0, 0x60, 0x29, 0xC3, 0x90, 0x82, 0xB9, 0xE0, 0x94, 0xE8, 0x90, 0x82, 0xB8, 0xE0, \r
+0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x11, 0x90, \r
+0x82, 0xB8, 0x12, 0x5F, 0xB2, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0x80, 0xC9, 0x7F, 0x01, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x82, 0x10, \r
+0x71, 0x75, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0x82, 0x10, \r
+0xE0, 0x6F, 0x60, 0x35, 0xC3, 0x90, 0x82, 0x12, 0xE0, 0x94, 0x88, 0x90, 0x82, 0x11, 0xE0, 0x94, \r
+0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x82, 0x11, 0x12, 0x5F, \r
+0xB2, 0x71, 0xCA, 0xD3, 0x90, 0x82, 0x12, 0xE0, 0x94, 0x32, 0x90, 0x82, 0x11, 0xE0, 0x94, 0x00, \r
+0x40, 0xC0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB9, 0x22, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x32, \r
+0xAA, 0x90, 0x81, 0x46, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x81, 0x54, 0xE0, 0xFD, 0x7F, 0x93, 0x12, \r
+0x32, 0x1E, 0x90, 0x81, 0x4A, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, \r
+0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, \r
+0xFD, 0x7F, 0x08, 0x12, 0x32, 0x1E, 0x7F, 0x01, 0x71, 0x7D, 0x90, 0x00, 0x90, 0xE0, 0x44, 0x01, \r
+0xFD, 0x7F, 0x90, 0x12, 0x32, 0x1E, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x32, 0xAA, 0xE4, 0x90, 0x82, \r
+0x07, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, 0xE0, 0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, \r
+0x64, 0x01, 0x60, 0x3C, 0xC3, 0x90, 0x82, 0x08, 0xE0, 0x94, 0x88, 0x90, 0x82, 0x07, 0xE0, 0x94, \r
+0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0xFD, 0xF0, \r
+0x80, 0x1E, 0x90, 0x82, 0x07, 0x12, 0x5F, 0xB2, 0x71, 0xCA, 0xD3, 0x90, 0x82, 0x08, 0xE0, 0x94, \r
+0x32, 0x90, 0x82, 0x07, 0xE0, 0x94, 0x00, 0x40, 0xBB, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xB4, \r
+0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x78, 0x7F, 0xF5, 0x7E, \r
+0x00, 0x12, 0x2B, 0x27, 0xBF, 0x01, 0x06, 0x90, 0x82, 0x78, 0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, \r
+0x82, 0x79, 0x78, 0x7F, 0xF6, 0x7E, 0x00, 0x12, 0x2B, 0x27, 0xBF, 0x01, 0x08, 0x90, 0x82, 0x78, \r
+0xE0, 0x90, 0x82, 0x7A, 0xF0, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x78, 0x7F, 0xF4, 0x7E, 0x00, 0x12, \r
+0x2B, 0x27, 0xBF, 0x01, 0x08, 0x90, 0x82, 0x78, 0xE0, 0x90, 0x82, 0x7B, 0xF0, 0x7B, 0x01, 0x7A, \r
+0x82, 0x79, 0x78, 0x7F, 0xF3, 0x7E, 0x00, 0x12, 0x2B, 0x27, 0xBF, 0x01, 0x08, 0x90, 0x82, 0x78, \r
+0xE0, 0x90, 0x82, 0x7C, 0xF0, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x78, 0x7F, 0xF2, 0x7E, 0x00, 0x12, \r
+0x2B, 0x27, 0xBF, 0x01, 0x08, 0x90, 0x82, 0x78, 0xE0, 0x90, 0x82, 0x7D, 0xF0, 0x90, 0x82, 0x79, \r
+0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x82, 0x81, 0xF0, 0x90, 0x82, \r
+0x7D, 0xE0, 0x90, 0x82, 0x82, 0xF0, 0x41, 0x79, 0x12, 0x1F, 0xA4, 0xFF, 0x90, 0x81, 0x35, 0xF0, \r
+0xBF, 0x01, 0x07, 0x91, 0x77, 0xE4, 0x90, 0x81, 0x35, 0xF0, 0x22, 0x90, 0x82, 0xA1, 0xEF, 0xF0, \r
+0xAB, 0x05, 0x90, 0x82, 0xA7, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x03, 0xE4, 0xFC, \r
+0xFD, 0xFE, 0x78, 0x14, 0xB1, 0x72, 0x90, 0x82, 0xA3, 0x12, 0x44, 0xCF, 0xED, 0x54, 0x0F, 0xFD, \r
+0xE4, 0xFC, 0x12, 0x44, 0xC2, 0xEC, 0x54, 0x0F, 0xFC, 0x90, 0x82, 0xA7, 0x12, 0x20, 0xCE, 0x90, \r
+0x82, 0xA1, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x60, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0x12, 0x5F, \r
+0x92, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x82, 0xA7, 0x12, 0x5E, 0x96, 0xD0, 0x07, 0xD0, 0x06, 0x02, \r
+0x2E, 0xA2, 0x12, 0x20, 0xBB, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x22, 0x78, 0x10, \r
+0x74, 0x01, 0xF2, 0x90, 0x02, 0x09, 0xE0, 0x78, 0x00, 0xF2, 0x08, 0x74, 0x20, 0xF2, 0x18, 0xE2, \r
+0xFF, 0x30, 0xE0, 0x05, 0x08, 0xE2, 0x24, 0x80, 0xF2, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, \r
+0x78, 0x01, 0xE2, 0xF1, 0xA6, 0x78, 0x03, 0xF2, 0x64, 0x04, 0x60, 0x0D, 0xE2, 0xFF, 0x64, 0x08, \r
+0x60, 0x07, 0xEF, 0x64, 0x0C, 0x60, 0x02, 0xE1, 0x9C, 0xE4, 0x78, 0x02, 0xF2, 0x78, 0x03, 0xE2, \r
+0xFF, 0x18, 0xE2, 0xC3, 0x9F, 0x50, 0x25, 0xE2, 0xFD, 0x18, 0xE2, 0x2D, 0x90, 0x82, 0x10, 0xF0, \r
+0xE0, 0xFF, 0xF1, 0xA6, 0xFE, 0x74, 0x04, 0x2D, 0xF8, 0xEE, 0xF2, 0xEF, 0xB4, 0xFF, 0x06, 0x90, \r
+0xFD, 0x10, 0xE0, 0x04, 0xF0, 0x78, 0x02, 0xE2, 0x04, 0xF2, 0x80, 0xD1, 0x78, 0x04, 0xE2, 0x78, \r
+0x12, 0xF2, 0xFF, 0x78, 0x05, 0xE2, 0x78, 0x11, 0xF2, 0x78, 0x06, 0xE2, 0x78, 0x13, 0xF2, 0x78, \r
+0x07, 0xE2, 0x78, 0x14, 0xF2, 0x78, 0x08, 0xE2, 0x78, 0x33, 0xF2, 0x78, 0x09, 0xE2, 0x78, 0x34, \r
+0xF2, 0x78, 0x0A, 0xE2, 0x78, 0x35, 0xF2, 0x78, 0x0B, 0xE2, 0x78, 0x36, 0xF2, 0x78, 0x0C, 0xE2, \r
+0x78, 0x37, 0xF2, 0x78, 0x0D, 0xE2, 0x78, 0x38, 0xF2, 0x78, 0x0E, 0xE2, 0x78, 0x39, 0xF2, 0x78, \r
+0x0F, 0xE2, 0x78, 0x3A, 0xF2, 0xE4, 0x78, 0x15, 0xF2, 0xEF, 0x24, 0xF8, 0x60, 0x56, 0x24, 0xFC, \r
+0x60, 0x4D, 0x24, 0x08, 0x60, 0x02, 0xE1, 0x7E, 0x78, 0x11, 0xE2, 0xB4, 0x01, 0x05, 0x12, 0x29, \r
+0xC5, 0xE1, 0x83, 0x78, 0x11, 0xE2, 0xB4, 0x02, 0x05, 0x12, 0x11, 0xBD, 0xE1, 0x83, 0x78, 0x11, \r
+0xE2, 0xB4, 0x03, 0x05, 0x12, 0x69, 0x27, 0xE1, 0x83, 0x78, 0x11, 0xE2, 0xB4, 0x10, 0x07, 0xF1, \r
+0xB1, 0x12, 0x32, 0xAA, 0xE1, 0x83, 0x78, 0x11, 0xE2, 0xB4, 0x11, 0x07, 0xF1, 0xB1, 0x12, 0x32, \r
+0x06, 0xE1, 0x83, 0x78, 0x11, 0xE2, 0xF4, 0x60, 0x02, 0xE1, 0x83, 0x18, 0xF2, 0xE1, 0x83, 0x78, \r
+0x15, 0x74, 0x01, 0xF2, 0x78, 0x11, 0xE2, 0x64, 0x07, 0x60, 0x02, 0xE1, 0x68, 0x78, 0x34, 0xF1, \r
+0x9F, 0x78, 0x08, 0x12, 0x20, 0xBB, 0xC0, 0x04, 0xB1, 0x77, 0x78, 0x33, 0xF1, 0x9F, 0xD0, 0x00, \r
+0x12, 0x44, 0xC2, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x78, 0x35, 0xF1, 0x9F, 0x78, \r
+0x10, 0x12, 0x20, 0xBB, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0xC2, 0x78, \r
+0x18, 0x12, 0x44, 0xF4, 0x78, 0x15, 0xE2, 0x60, 0x79, 0x18, 0xE2, 0xFF, 0x18, 0xE2, 0xFD, 0xF1, \r
+0xC4, 0x78, 0x1C, 0x12, 0x44, 0xF4, 0x78, 0x38, 0xF1, 0x9F, 0x78, 0x08, 0x12, 0x20, 0xBB, 0xC0, \r
+0x04, 0xB1, 0x77, 0x78, 0x37, 0xF1, 0x9F, 0xD0, 0x00, 0x12, 0x44, 0xC2, 0xC0, 0x04, 0xC0, 0x05, \r
+0xC0, 0x06, 0xC0, 0x07, 0x78, 0x39, 0xF1, 0x9F, 0x78, 0x10, 0x12, 0x20, 0xBB, 0xD0, 0x03, 0xD0, \r
+0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0xC2, 0x78, 0x20, 0x12, 0x44, 0xF4, 0x78, 0x20, 0x12, \r
+0x44, 0xDB, 0x12, 0x20, 0x9B, 0x78, 0x1C, 0x12, 0x44, 0xE7, 0x12, 0x44, 0xB5, 0xC0, 0x04, 0xC0, \r
+0x05, 0xC0, 0x06, 0xC0, 0x07, 0x78, 0x18, 0x12, 0x44, 0xDB, 0x78, 0x20, 0x12, 0x44, 0xE7, 0x12, \r
+0x44, 0xB5, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0xC2, 0x78, 0x18, 0x12, \r
+0x44, 0xF4, 0x78, 0x18, 0x12, 0x44, 0xDB, 0x90, 0x82, 0xAD, 0x12, 0x20, 0xCE, 0x78, 0x13, 0xE2, \r
+0xFD, 0x08, 0xE2, 0xFF, 0xF1, 0xD3, 0x80, 0x1B, 0x78, 0x13, 0xE2, 0xFF, 0x08, 0xE2, 0xFD, 0x78, \r
+0x11, 0xE2, 0xFB, 0x78, 0x15, 0xE2, 0x90, 0x82, 0x72, 0xF0, 0xF1, 0xF5, 0x80, 0x05, 0x78, 0x10, \r
+0x74, 0x02, 0xF2, 0x78, 0x10, 0xE2, 0xFF, 0xC3, 0x94, 0x02, 0x50, 0x10, 0xEF, 0x60, 0x0A, 0x78, \r
+0x02, 0xE2, 0xFF, 0x18, 0xE2, 0x2F, 0xF2, 0xA1, 0xA0, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xE2, \r
+0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x22, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
+0x22, 0x78, 0x14, 0xE2, 0xFE, 0x18, 0xE2, 0xFD, 0xED, 0xFF, 0x78, 0x16, 0xEE, 0xF2, 0xFE, 0x08, \r
+0xEF, 0xF2, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x5E, 0x9F, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, 0x07, 0xC0, 0x05, 0x90, 0x82, \r
+0xAD, 0x12, 0x44, 0xCF, 0x90, 0x82, 0xA3, 0x12, 0x20, 0xCE, 0xD0, 0x05, 0xD0, 0x07, 0xB1, 0x1B, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAC, 0x07, 0xED, 0xAD, 0x04, 0x78, 0x24, 0xF2, 0xED, 0x08, 0xF2, \r
+0xEB, 0xB4, 0x04, 0x07, 0x78, 0x27, 0x74, 0x01, 0xF2, 0x80, 0x0E, 0xEB, 0x78, 0x27, 0xB4, 0x05, \r
+0x05, 0x74, 0x02, 0xF2, 0x80, 0x03, 0x74, 0x04, 0xF2, 0x91, 0x43, 0xE2, 0x94, 0x00, 0x50, 0x45, \r
+0xE4, 0x78, 0x26, 0xF2, 0x31, 0x11, 0x9F, 0x40, 0x02, 0x21, 0x10, 0x31, 0x1A, 0x60, 0x1F, 0x74, \r
+0x37, 0x2E, 0xF8, 0xE2, 0x78, 0x32, 0xF2, 0xEE, 0xFF, 0x78, 0x25, 0xE2, 0x2F, 0xFF, 0x18, 0xE2, \r
+0x34, 0x00, 0x8F, 0x82, 0xF5, 0x83, 0xE0, 0x78, 0x29, 0xF2, 0x78, 0x32, 0x91, 0x62, 0x78, 0x24, \r
+0x08, 0xE2, 0xFF, 0x08, 0xE2, 0x2F, 0xFF, 0x78, 0x28, 0xE2, 0xFD, 0x12, 0x32, 0x1E, 0x78, 0x26, \r
+0xE2, 0x04, 0xF2, 0x80, 0xBF, 0x91, 0x43, 0xE2, 0x94, 0x07, 0x50, 0x30, 0xE4, 0x78, 0x26, 0xF2, \r
+0x31, 0x11, 0x9F, 0x40, 0x02, 0x21, 0x10, 0x31, 0x1A, 0x60, 0x14, 0x78, 0x26, 0xE2, 0xFF, 0x91, \r
+0x54, 0xE0, 0x78, 0x29, 0xF2, 0x74, 0x37, 0x2F, 0xF8, 0xE2, 0x78, 0x32, 0xF2, 0x91, 0x62, 0x91, \r
+0x3B, 0x91, 0x54, 0xEF, 0xF0, 0x78, 0x26, 0xE2, 0x04, 0xF2, 0x80, 0xD4, 0x90, 0x82, 0x72, 0xE0, \r
+0x60, 0x0A, 0x91, 0x33, 0x12, 0x2D, 0x5C, 0x78, 0x2E, 0x12, 0x44, 0xF4, 0xE4, 0x78, 0x26, 0xF2, \r
+0x31, 0x11, 0x9F, 0x50, 0x4E, 0x31, 0x1A, 0x60, 0x2B, 0x78, 0x2E, 0x12, 0x44, 0xDB, 0x78, 0x26, \r
+0xE2, 0xFB, 0x75, 0xF0, 0x08, 0xA4, 0xF9, 0xF8, 0x12, 0x20, 0xA8, 0x78, 0x29, 0xEF, 0xF2, 0x74, \r
+0x37, 0x2B, 0xF8, 0xE2, 0x78, 0x32, 0xF2, 0xE2, 0xFE, 0xF4, 0x5F, 0xFF, 0x78, 0x28, 0xE2, 0xFD, \r
+0xEE, 0x5D, 0x4F, 0xF2, 0x91, 0x3B, 0xFD, 0xC3, 0x74, 0x03, 0x9D, 0xFD, 0xE4, 0x94, 0x00, 0xFC, \r
+0x7B, 0xFE, 0x74, 0x2A, 0x2D, 0xF9, 0x74, 0x80, 0x3C, 0xFA, 0xEF, 0x12, 0x1F, 0xEA, 0xE2, 0x04, \r
+0xF2, 0x80, 0xAD, 0x78, 0x2A, 0x12, 0x44, 0xDB, 0x12, 0x5E, 0x99, 0x91, 0x33, 0x12, 0x2E, 0xA2, \r
+0x22, 0x78, 0x27, 0xE2, 0xFF, 0x18, 0xE2, 0xFE, 0xC3, 0x22, 0x74, 0x33, 0x2E, 0xF8, 0xE2, 0x78, \r
+0x28, 0xF2, 0x90, 0x82, 0x72, 0xE0, 0x22, 0xE4, 0x90, 0x82, 0x20, 0xF0, 0x90, 0x87, 0x5F, 0xE0, \r
+0x90, 0x82, 0x1F, 0xF0, 0xE4, 0x90, 0x82, 0x2C, 0xF0, 0x90, 0x82, 0x1C, 0xF0, 0x90, 0x82, 0x1C, \r
+0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x10, 0x74, 0x2F, 0x2F, 0x91, 0x2B, 0x74, 0xFF, 0xF0, 0x90, \r
+0x82, 0x1C, 0xE0, 0x04, 0xF0, 0x80, 0xE6, 0xE4, 0x90, 0x82, 0x1C, 0xF0, 0x90, 0x82, 0x1F, 0xE0, \r
+0xFF, 0x90, 0x82, 0x1C, 0xE0, 0xFE, 0xC3, 0x9F, 0x40, 0x02, 0x41, 0x27, 0x74, 0xDF, 0x2E, 0xF9, \r
+0xE4, 0x34, 0x86, 0x91, 0x23, 0x75, 0x16, 0x0A, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x11, 0x12, 0x2B, \r
+0xED, 0x90, 0x82, 0x12, 0xE0, 0xFF, 0x12, 0x2F, 0x27, 0xEF, 0x04, 0x90, 0x82, 0x2C, 0xF0, 0x90, \r
+0x82, 0x11, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x31, 0xEA, 0xEF, 0x24, 0xC8, 0x90, 0x82, 0x2E, \r
+0xF0, 0x75, 0xF0, 0x08, 0xA4, 0xF0, 0x90, 0x82, 0x12, 0xE0, 0x54, 0x0F, 0x90, 0x82, 0x2D, 0xF0, \r
+0xE4, 0x90, 0x82, 0x1B, 0xF0, 0x90, 0x82, 0x1D, 0xF0, 0x90, 0x82, 0x1D, 0xE0, 0xFF, 0xC3, 0x94, \r
+0x04, 0x50, 0x57, 0x90, 0x82, 0x2D, 0xE0, 0xFE, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x13, 0xD8, \r
+0xFC, 0x20, 0xE0, 0x3E, 0x90, 0x82, 0x1D, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0x82, 0x2E, 0xE0, 0x2F, \r
+0x24, 0x2F, 0xF9, 0xE4, 0x34, 0x82, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x01, 0x90, 0x82, 0x1B, \r
+0xE0, 0x75, 0xF0, 0x02, 0xA4, 0x24, 0x13, 0xF9, 0x74, 0x82, 0x35, 0xF0, 0x8B, 0x13, 0xF5, 0x14, \r
+0x89, 0x15, 0x75, 0x16, 0x02, 0xD0, 0x01, 0xD0, 0x03, 0x12, 0x2B, 0xED, 0x90, 0x82, 0x1B, 0xE0, \r
+0x04, 0xF0, 0x90, 0x82, 0x1D, 0xE0, 0x04, 0xF0, 0x80, 0x9F, 0x90, 0x82, 0x2C, 0xE0, 0xFF, 0x90, \r
+0x82, 0x1C, 0xE0, 0x2F, 0xF0, 0x21, 0x5C, 0xE4, 0x90, 0x82, 0x20, 0xF0, 0x90, 0x82, 0x20, 0xE0, \r
+0xC3, 0x94, 0x40, 0x40, 0x02, 0x61, 0xD0, 0xE0, 0xFF, 0x24, 0x2F, 0x91, 0x2B, 0xE0, 0x90, 0x82, \r
+0x22, 0xF0, 0xE0, 0xFE, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFD, 0x90, 0x82, 0x21, 0xF0, 0xEE, 0x54, \r
+0x0F, 0xFE, 0xA3, 0xF0, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0x90, \r
+0x82, 0x23, 0xF0, 0xFC, 0xEE, 0xFE, 0xEC, 0xFB, 0xEB, 0xFF, 0x90, 0x82, 0x28, 0xEE, 0xF0, 0xA3, \r
+0xEF, 0xF0, 0xED, 0x12, 0x45, 0x1E, 0x6A, 0x9B, 0x00, 0x6A, 0xCD, 0x01, 0x6B, 0x3A, 0x02, 0x6B, \r
+0xC1, 0x03, 0x6B, 0x45, 0x04, 0x6B, 0x56, 0x05, 0x6B, 0x56, 0x06, 0x6B, 0x56, 0x07, 0x6B, 0x56, \r
+0x08, 0x6B, 0x9E, 0x09, 0x6B, 0xAF, 0x0A, 0x00, 0x00, 0x6B, 0xD0, 0x90, 0x82, 0x20, 0xE0, 0xFD, \r
+0x24, 0x32, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x31, 0x2D, 0x91, 0x10, \r
+0xE0, 0xFD, 0xED, 0xFF, 0x90, 0x82, 0x2A, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0x90, 0x82, 0x23, \r
+0xE0, 0xFF, 0x12, 0x2F, 0x96, 0x90, 0x82, 0x1E, 0x74, 0x02, 0xF0, 0x61, 0xC1, 0x71, 0xD1, 0x12, \r
+0x44, 0xC2, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x82, 0x20, 0xE0, 0x24, 0x33, \r
+0xF5, 0x82, 0xE4, 0x34, 0x82, 0x71, 0xFC, 0x78, 0x10, 0x12, 0x20, 0xBB, 0xD0, 0x03, 0xD0, 0x02, \r
+0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0xC2, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, \r
+0x82, 0x20, 0xE0, 0x24, 0x34, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x71, 0xFC, 0x78, 0x18, 0x12, 0x20, \r
+0xBB, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x91, 0x4B, 0x90, 0x82, 0x24, 0x12, 0x44, \r
+0xCF, 0x90, 0x85, 0x96, 0x12, 0x20, 0xCE, 0x90, 0x82, 0x28, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, \r
+0x2E, 0xE4, 0x90, 0x82, 0x1E, 0x74, 0x04, 0xF0, 0x61, 0xC1, 0x91, 0x05, 0xE0, 0xFB, 0xE4, 0xFF, \r
+0x12, 0x30, 0xC7, 0x80, 0x09, 0x91, 0x05, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x30, 0x6A, 0x90, 0x82, \r
+0x1E, 0x74, 0x01, 0xF0, 0x80, 0x6B, 0x90, 0x82, 0x1E, 0x74, 0x02, 0xF0, 0x71, 0xD1, 0x12, 0x44, \r
+0xC2, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x82, 0x22, 0x71, 0xFE, 0x78, 0x10, \r
+0x12, 0x20, 0xBB, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x91, 0x4B, 0x90, 0x82, 0x21, \r
+0xE0, 0x24, 0xFB, 0xFF, 0xC0, 0x07, 0x90, 0x82, 0x24, 0x12, 0x44, 0xCF, 0x90, 0x82, 0xAD, 0x12, \r
+0x20, 0xCE, 0x90, 0x82, 0x23, 0xE0, 0xFD, 0xD0, 0x07, 0x12, 0x67, 0xD3, 0x80, 0x23, 0x90, 0x82, \r
+0x1E, 0x74, 0x01, 0x91, 0x18, 0x75, 0x16, 0x01, 0x91, 0x73, 0xF0, 0x7B, 0x04, 0x80, 0x0F, 0x90, \r
+0x82, 0x1E, 0x74, 0x04, 0x91, 0x18, 0x75, 0x16, 0x04, 0x91, 0x73, 0xF0, 0x7B, 0x06, 0x12, 0x67, \r
+0xF5, 0x90, 0x82, 0x1E, 0xE0, 0x24, 0x02, 0xFF, 0x90, 0x82, 0x20, 0xE0, 0x2F, 0xF0, 0x41, 0x2C, \r
+0x22, 0x90, 0x82, 0x20, 0xE0, 0x24, 0x32, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFF, \r
+0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12, 0x20, 0xBB, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, \r
+0x07, 0x90, 0x82, 0x20, 0xE0, 0x24, 0x31, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFF, \r
+0xE4, 0xFC, 0xFD, 0xFE, 0x22, 0x90, 0x82, 0x23, 0xE0, 0xFD, 0x90, 0x82, 0x20, 0xE0, 0x24, 0x31, \r
+0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0x22, 0xF0, 0x90, 0x82, 0x20, 0xE0, 0x24, 0x31, 0xF9, \r
+0xE4, 0x34, 0x82, 0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x82, \r
+0xF5, 0x83, 0x22, 0x78, 0x24, 0xE2, 0xFE, 0x08, 0xE2, 0xFF, 0x22, 0x78, 0x28, 0xE2, 0xFF, 0x78, \r
+0x26, 0xE2, 0x22, 0xD3, 0x78, 0x25, 0xE2, 0x94, 0xFF, 0x18, 0x22, 0x12, 0x44, 0xC2, 0x90, 0x82, \r
+0x24, 0x02, 0x20, 0xCE, 0xFD, 0x18, 0xE2, 0x2D, 0xFD, 0x18, 0xE2, 0x34, 0x00, 0x8D, 0x82, 0xF5, \r
+0x83, 0x22, 0xE2, 0xFF, 0xF4, 0xFE, 0x78, 0x29, 0xE2, 0x5E, 0xFE, 0x18, 0xE2, 0xFD, 0xEF, 0x5D, \r
+0x4E, 0xF2, 0x22, 0x7B, 0xFE, 0x7A, 0x80, 0x79, 0x33, 0x12, 0x2B, 0xED, 0x90, 0x82, 0x23, 0xE0, \r
+0xFF, 0x90, 0x82, 0x22, 0xE0, 0xFD, 0xE4, 0x90, 0x82, 0x72, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
+0xC0, 0xD0, 0x12, 0x2D, 0xA7, 0xE4, 0xF5, 0x51, 0x12, 0x32, 0x9E, 0xEF, 0x60, 0x72, 0x63, 0x51, \r
+0x01, 0xE5, 0x51, 0x24, 0x8B, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x6C, 0xA3, 0xF0, 0x90, 0x00, 0x88, \r
+0xE0, 0xF5, 0x4F, 0xF5, 0x50, 0x54, 0x0F, 0x60, 0xDF, 0xE5, 0x4F, 0x30, 0xE0, 0x0B, 0x20, 0xE4, \r
+0x03, 0x12, 0x29, 0xC5, 0x53, 0x50, 0xEE, 0x80, 0x3E, 0xE5, 0x4F, 0x30, 0xE1, 0x16, 0x20, 0xE5, \r
+0x0E, 0x12, 0x11, 0xBD, 0xEF, 0x70, 0x03, 0x43, 0x50, 0x20, 0x90, 0x01, 0x06, 0xE4, 0xF0, 0x53, \r
+0x50, 0xFD, 0x80, 0x23, 0xE5, 0x4F, 0x30, 0xE2, 0x0A, 0x20, 0xE6, 0x02, 0x31, 0x27, 0x53, 0x50, \r
+0xFB, 0x80, 0x14, 0xE5, 0x4F, 0x30, 0xE3, 0x0F, 0x20, 0xE7, 0x09, 0x12, 0x65, 0x7E, 0xEF, 0x70, \r
+0x03, 0x43, 0x50, 0x80, 0x53, 0x50, 0xF7, 0xAD, 0x50, 0x7F, 0x88, 0x12, 0x32, 0x1E, 0x80, 0x88, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x1F, 0xA4, 0x54, 0x01, 0xFF, 0x90, 0x81, 0xFD, 0xE0, 0x54, \r
+0xFE, 0x4F, 0xF0, 0x22, 0x12, 0x1F, 0xA4, 0x90, 0x81, 0x54, 0xF0, 0x22, 0x12, 0x1F, 0xA4, 0x90, \r
+0x81, 0xF3, 0xF0, 0x22, 0x12, 0x1F, 0xA4, 0x90, 0x81, 0xFB, 0x12, 0x53, 0x4B, 0x90, 0x81, 0xFC, \r
+0xF0, 0x22, 0xE4, 0x90, 0x81, 0x31, 0xF0, 0xA3, 0xF0, 0x90, 0x80, 0x99, 0xF0, 0xA3, 0xF0, 0x22, \r
+0x75, 0x3D, 0x10, 0xE4, 0xF5, 0x3E, 0x75, 0x3F, 0x07, 0x75, 0x40, 0x02, 0x90, 0x01, 0x30, 0xE5, \r
+0x3D, 0xF0, 0xA3, 0xE5, 0x3E, 0xF0, 0xA3, 0xE5, 0x3F, 0xF0, 0xA3, 0xE5, 0x40, 0xF0, 0x22, 0x75, \r
+0x45, 0x06, 0x75, 0x46, 0x01, 0x43, 0x46, 0x10, 0x75, 0x47, 0x03, 0x75, 0x48, 0x62, 0x90, 0x01, \r
+0x38, 0xE5, 0x45, 0xF0, 0xA3, 0xE5, 0x46, 0xF0, 0xA3, 0xE5, 0x47, 0xF0, 0xA3, 0xE5, 0x48, 0xF0, \r
+0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, 0x01, \r
+0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, \r
+0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, \r
+0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, 0x7D, 0x02, \r
+0x90, 0x01, 0xC4, 0x74, 0xCE, 0xF0, 0x74, 0x6D, 0xA3, 0xF0, 0x90, 0x81, 0xFA, 0xE0, 0xFF, 0xED, \r
+0xC3, 0x9F, 0x50, 0x14, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x07, 0xD1, 0x06, \r
+0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE2, 0x74, 0xCE, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, \r
+0x6D, 0xA3, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x22, 0xD1, 0xC8, 0xEF, \r
+0x64, 0x01, 0x60, 0x04, 0xD1, 0x7E, 0x80, 0x5D, 0x90, 0x81, 0x4D, 0xE0, 0xFF, 0x54, 0x03, 0x60, \r
+0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x4C, 0x90, 0x81, 0x4B, 0xE0, 0xFE, 0xE4, 0xC3, \r
+0x9E, 0x50, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x3A, 0xEF, 0x30, 0xE2, 0x04, 0xD1, \r
+0x06, 0x80, 0x32, 0x90, 0x81, 0x4D, 0xE0, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, \r
+0x80, 0x23, 0x90, 0x81, 0x46, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x08, 0x90, 0x01, 0xB8, \r
+0x74, 0x20, 0xF0, 0x80, 0x10, 0x90, 0x81, 0xF3, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x80, \r
+0xF0, 0x80, 0x02, 0x80, 0x4B, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x01, \r
+0xB8, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x81, 0xF6, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x27, 0x90, 0x02, \r
+0x87, 0xE0, 0x60, 0x04, 0xD1, 0x7E, 0x80, 0x1F, 0x90, 0x02, 0x96, 0xE0, 0x60, 0x08, 0x90, 0x01, \r
+0xB8, 0x74, 0x10, 0xF0, 0x80, 0x11, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB8, \r
+0x74, 0x04, 0xF0, 0x80, 0x02, 0x80, 0x09, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x7F, 0x00, 0x22, \r
+0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, \r
+0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, \r
+0x22, 0xD1, 0xC8, 0xEF, 0x70, 0x03, 0x12, 0x4F, 0xBD, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x14, 0xF0, \r
+0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x3D, 0xF5, 0x41, 0xA3, 0xE0, 0x55, 0x3E, \r
+0xF5, 0x42, 0xA3, 0xE0, 0x55, 0x3F, 0xF5, 0x43, 0xA3, 0xE0, 0x55, 0x40, 0xF5, 0x44, 0x90, 0x01, \r
+0x34, 0xE5, 0x41, 0xF0, 0xA3, 0xE5, 0x42, 0xF0, 0xA3, 0xE5, 0x43, 0xF0, 0xA3, 0xE5, 0x44, 0xF0, \r
+0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x45, 0xF5, 0x49, 0xA3, 0xE0, 0x55, 0x46, 0xF5, 0x4A, 0xA3, \r
+0xE0, 0x55, 0x47, 0xF5, 0x4B, 0xA3, 0xE0, 0x55, 0x48, 0xF5, 0x4C, 0x90, 0x01, 0x3C, 0xE5, 0x49, \r
+0xF0, 0xA3, 0xE5, 0x4A, 0xF0, 0xA3, 0xE5, 0x4B, 0xF0, 0xA3, 0xE5, 0x4C, 0xF0, 0x53, 0x91, 0xDF, \r
+0x22, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0x82, 0xD4, 0xF0, 0xE0, 0xFF, 0x30, 0xE0, 0x07, 0x90, 0x01, \r
+0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x23, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xDF, 0xF0, \r
+0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x12, 0x52, 0x84, 0x90, 0x00, \r
+0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x32, 0x1E, 0x80, 0xFE, 0x22, 0x90, 0x81, 0x40, \r
+0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x81, 0xFC, 0xE0, 0x60, 0x0F, \r
+0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x90, \r
+0x81, 0x40, 0xE0, 0x30, 0xE0, 0x11, 0xA3, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x40, 0xE0, 0xFF, 0xC3, \r
+0x13, 0x30, 0xE0, 0x03, 0x12, 0x5C, 0x5D, 0x12, 0x74, 0x93, 0x90, 0x81, 0xF4, 0xE0, 0x30, 0xE0, \r
+0x14, 0x12, 0x4F, 0x43, 0x12, 0x55, 0xE4, 0x90, 0x81, 0xF4, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x03, \r
+0x12, 0x4D, 0xF9, 0xF1, 0xE6, 0x22, 0x90, 0x81, 0xF4, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x81, \r
+0xF4, 0xE0, 0x30, 0xE0, 0x09, 0xE4, 0xF5, 0x1D, 0xA3, 0x12, 0x47, 0x84, 0xF1, 0xE6, 0x90, 0x81, \r
+0xF4, 0xE0, 0x30, 0xE0, 0x34, 0x90, 0x82, 0xD0, 0xE0, 0x70, 0x37, 0x90, 0x82, 0xCF, 0xE0, 0x04, \r
+0xF0, 0xE0, 0xD3, 0x94, 0x06, 0x40, 0x2B, 0x90, 0x81, 0x54, 0x74, 0xD0, 0xF0, 0x90, 0x82, 0xD0, \r
+0x74, 0x01, 0xF0, 0x90, 0x81, 0xF4, 0xE0, 0x13, 0x30, 0xE0, 0x17, 0x90, 0x81, 0x45, 0xE0, 0x44, \r
+0x01, 0xF0, 0x90, 0x81, 0x54, 0x74, 0xD0, 0xF0, 0x22, 0xE4, 0x90, 0x82, 0xD0, 0xF0, 0x90, 0x82, \r
+0xCF, 0xF0, 0x22, 0x90, 0x81, 0x40, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x81, 0x42, 0x74, 0x01, 0xF0, \r
+0x90, 0x81, 0x49, 0xE0, 0x60, 0x44, 0x90, 0x81, 0x45, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0x81, 0x60, \r
+0xE0, 0x04, 0x91, 0x22, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x81, 0x80, 0xEE, \r
+0xF0, 0xA3, 0xEF, 0xF0, 0x11, 0xB1, 0x30, 0xE0, 0x0A, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x03, \r
+0x12, 0x49, 0x7C, 0x90, 0x82, 0xD3, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x80, 0x40, 0x0B, 0x90, \r
+0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0x6F, 0xEE, 0x90, 0x81, 0xF6, \r
+0xE0, 0x30, 0xE0, 0x0C, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x05, 0x12, 0x49, 0x7C, 0x71, 0xF6, \r
+0x22, 0x90, 0x81, 0x46, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, 0x11, 0xB1, 0x30, 0xE0, \r
+0x0B, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x71, 0xE7, 0x71, 0xFF, 0x30, 0xE0, \r
+0x08, 0x91, 0x09, 0x54, 0x07, 0x70, 0x3C, 0x80, 0x37, 0x31, 0x38, 0x40, 0x33, 0x12, 0x47, 0xF3, \r
+0x70, 0x31, 0x12, 0x54, 0x61, 0x70, 0x07, 0x31, 0x14, 0x12, 0x57, 0x81, 0xF0, 0x22, 0x31, 0x14, \r
+0x90, 0x81, 0x53, 0xE0, 0x04, 0xF0, 0xE0, 0xD3, 0x94, 0x02, 0x40, 0x0B, 0x12, 0x57, 0x81, 0xF0, \r
+0xE4, 0x90, 0x81, 0x53, 0xF0, 0x80, 0x03, 0x12, 0x4F, 0xAD, 0xE4, 0x90, 0x81, 0x52, 0xF0, 0x22, \r
+0x12, 0x58, 0x54, 0x22, 0x31, 0x45, 0x40, 0x1F, 0x90, 0x81, 0x63, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, \r
+0x94, 0x04, 0x50, 0x13, 0x90, 0x81, 0x5B, 0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0x81, 0x62, \r
+0xF0, 0xFB, 0x71, 0x2C, 0xFD, 0x31, 0x51, 0x22, 0x90, 0x81, 0x52, 0xE0, 0x04, 0xF0, 0x90, 0x81, \r
+0x4D, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x81, 0xED, 0xE0, 0xFF, 0x90, 0x81, 0x52, 0xE0, 0xD3, 0x9F, \r
+0x22, 0xAC, 0x07, 0x90, 0x81, 0x45, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x81, 0x7F, 0xE0, 0x24, 0x04, \r
+0x90, 0x81, 0x5E, 0xF0, 0x90, 0x81, 0x7F, 0xE0, 0x24, 0x03, 0x90, 0x81, 0x5D, 0xF0, 0x80, 0x0B, \r
+0x90, 0x81, 0x5E, 0x74, 0x02, 0xF0, 0x90, 0x81, 0x5D, 0x14, 0xF0, 0x90, 0x81, 0x5D, 0xE0, 0xFA, \r
+0x90, 0x81, 0x5C, 0xE0, 0xD3, 0x9A, 0x50, 0x09, 0x90, 0x81, 0x51, 0xEB, 0x31, 0xB4, 0x2C, 0x80, \r
+0x0B, 0xAD, 0x02, 0xC3, 0xED, 0x9D, 0x2B, 0x90, 0x81, 0x51, 0x31, 0xB4, 0x90, 0x81, 0x61, 0xF0, \r
+0x90, 0x81, 0x61, 0xE0, 0xFF, 0x7E, 0x00, 0x90, 0x81, 0x55, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, \r
+0x05, 0x58, 0xF0, 0x22, 0xF0, 0x90, 0x81, 0x5E, 0xE0, 0xC3, 0x9D, 0x22, 0xE4, 0xFD, 0xF9, 0xFC, \r
+0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFB, 0xEB, 0x78, 0x02, 0xCE, 0xC3, 0x13, \r
+0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xEE, 0x54, 0x3F, 0x90, 0x81, 0x82, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, \r
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x82, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3, 0x9F, 0xEA, \r
+0x9E, 0x40, 0x21, 0xEB, 0x9F, 0xFF, 0x90, 0x81, 0x61, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F, \r
+0xF9, 0xC3, 0x94, 0x19, 0x50, 0x0E, 0x74, 0x66, 0x29, 0x51, 0xA8, 0xE0, 0x04, 0xF0, 0x90, 0x81, \r
+0x5F, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x5F, 0xE0, 0xC3, 0x94, 0x64, 0x50, 0x02, 0x41, 0xA4, 0xE4, \r
+0xFC, 0xFD, 0x51, 0xA5, 0xE0, 0x2C, 0xFC, 0xD3, 0x94, 0x05, 0x40, 0x07, 0x90, 0x82, 0x00, 0xED, \r
+0xF0, 0x80, 0x05, 0x0D, 0xED, 0xB4, 0x19, 0xEA, 0xE4, 0xFC, 0xFD, 0x51, 0xA5, 0xE0, 0x2C, 0xFC, \r
+0xD3, 0x94, 0x5F, 0x40, 0x07, 0x90, 0x82, 0x01, 0xED, 0xF0, 0x80, 0x05, 0x0D, 0xED, 0xB4, 0x19, \r
+0xEA, 0x90, 0x82, 0x00, 0xE0, 0x90, 0x81, 0x64, 0xF0, 0x90, 0x82, 0x01, 0xE0, 0x90, 0x81, 0x65, \r
+0x51, 0xB0, 0x94, 0x0B, 0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0x81, 0x5C, 0xF0, 0xE4, 0x80, 0x09, \r
+0xE4, 0x90, 0x81, 0x5C, 0x51, 0xB0, 0x74, 0x0A, 0x9F, 0x90, 0x81, 0x5B, 0xF0, 0x90, 0x81, 0x64, \r
+0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x90, 0x81, 0x62, 0xF0, 0xC3, 0x94, 0x08, 0x50, 0x03, 0x74, \r
+0x08, 0xF0, 0x90, 0x81, 0x5C, 0xE0, 0xFD, 0x90, 0x81, 0x62, 0xE0, 0xFB, 0xE4, 0xFF, 0x31, 0x51, \r
+0xE4, 0xFF, 0x51, 0xB8, 0x22, 0x74, 0x66, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, \r
+0xF0, 0x90, 0x81, 0x64, 0xE0, 0xFF, 0xC3, 0x22, 0xE4, 0xFE, 0x74, 0x66, 0x2E, 0x51, 0xA8, 0xE4, \r
+0xF0, 0x0E, 0xEE, 0xB4, 0x19, 0xF4, 0xE4, 0x90, 0x81, 0x5F, 0xF0, 0x90, 0x81, 0x63, 0xF0, 0x90, \r
+0x81, 0x5B, 0xF0, 0xEF, 0xB4, 0x01, 0x09, 0x90, 0x81, 0x64, 0x74, 0x19, 0xF0, 0xE4, 0xA3, 0xF0, \r
+0x22, 0xB1, 0x43, 0x90, 0x82, 0x03, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, \r
+0xE4, 0xFD, 0xFF, 0x12, 0x4D, 0xFD, 0x90, 0x82, 0x03, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, \r
+0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90, 0x81, \r
+0x45, 0xE0, 0x90, 0x04, 0xEC, 0x30, 0xE0, 0x06, 0xE0, 0x54, 0xDD, 0xF0, 0x80, 0x04, 0xE0, 0x44, \r
+0x22, 0xF0, 0x71, 0x2C, 0xFD, 0x90, 0x81, 0x62, 0xE0, 0xFB, 0x21, 0x51, 0x90, 0x81, 0x5B, 0xE0, \r
+0xFF, 0xA3, 0xE0, 0x22, 0x7E, 0x00, 0x7F, 0xA8, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0x45, \r
+0x12, 0x45, 0x44, 0x91, 0x15, 0x12, 0x45, 0x44, 0x90, 0x81, 0x48, 0x74, 0x02, 0xF0, 0x90, 0x81, \r
+0x4F, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0x81, 0x55, 0xE4, 0xF0, 0xA3, 0x74, \r
+0x02, 0xF0, 0x71, 0xD9, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x4D, 0xFD, 0x7D, 0x0C, 0x7F, 0x02, 0x12, \r
+0x4D, 0xFD, 0x12, 0x4D, 0xF9, 0x90, 0x80, 0x41, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0x81, 0x54, \r
+0x74, 0x99, 0xF0, 0x80, 0x29, 0xEF, 0xB4, 0x03, 0x08, 0x90, 0x81, 0x54, 0x74, 0x90, 0xF0, 0x80, \r
+0x1D, 0x90, 0x81, 0x54, 0x74, 0x40, 0xF0, 0x90, 0x00, 0x2C, 0xE0, 0x54, 0x0F, 0xFF, 0xBF, 0x05, \r
+0x08, 0x90, 0x81, 0x7F, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x81, 0x7F, 0xF0, 0x12, 0x55, \r
+0x17, 0x71, 0xD9, 0xF0, 0x7F, 0x01, 0x51, 0xB8, 0x7E, 0x00, 0x7F, 0x02, 0x7D, 0x00, 0x7B, 0x01, \r
+0x7A, 0x81, 0x79, 0xF1, 0x12, 0x45, 0x44, 0x71, 0xEE, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, \r
+0x12, 0x4F, 0x43, 0xE4, 0x90, 0x81, 0xF3, 0xF0, 0x22, 0x90, 0x81, 0x7F, 0xE0, 0x24, 0x04, 0x90, \r
+0x81, 0x61, 0xF0, 0xA3, 0x74, 0x08, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x02, 0x49, 0x86, 0x90, 0x06, \r
+0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x22, 0x90, 0x81, 0xF8, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x90, \r
+0x81, 0x45, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x22, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0x81, 0x4D, \r
+0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x81, 0x79, \r
+0xF6, 0x22, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, \r
+0x22, 0xE4, 0x90, 0x82, 0x03, 0xF0, 0x90, 0x81, 0x49, 0xE0, 0x60, 0x56, 0x12, 0x47, 0xF3, 0x70, \r
+0x51, 0xB1, 0x3B, 0x91, 0x22, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xB1, 0x30, 0xF0, 0x90, \r
+0x82, 0x03, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x81, 0x50, 0xF0, 0x90, 0x81, 0x40, 0xE0, 0x30, 0xE0, \r
+0x16, 0x90, 0x81, 0x44, 0xE0, 0xB4, 0x02, 0x05, 0xE4, 0x90, 0x82, 0x03, 0xF0, 0x12, 0x5B, 0x43, \r
+0xEF, 0x70, 0x04, 0x90, 0x82, 0x03, 0xF0, 0x90, 0x82, 0x03, 0xE0, 0x60, 0x15, 0xB1, 0x28, 0xE4, \r
+0xF5, 0x1D, 0x90, 0x81, 0x51, 0x12, 0x47, 0x84, 0x90, 0x81, 0x4C, 0xE0, 0x20, 0xE2, 0x03, 0x12, \r
+0x4B, 0xBA, 0x22, 0xE4, 0xF5, 0x4E, 0x90, 0x81, 0x49, 0xE0, 0x70, 0x02, 0xA1, 0x1F, 0x12, 0x47, \r
+0xF3, 0x70, 0x7C, 0x91, 0x23, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xB1, 0x30, 0x12, 0x57, \r
+0x6D, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0x81, 0x50, 0xE0, 0x14, 0xF0, \r
+0xE0, 0xFF, 0x60, 0x06, 0x90, 0x81, 0x52, 0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0x81, 0x4F, \r
+0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x4E, 0x01, 0x90, 0x81, 0x40, 0xE0, 0x30, 0xE0, 0x12, 0x90, \r
+0x81, 0x44, 0xE0, 0xB4, 0x02, 0x03, 0xE4, 0xF5, 0x4E, 0x12, 0x5B, 0x43, 0xEF, 0x70, 0x02, 0xF5, \r
+0x4E, 0xE5, 0x4E, 0x60, 0x2A, 0xB1, 0x28, 0x90, 0x81, 0x52, 0xE0, 0x60, 0x03, 0xB4, 0x01, 0x04, \r
+0xB1, 0x20, 0x80, 0x08, 0xB1, 0x20, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x81, 0x51, \r
+0xE0, 0x2F, 0x12, 0x47, 0x85, 0x90, 0x81, 0x4C, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x4B, 0xBA, 0x22, \r
+0xE4, 0xF5, 0x1D, 0x90, 0x81, 0x52, 0xE0, 0x22, 0x90, 0x81, 0x4D, 0xE0, 0x44, 0x10, 0xF0, 0x22, \r
+0xFF, 0xEE, 0x54, 0x3F, 0x90, 0x81, 0x84, 0xF0, 0xA3, 0xEF, 0x22, 0x90, 0x81, 0x4F, 0xE0, 0x90, \r
+0x05, 0x73, 0x22, 0xE4, 0x90, 0x82, 0x04, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x00, 0x83, 0xE0, \r
+0x90, 0x82, 0x04, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xFE, 0x90, 0x82, 0x04, 0xE0, 0xFF, 0xB5, 0x06, \r
+0x01, 0x22, 0xC3, 0x90, 0x82, 0x06, 0xE0, 0x94, 0x64, 0x90, 0x82, 0x05, 0xE0, 0x94, 0x00, 0x40, \r
+0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x82, 0x04, 0xE0, 0xFF, 0x22, 0x90, 0x82, \r
+0x05, 0x12, 0x5F, 0xB2, 0x80, 0xC6, 0x90, 0x81, 0x40, 0xE0, 0xFF, 0x30, 0xE0, 0x05, 0x12, 0x5B, \r
+0xBC, 0x60, 0x1B, 0x90, 0x81, 0x49, 0xE0, 0x70, 0x04, 0xEF, 0x30, 0xE0, 0x0B, 0x90, 0x81, 0x4C, \r
+0xE0, 0x64, 0x02, 0x60, 0x09, 0x12, 0x56, 0xB0, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x22, 0x90, \r
+0x81, 0xFB, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, \r
+0xFD, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x81, 0x40, 0xE0, 0xFF, 0x30, 0xE0, 0x3F, 0x90, 0x81, 0x44, \r
+0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0x81, 0x43, 0xE0, 0x7D, 0x00, 0xB4, 0x04, \r
+0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x25, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x03, 0x02, 0x5C, 0x5D, \r
+0x12, 0x5B, 0xA5, 0x90, 0x81, 0x44, 0xE0, 0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F, 0x0C, 0x80, 0x09, \r
+0x90, 0x81, 0x44, 0xE0, 0x70, 0x06, 0xFD, 0x7F, 0x04, 0x12, 0x4B, 0xBE, 0x22, 0x90, 0x81, 0x40, \r
+0xE0, 0xFF, 0x30, 0xE0, 0x40, 0x90, 0x81, 0x44, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, \r
+0x90, 0x81, 0x43, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x26, 0xEF, \r
+0xC3, 0x13, 0x30, 0xE0, 0x03, 0x02, 0x5C, 0x5D, 0x12, 0x57, 0x88, 0x90, 0x81, 0x44, 0xE0, 0xB4, \r
+0x0C, 0x06, 0xE4, 0xFD, 0x7F, 0x08, 0x80, 0x0A, 0x90, 0x81, 0x44, 0xE0, 0xB4, 0x04, 0x06, 0xE4, \r
+0xFD, 0xFF, 0x12, 0x4B, 0xBE, 0x22, 0x22, 0x90, 0x81, 0x45, 0xE0, 0xFF, 0xD1, 0x86, 0x30, 0xE0, \r
+0x24, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x81, 0x46, 0x30, 0xE1, 0x06, 0xE0, \r
+0x44, 0x02, 0xF0, 0x80, 0x07, 0xE0, 0x54, 0xFD, 0xD1, 0x8D, 0x04, 0xF0, 0x90, 0x81, 0x49, 0xE0, \r
+0x60, 0x03, 0x12, 0x58, 0x54, 0x22, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x22, 0xF0, 0x90, 0x01, \r
+0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x22, 0x90, 0x01, 0xC4, 0x74, 0x98, 0xF0, 0x74, 0x76, \r
+0xA3, 0xF0, 0x90, 0x00, 0x90, 0xE0, 0x20, 0xE0, 0xF9, 0x74, 0x98, 0x04, 0x90, 0x01, 0xC4, 0xF0, \r
+0x74, 0x76, 0xA3, 0xF0, 0x22, 0xD1, 0xEA, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, \r
+0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0xF5, 0x1D, 0x90, 0x81, \r
+0xEF, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0xF5, 0x1E, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, \r
+0x47, 0x8E, 0x90, 0x81, 0x45, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x81, 0x45, 0xE0, 0x13, 0x13, \r
+0x13, 0x54, 0x1F, 0x22, 0x90, 0x81, 0x45, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x81, 0x52, 0xF0, \r
+0xA3, 0xF0, 0x90, 0x81, 0x4D, 0xF0, 0x90, 0x81, 0x46, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, \r
+0x12, 0x49, 0x06, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x49, 0x0A, 0x7D, 0x10, 0x7F, 0x03, 0x02, 0x57, \r
+0xBC, 0xEF, 0x24, 0xFE, 0x60, 0x0B, 0x04, 0x70, 0x24, 0x90, 0x81, 0x4F, 0x74, 0x02, 0xF0, 0x80, \r
+0x13, 0xED, 0x70, 0x06, 0x90, 0x81, 0xF0, 0xE0, 0x80, 0x02, 0xED, 0x14, 0x90, 0x81, 0x4F, 0xF0, \r
+0x90, 0x81, 0x4F, 0xE0, 0xA3, 0xF0, 0x90, 0x81, 0x46, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x7D, 0x2E, \r
+0x7F, 0x6F, 0x12, 0x4D, 0xA9, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x4D, 0xFD, 0x12, 0x5F, 0xC8, 0x90, \r
+0x81, 0x44, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x4F, 0x43, 0x12, 0x4F, 0xD9, 0x12, 0x5E, 0x8E, 0x90, \r
+0x81, 0x44, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x81, 0xF4, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, \r
+0xE4, 0xA3, 0xF0, 0x90, 0x81, 0xF4, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x90, 0x81, 0x43, 0xE0, 0x64, \r
+0x02, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, \r
+0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0xE0, 0x54, 0xFE, 0x4E, \r
+0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x1F, 0xA4, 0xFE, \r
+0x22, 0xE0, 0x90, 0x01, 0xBA, 0xF0, 0x90, 0x81, 0x4B, 0xE0, 0x90, 0x01, 0xBB, 0x22, 0xEF, 0x13, \r
+0x13, 0x13, 0x54, 0x1F, 0xFE, 0xEF, 0x54, 0x07, 0xFF, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, \r
+0xF0, 0xE0, 0x44, 0x80, 0x22, 0x7F, 0x70, 0x7E, 0x0E, 0x12, 0x2E, 0xA2, 0x90, 0x82, 0xAD, 0x22, \r
+0x90, 0x81, 0xF6, 0xE0, 0x54, 0xFE, 0x4E, 0x22, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0x22, \r
+0x4D, 0xFF, 0x90, 0x81, 0x40, 0xF0, 0xEE, 0x22, 0x36, 0x28,  \r
 };\r
-u4Byte ArrayLength_MP_8188E_FW_NIC_S = 15894;\r
+u4Byte ArrayLength_MP_8188E_FW_NIC = 14378;\r
 \r
 \r
 void\r
-ODM_ReadFirmware_MP_8188E_FW_NIC_S(\r
+ODM_ReadFirmware_MP_8188E_FW_NIC(\r
      IN   PDM_ODM_T    pDM_Odm,\r
      OUT  u1Byte       *pFirmware,\r
      OUT  u4Byte       *pFirmwareSize\r
 )\r
 {\r
-#if(DM_ODM_SUPPORT_TYPE & (ODM_CE))\r
-       *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8188E_FW_NIC_S;\r
+ #if (DM_ODM_SUPPORT_TYPE & (ODM_CE))\r
+     *((SIZE_PTR*)pFirmware) = (SIZE_PTR)Array_MP_8188E_FW_NIC;\r
 #else\r
-       ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8188E_FW_NIC_S, ArrayLength_MP_8188E_FW_NIC_S);\r
+     ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8188E_FW_NIC, ArrayLength_MP_8188E_FW_NIC);\r
 #endif\r
-       *pFirmwareSize = ArrayLength_MP_8188E_FW_NIC_S;\r
+     *pFirmwareSize = ArrayLength_MP_8188E_FW_NIC;\r
 }\r
 \r
 \r
-u1Byte Array_MP_8188E_FW_NIC_T[] = {\r
-0xE1, 0x88, 0x10, 0x00, 0x12, 0x00, 0x00, 0x00, 0x04, 0x03, 0x13, 0x39, 0xD8, 0x3A, 0x00, 0x00, \r
-0xF1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+u1Byte Array_MP_8188E_FW_NIC_89EM[] = {\r
+0xE1, 0x88, 0x40, 0x00, 0x14, 0x00, 0x00, 0x00, 0x09, 0x11, 0x20, 0x13, 0x70, 0x36, 0x00, 0x00, \r
+0xEE, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
 0x02, 0x45, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
 0x00, 0x00, 0x00, 0xC1, 0xB9, 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
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0xC1, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xED, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0xC1, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xFC, 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
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
@@ -2110,8 +1958,8 @@ u1Byte Array_MP_8188E_FW_NIC_T[] = {
 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, \r
 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, \r
 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, \r
-0xE7, 0x80, 0xBE, 0x00, 0x41, 0x82, 0xF9, 0x00, 0x41, 0x82, 0xFA, 0x00, 0x41, 0x83, 0x01, 0x00\r
-0x41, 0x83, 0x02, 0x01, 0x41, 0x83, 0x0A, 0x00, 0x52, 0x2F, 0x57, 0xD7, 0x5F, 0xEA, 0xC0, 0xE0, \r
+0xE7, 0x80, 0xBE, 0x41, 0x82, 0x62, 0x00, 0x41, 0x82, 0x63, 0x00, 0x41, 0x82, 0x68, 0x00, 0x41\r
+0x82, 0x69, 0x00, 0x41, 0x82, 0x72, 0x00, 0x00, 0x50, 0xF3, 0x58, 0x0D, 0x5F, 0xDE, 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, 0x0E, \r
 0xF0, 0x74, 0x46, 0xA3, 0xF0, 0xD1, 0x7F, 0xE5, 0x3C, 0x30, 0xE7, 0x02, 0xD1, 0x64, 0x74, 0x0E, \r
@@ -2125,1964 +1973,795 @@ u1Byte Array_MP_8188E_FW_NIC_T[] = {
 0x7F, 0x57, 0x12, 0x32, 0x1E, 0x53, 0x91, 0xEF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, \r
 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, \r
 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xB9, 0xF0, 0x74, 0x46, 0xA3, 0xF0, \r
-0x12, 0x71, 0x98, 0xE5, 0x41, 0x30, 0xE4, 0x02, 0xF1, 0x55, 0xE5, 0x41, 0x30, 0xE6, 0x02, 0xF1, \r
-0xE0, 0xE5, 0x43, 0x30, 0xE0, 0x03, 0x12, 0x71, 0xF5, 0xE5, 0x43, 0x30, 0xE1, 0x03, 0x12, 0x56, \r
-0xC0, 0xE5, 0x43, 0x30, 0xE2, 0x03, 0x12, 0x56, 0x74, 0xE5, 0x43, 0x30, 0xE3, 0x02, 0xF1, 0x68, \r
-0xE5, 0x43, 0x30, 0xE4, 0x03, 0x12, 0x73, 0x07, 0xE5, 0x43, 0x30, 0xE5, 0x03, 0x12, 0x67, 0xCA, \r
-0xE5, 0x43, 0x30, 0xE6, 0x02, 0xF1, 0x84, 0xE5, 0x44, 0x30, 0xE1, 0x03, 0x12, 0x73, 0x36, 0x74, \r
-0xB9, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x46, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, \r
-0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, \r
-0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x12, 0x61, 0x95, 0x7F, 0x02, 0x8F, 0x0D, 0x7F, 0x02, 0x71, 0x27, \r
-0x90, 0x80, 0x3C, 0xE0, 0x45, 0x0D, 0xF0, 0x22, 0x90, 0x81, 0x36, 0xE0, 0x64, 0x01, 0x70, 0x13, \r
-0x90, 0x81, 0x80, 0xE0, 0x60, 0x0D, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, \r
-0x12, 0x64, 0x27, 0x22, 0x90, 0x81, 0x36, 0xE0, 0xB4, 0x01, 0x13, 0x90, 0x81, 0x80, 0xE0, 0x60, \r
-0x0D, 0x90, 0x81, 0x84, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x07, 0x70, 0x02, 0xF1, 0x9F, 0x22, 0x90, \r
-0x81, 0x77, 0xE0, 0x90, 0x81, 0x82, 0x30, 0xE0, 0x04, 0xE0, 0xFF, 0x80, 0x07, 0xE0, 0xFF, 0x7D, \r
-0x01, 0x02, 0x48, 0xD1, 0xAE, 0x07, 0xF1, 0xD4, 0xBF, 0x01, 0x16, 0x90, 0x81, 0x77, 0xE0, 0xC4, \r
-0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x0A, 0xAF, 0x06, 0x7D, 0x01, 0x12, 0x48, 0xD1, 0x7F, 0x01, \r
-0x22, 0x7F, 0x00, 0x22, 0x90, 0x05, 0x43, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, \r
-0x90, 0x81, 0x77, 0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, \r
-0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, \r
-0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xED, 0xF0, \r
-0x74, 0x47, 0xA3, 0xF0, 0x12, 0x71, 0xC5, 0xE5, 0x49, 0x30, 0xE1, 0x02, 0x11, 0x95, 0xE5, 0x49, \r
-0x30, 0xE2, 0x03, 0x12, 0x73, 0xE1, 0xE5, 0x4A, 0x30, 0xE0, 0x03, 0x12, 0x74, 0x37, 0xE5, 0x4A, \r
-0x30, 0xE4, 0x03, 0x12, 0x74, 0xF1, 0xE5, 0x4B, 0x30, 0xE1, 0x03, 0x12, 0x75, 0x07, 0xE5, 0x4B, \r
-0x30, 0xE0, 0x03, 0x12, 0x73, 0x9A, 0xE5, 0x4B, 0x30, 0xE3, 0x02, 0xF1, 0xEE, 0xE5, 0x4C, 0x30, \r
-0xE1, 0x05, 0x7F, 0x04, 0x12, 0x47, 0x5A, 0xE5, 0x4C, 0x30, 0xE4, 0x03, 0x12, 0x56, 0x60, 0xE5, \r
-0x4C, 0x30, 0xE5, 0x03, 0x12, 0x75, 0x9E, 0xE5, 0x4C, 0x30, 0xE6, 0x03, 0x12, 0x75, 0xD3, 0x74, \r
-0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x47, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, \r
-0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, \r
-0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x81, 0x80, 0xE0, 0x60, 0x03, 0x12, 0x77, 0xC4, 0x90, 0x82, \r
-0x26, 0xE0, 0x30, 0xE0, 0x13, 0x54, 0xFB, 0xF0, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x06, 0x7D, 0x04, \r
-0x7F, 0x01, 0x61, 0x09, 0x7D, 0x31, 0x91, 0xC4, 0x22, 0xE4, 0xFD, 0x7F, 0x0C, 0x11, 0xD1, 0xE4, \r
-0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, 0xF0, 0x90, 0x80, 0x40, 0xED, 0xF0, 0x22, 0x7D, 0x01, 0x7F, \r
-0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x83, 0x07, 0xED, 0xF0, 0x90, 0x81, 0x7C, \r
-0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x41, 0x29, 0xEE, 0xC4, 0x13, 0x13, \r
-0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0x41, 0x29, 0x90, 0x81, 0x83, 0xE0, 0xFE, 0x6F, 0x70, 0x02, \r
-0x41, 0x29, 0xEF, 0x70, 0x02, 0x21, 0x90, 0x24, 0xFE, 0x70, 0x02, 0x21, 0xC9, 0x24, 0xFE, 0x60, \r
-0x47, 0x24, 0xFC, 0x70, 0x02, 0x41, 0x04, 0x24, 0xFC, 0x60, 0x02, 0x41, 0x19, 0xEE, 0xB4, 0x0E, \r
-0x02, 0x51, 0xB1, 0x90, 0x81, 0x83, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0xE1, 0x90, 0x81, 0x83, \r
-0xE0, 0xB4, 0x06, 0x02, 0x51, 0x87, 0x90, 0x81, 0x83, 0xE0, 0xB4, 0x04, 0x0D, 0x90, 0x83, 0x07, \r
-0xE0, 0xFF, 0x60, 0x04, 0xB1, 0x3E, 0x80, 0x02, 0xF1, 0xD1, 0x90, 0x81, 0x83, 0xE0, 0x64, 0x08, \r
-0x60, 0x02, 0x41, 0x19, 0x91, 0x77, 0x41, 0x19, 0x90, 0x81, 0x83, 0xE0, 0x70, 0x04, 0x7F, 0x01, \r
-0x51, 0xE1, 0x90, 0x81, 0x83, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0x87, 0x90, 0x81, 0x83, 0xE0, 0xB4, \r
-0x0E, 0x07, 0x51, 0x2E, 0xBF, 0x01, 0x02, 0x51, 0xB1, 0x90, 0x81, 0x83, 0xE0, 0x64, 0x0C, 0x60, \r
-0x02, 0x41, 0x19, 0x51, 0x2E, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x41, 0x19, 0x71, 0x71, 0x41, 0x19, \r
-0x90, 0x81, 0x83, 0xE0, 0xB4, 0x0E, 0x07, 0x51, 0x2E, 0xBF, 0x01, 0x02, 0x51, 0xB1, 0x90, 0x81, \r
-0x83, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0x87, 0x90, 0x81, 0x83, 0xE0, 0xB4, 0x0C, 0x07, 0x51, 0x2E, \r
-0xBF, 0x01, 0x02, 0x71, 0x71, 0x90, 0x81, 0x83, 0xE0, 0x64, 0x04, 0x70, 0x5C, 0x12, 0x76, 0xAC, \r
-0xEF, 0x64, 0x01, 0x70, 0x54, 0x91, 0xA6, 0x80, 0x50, 0x90, 0x81, 0x83, 0xE0, 0xB4, 0x0E, 0x07, \r
-0x51, 0x2E, 0xBF, 0x01, 0x02, 0x51, 0xB1, 0x90, 0x81, 0x83, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0x87, \r
-0x90, 0x81, 0x83, 0xE0, 0xB4, 0x0C, 0x07, 0x51, 0x2E, 0xBF, 0x01, 0x02, 0x71, 0x71, 0x90, 0x81, \r
-0x83, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0xE1, 0x90, 0x81, 0x83, 0xE0, 0xB4, 0x04, 0x1A, 0x12, \r
-0x77, 0x2C, 0x80, 0x15, 0x90, 0x81, 0x83, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, 0x81, 0x7D, 0xE0, 0xFF, \r
-0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0x91, 0x66, 0x90, 0x81, 0x83, 0xE0, 0x90, 0x01, 0xBA, \r
-0xF0, 0x90, 0x81, 0x82, 0xE0, 0x90, 0x01, 0xBB, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x57, \r
-0xA3, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x40, 0x90, 0x81, \r
-0x7C, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, \r
-0x80, 0x2C, 0x90, 0x81, 0x82, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, \r
-0xF0, 0x80, 0x1B, 0x90, 0x82, 0x26, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0x90, 0x01, \r
-0xB8, 0x74, 0x11, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, \r
-0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x81, 0x7D, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, \r
-0x0C, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0x71, 0x09, 0x80, 0x0F, 0x71, 0x01, 0x90, \r
-0x05, 0x27, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x81, 0x7B, 0x74, 0x0C, 0xF0, 0xE4, 0xFD, 0xFF, 0x01, \r
-0xC2, 0x90, 0x81, 0x7D, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, 0x71, 0x05, 0x80, 0x1E, 0x90, 0x06, \r
-0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0x71, 0x09, 0x90, \r
-0x05, 0x27, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x81, 0x7B, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x01, \r
-0xC2, 0x90, 0x83, 0x06, 0xEF, 0xF0, 0x12, 0x5D, 0x56, 0x90, 0x83, 0x06, 0xE0, 0x60, 0x05, 0xE4, \r
-0xFD, 0xFF, 0x11, 0xC2, 0x7D, 0x04, 0x7F, 0x01, 0x71, 0x09, 0x90, 0x81, 0x7B, 0x74, 0x04, 0xF0, \r
-0x22, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0xAC, 0x07, 0xEF, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, 0x01, \r
-0xFE, 0x90, 0x81, 0x7C, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0x80, 0x0C, 0x90, 0x81, 0x83, 0xED, 0xF0, \r
-0x80, 0x05, 0x90, 0x81, 0x82, 0xED, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE4, 0x2E, 0xEC, 0x14, \r
-0x60, 0x07, 0x14, 0x60, 0x1D, 0x24, 0x02, 0x70, 0x23, 0x90, 0x81, 0x7C, 0xE0, 0x54, 0x01, 0xC4, \r
-0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x90, 0x81, 0x83, 0xE0, 0x54, 0x7F, 0x4F, 0xFD, 0x7F, 0x88, \r
-0x80, 0x07, 0x90, 0x81, 0x82, 0xE0, 0xFD, 0x7F, 0x89, 0x12, 0x32, 0x1E, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0x90, 0x81, 0x36, 0xE0, 0x64, 0x01, 0x70, 0x35, 0x90, 0x81, 0x7D, 0xE0, 0x54, 0xFD, 0xF0, \r
-0x7D, 0x2C, 0x7F, 0x6F, 0x11, 0xC2, 0x7D, 0x08, 0x7F, 0x01, 0xB1, 0x87, 0xBF, 0x01, 0x14, 0x90, \r
-0x81, 0x7C, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0x71, 0x09, 0x90, 0x81, 0x7B, 0x74, \r
-0x0E, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x22, 0x7E, \r
-0x00, 0x7F, 0xA3, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0x7C, 0x12, 0x45, 0x44, 0x90, 0x81, \r
-0x7F, 0x74, 0x02, 0xF0, 0x90, 0x81, 0x86, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, \r
-0x81, 0x8B, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0x81, 0xB7, 0xE0, 0x24, 0x04, 0x90, 0x81, \r
-0x95, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xE4, 0xFD, 0xFF, 0x71, 0x09, 0x7D, 0x0C, 0x7F, 0x02, 0x71, \r
-0x09, 0x71, 0x05, 0x90, 0x80, 0x41, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0x81, 0x8A, 0x74, 0x99, \r
-0xF0, 0x80, 0x15, 0xEF, 0x90, 0x81, 0x8A, 0xB4, 0x03, 0x05, 0x74, 0x90, 0xF0, 0x80, 0x09, 0x74, \r
-0x40, 0xF0, 0x90, 0x81, 0xB7, 0x74, 0x02, 0xF0, 0x90, 0x82, 0x1F, 0x74, 0x03, 0xF0, 0xA3, 0x74, \r
-0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x90, 0x81, 0xB7, \r
-0xE0, 0x24, 0x04, 0x90, 0x81, 0x95, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x12, 0x77, 0xA3, 0x7E, 0x00, \r
-0x7F, 0x02, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x23, 0x12, 0x45, 0x44, 0x90, 0x06, 0x04, \r
-0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0xE4, 0xFD, 0xFF, 0x11, 0xC2, \r
-0xE4, 0x90, 0x82, 0x25, 0xF0, 0x22, 0x7D, 0x2F, 0x91, 0xC4, 0x7D, 0x08, 0x7F, 0x01, 0x71, 0x09, \r
-0x90, 0x81, 0x7B, 0x74, 0x08, 0xF0, 0x22, 0x12, 0x5D, 0x56, 0xE4, 0xFD, 0xFF, 0x11, 0xC2, 0x71, \r
-0x05, 0x90, 0x81, 0x7B, 0x74, 0x0C, 0xF0, 0x22, 0x90, 0x81, 0x80, 0xE0, 0x64, 0x01, 0x70, 0x15, \r
-0x90, 0x81, 0x7E, 0xE0, 0x54, 0x0F, 0x60, 0x05, 0x11, 0xB9, 0x02, 0x73, 0xFB, 0x90, 0x81, 0x83, \r
-0xE0, 0x70, 0x02, 0x11, 0xCD, 0x22, 0x7D, 0x2D, 0xD1, 0x4E, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, \r
-0xFD, 0x7F, 0x03, 0x12, 0x54, 0xFC, 0x91, 0xC8, 0xE4, 0xFD, 0x7F, 0x01, 0x71, 0x09, 0xE4, 0x90, \r
-0x81, 0x7B, 0xF0, 0x22, 0x7F, 0xFF, 0x11, 0xC2, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xD1, \r
-0x52, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xDA, 0xCC, 0xF0, 0x00, 0xC0, 0x7F, 0x8C, 0x7E, 0x08, 0x12, \r
-0x2E, 0xA2, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x14, 0x7F, 0x70, 0x7E, 0x0E, \r
-0x12, 0x2E, 0xA2, 0x90, 0x82, 0xDD, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xFD, 0xFF, \r
-0x12, 0x5C, 0x32, 0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2D, 0x5C, 0xEC, 0x44, 0x80, 0xFC, 0x90, 0x82, \r
-0xEE, 0x12, 0x20, 0xCE, 0x90, 0x82, 0xEE, 0x12, 0x44, 0xCF, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xCE, \r
-0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, \r
-0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x60, \r
-0x41, 0x90, 0x81, 0x36, 0xE0, 0x64, 0x01, 0x70, 0x39, 0x90, 0x81, 0x7D, 0xE0, 0x54, 0xFE, 0xF0, \r
-0x7D, 0x2B, 0x7F, 0x0F, 0x11, 0xC2, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0xB1, 0x83, 0xBF, \r
-0x01, 0x14, 0x90, 0x81, 0x7C, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0x7F, 0x01, 0x71, 0x09, 0x90, \r
-0x81, 0x7B, 0x74, 0x06, 0xF0, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x74, \r
-0x08, 0xF0, 0x22, 0x7D, 0x08, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x82, \r
-0xE1, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x80, 0x3E, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0, \r
-0x60, 0x21, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x82, 0xE5, 0xF0, 0x7D, 0x26, 0xD1, 0x4E, 0xEF, 0x64, \r
-0x01, 0x70, 0x03, 0x12, 0x7A, 0x15, 0x90, 0x82, 0xE5, 0xE0, 0xFF, 0x7D, 0x27, 0x11, 0xC2, 0xB1, \r
-0xD5, 0x80, 0x05, 0xB1, 0xD5, 0x12, 0x7A, 0x15, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x82, 0xE1, 0xE0, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x90, 0x83, 0x09, 0xEF, 0xF0, 0x90, 0x80, 0x44, 0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, \r
-0x70, 0x47, 0x90, 0x81, 0x83, 0xE0, 0x64, 0x0E, 0x70, 0x14, 0x90, 0x83, 0x09, 0xE0, 0x70, 0x39, \r
-0x90, 0x81, 0x7C, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0x71, 0x01, 0x80, 0x26, 0x90, 0x81, \r
-0x83, 0xE0, 0x64, 0x06, 0x70, 0x23, 0x90, 0x83, 0x09, 0xE0, 0x60, 0x1D, 0x90, 0x81, 0x7C, 0xE0, \r
-0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x81, \r
-0x83, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x11, 0xC2, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x73, \r
-0xFB, 0x90, 0x81, 0x83, 0xE0, 0x64, 0x0C, 0x60, 0x04, 0x11, 0xB9, 0xB1, 0x83, 0x22, 0x7F, 0xFF, \r
-0x11, 0xC2, 0xE4, 0x90, 0x82, 0xFF, 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, 0xD3, 0x90, \r
-0x83, 0x00, 0xE0, 0x94, 0xE8, 0x90, 0x82, 0xFF, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, \r
-0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0x90, 0x82, \r
-0xFF, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x44, 0x9F, 0x80, 0xBF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x90, 0x82, 0xF2, 0xEF, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1C, 0x90, 0x05, 0x22, 0xE0, \r
-0x90, 0x82, 0xF5, 0xF0, 0x7D, 0x29, 0xD1, 0x4E, 0xBF, 0x01, 0x02, 0xD1, 0xD5, 0x90, 0x82, 0xF5, \r
-0xE0, 0xFF, 0x7D, 0x2A, 0x11, 0xC2, 0x80, 0x02, 0xD1, 0xD5, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x80, 0x45, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0xF1, 0x3A, \r
-0x90, 0x82, 0xF3, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x82, 0xF2, 0xE0, 0xFF, 0x74, \r
-0x1F, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x1D, \r
-0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x1F, \r
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x74, 0x21, 0x2D, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x1F, 0x2D, 0xF5, 0x82, \r
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x90, 0x82, 0xF7, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x82, 0xF6, 0xEF, 0xF0, 0xE4, 0xFD, \r
-0xFC, 0x12, 0x7A, 0xC2, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0x82, 0xF6, 0xE0, 0x90, 0x04, 0x25, 0xF0, \r
-0x90, 0x82, 0xF7, 0xE0, 0x60, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
-0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x08, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
-0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, \r
-0xAF, 0x05, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x01, 0xFE, \r
-0x90, 0x82, 0xF8, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x74, 0x16, \r
-0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0xE4, 0xFD, 0xFF, 0x11, 0xC2, 0x7D, 0x0C, 0x7F, \r
-0x01, 0x61, 0x09, 0x7D, 0x20, 0x91, 0xC4, 0x90, 0x81, 0x7A, 0x74, 0x02, 0xF0, 0x22, 0x22, 0xF1, \r
-0xF3, 0x80, 0xF0, 0x90, 0x81, 0x7A, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x01, 0xC8, 0xE4, 0xF0, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x37, 0x7F, 0xFF, 0xFE, 0x12, 0x2B, 0x27, 0xBF, \r
-0x01, 0x09, 0x90, 0x82, 0x37, 0xE0, 0x64, 0x03, 0x60, 0x03, 0x22, 0x01, 0xBC, 0xE4, 0x90, 0x82, \r
-0x3C, 0xF0, 0x90, 0x82, 0x3C, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, 0x02, 0x01, 0xF7, 0xC3, 0x74, \r
-0xFE, 0x9F, 0xFF, 0xE4, 0x94, 0x00, 0xFE, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x38, 0x12, 0x2B, 0x27, \r
-0xEF, 0x64, 0x01, 0x70, 0x77, 0x90, 0x82, 0x38, 0xE0, 0xFF, 0x54, 0xC0, 0xFE, 0x60, 0x05, 0xEF, \r
-0x54, 0x0C, 0x70, 0x16, 0x90, 0x82, 0x38, 0xE0, 0xFF, 0x54, 0x30, 0x60, 0x67, 0xEF, 0x54, 0x03, \r
-0x60, 0x62, 0x90, 0x82, 0x39, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x82, 0x39, 0xF0, 0x90, \r
-0x82, 0x39, 0xE0, 0x90, 0x82, 0x38, 0x70, 0x16, 0xE0, 0xFF, 0xEE, 0x13, 0x13, 0x54, 0x3F, 0x90, \r
-0x82, 0x3A, 0xF0, 0xEF, 0x54, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0xA3, 0xF0, 0x80, 0x0D, 0xE0, 0xFE, \r
-0x54, 0x30, 0x90, 0x82, 0x3A, 0xF0, 0xEE, 0x54, 0x03, 0xA3, 0xF0, 0x90, 0x82, 0x3A, 0xE0, 0x64, \r
-0x30, 0x70, 0x54, 0xA3, 0xE0, 0x64, 0x02, 0x70, 0x4E, 0x90, 0x00, 0xF5, 0xE0, 0x54, 0x40, 0x90, \r
-0x82, 0x3D, 0xF0, 0xE0, 0x70, 0x41, 0xA3, 0x74, 0x02, 0xF0, 0x80, 0x10, 0x90, 0x82, 0x3E, 0x74, \r
-0x01, 0xF0, 0x80, 0x08, 0x90, 0x82, 0x3C, 0xE0, 0x04, 0xF0, 0x01, 0x22, 0x90, 0x01, 0xC4, 0x74, \r
-0xFA, 0xF0, 0x74, 0x4F, 0xA3, 0xF0, 0x90, 0x82, 0x3E, 0xE0, 0x90, 0x01, 0xC8, 0xF0, 0x90, 0x82, \r
-0x38, 0xE0, 0x90, 0x01, 0xC9, 0xF0, 0x90, 0x82, 0x39, 0xE0, 0x90, 0x01, 0xCA, 0xF0, 0xE4, 0xFD, \r
-0x7F, 0x1F, 0x12, 0x32, 0x1E, 0x80, 0xD5, 0x22, 0x90, 0x00, 0xF7, 0xE0, 0x20, 0xE7, 0x09, 0xE0, \r
-0x7F, 0x01, 0x20, 0xE6, 0x0C, 0x7F, 0x02, 0x22, 0x90, 0x00, 0xF7, 0xE0, 0x30, 0xE6, 0x02, 0x7F, \r
-0x03, 0x22, 0x11, 0xF8, 0x90, 0x80, 0x41, 0xEF, 0xF0, 0x31, 0x24, 0x90, 0x01, 0x64, 0x74, 0x01, \r
-0xF0, 0x02, 0x2D, 0xA7, 0x31, 0x93, 0x31, 0xC3, 0x31, 0x52, 0x31, 0x71, 0xE4, 0xF5, 0x35, 0xF5, \r
-0x36, 0xF5, 0x37, 0x75, 0x38, 0x80, 0xAD, 0x35, 0x7F, 0x50, 0x12, 0x32, 0x1E, 0xAD, 0x36, 0x7F, \r
-0x51, 0x12, 0x32, 0x1E, 0xAD, 0x37, 0x7F, 0x52, 0x12, 0x32, 0x1E, 0xAD, 0x38, 0x7F, 0x53, 0x02, \r
-0x32, 0x1E, 0x75, 0x3D, 0x10, 0xE4, 0xF5, 0x3E, 0x75, 0x3F, 0x07, 0x75, 0x40, 0x02, 0x90, 0x01, \r
-0x30, 0xE5, 0x3D, 0xF0, 0xA3, 0xE5, 0x3E, 0xF0, 0xA3, 0xE5, 0x3F, 0xF0, 0xA3, 0xE5, 0x40, 0xF0, \r
-0x22, 0x75, 0x45, 0x06, 0x75, 0x46, 0x01, 0x43, 0x46, 0x10, 0x75, 0x47, 0x03, 0x75, 0x48, 0x62, \r
-0x90, 0x01, 0x38, 0xE5, 0x45, 0xF0, 0xA3, 0xE5, 0x46, 0xF0, 0xA3, 0xE5, 0x47, 0xF0, 0xA3, 0xE5, \r
-0x48, 0xF0, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, \r
-0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x32, 0x1E, 0xE4, 0xFD, \r
-0x7F, 0x51, 0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x53, \r
-0x02, 0x32, 0x1E, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, \r
-0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x12, 0x32, 0x1E, 0x7D, \r
-0xFF, 0x7F, 0x55, 0x12, 0x32, 0x1E, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x32, 0x1E, 0x7D, 0xFF, 0x7F, \r
-0x57, 0x02, 0x32, 0x1E, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0x83, 0x05, 0xF0, 0xE0, 0xFF, 0x30, 0xE0, \r
-0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x22, 0x90, 0x01, 0xCF, 0xE0, \r
-0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x31, 0x93, \r
-0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x32, 0x1E, 0x80, 0xFE, 0x22, 0x90, \r
-0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x32, 0x1E, 0x90, 0xFD, 0x00, 0xE0, 0x54, \r
-0xBF, 0xF0, 0x12, 0x4F, 0xFA, 0x51, 0xB4, 0x12, 0x32, 0x77, 0x12, 0x71, 0x05, 0x51, 0xCF, 0x7F, \r
-0x01, 0x12, 0x42, 0x15, 0x90, 0x82, 0x2C, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x42, 0x15, 0x90, 0x82, \r
-0x2C, 0xE0, 0x04, 0xF0, 0x31, 0x12, 0x51, 0x83, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xFD, 0x7F, \r
-0x80, 0x12, 0x32, 0x1E, 0x75, 0x20, 0xFF, 0x51, 0xA3, 0x12, 0x71, 0x35, 0x51, 0xAA, 0xE4, 0xFF, \r
-0x02, 0x42, 0x9E, 0x51, 0x9D, 0x51, 0xC1, 0x51, 0xF2, 0x12, 0x4B, 0xAF, 0x51, 0xDD, 0x7E, 0x00, \r
-0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x28, 0x02, 0x45, 0x44, 0xE4, 0x90, 0x81, \r
-0x36, 0xF0, 0x22, 0x75, 0xE8, 0x03, 0x75, 0xA8, 0x84, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x12, 0xF0, \r
-0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, \r
-0x22, 0xE4, 0x90, 0x81, 0x31, 0xF0, 0xA3, 0xF0, 0x90, 0x80, 0x99, 0xF0, 0xA3, 0xF0, 0x22, 0xE4, \r
-0x90, 0x80, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x82, 0x26, \r
-0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x82, 0x26, 0xE0, 0x54, 0xFB, \r
-0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x01, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0x77, 0x12, 0x45, \r
-0x44, 0x90, 0x81, 0x77, 0xE0, 0x54, 0xFD, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0x74, 0x0C, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x52, 0x8A, 0x53, 0x89, \r
-0x54, 0x90, 0x05, 0x27, 0xE0, 0xF5, 0x55, 0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x81, \r
-0x77, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, \r
-0xF0, 0x12, 0x1F, 0xA4, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x81, 0x77, \r
-0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, 0x1F, 0xA4, 0xFE, 0x54, \r
-0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x81, 0x77, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, \r
-0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12, 0x1F, 0xA4, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, \r
-0x90, 0x81, 0x77, 0xF0, 0xEE, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0x81, 0x2F, 0xE0, 0x20, 0xE0, 0x02, \r
-0x81, 0x16, 0x75, 0x55, 0x21, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0x91, 0xF3, 0x43, 0x55, \r
-0x08, 0x80, 0x0C, 0xE4, 0x90, 0x81, 0x78, 0xF0, 0xA3, 0xF0, 0x7D, 0x40, 0xFF, 0xB1, 0x1B, 0x90, \r
-0x81, 0x77, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x03, 0x43, 0x55, 0x12, 0xEF, \r
-0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x55, 0x14, 0x90, 0x81, 0x77, 0xE0, 0xC4, 0x13, 0x54, \r
-0x07, 0x30, 0xE0, 0x03, 0x43, 0x55, 0x80, 0x90, 0x81, 0x77, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, \r
-0x20, 0xE0, 0x03, 0x43, 0x55, 0x40, 0x90, 0x05, 0x27, 0xE5, 0x55, 0xF0, 0x90, 0x81, 0x7A, 0xE0, \r
-0x70, 0x05, 0x7F, 0x01, 0x12, 0x78, 0x77, 0x90, 0x81, 0x77, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, \r
-0x03, 0x30, 0xE0, 0x04, 0x7F, 0x04, 0x80, 0x22, 0x12, 0x47, 0xD4, 0xEF, 0x60, 0x04, 0x7F, 0x01, \r
-0x80, 0x18, 0x7F, 0x02, 0x80, 0x14, 0x75, 0x55, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x55, 0xF0, 0x90, \r
-0x81, 0x7A, 0xE0, 0x64, 0x04, 0x60, 0x02, 0x81, 0xEE, 0xFF, 0x12, 0x78, 0x77, 0x81, 0xEE, 0x90, \r
-0x81, 0x77, 0xE0, 0xFF, 0x20, 0xE0, 0x02, 0x81, 0xBC, 0x43, 0x55, 0x31, 0x13, 0x13, 0x54, 0x3F, \r
-0x30, 0xE0, 0x07, 0x91, 0xF3, 0x43, 0x55, 0x08, 0x80, 0x06, 0x7D, 0x40, 0xE4, 0xFF, 0xB1, 0x1B, \r
-0x90, 0x81, 0x77, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x03, 0x43, 0x55, 0x02, \r
-0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x55, 0x04, 0x90, 0x05, 0x27, 0xE5, 0x55, 0xF0, \r
-0x90, 0x81, 0x77, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x90, 0x81, 0x7B, \r
-0xE0, 0x64, 0x02, 0x60, 0x69, 0xE4, 0xFD, 0x7F, 0x02, 0x80, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x44, \r
-0x40, 0xF0, 0x90, 0x81, 0x7B, 0xE0, 0xB4, 0x02, 0x19, 0xF1, 0xBC, 0x12, 0x47, 0xD4, 0xBF, 0x01, \r
-0x09, 0x90, 0x81, 0x82, 0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x03, 0xE4, 0xFD, 0xFF, 0x12, 0x48, 0xD1, \r
-0x80, 0x3C, 0x90, 0x81, 0x83, 0xE0, 0x90, 0x81, 0x7B, 0xF0, 0x80, 0x32, 0x75, 0x55, 0x01, 0x90, \r
-0x05, 0x27, 0xE5, 0x55, 0xF0, 0x90, 0x81, 0x7B, 0xE0, 0xB4, 0x02, 0x06, 0x7D, 0x01, 0x7F, 0x04, \r
-0x80, 0x0B, 0x90, 0x81, 0x7B, 0xE0, 0xB4, 0x08, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x48, 0xD1, \r
-0xF1, 0x9A, 0x90, 0x81, 0x82, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x48, 0xD1, 0x51, 0xF2, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x74, 0x3D, 0x2F, 0xF8, \r
-0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, \r
-0x22, 0x7D, 0x02, 0x7F, 0x02, 0xB1, 0x1B, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x3D, 0x2F, 0xF8, 0xE6, \r
-0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, \r
-0xEE, 0xF0, 0x22, 0xAC, 0x07, 0xEF, 0x54, 0x01, 0xFE, 0x90, 0x82, 0x28, 0xE0, 0x54, 0xFE, 0x4E, \r
-0xF0, 0xEF, 0x64, 0x01, 0x70, 0x20, 0x90, 0x01, 0x53, 0xF0, 0x90, 0x82, 0x2A, 0xE0, 0x60, 0x0F, \r
-0x7D, 0x10, 0x7F, 0x03, 0xF1, 0x85, 0x90, 0x82, 0x2A, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0xB1, \r
-0x6B, 0xB1, 0x11, 0x02, 0x4C, 0x66, 0xB1, 0x6B, 0x02, 0x4C, 0x77, 0x90, 0x01, 0x53, 0x74, 0x03, \r
-0xF0, 0x7D, 0x10, 0xFF, 0x74, 0x45, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, \r
-0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xEF, 0x70, 0x4E, 0x7D, \r
-0x78, 0x7F, 0x02, 0xB1, 0x1B, 0x7D, 0x02, 0x7F, 0x03, 0xB1, 0x1B, 0x7D, 0xC8, 0x7F, 0x02, 0xB1, \r
-0x74, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x81, 0x36, 0xE0, \r
-0x70, 0x15, 0x12, 0x5D, 0x56, 0x12, 0x4F, 0xD1, 0x90, 0x81, 0x7C, 0xE0, 0x54, 0xF7, 0xF0, 0x54, \r
-0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x48, 0xD1, 0x90, 0x81, \r
-0x7C, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, \r
-0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0x91, 0xFC, 0x7D, 0x02, 0x7F, 0x03, \r
-0x91, 0xFC, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x90, 0x81, 0x8B, 0xA3, 0xE0, 0x90, 0x05, \r
-0x58, 0xF0, 0x90, 0x81, 0x36, 0xE0, 0xB4, 0x01, 0x15, 0x90, 0x81, 0x7D, 0xE0, 0x54, 0xFB, 0xF0, \r
-0x90, 0x81, 0x83, 0xE0, 0x20, 0xE2, 0x0E, 0x7D, 0x01, 0x7F, 0x04, 0x02, 0x48, 0xD1, 0x90, 0x81, \r
-0x7D, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x82, 0x28, 0xE0, 0x30, 0xE0, 0x32, 0x90, 0x82, 0x2A, \r
-0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x82, 0x2B, 0xE0, 0x60, 0x05, 0x14, 0xF0, 0x02, 0x4C, 0x66, \r
-0x90, 0x82, 0x29, 0xE0, 0x14, 0x90, 0x82, 0x2B, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, \r
-0xFF, 0xB1, 0x33, 0x7D, 0x02, 0x7F, 0x02, 0x91, 0xFC, 0x7D, 0x01, 0x7F, 0x02, 0x91, 0xFC, 0x22, \r
-0x12, 0x77, 0x48, 0x90, 0x81, 0x86, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, \r
-0x91, 0xFC, 0x80, 0xB2, 0x90, 0x81, 0x77, 0xE0, 0xFF, 0x30, 0xE0, 0x08, 0x90, 0x81, 0x7B, 0xE0, \r
-0x64, 0x02, 0x60, 0x3B, 0x90, 0x81, 0x80, 0xE0, 0x70, 0x04, 0xEF, 0x30, 0xE0, 0x0B, 0x90, 0x81, \r
-0x83, 0xE0, 0x64, 0x02, 0x60, 0x29, 0x12, 0x65, 0x92, 0x90, 0x81, 0x7D, 0xE0, 0x13, 0x13, 0x13, \r
-0x54, 0x1F, 0x30, 0xE0, 0x14, 0x90, 0x81, 0x86, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x0A, 0xF1, \r
-0x76, 0xB1, 0x11, 0x90, 0x81, 0x87, 0xE0, 0x14, 0xF0, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x22, \r
-0x90, 0x81, 0x77, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x81, 0x79, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x80, \r
-0xE0, 0x60, 0x6F, 0x90, 0x81, 0x7C, 0xE0, 0x30, 0xE0, 0x23, 0x90, 0x81, 0x94, 0xE0, 0x04, 0xF0, \r
-0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, \r
-0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x81, 0xB1, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x81, 0x7D, \r
-0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x12, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, \r
-0x0B, 0xB1, 0x11, 0x90, 0x81, 0x86, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x82, 0xFD, 0xE4, \r
-0x75, 0xF0, 0x01, 0x12, 0x44, 0x9F, 0xC3, 0x90, 0x82, 0xFE, 0xE0, 0x94, 0x80, 0x90, 0x82, 0xFD, \r
-0xE0, 0x64, 0x80, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, \r
-0x01, 0xF0, 0xF1, 0x5D, 0x90, 0x82, 0x28, 0xE0, 0x30, 0xE0, 0x11, 0x90, 0x01, 0x3B, 0xE0, 0x30, \r
-0xE4, 0x0A, 0xB1, 0x11, 0x90, 0x82, 0x2A, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x90, 0x82, 0x26, \r
-0xE0, 0x30, 0xE0, 0x11, 0xE4, 0xF5, 0x1D, 0xA3, 0x12, 0x64, 0x2E, 0x90, 0x82, 0x26, 0xE0, 0x44, \r
-0x04, 0xF0, 0x12, 0x78, 0x0F, 0x22, 0xEF, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, \r
-0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x45, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xF1, 0xA3, 0xEF, 0x70, 0x03, 0x12, \r
-0x4C, 0x88, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, \r
-0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0xE4, 0xFD, 0xFF, 0x12, \r
-0x48, 0xC2, 0x7D, 0x04, 0x7F, 0x01, 0x12, 0x4B, 0x09, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, \r
-0x90, 0x81, 0x7B, 0x74, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0x82, 0x3F, 0xF0, 0x90, 0x82, 0x3F, 0xE0, \r
-0x64, 0x01, 0xF0, 0x24, 0xD7, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x57, 0xA3, 0xF0, 0x90, 0x81, 0x80, \r
-0xE0, 0x60, 0x0F, 0x90, 0x81, 0x83, 0xE0, 0xFF, 0x90, 0x81, 0x82, 0xE0, 0x6F, 0x60, 0x03, 0x12, \r
-0x47, 0x9F, 0xC2, 0xAF, 0x91, 0x7F, 0xBF, 0x01, 0x02, 0x11, 0x1C, 0xD2, 0xAF, 0x91, 0x54, 0x12, \r
-0x32, 0x9E, 0xBF, 0x01, 0x02, 0x31, 0x25, 0x12, 0x41, 0x4D, 0x80, 0xC0, 0x90, 0x81, 0x7C, 0xE0, \r
-0x30, 0xE0, 0x18, 0x90, 0x81, 0x77, 0xE0, 0xFF, 0x30, 0xE0, 0x0E, 0xC3, 0x13, 0x30, 0xE0, 0x07, \r
-0x91, 0x55, 0xBF, 0x01, 0x06, 0x80, 0x02, 0x80, 0x00, 0x11, 0x3C, 0x22, 0x90, 0x81, 0x83, 0xE0, \r
-0xFF, 0x60, 0x03, 0xB4, 0x08, 0x0D, 0x91, 0xB0, 0xBF, 0x01, 0x08, 0x11, 0x54, 0x90, 0x01, 0xE5, \r
-0xE0, 0x04, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x11, 0x7E, 0x11, 0x64, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0x91, 0x62, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, \r
-0x32, 0x1E, 0xE4, 0xFF, 0x11, 0xCA, 0x90, 0x81, 0x7D, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x90, 0x81, \r
-0x7D, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x81, 0x8A, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x32, 0x1E, 0x90, \r
-0x81, 0x81, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, \r
-0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, 0x7F, 0x08, \r
-0x12, 0x32, 0x1E, 0x7F, 0x01, 0x11, 0xCA, 0x90, 0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, \r
-0x12, 0x32, 0x1E, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x32, 0xAA, 0x90, 0x82, 0x40, 0xEF, 0xF0, 0xE4, \r
-0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, \r
-0x82, 0x40, 0xE0, 0x6F, 0x60, 0x3E, 0xC3, 0x90, 0x82, 0x42, 0xE0, 0x94, 0x88, 0x90, 0x82, 0x41, \r
-0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x82, 0x41, \r
-0xE4, 0x75, 0xF0, 0x01, 0x12, 0x44, 0x9F, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0xD3, 0x90, \r
-0x82, 0x42, 0xE0, 0x94, 0x32, 0x90, 0x82, 0x41, 0xE0, 0x94, 0x00, 0x40, 0xB7, 0x90, 0x01, 0xC6, \r
-0xE0, 0x30, 0xE0, 0xB0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x2D, 0xA7, 0xE4, \r
-0xF5, 0x51, 0x12, 0x32, 0x9E, 0xEF, 0x60, 0x72, 0x63, 0x51, 0x01, 0xE5, 0x51, 0x24, 0x25, 0x90, \r
-0x01, 0xC4, 0xF0, 0x74, 0x59, 0xA3, 0xF0, 0x90, 0x00, 0x88, 0xE0, 0xF5, 0x4F, 0xF5, 0x50, 0x54, \r
-0x0F, 0x60, 0xDF, 0xE5, 0x4F, 0x30, 0xE0, 0x0B, 0x20, 0xE4, 0x03, 0x12, 0x29, 0xC5, 0x53, 0x50, \r
-0xEE, 0x80, 0x3E, 0xE5, 0x4F, 0x30, 0xE1, 0x16, 0x20, 0xE5, 0x0E, 0x12, 0x11, 0xBD, 0xEF, 0x70, \r
-0x03, 0x43, 0x50, 0x20, 0x90, 0x01, 0x06, 0xE4, 0xF0, 0x53, 0x50, 0xFD, 0x80, 0x23, 0xE5, 0x4F, \r
-0x30, 0xE2, 0x0B, 0x20, 0xE6, 0x03, 0x12, 0x69, 0x86, 0x53, 0x50, 0xFB, 0x80, 0x13, 0xE5, 0x4F, \r
-0x30, 0xE3, 0x0E, 0x20, 0xE7, 0x08, 0x31, 0xAF, 0xEF, 0x70, 0x03, 0x43, 0x50, 0x80, 0x53, 0x50, \r
-0xF7, 0xAD, 0x50, 0x7F, 0x88, 0x12, 0x32, 0x1E, 0x80, 0x88, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x78, \r
-0x10, 0x74, 0x01, 0xF2, 0x90, 0x02, 0x09, 0xE0, 0x78, 0x00, 0xF2, 0x08, 0x74, 0x20, 0xF2, 0x18, \r
-0xE2, 0xFF, 0x30, 0xE0, 0x05, 0x08, 0xE2, 0x24, 0x80, 0xF2, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, \r
-0xF0, 0x78, 0x01, 0xE2, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x78, 0x03, \r
-0xF2, 0x64, 0x04, 0x60, 0x0D, 0xE2, 0xFF, 0x64, 0x08, 0x60, 0x07, 0xEF, 0x64, 0x0C, 0x60, 0x02, \r
-0x81, 0x20, 0xE4, 0x78, 0x02, 0xF2, 0x78, 0x03, 0xE2, 0xFF, 0x18, 0xE2, 0xC3, 0x9F, 0x50, 0x2D, \r
-0xE2, 0xFD, 0x18, 0xE2, 0x2D, 0x90, 0x82, 0x40, 0xF0, 0xE0, 0xFF, 0x24, 0x00, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x04, 0x2D, 0xF8, 0xEE, 0xF2, 0xEF, 0xB4, 0xFF, 0x06, \r
-0x90, 0xFD, 0x10, 0xE0, 0x04, 0xF0, 0x78, 0x02, 0xE2, 0x04, 0xF2, 0x80, 0xC9, 0x78, 0x04, 0xE2, \r
-0x78, 0x12, 0xF2, 0xFF, 0x78, 0x05, 0xE2, 0x78, 0x11, 0xF2, 0x78, 0x06, 0xE2, 0x78, 0x13, 0xF2, \r
-0x78, 0x07, 0xE2, 0x78, 0x14, 0xF2, 0x78, 0x08, 0xE2, 0x78, 0x33, 0xF2, 0x78, 0x09, 0xE2, 0x78, \r
-0x34, 0xF2, 0x78, 0x0A, 0xE2, 0x78, 0x35, 0xF2, 0x78, 0x0B, 0xE2, 0x78, 0x36, 0xF2, 0x78, 0x0C, \r
-0xE2, 0x78, 0x37, 0xF2, 0x78, 0x0D, 0xE2, 0x78, 0x38, 0xF2, 0x78, 0x0E, 0xE2, 0x78, 0x39, 0xF2, \r
-0x78, 0x0F, 0xE2, 0x78, 0x3A, 0xF2, 0xE4, 0x78, 0x15, 0xF2, 0xEF, 0x24, 0xF8, 0x60, 0x76, 0x24, \r
-0xFC, 0x60, 0x6D, 0x24, 0x08, 0x60, 0x02, 0x81, 0x02, 0x78, 0x11, 0xE2, 0xB4, 0x01, 0x05, 0x12, \r
-0x29, 0xC5, 0x81, 0x07, 0x78, 0x11, 0xE2, 0xB4, 0x02, 0x05, 0x12, 0x11, 0xBD, 0x81, 0x07, 0x78, \r
-0x11, 0xE2, 0xB4, 0x03, 0x05, 0x12, 0x69, 0x86, 0x81, 0x07, 0x78, 0x11, 0xE2, 0xB4, 0x10, 0x17, \r
-0x78, 0x14, 0xE2, 0xFE, 0x18, 0xE2, 0xFD, 0xED, 0xFF, 0x78, 0x16, 0xEE, 0xF2, 0xFE, 0x08, 0xEF, \r
-0xF2, 0xFF, 0x12, 0x32, 0xAA, 0x81, 0x07, 0x78, 0x11, 0xE2, 0xB4, 0x11, 0x17, 0x78, 0x14, 0xE2, \r
-0xFE, 0x18, 0xE2, 0xFD, 0xED, 0xFF, 0x78, 0x16, 0xEE, 0xF2, 0xFE, 0x08, 0xEF, 0xF2, 0xFF, 0x12, \r
-0x32, 0x06, 0x81, 0x07, 0x78, 0x11, 0xE2, 0xF4, 0x60, 0x02, 0x81, 0x07, 0x18, 0xF2, 0x81, 0x07, \r
-0x78, 0x15, 0x74, 0x01, 0xF2, 0x78, 0x11, 0xE2, 0x64, 0x07, 0x60, 0x02, 0x61, 0xEB, 0x78, 0x34, \r
-0xE2, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12, 0x20, 0xBB, 0xC0, 0x04, 0xA9, 0x05, 0xAA, \r
-0x06, 0xAB, 0x07, 0x78, 0x33, 0xE2, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xD0, 0x00, 0x12, 0x44, 0xC2, \r
-0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x78, 0x35, 0xE2, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, \r
-0x78, 0x10, 0x12, 0x20, 0xBB, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0xC2, \r
-0x78, 0x18, 0x12, 0x44, 0xF4, 0x78, 0x15, 0xE2, 0x70, 0x02, 0x61, 0xD5, 0x18, 0xE2, 0xFF, 0x18, \r
-0xE2, 0xFD, 0x91, 0x23, 0x78, 0x1C, 0x12, 0x44, 0xF4, 0x78, 0x38, 0xE2, 0xFF, 0xE4, 0xFC, 0xFD, \r
-0xFE, 0x78, 0x08, 0x12, 0x20, 0xBB, 0xC0, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x78, 0x37, \r
-0xE2, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xD0, 0x00, 0x12, 0x44, 0xC2, 0xC0, 0x04, 0xC0, 0x05, 0xC0, \r
-0x06, 0xC0, 0x07, 0x78, 0x39, 0xE2, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x10, 0x12, 0x20, 0xBB, \r
-0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0xC2, 0x78, 0x20, 0x12, 0x44, 0xF4, \r
-0x78, 0x20, 0x12, 0x44, 0xDB, 0x12, 0x20, 0x9B, 0x78, 0x1C, 0x12, 0x44, 0xE7, 0x12, 0x44, 0xB5, \r
-0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x78, 0x18, 0x12, 0x44, 0xDB, 0x78, 0x20, 0x12, \r
-0x44, 0xE7, 0x12, 0x44, 0xB5, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0xC2, \r
-0x78, 0x18, 0x12, 0x44, 0xF4, 0x78, 0x18, 0x12, 0x44, 0xDB, 0x90, 0x82, 0xDD, 0x12, 0x20, 0xCE, \r
-0x78, 0x13, 0xE2, 0xFD, 0x08, 0xE2, 0xFF, 0x91, 0x32, 0x80, 0x1C, 0x78, 0x13, 0xE2, 0xFF, 0x08, \r
-0xE2, 0xFD, 0x78, 0x11, 0xE2, 0xFB, 0x78, 0x15, 0xE2, 0x90, 0x82, 0xA2, 0xF0, 0x12, 0x67, 0xE7, \r
-0x80, 0x05, 0x78, 0x10, 0x74, 0x02, 0xF2, 0x78, 0x10, 0xE2, 0xFF, 0xC3, 0x94, 0x02, 0x50, 0x10, \r
-0xEF, 0x60, 0x0A, 0x78, 0x02, 0xE2, 0xFF, 0x18, 0xE2, 0x2F, 0xF2, 0x21, 0xD1, 0x7F, 0x01, 0x22, \r
-0x7F, 0x00, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x62, 0xE5, 0xD0, 0xD0, 0x92, \r
-0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, 0x07, 0xC0, 0x05, 0x90, 0x82, 0xDD, \r
-0x12, 0x44, 0xCF, 0x90, 0x82, 0xD3, 0x12, 0x20, 0xCE, 0xD0, 0x05, 0xD0, 0x07, 0x91, 0xEC, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0x22, 0x90, 0x81, 0x7A, 0xE0, 0x64, 0x02, 0x7F, 0x01, 0x60, 0x02, 0x7F, \r
-0x00, 0x22, 0x90, 0x01, 0xC4, 0x74, 0x62, 0xF0, 0x74, 0x5C, 0xA3, 0xF0, 0x90, 0x00, 0x90, 0xE0, \r
-0x20, 0xE0, 0xF9, 0x74, 0x62, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x5C, 0xA3, 0xF0, 0x22, 0x7D, \r
-0x02, 0x90, 0x01, 0xC4, 0x74, 0x7F, 0xF0, 0x74, 0x5C, 0xA3, 0xF0, 0x90, 0x82, 0x2C, 0xE0, 0xFF, \r
-0xED, 0xC3, 0x9F, 0x50, 0x18, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x0B, 0x90, \r
-0x01, 0xB8, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xDE, 0x7F, 0x01, 0x22, \r
-0x90, 0x02, 0x87, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x25, 0x90, 0x02, \r
-0x96, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, 0x17, 0x90, 0x02, 0x86, 0xE0, \r
-0x20, 0xE1, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, \r
-0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x82, 0xD1, 0xEF, \r
-0xF0, 0xAB, 0x05, 0x90, 0x82, 0xD7, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x03, 0xE4, \r
-0xFC, 0xFD, 0xFE, 0x78, 0x14, 0x12, 0x20, 0xBB, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, \r
-0x90, 0x82, 0xD3, 0x12, 0x44, 0xCF, 0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x12, 0x44, 0xC2, 0xEC, \r
-0x54, 0x0F, 0xFC, 0x90, 0x82, 0xD7, 0x12, 0x20, 0xCE, 0x90, 0x82, 0xD1, 0xE0, 0x75, 0xF0, 0x08, \r
-0xA4, 0x24, 0x60, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC0, \r
-0x06, 0xC0, 0x07, 0x90, 0x82, 0xD7, 0x12, 0x44, 0xCF, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xCE, 0xD0, \r
-0x07, 0xD0, 0x06, 0x02, 0x2E, 0xA2, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0x01, \r
-0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, \r
-0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2D, 0x5C, 0xEC, 0x54, 0x7F, \r
-0xFC, 0x90, 0x82, 0xEA, 0x12, 0x20, 0xCE, 0x90, 0x82, 0xEA, 0x12, 0x44, 0xCF, 0x90, 0x85, 0xBB, \r
-0x12, 0x20, 0xCE, 0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xDA, \r
-0xCC, 0xC0, 0x00, 0xC0, 0x7F, 0x8C, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x85, 0xBB, 0x12, 0x20, \r
-0xDA, 0x00, 0xC0, 0x00, 0x14, 0x7F, 0x70, 0x7E, 0x0E, 0x12, 0x2E, 0xA2, 0x90, 0x82, 0xDD, 0x12, \r
-0x20, 0xDA, 0x00, 0x03, 0x3E, 0x60, 0xE4, 0xFD, 0xFF, 0x91, 0x32, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
-0x8B, 0x52, 0x8A, 0x53, 0x89, 0x54, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0xFF, 0xF5, 0x56, 0x12, \r
-0x1F, 0xA4, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0xF5, 0x57, \r
-0x80, 0x02, 0x8F, 0x57, 0x85, 0x56, 0x55, 0xE5, 0x55, 0xD3, 0x95, 0x57, 0x50, 0x33, 0xAB, 0x52, \r
-0xAA, 0x53, 0xA9, 0x54, 0x12, 0x1F, 0xA4, 0x54, 0x01, 0xFF, 0x74, 0x36, 0x25, 0x55, 0xF5, 0x82, \r
-0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x36, 0x25, 0x55, 0xF5, 0x82, 0xE4, 0x34, 0x81, \r
-0xF5, 0x83, 0xE0, 0xAF, 0x55, 0x70, 0x04, 0xF1, 0x8D, 0x80, 0x02, 0xF1, 0x8C, 0x05, 0x55, 0x80, \r
-0xC6, 0x12, 0x77, 0xA3, 0xE5, 0x56, 0x70, 0x18, 0x90, 0x81, 0x36, 0xE0, 0x70, 0x12, 0xB1, 0x56, \r
-0x12, 0x4F, 0xD1, 0x90, 0x81, 0x7C, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, \r
-0x22, 0x90, 0x82, 0xA5, 0x12, 0x45, 0x15, 0x90, 0x82, 0xA4, 0xEF, 0xF0, 0x12, 0x45, 0x1E, 0x5E, \r
-0x8A, 0x00, 0x5E, 0x93, 0x01, 0x5E, 0x9B, 0x02, 0x5E, 0xA3, 0x12, 0x5E, 0xAB, 0x14, 0x5E, 0xB3, \r
-0x20, 0x5E, 0xBC, 0x21, 0x5E, 0xC5, 0x23, 0x5E, 0xCD, 0x24, 0x5E, 0xD6, 0x25, 0x5E, 0xDE, 0x26, \r
-0x5E, 0xE7, 0x27, 0x5E, 0xF0, 0xC0, 0x00, 0x00, 0x5E, 0xF9, 0x90, 0x82, 0xA5, 0x12, 0x45, 0x0C, \r
-0x02, 0x6E, 0x92, 0x90, 0x82, 0xA5, 0x12, 0x45, 0x0C, 0xA1, 0xD0, 0x90, 0x82, 0xA5, 0x12, 0x45, \r
-0x0C, 0x80, 0x7A, 0x90, 0x82, 0xA5, 0x12, 0x45, 0x0C, 0x80, 0x5E, 0x90, 0x82, 0xA5, 0x12, 0x45, \r
-0x0C, 0xE1, 0xA7, 0x90, 0x82, 0xA5, 0x12, 0x45, 0x0C, 0x02, 0x6E, 0xEA, 0x90, 0x82, 0xA5, 0x12, \r
-0x45, 0x0C, 0x02, 0x6F, 0xEB, 0x90, 0x82, 0xA5, 0x12, 0x45, 0x0C, 0xE1, 0x8E, 0x90, 0x82, 0xA5, \r
-0x12, 0x45, 0x0C, 0x02, 0x53, 0x14, 0x90, 0x82, 0xA5, 0x12, 0x45, 0x0C, 0xE1, 0x96, 0x90, 0x82, \r
-0xA5, 0x12, 0x45, 0x0C, 0x02, 0x70, 0x31, 0x90, 0x82, 0xA5, 0x12, 0x45, 0x0C, 0x02, 0x70, 0xB4, \r
-0x90, 0x82, 0xA5, 0x12, 0x45, 0x0C, 0x02, 0x70, 0xE8, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, \r
-0x90, 0x82, 0xA4, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0x12, 0x1F, 0xA4, 0xFF, 0x90, 0x81, 0x35, \r
-0xF0, 0xBF, 0x01, 0x08, 0x12, 0x6D, 0xE6, 0xE4, 0x90, 0x81, 0x35, 0xF0, 0x22, 0xD3, 0x10, 0xAF, \r
-0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x52, 0x8A, 0x53, 0x89, 0x54, 0x12, 0x1F, 0xA4, 0xFF, 0x90, 0x81, \r
-0x76, 0xF0, 0xBF, 0x01, 0x0C, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x64, 0x01, 0x60, 0x22, 0x80, \r
-0x1E, 0xAB, 0x52, 0xAA, 0x53, 0xA9, 0x54, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x64, 0x01, 0x60, \r
-0x10, 0x90, 0x81, 0x77, 0xE0, 0x20, 0xE0, 0x07, 0xE4, 0xFF, 0x12, 0x78, 0x77, 0x80, 0x02, 0xF1, \r
-0x66, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x81, 0x76, \r
-0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x04, 0x80, 0x0C, 0x12, 0x47, 0xD4, 0xBF, 0x01, 0x04, 0x7F, 0x01, \r
-0x80, 0x02, 0x7F, 0x02, 0x12, 0x78, 0x77, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x22, 0x22, 0x12, 0x1F, \r
-0xA4, 0x90, 0x81, 0x8A, 0xF0, 0x22, 0x12, 0x1F, 0xA4, 0x90, 0x82, 0x25, 0xF0, 0x22, 0xB1, 0x56, \r
-0x90, 0x81, 0x7A, 0x74, 0x03, 0xF0, 0x22, 0x12, 0x1F, 0xA4, 0x54, 0x01, 0xFF, 0x90, 0x82, 0x2F, \r
-0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0xB1, 0x56, 0xE4, 0xFD, 0xFF, 0x12, 0x48, 0xC2, 0x90, 0x81, \r
-0x7A, 0x74, 0x01, 0xF0, 0x22, 0xF1, 0xB6, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, \r
-0x81, 0x7A, 0xF0, 0x22, 0x12, 0x79, 0xBF, 0x80, 0xEE, 0xF1, 0xDD, 0x80, 0xEA, 0xE4, 0xFD, 0xFF, \r
-0x12, 0x48, 0xC2, 0x90, 0x81, 0x7A, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, \r
-0x12, 0x43, 0x4E, 0x90, 0x82, 0xA3, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x80, 0x3C, 0xE0, 0xFF, 0x60, \r
-0xE9, 0xC2, 0xAF, 0x30, 0xE1, 0x05, 0x54, 0xFD, 0xF0, 0x11, 0xDB, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, \r
-0x80, 0x3C, 0xE0, 0xFF, 0x30, 0xE2, 0x05, 0x54, 0xFB, 0xF0, 0x11, 0x20, 0xD2, 0xAF, 0x80, 0xDA, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x81, 0x32, 0xE0, 0xFE, 0x90, 0x81, \r
-0x31, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, \r
-0x32, 0x90, 0x01, 0xAF, 0xE0, 0x70, 0x13, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x9B, 0xF9, 0x74, \r
-0x80, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x11, 0x78, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, 0x81, 0x31, \r
-0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, \r
-0x81, 0x31, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
-0x82, 0xA4, 0x12, 0x45, 0x15, 0x90, 0x82, 0xFA, 0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, \r
-0x12, 0x1F, 0xFC, 0x7F, 0xAF, 0x7E, 0x01, 0x31, 0x3F, 0xEF, 0x60, 0x3A, 0x90, 0x82, 0xA4, 0x12, \r
+0x12, 0x6F, 0x03, 0xE5, 0x41, 0x30, 0xE4, 0x02, 0xF1, 0x57, 0xE5, 0x41, 0x30, 0xE6, 0x03, 0x12, \r
+0x6F, 0x9C, 0xE5, 0x43, 0x30, 0xE0, 0x03, 0x12, 0x6F, 0xA9, 0xE5, 0x43, 0x30, 0xE1, 0x03, 0x12, \r
+0x70, 0x53, 0xE5, 0x43, 0x30, 0xE2, 0x03, 0x12, 0x70, 0xB7, 0xE5, 0x43, 0x30, 0xE3, 0x02, 0xF1, \r
+0x6A, 0xE5, 0x43, 0x30, 0xE4, 0x03, 0x12, 0x5B, 0x4E, 0xE5, 0x43, 0x30, 0xE5, 0x03, 0x12, 0x54, \r
+0x65, 0xE5, 0x43, 0x30, 0xE6, 0x03, 0x12, 0x58, 0x7E, 0xE5, 0x44, 0x30, 0xE1, 0x03, 0x12, 0x5B, \r
+0x6B, 0x74, 0xB9, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x46, 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, 0x12, 0x60, 0x7D, 0x7F, 0x02, 0x8F, 0x0D, 0x7F, 0x02, \r
+0x71, 0x27, 0x90, 0x80, 0x3C, 0xE0, 0x45, 0x0D, 0xF0, 0x22, 0xF1, 0xF3, 0x70, 0x0B, 0x90, 0x81, \r
+0x49, 0xE0, 0x60, 0x05, 0x12, 0x72, 0xAE, 0xF1, 0x7D, 0x22, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xF5, \r
+0x1D, 0x90, 0x81, 0x87, 0xE0, 0xF5, 0x1E, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8E, 0x19, 0x8F, 0x1A, 0xE5, 0x1E, 0xF1, 0xE3, 0x85, 0x19, 0x83, \r
+0x85, 0x1A, 0x82, 0xF0, 0xE5, 0x1D, 0xF1, 0xE3, 0xFF, 0xE5, 0x1E, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
+0x4F, 0xA3, 0xF0, 0xEB, 0xF1, 0xE3, 0xFF, 0xE5, 0x1D, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x4F, 0xF1, \r
+0xEA, 0xF0, 0xBD, 0x01, 0x0D, 0x85, 0x1A, 0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0x74, 0x03, 0xF0, \r
+0x80, 0x06, 0xF1, 0xEA, 0xA3, 0x74, 0x01, 0xF0, 0xF1, 0xEA, 0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0x54, 0x07, 0xC4, 0x33, 0x54, 0xE0, 0x22, 0x85, 0x1A, 0x82, 0x85, 0x19, 0x83, \r
+0xA3, 0xA3, 0x22, 0xE4, 0xFF, 0x12, 0x52, 0xC9, 0xEF, 0x64, 0x01, 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
+0x47, 0xA3, 0xF0, 0x12, 0x6F, 0x30, 0xE5, 0x49, 0x30, 0xE1, 0x02, 0x11, 0xA4, 0xE5, 0x49, 0x30, \r
+0xE2, 0x03, 0x12, 0x58, 0x68, 0xE5, 0x4A, 0x30, 0xE0, 0x03, 0x12, 0x70, 0xE0, 0xE5, 0x4A, 0x30, \r
+0xE4, 0x03, 0x12, 0x71, 0xDC, 0xE5, 0x4B, 0x30, 0xE1, 0x03, 0x12, 0x72, 0x3A, 0xE5, 0x4B, 0x30, \r
+0xE0, 0x03, 0x12, 0x71, 0xF2, 0xE5, 0x4B, 0x30, 0xE3, 0x03, 0x12, 0x72, 0xDD, 0xE5, 0x4C, 0x30, \r
+0xE1, 0x05, 0x7F, 0x04, 0x12, 0x47, 0x5C, 0xE5, 0x4C, 0x30, 0xE4, 0x02, 0x11, 0xCD, 0xE5, 0x4C, \r
+0x30, 0xE5, 0x03, 0x12, 0x5B, 0xCD, 0xE5, 0x4C, 0x30, 0xE6, 0x03, 0x12, 0x72, 0xDE, 0x74, 0xFC, \r
+0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x47, 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, 0x81, 0x49, 0xE0, 0x60, 0x03, 0x12, 0x57, 0x84, 0x90, 0x81, 0x8D, \r
+0xE0, 0x30, 0xE0, 0x18, 0x54, 0xFB, 0xF0, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x06, 0x7D, 0x04, 0x7F, \r
+0x01, 0xA1, 0xFD, 0x7D, 0x31, 0x7F, 0xFF, 0xB1, 0xA9, 0x12, 0x5D, 0x9F, 0x22, 0x12, 0x75, 0x64, \r
+0x7D, 0x02, 0x7F, 0x02, 0x31, 0x0A, 0x90, 0x81, 0x8F, 0xE0, 0x30, 0xE0, 0x22, 0x12, 0x70, 0xAE, \r
+0x90, 0x81, 0x92, 0xE0, 0x60, 0x04, 0x14, 0xF0, 0xA1, 0xE4, 0x90, 0x81, 0x90, 0xE0, 0x14, 0x90, \r
+0x81, 0x92, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0x31, 0x16, 0x31, 0x00, 0x22, \r
+0x7D, 0x02, 0x7F, 0x02, 0x31, 0x0A, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x3D, 0x2F, 0xF8, 0xE6, 0x4D, \r
+0xFE, 0xF6, 0x74, 0x30, 0x80, 0x5B, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xAC, 0x07, 0xEF, \r
+0x54, 0x01, 0xFE, 0x12, 0x76, 0x57, 0xF0, 0xEF, 0x64, 0x01, 0x70, 0x20, 0x90, 0x01, 0x53, 0xF0, \r
+0x90, 0x81, 0x91, 0xE0, 0x60, 0x0B, 0x7D, 0x10, 0x7F, 0x03, 0x31, 0x67, 0x12, 0x70, 0xAE, 0x80, \r
+0x13, 0x31, 0x59, 0x12, 0x73, 0x3C, 0x31, 0x7C, 0xB1, 0xE4, 0x80, 0x08, 0x31, 0x59, 0x31, 0x67, \r
+0x31, 0x00, 0xF1, 0x35, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x53, 0x74, 0x03, 0xF0, 0x7D, \r
+0x10, 0xFF, 0x22, 0x7D, 0x03, 0x7F, 0x02, 0x74, 0x45, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, \r
+0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x7D, 0x02, 0x7F, 0x02, \r
+0x31, 0x86, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x3D, 0x12, 0x73, 0x43, 0xFE, 0xF6, 0x74, 0x30, 0x80, \r
+0xE0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x76, 0x50, 0x90, 0x05, 0x27, 0xE0, 0xF5, \r
+0x55, 0x12, 0x76, 0x27, 0x90, 0x81, 0x40, 0x12, 0x75, 0xF9, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, \r
+0x12, 0x76, 0x66, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0x12, 0x76, 0x07, 0x54, 0x10, 0xFD, \r
+0xEF, 0x54, 0xEF, 0x12, 0x76, 0x66, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0x12, 0x76, 0x07, \r
+0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0x90, 0x81, 0x40, 0xF0, 0xEE, 0xC3, 0x13, 0x20, 0xE0, \r
+0x02, 0x41, 0x74, 0xE0, 0x30, 0xE0, 0x78, 0x31, 0x63, 0x75, 0x55, 0x21, 0x90, 0x81, 0x40, 0xE0, \r
+0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0xF1, 0xDF, 0x43, 0x55, 0x08, 0x80, 0x0C, 0xE4, 0x90, \r
+0x81, 0x41, 0xF0, 0xA3, 0xF0, 0x7D, 0x40, 0xFF, 0x31, 0x86, 0x90, 0x81, 0x40, 0x12, 0x70, 0xA6, \r
+0x30, 0xE0, 0x03, 0x43, 0x55, 0x12, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x55, 0x14, \r
+0x90, 0x81, 0x40, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x43, 0x55, 0x80, 0x12, 0x5F, \r
+0xD4, 0x20, 0xE0, 0x03, 0x43, 0x55, 0x40, 0x71, 0xB3, 0x90, 0x81, 0x43, 0xE0, 0x70, 0x05, 0x7F, \r
+0x01, 0x12, 0x5C, 0x80, 0x12, 0x5B, 0xC2, 0x30, 0xE0, 0x04, 0x7F, 0x04, 0x80, 0x0C, 0x12, 0x5B, \r
+0x42, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0x5C, 0x80, 0x41, 0xEC, 0x75, \r
+0x55, 0x01, 0x71, 0xB3, 0x90, 0x81, 0x43, 0xE0, 0x64, 0x04, 0x60, 0x02, 0x61, 0x1F, 0xFF, 0x12, \r
+0x5C, 0x80, 0x61, 0x1F, 0x90, 0x81, 0x40, 0xE0, 0x30, 0xE0, 0x79, 0x31, 0x63, 0x43, 0x55, 0x31, \r
+0x90, 0x81, 0x40, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0xF1, 0xDF, 0x43, 0x55, 0x08, \r
+0x80, 0x06, 0x7D, 0x40, 0xE4, 0xFF, 0x31, 0x86, 0x90, 0x81, 0x40, 0x12, 0x70, 0xA6, 0x30, 0xE0, \r
+0x03, 0x43, 0x55, 0x02, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x55, 0x04, 0x71, 0xB3, \r
+0x12, 0x5B, 0xC2, 0x30, 0xE0, 0x0B, 0x12, 0x5B, 0xBB, 0x60, 0x31, 0xE4, 0xFD, 0x7F, 0x02, 0x80, \r
+0x1F, 0x12, 0x5E, 0x88, 0x90, 0x81, 0x44, 0xE0, 0xB4, 0x02, 0x19, 0x12, 0x74, 0xBF, 0x12, 0x5B, \r
+0x42, 0xBF, 0x01, 0x09, 0x90, 0x81, 0x4B, 0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x03, 0xE4, 0xFD, 0xFF, \r
+0x71, 0xBE, 0x80, 0x08, 0x90, 0x81, 0x4C, 0xE0, 0x90, 0x81, 0x44, 0xF0, 0x90, 0x05, 0x40, 0x74, \r
+0x22, 0xF0, 0x80, 0x2B, 0x75, 0x55, 0x01, 0x71, 0xB3, 0x90, 0x81, 0x44, 0xE0, 0xB4, 0x02, 0x06, \r
+0x7D, 0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, 0x81, 0x44, 0xE0, 0xB4, 0x08, 0x06, 0x7D, 0x01, 0x7F, \r
+0x0C, 0x71, 0xBE, 0x12, 0x6E, 0xF0, 0x90, 0x81, 0x4B, 0x12, 0x58, 0x61, 0x12, 0x52, 0x0E, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0x90, 0x82, 0x0E, 0x12, 0x45, 0x15, 0x90, 0x82, 0x0D, 0xEF, 0xF0, 0x12, \r
+0x45, 0x1E, 0x4B, 0x5D, 0x00, 0x4B, 0x62, 0x01, 0x4B, 0x67, 0x02, 0x4B, 0x6C, 0x12, 0x4B, 0x71, \r
+0x14, 0x4B, 0x76, 0x20, 0x4B, 0x7B, 0x21, 0x4B, 0x80, 0x23, 0x4B, 0x85, 0x24, 0x4B, 0x89, 0x25, \r
+0x4B, 0x8E, 0x26, 0x4B, 0x93, 0x27, 0x4B, 0x98, 0xC0, 0x00, 0x00, 0x4B, 0x9D, 0x71, 0xAD, 0x02, \r
+0x54, 0xAE, 0x71, 0xAD, 0x02, 0x52, 0xEC, 0x71, 0xAD, 0x02, 0x53, 0x4E, 0x71, 0xAD, 0x02, 0x65, \r
+0x15, 0x71, 0xAD, 0x02, 0x6D, 0x22, 0x71, 0xAD, 0x02, 0x53, 0x8D, 0x71, 0xAD, 0x02, 0x54, 0xF2, \r
+0x71, 0xAD, 0x02, 0x6D, 0x31, 0x71, 0xAD, 0x21, 0x91, 0x71, 0xAD, 0x02, 0x6D, 0x39, 0x71, 0xAD, \r
+0x02, 0x56, 0x4C, 0x71, 0xAD, 0x02, 0x55, 0x31, 0x71, 0xAD, 0x02, 0x6D, 0x41, 0x90, 0x01, 0xC0, \r
+0xE0, 0x44, 0x01, 0xF0, 0x90, 0x82, 0x0D, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0x90, 0x82, 0x0E, \r
+0x02, 0x45, 0x0C, 0x90, 0x05, 0x27, 0xE5, 0x55, 0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x82, 0x6F, 0xED, 0xF0, 0x90, 0x81, 0x45, 0xE0, 0xFE, 0xC4, \r
+0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xA1, 0x07, 0xEE, 0x12, 0x73, 0x0D, 0x30, 0xE0, 0x02, \r
+0xA1, 0x07, 0x90, 0x81, 0x4C, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xA1, 0x07, 0xEF, 0x70, 0x02, 0x81, \r
+0x7A, 0x24, 0xFE, 0x70, 0x02, 0x81, 0xB3, 0x24, 0xFE, 0x60, 0x47, 0x24, 0xFC, 0x70, 0x02, 0x81, \r
+0xEE, 0x24, 0xFC, 0x60, 0x02, 0xA1, 0x00, 0xEE, 0xB4, 0x0E, 0x02, 0xB1, 0x57, 0x90, 0x81, 0x4C, \r
+0xE0, 0x70, 0x04, 0x7F, 0x01, 0xD1, 0x65, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x06, 0x02, 0xB1, 0x7B, \r
+0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x04, 0x0D, 0x90, 0x82, 0x6F, 0xE0, 0xFF, 0x60, 0x04, 0xD1, 0xA4, \r
+0x80, 0x02, 0xF1, 0xA2, 0x90, 0x81, 0x4C, 0xE0, 0x64, 0x08, 0x60, 0x02, 0xA1, 0x00, 0xF1, 0x35, \r
+0xA1, 0x00, 0x90, 0x81, 0x4C, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0xD1, 0x65, 0x90, 0x81, 0x4C, 0xE0, \r
+0xB4, 0x06, 0x02, 0xB1, 0x7B, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x0E, 0x07, 0xB1, 0x0C, 0xBF, 0x01, \r
+0x02, 0xB1, 0x57, 0x90, 0x81, 0x4C, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0xA1, 0x00, 0xB1, 0x0C, 0xEF, \r
+0x64, 0x01, 0x60, 0x02, 0xA1, 0x00, 0xB1, 0xB4, 0xA1, 0x00, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x0E, \r
+0x07, 0xB1, 0x0C, 0xBF, 0x01, 0x02, 0xB1, 0x57, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x06, 0x02, 0xB1, \r
+0x7B, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x0C, 0x07, 0xB1, 0x0C, 0xBF, 0x01, 0x02, 0xB1, 0xB4, 0x90, \r
+0x81, 0x4C, 0xE0, 0x64, 0x04, 0x70, 0x59, 0x12, 0x6E, 0x1C, 0xEF, 0x64, 0x01, 0x70, 0x51, 0xD1, \r
+0x7D, 0x80, 0x4D, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x0E, 0x07, 0xB1, 0x0C, 0xBF, 0x01, 0x02, 0xB1, \r
+0x57, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x06, 0x02, 0xB1, 0x7B, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x0C, \r
+0x07, 0xB1, 0x0C, 0xBF, 0x01, 0x02, 0xB1, 0xB4, 0x90, 0x81, 0x4C, 0xE0, 0x70, 0x04, 0x7F, 0x01, \r
+0xD1, 0x65, 0x90, 0x81, 0x4C, 0xE0, 0xB4, 0x04, 0x17, 0x12, 0x74, 0xA7, 0x80, 0x12, 0x90, 0x81, \r
+0x4C, 0xE0, 0xB4, 0x0C, 0x0B, 0x90, 0x81, 0x46, 0x12, 0x72, 0xA7, 0x30, 0xE0, 0x02, 0xB1, 0xE4, \r
+0x90, 0x81, 0x4C, 0x12, 0x76, 0x0E, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x6E, 0xD7, 0xEF, \r
+0x64, 0x01, 0x60, 0x05, 0x12, 0x6E, 0x8D, 0x80, 0x35, 0x12, 0x73, 0xAC, 0x30, 0xE0, 0x08, 0x90, \r
+0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x27, 0x90, 0x81, 0x4B, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x05, \r
+0x12, 0x6E, 0x15, 0x80, 0x19, 0x90, 0x81, 0x8D, 0xE0, 0x30, 0xE0, 0x0F, 0x13, 0x13, 0x54, 0x3F, \r
+0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x11, 0xF0, 0x80, 0x03, 0x02, 0x6E, 0xCF, 0x90, 0x01, \r
+0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x81, 0x46, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, \r
+0xB1, 0xF9, 0x80, 0x12, 0x12, 0x76, 0x2F, 0xF1, 0xD8, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x80, 0xF0, \r
+0x90, 0x81, 0x44, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x80, 0x2E, 0x90, 0x81, 0x46, 0xE0, 0x90, \r
+0x06, 0x04, 0x20, 0xE0, 0x07, 0xE0, 0x44, 0x40, 0xF1, 0xD8, 0x80, 0x0F, 0xB1, 0xF5, 0x90, 0x05, \r
+0x27, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x81, 0x44, 0x74, 0x0C, 0xF0, 0xE4, 0xFD, 0xFF, 0x80, 0x09, \r
+0xE4, 0xFD, 0x7F, 0x0C, 0x71, 0xBE, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, 0xF0, 0x90, 0x80, \r
+0x40, 0xED, 0xF0, 0x22, 0x12, 0x47, 0xF3, 0x70, 0x2A, 0x90, 0x81, 0x46, 0xE0, 0x54, 0xFD, 0xF0, \r
+0x7D, 0x2C, 0x7F, 0x6F, 0xB1, 0xA9, 0x7D, 0x08, 0x7F, 0x01, 0xD1, 0xDF, 0xBF, 0x01, 0x0F, 0x90, \r
+0x81, 0x45, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0xD1, 0x9C, 0x74, 0x0E, 0xF0, 0x22, 0x12, 0x73, \r
+0x15, 0x04, 0xF0, 0x22, 0x7D, 0x2F, 0x7F, 0xFF, 0xB1, 0xA9, 0x12, 0x5D, 0x9F, 0x7D, 0x08, 0xD1, \r
+0x9C, 0x74, 0x08, 0xF0, 0x22, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0xAC, 0x07, 0xEF, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, \r
+0x1A, 0xED, 0x54, 0x01, 0xFE, 0x90, 0x81, 0x45, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0x80, 0x0C, 0x90, \r
+0x81, 0x4C, 0xED, 0xF0, 0x80, 0x05, 0x90, 0x81, 0x4B, 0xED, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, \r
+0xE4, 0x2E, 0xEC, 0x14, 0x60, 0x07, 0x14, 0x60, 0x1D, 0x24, 0x02, 0x70, 0x23, 0x90, 0x81, 0x45, \r
+0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x90, 0x81, 0x4C, 0xE0, 0x54, 0x7F, \r
+0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, 0x81, 0x4B, 0xE0, 0xFD, 0x7F, 0x89, 0x12, 0x32, 0x1E, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x82, 0x6E, 0xEF, 0xF0, 0x12, 0x55, 0xE5, 0x90, 0x82, 0x6E, \r
+0xE0, 0x60, 0x02, 0xF1, 0x43, 0x7D, 0x04, 0xD1, 0x9C, 0x74, 0x04, 0xF0, 0x22, 0x7D, 0x2D, 0x12, \r
+0x5E, 0x07, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x31, 0x0A, 0x12, 0x5D, 0x9F, \r
+0xE4, 0xFD, 0x7F, 0x01, 0xB1, 0xFD, 0xE4, 0x90, 0x81, 0x44, 0xF0, 0x22, 0x7F, 0x01, 0xB1, 0xFD, \r
+0x90, 0x81, 0x44, 0x22, 0xEF, 0x60, 0x33, 0x12, 0x47, 0xF3, 0x70, 0x2E, 0x90, 0x81, 0x46, 0xE0, \r
+0x54, 0xFE, 0xF0, 0x7D, 0x2B, 0x7F, 0x0F, 0xB1, 0xA9, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, \r
+0xD1, 0xDB, 0xBF, 0x01, 0x0F, 0x90, 0x81, 0x45, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0xD1, 0x9C, \r
+0x74, 0x06, 0xF0, 0x22, 0x12, 0x73, 0x15, 0x74, 0x08, 0xF0, 0x22, 0x7D, 0x08, 0xE4, 0xFF, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x82, 0x4A, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x80, \r
+0x3E, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x27, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x82, \r
+0x4E, 0xF0, 0x7D, 0x26, 0x12, 0x5E, 0x07, 0xEF, 0x64, 0x01, 0x70, 0x03, 0x12, 0x5A, 0x71, 0x90, \r
+0x82, 0x4E, 0xE0, 0xFF, 0x7D, 0x27, 0xB1, 0xA9, 0x90, 0x82, 0x4A, 0xE0, 0xFF, 0xF1, 0x48, 0x80, \r
+0x0A, 0x90, 0x82, 0x4A, 0xE0, 0xFF, 0xF1, 0x48, 0x12, 0x5A, 0x71, 0x12, 0x5B, 0x1A, 0x7F, 0x01, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF1, 0x40, 0xB1, 0xF9, 0x90, 0x81, 0x44, 0x74, 0x0C, 0xF0, 0x22, \r
+0x12, 0x55, 0xE5, 0xE4, 0xFD, 0xFF, 0xA1, 0xA9, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
+0x82, 0x71, 0xEF, 0xF0, 0x90, 0x80, 0x44, 0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x3D, \r
+0x90, 0x81, 0x4C, 0xE0, 0x64, 0x0E, 0x70, 0x14, 0x90, 0x82, 0x71, 0xE0, 0x70, 0x2F, 0x90, 0x81, \r
+0x45, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0xB1, 0xF5, 0x80, 0x1F, 0x90, 0x81, 0x4C, 0xE0, \r
+0x64, 0x06, 0x70, 0x19, 0x90, 0x82, 0x71, 0xE0, 0x60, 0x13, 0x90, 0x81, 0x45, 0xE0, 0x54, 0xBF, \r
+0xF0, 0x12, 0x76, 0x2F, 0xF0, 0x90, 0x81, 0x4C, 0x74, 0x04, 0xF0, 0xF1, 0x43, 0xD0, 0xD0, 0x92, \r
+0xAF, 0x22, 0x12, 0x74, 0x65, 0xF1, 0x43, 0x7D, 0x0C, 0x7F, 0x01, 0xA1, 0xFD, 0x12, 0x73, 0x77, \r
+0x90, 0x81, 0x4C, 0xE0, 0x64, 0x0C, 0x60, 0x04, 0xB1, 0xA0, 0xD1, 0xDB, 0x22, 0x90, 0x81, 0x49, \r
+0xE0, 0x64, 0x01, 0x70, 0x12, 0x12, 0x54, 0x5E, 0x60, 0x05, 0xB1, 0xA0, 0x02, 0x73, 0x77, 0x90, \r
+0x81, 0x4C, 0xE0, 0x70, 0x02, 0x71, 0xBA, 0x22, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0xA1, 0xFD, 0x90, \r
+0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x21, 0x0A, 0x7D, 0x1F, 0x7F, 0x6F, 0xB1, 0xA9, \r
+0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x81, 0x43, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x01, \r
+0xC8, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xA0, 0x7F, 0xFF, 0xFE, \r
+0x12, 0x2B, 0x27, 0xBF, 0x01, 0x0A, 0x90, 0x81, 0xA0, 0xE0, 0x64, 0x03, 0x60, 0x04, 0x01, 0xAF, \r
+0x01, 0xB7, 0xE4, 0x90, 0x81, 0xA5, 0xF0, 0x90, 0x81, 0xA5, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, \r
+0x02, 0x01, 0xF2, 0xC3, 0x74, 0xFE, 0x9F, 0xFF, 0xE4, 0x94, 0x00, 0xFE, 0x7B, 0x01, 0x7A, 0x81, \r
+0x79, 0xA1, 0x12, 0x2B, 0x27, 0xEF, 0x64, 0x01, 0x70, 0x6D, 0x90, 0x81, 0xA1, 0xE0, 0xFF, 0x54, \r
+0xC0, 0xFE, 0x60, 0x05, 0xEF, 0x54, 0x0C, 0x70, 0x16, 0x90, 0x81, 0xA1, 0xE0, 0xFF, 0x54, 0x30, \r
+0x60, 0x5D, 0xEF, 0x54, 0x03, 0x60, 0x58, 0x90, 0x81, 0xA2, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, \r
+0x90, 0x81, 0xA2, 0xF0, 0x90, 0x81, 0xA2, 0xE0, 0x90, 0x81, 0xA1, 0x70, 0x16, 0xE0, 0xFF, 0xEE, \r
+0x13, 0x13, 0x54, 0x3F, 0x90, 0x81, 0xA3, 0xF0, 0xEF, 0x54, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0xA3, \r
+0xF0, 0x80, 0x0D, 0xE0, 0xFE, 0x54, 0x30, 0x90, 0x81, 0xA3, 0xF0, 0xEE, 0x54, 0x03, 0xA3, 0xF0, \r
+0x90, 0x81, 0xA4, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x81, 0xA3, 0xE0, 0x64, 0x30, 0x60, 0x43, 0x90, \r
+0x81, 0xA7, 0x74, 0x02, 0xF0, 0x80, 0x10, 0x90, 0x81, 0xA7, 0x74, 0x01, 0xF0, 0x80, 0x08, 0x90, \r
+0x81, 0xA5, 0xE0, 0x04, 0xF0, 0x01, 0x27, 0x90, 0x01, 0xC4, 0x74, 0xFE, 0xF0, 0x74, 0x4F, 0xA3, \r
+0xF0, 0x90, 0x81, 0xA7, 0xE0, 0x90, 0x01, 0xC8, 0xF0, 0x90, 0x81, 0xA1, 0xE0, 0x90, 0x01, 0xC9, \r
+0xF0, 0x90, 0x81, 0xA2, 0xE0, 0x90, 0x01, 0xCA, 0xF0, 0xE4, 0xFD, 0x7F, 0x1F, 0x12, 0x32, 0x1E, \r
+0x80, 0xD5, 0x22, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x32, 0x1E, 0x90, \r
+0xFD, 0x00, 0xE0, 0x54, 0xBF, 0xF0, 0x12, 0x4F, 0xFE, 0x12, 0x6D, 0xA0, 0x12, 0x32, 0x77, 0x12, \r
+0x6D, 0xAD, 0x31, 0x4A, 0x7F, 0x01, 0x12, 0x42, 0x15, 0x90, 0x81, 0x93, 0x74, 0x02, 0xF0, 0xFF, \r
+0x12, 0x42, 0x15, 0x90, 0x81, 0x93, 0xE0, 0x04, 0xF0, 0x51, 0x2C, 0x31, 0x5B, 0x90, 0x00, 0x80, \r
+0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x32, 0x1E, 0x75, 0x20, 0xFF, 0x12, 0x58, 0x06, 0x12, \r
+0x64, 0x2A, 0x12, 0x6E, 0xF9, 0xE4, 0xFF, 0x02, 0x42, 0x9E, 0xE4, 0x90, 0x80, 0x3C, 0x31, 0x53, \r
+0xA3, 0xF0, 0x22, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x31, 0x6E, 0x12, 0x6D, 0x4F, \r
+0x51, 0x0E, 0x12, 0x73, 0xB6, 0x12, 0x75, 0xC3, 0x12, 0x74, 0x6D, 0x02, 0x45, 0x44, 0xE4, 0xFD, \r
+0xFF, 0x12, 0x76, 0x1B, 0xED, 0x70, 0x12, 0x31, 0xAD, 0xC0, 0x83, 0xC0, 0x82, 0x31, 0xA5, 0x80, \r
+0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5E, 0x80, 0x0F, 0x31, 0xAD, 0xC0, 0x83, 0xC0, 0x82, 0x31, \r
+0xA5, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x31, 0xB8, 0x90, \r
+0x81, 0x3E, 0xEF, 0xF0, 0x22, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x22, 0x74, 0x36, 0x2E, \r
+0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7D, \r
+0x08, 0xED, 0x14, 0xF9, 0x24, 0x36, 0x31, 0xB0, 0xE0, 0x60, 0x3A, 0x7C, 0x08, 0xEC, 0x14, 0x90, \r
+0x82, 0x6B, 0xF0, 0x74, 0x36, 0x29, 0x31, 0xB0, 0xE0, 0xFB, 0x7A, 0x00, 0x90, 0x82, 0x6B, 0x12, \r
+0x63, 0xD4, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5A, 0xFE, 0xEF, \r
+0x5B, 0x4E, 0x60, 0x0F, 0xE9, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, 0x82, 0x6B, 0xE0, 0x2F, 0x04, \r
+0xFF, 0x80, 0x06, 0xDC, 0xC8, 0xDD, 0xBA, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7E, 0x00, \r
+0x7F, 0x01, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0x40, 0x12, 0x45, 0x44, 0x90, 0x81, 0x40, \r
+0xE0, 0x54, 0xFD, 0xF0, 0xE4, 0x31, 0x54, 0xA3, 0x74, 0x0C, 0xF0, 0x22, 0xF1, 0xEC, 0x90, 0x80, \r
+0x41, 0xEF, 0xF0, 0x51, 0x4C, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x12, 0xE0, 0x54, \r
+0xC7, 0x44, 0x20, 0xFD, 0x7F, 0x12, 0x12, 0x32, 0x1E, 0x02, 0x2D, 0xA7, 0x51, 0x7C, 0x51, 0xA2, \r
+0x12, 0x6D, 0x5F, 0x12, 0x6D, 0x7E, 0xE4, 0xF5, 0x35, 0xF5, 0x36, 0xF5, 0x37, 0x75, 0x38, 0x80, \r
+0xAD, 0x35, 0x7F, 0x50, 0x12, 0x32, 0x1E, 0xAD, 0x36, 0x7F, 0x51, 0x12, 0x32, 0x1E, 0xAD, 0x37, \r
+0x7F, 0x52, 0x12, 0x32, 0x1E, 0xAD, 0x38, 0x7F, 0x53, 0x02, 0x32, 0x1E, 0x90, 0x01, 0x30, 0xE4, \r
+0x31, 0x53, 0x90, 0x01, 0x38, 0x31, 0x53, 0xFD, 0x7F, 0x50, 0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, \r
+0x51, 0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x53, 0x02, \r
+0x32, 0x1E, 0x90, 0x01, 0x34, 0x74, 0xFF, 0x31, 0x53, 0x90, 0x01, 0x3C, 0x31, 0x53, 0xFD, 0x7F, \r
+0x54, 0x12, 0x32, 0x1E, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x32, 0x1E, 0x7D, 0xFF, 0x7F, 0x56, 0x12, \r
+0x32, 0x1E, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x32, 0x1E, 0x12, 0x76, 0x1B, 0x31, 0xAD, 0xE0, 0xFD, \r
+0x7C, 0x00, 0x12, 0x63, 0xD6, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, \r
+0x5C, 0xFE, 0xEF, 0x5D, 0x4E, 0x7F, 0x00, 0x60, 0x02, 0x7F, 0x01, 0x22, 0x12, 0x76, 0x50, 0x71, \r
+0x48, 0xFF, 0xF5, 0x56, 0x12, 0x1F, 0xA4, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x06, 0x91, 0xA8, 0xF5, \r
+0x57, 0x80, 0x02, 0x8F, 0x57, 0x85, 0x56, 0x55, 0xE5, 0x55, 0xD3, 0x95, 0x57, 0x50, 0x25, 0xAB, \r
+0x52, 0xAA, 0x53, 0xA9, 0x54, 0x12, 0x1F, 0xA4, 0x54, 0x01, 0xFD, 0xAF, 0x55, 0x31, 0x71, 0xAF, \r
+0x55, 0x51, 0xC9, 0xEF, 0xAF, 0x55, 0x70, 0x05, 0x12, 0x6D, 0x5E, 0x80, 0x03, 0x12, 0x6D, 0x5D, \r
+0x05, 0x55, 0x80, 0xD4, 0xE5, 0x56, 0x70, 0x0E, 0xFF, 0x51, 0xC9, 0xEF, 0x70, 0x08, 0xB1, 0xD8, \r
+0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0xF0, 0x90, 0x00, 0x01, 0x02, 0x1F, 0xBD, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x76, 0x50, 0x12, 0x1F, 0xA4, 0xFF, 0x90, 0x81, 0x3F, 0xF0, \r
+0xBF, 0x01, 0x08, 0x71, 0x48, 0x64, 0x01, 0x60, 0x1F, 0x80, 0x1A, 0xAB, 0x52, 0xAA, 0x53, 0xA9, \r
+0x54, 0x71, 0x48, 0x64, 0x01, 0x60, 0x11, 0x90, 0x81, 0x40, 0xE0, 0x20, 0xE0, 0x07, 0xE4, 0xFF, \r
+0x12, 0x5C, 0x80, 0x80, 0x03, 0x12, 0x5C, 0x5C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x82, 0x11, \r
+0x12, 0x45, 0x15, 0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x7F, 0x90, 0x81, 0x49, 0xF0, 0xEF, 0x12, 0x73, \r
+0x0D, 0xA3, 0x71, 0x47, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x81, 0x47, 0xE0, 0x54, \r
+0xF0, 0x4E, 0xB1, 0x2A, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0x81, 0x45, 0xE0, 0x54, 0xFD, 0x4E, \r
+0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x91, 0x5E, 0x4F, 0x91, 0xA7, 0x90, 0x81, 0x48, \r
+0x91, 0x50, 0x30, 0xE0, 0x52, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x81, 0x5C, \r
+0x50, 0x04, 0xEF, 0xF0, 0x80, 0x2A, 0x74, 0x03, 0xF0, 0x91, 0x4A, 0xE9, 0x24, 0x06, 0xF9, 0xE4, \r
+0x3A, 0xFA, 0x12, 0x1F, 0xA4, 0xFF, 0x74, 0x03, 0x24, 0xFD, 0xFE, 0xEF, 0xC4, 0x54, 0x0F, 0xFD, \r
+0xEF, 0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F, 0xFE, 0xC4, 0x54, 0xF0, 0x4F, 0x12, 0x1F, 0xEA, \r
+0x91, 0x4A, 0x91, 0x51, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x81, 0x51, 0x50, 0x05, \r
+0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x91, 0x4A, 0x90, 0x00, 0x04, 0x12, 0x1F, 0xBD, 0xFD, \r
+0x7F, 0x02, 0x12, 0x4D, 0xFD, 0x91, 0x4A, 0x91, 0x7F, 0x12, 0x73, 0x15, 0xF0, 0x90, 0x81, 0x49, \r
+0x12, 0x76, 0x0E, 0x91, 0x5D, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0x82, 0x11, 0x02, 0x45, 0x0C, \r
+0xF0, 0x90, 0x00, 0x06, 0x02, 0x1F, 0xBD, 0x90, 0x81, 0x4D, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x81, \r
+0x47, 0xE0, 0x54, 0x0F, 0x22, 0xE4, 0xFF, 0x51, 0xC9, 0xBF, 0x01, 0x12, 0x90, 0x81, 0x49, 0xE0, \r
+0x60, 0x0C, 0x91, 0x5E, 0x64, 0x02, 0x60, 0x03, 0x02, 0x59, 0x4D, 0x12, 0x4F, 0xAD, 0x22, 0x90, \r
+0x82, 0x14, 0x12, 0x45, 0x15, 0x12, 0x73, 0x4B, 0x90, 0x81, 0x49, 0xE0, 0xFF, 0xB1, 0x5E, 0x90, \r
+0x81, 0x49, 0xE0, 0x60, 0x11, 0x90, 0x82, 0x14, 0x12, 0x45, 0x0C, 0x71, 0x48, 0x54, 0x0F, 0xFF, \r
+0x91, 0xA8, 0xFD, 0x12, 0x74, 0x7A, 0x22, 0xF0, 0x90, 0x00, 0x02, 0x02, 0x1F, 0xBD, 0x90, 0x02, \r
+0x09, 0xE0, 0xF5, 0x52, 0x12, 0x1F, 0xA4, 0x25, 0x52, 0x90, 0x80, 0x42, 0x71, 0x47, 0x25, 0x52, \r
+0x90, 0x80, 0x43, 0x91, 0xA7, 0x25, 0x52, 0x90, 0x80, 0x44, 0xB1, 0x2A, 0x25, 0x52, 0x90, 0x80, \r
+0x45, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0xBD, 0x25, 0x52, 0x90, 0x80, 0x46, 0xF0, 0x90, 0x00, \r
+0x05, 0x12, 0x1F, 0xBD, 0x25, 0x52, 0x90, 0x80, 0x47, 0x91, 0x50, 0x25, 0x52, 0x90, 0x80, 0x48, \r
+0xF0, 0x22, 0x91, 0xA8, 0xFF, 0x30, 0xE0, 0x1C, 0x12, 0x1F, 0xA4, 0x90, 0x81, 0x86, 0x71, 0x47, \r
+0x90, 0x81, 0x87, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xB1, 0x2A, 0x90, \r
+0x81, 0x89, 0xF0, 0x22, 0x90, 0x81, 0x86, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xA3, 0xE0, \r
+0x54, 0x01, 0x44, 0x1E, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0xF0, 0x90, 0x00, 0x03, 0x02, 0x1F, \r
+0xBD, 0x12, 0x76, 0x27, 0x12, 0x76, 0x57, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, \r
+0x4F, 0x71, 0x47, 0x90, 0x81, 0x90, 0x91, 0xA7, 0x90, 0x81, 0x91, 0xF0, 0x90, 0x81, 0x90, 0xE0, \r
+0x90, 0x81, 0x92, 0xF0, 0x90, 0x81, 0x8F, 0xE0, 0x54, 0x01, 0xFF, 0x02, 0x49, 0x16, 0xEF, 0x70, \r
+0x3B, 0x7D, 0x78, 0x7F, 0x02, 0x12, 0x49, 0x86, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x49, 0x86, 0x7D, \r
+0xC8, 0x7F, 0x02, 0x12, 0x73, 0x3C, 0x12, 0x72, 0xAE, 0xF0, 0xE4, 0xFF, 0x51, 0xC9, 0xEF, 0x70, \r
+0x0A, 0xB1, 0xD8, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, \r
+0x4B, 0xBE, 0xB1, 0xDD, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, \r
+0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0x12, 0x49, 0x0A, 0x7D, 0x02, 0x7F, 0x03, \r
+0x12, 0x49, 0x0A, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0x12, 0x76, 0x3A, 0xE4, 0xFF, 0x51, 0xC9, \r
+0xBF, 0x01, 0x11, 0xF1, 0xDB, 0xF0, 0x90, 0x81, 0x4C, 0xE0, 0x20, 0xE2, 0x0A, 0x7D, 0x01, 0x7F, \r
+0x04, 0x02, 0x4B, 0xBE, 0xD1, 0xAB, 0xF0, 0x22, 0xB1, 0xE5, 0x12, 0x4F, 0xA2, 0x90, 0x81, 0x45, \r
+0xE0, 0x54, 0xF7, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0x01, 0xE0, \r
+0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, \r
+0x06, 0xB4, 0x74, 0x86, 0xF0, 0x12, 0x5F, 0xBD, 0xEC, 0x54, 0x7F, 0xFC, 0x90, 0x82, 0x53, 0x12, \r
+0x20, 0xCE, 0x90, 0x82, 0x53, 0x12, 0x5E, 0xA0, 0x7F, 0x7C, 0xD1, 0x43, 0x12, 0x20, 0xDA, 0xCC, \r
+0xC0, 0x00, 0xC0, 0x7F, 0x8C, 0xD1, 0x43, 0x12, 0x20, 0xDA, 0x00, 0xC0, 0x00, 0x14, 0x12, 0x76, \r
+0x45, 0x12, 0x20, 0xDA, 0x00, 0x03, 0x3E, 0x60, 0xE4, 0xFD, 0xFF, 0x12, 0x67, 0xE1, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x85, 0xBB, 0x22, 0x12, 0x76, 0x27, 0x90, \r
+0x81, 0x8D, 0x12, 0x75, 0xF9, 0x54, 0x04, 0x25, 0xE0, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0x90, 0x81, \r
+0x8D, 0x71, 0x47, 0xFF, 0x90, 0x05, 0x54, 0xE0, 0xC3, 0x9F, 0x90, 0x81, 0x8E, 0xF0, 0xEE, 0x20, \r
+0xE0, 0x03, 0x12, 0x4F, 0x40, 0x90, 0x81, 0x8D, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x15, 0x90, 0x81, \r
+0x49, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x81, 0x4B, 0xF0, 0xD1, 0xAB, 0xF0, 0x90, 0x05, 0x58, 0x74, \r
+0x05, 0xF0, 0x22, 0xE4, 0x90, 0x81, 0x49, 0xF0, 0x90, 0x81, 0x4B, 0x74, 0x0C, 0xF0, 0x90, 0x81, \r
+0x45, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x90, 0x81, 0x46, 0xE0, 0x44, \r
+0x04, 0x22, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, 0xCE, \r
+0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x81, 0x97, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, \r
+0x47, 0xF3, 0x60, 0x02, 0xE1, 0x77, 0x90, 0x81, 0x49, 0xE0, 0x70, 0x02, 0xE1, 0x77, 0x90, 0x81, \r
+0x47, 0xE0, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x81, 0x50, \r
+0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x81, 0x4F, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x81, \r
+0x4F, 0xE0, 0xFE, 0xFF, 0x80, 0x00, 0x90, 0x81, 0x50, 0xEF, 0xF0, 0xD1, 0xAB, 0xF0, 0xE4, 0x90, \r
+0x81, 0x52, 0x12, 0x76, 0x3A, 0x12, 0x72, 0xAE, 0x12, 0x72, 0xBC, 0x54, 0xEF, 0xF0, 0x90, 0x81, \r
+0x47, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x0F, 0x90, 0x81, 0x40, 0xE0, \r
+0x30, 0xE0, 0x05, 0x12, 0x58, 0xE2, 0x80, 0x03, 0x12, 0x58, 0x9D, 0x12, 0x70, 0xA3, 0x30, 0xE0, \r
+0x36, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x2D, 0x90, 0x81, 0x4F, 0xE0, 0xFF, 0xA3, \r
+0xE0, 0x6F, 0x70, 0x23, 0x90, 0x81, 0x46, 0xE0, 0x44, 0x40, 0xF0, 0x12, 0x75, 0xBB, 0xF0, 0x90, \r
+0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x49, 0x67, 0x12, 0x49, 0x82, 0x12, 0x76, \r
+0x5F, 0x90, 0x81, 0x50, 0xE0, 0x14, 0xF0, 0x90, 0x81, 0x40, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x03, \r
+0xD1, 0xAB, 0xF0, 0x22, 0x12, 0x70, 0xA3, 0x30, 0xE0, 0x0C, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, \r
+0x30, 0xE0, 0x03, 0x12, 0x76, 0x5F, 0x12, 0x72, 0xA4, 0x30, 0xE0, 0x09, 0x12, 0x72, 0xB9, 0x54, \r
+0x07, 0x70, 0x37, 0x80, 0x32, 0x12, 0x72, 0xC5, 0x9F, 0x40, 0x2C, 0x12, 0x47, 0xF3, 0x70, 0x2A, \r
+0x91, 0x5E, 0x70, 0x04, 0xF1, 0xDB, 0xF0, 0x22, 0x90, 0x81, 0x53, 0xE0, 0x04, 0xF0, 0xE0, 0xD3, \r
+0x94, 0x02, 0x40, 0x0A, 0xF1, 0xDB, 0xF0, 0xE4, 0x90, 0x81, 0x53, 0xF0, 0x80, 0x03, 0x12, 0x4F, \r
+0xAD, 0xE4, 0x90, 0x81, 0x52, 0xF0, 0x22, 0x12, 0x58, 0x53, 0x22, 0x90, 0x81, 0x46, 0xE0, 0x54, \r
+0xFB, 0x22, 0x12, 0x4F, 0x40, 0x90, 0x81, 0x43, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x00, 0xF7, 0xE0, \r
+0x20, 0xE7, 0x09, 0xE0, 0x7F, 0x01, 0x20, 0xE6, 0x0C, 0x7F, 0x02, 0x22, 0x90, 0x00, 0xF7, 0xE0, \r
+0x30, 0xE6, 0x02, 0x7F, 0x03, 0x22, 0x75, 0xE8, 0x03, 0x75, 0xA8, 0x84, 0x22, 0xE4, 0x90, 0x81, \r
+0xA8, 0xF0, 0x90, 0x81, 0xA8, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0x0D, 0x90, 0x01, 0xC4, 0xF0, 0x74, \r
+0x58, 0xA3, 0xF0, 0x90, 0x81, 0x49, 0xE0, 0x60, 0x0E, 0x90, 0x81, 0x4C, 0xE0, 0xFF, 0x90, 0x81, \r
+0x4B, 0xE0, 0x6F, 0x60, 0x02, 0x11, 0x53, 0xC2, 0xAF, 0x12, 0x6D, 0xDD, 0xBF, 0x01, 0x02, 0x71, \r
+0xF5, 0xD2, 0xAF, 0xF1, 0xB0, 0x12, 0x32, 0x9E, 0xBF, 0x01, 0x03, 0x12, 0x6C, 0x98, 0x12, 0x41, \r
+0x4D, 0x80, 0xBF, 0x90, 0x81, 0x40, 0xE0, 0x90, 0x81, 0x4B, 0x30, 0xE0, 0x04, 0xE0, 0xFF, 0x61, \r
+0x29, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x4B, 0xBE, 0x90, 0x81, 0x49, 0xE0, 0x60, 0x0F, 0x90, 0x06, \r
+0x92, 0xE0, 0x30, 0xE1, 0x03, 0x02, 0x73, 0x77, 0x12, 0x55, 0xDD, 0x11, 0x53, 0x22, 0xE4, 0xFF, \r
+0x12, 0x52, 0xC9, 0xBF, 0x01, 0x0E, 0x90, 0x81, 0x49, 0xE0, 0x60, 0x08, 0x11, 0x95, 0x54, 0x07, \r
+0x70, 0x02, 0x11, 0x53, 0x22, 0x90, 0x81, 0x4D, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xE4, 0xF5, 0x4E, \r
+0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x4E, 0x54, 0xC0, 0x70, 0x07, 0x11, 0x95, 0x54, 0xFD, 0xF0, 0x80, \r
+0xA2, 0xE5, 0x4E, 0x30, 0xE6, 0x18, 0x90, 0x81, 0x49, 0xE0, 0x64, 0x01, 0x70, 0x12, 0x12, 0x54, \r
+0x57, 0x64, 0x02, 0x60, 0x04, 0x31, 0x4D, 0x80, 0x07, 0x12, 0x4F, 0xAD, 0x80, 0x02, 0x11, 0x95, \r
+0xE5, 0x4E, 0x90, 0x81, 0x4D, 0x30, 0xE7, 0x05, 0x12, 0x47, 0x7A, 0x61, 0x21, 0xE0, 0x54, 0xFD, \r
+0xF0, 0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x81, 0x99, 0xF0, 0xE0, 0xFD, 0x54, 0xC0, 0x70, 0x04, \r
+0x11, 0x95, 0x80, 0x55, 0xED, 0x30, 0xE6, 0x3F, 0x90, 0x81, 0x49, 0xE0, 0x64, 0x02, 0x70, 0x27, \r
+0x90, 0x81, 0x45, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x09, 0x90, 0x81, 0x4D, 0xE0, 0x44, 0x01, \r
+0xF0, 0x80, 0x1B, 0x12, 0x54, 0x5E, 0x64, 0x01, 0x70, 0x1F, 0x90, 0x81, 0x4D, 0xE0, 0x44, 0x04, \r
+0xF0, 0x7F, 0x01, 0x31, 0xEA, 0x80, 0x12, 0x12, 0x54, 0x57, 0x64, 0x02, 0x60, 0x04, 0x31, 0x4D, \r
+0x80, 0x07, 0x12, 0x4F, 0xAD, 0x80, 0x02, 0x11, 0x95, 0x90, 0x81, 0x99, 0xE0, 0x90, 0x81, 0x4D, \r
+0x30, 0xE7, 0x05, 0x12, 0x47, 0x7A, 0x61, 0x21, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x04, 0x1D, \r
+0xE0, 0x70, 0x15, 0x90, 0x80, 0x43, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x31, 0x69, 0x90, 0x81, \r
+0x9A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x71, 0x1A, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0x90, 0x82, 0x60, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x82, 0x5F, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, \r
+0x12, 0x75, 0xE5, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0x82, 0x5F, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, \r
+0x82, 0x60, 0xE0, 0x60, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
+0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x08, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, \r
+0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0xAF, \r
+0x05, 0x51, 0xFB, 0xE0, 0x54, 0x01, 0xFE, 0x90, 0x82, 0x61, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, \r
+0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x51, 0xFB, 0xEE, 0xF0, 0x74, 0x21, 0x2F, 0x51, 0x5B, 0x54, 0xF7, \r
+0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x90, 0x82, 0x5B, 0xEF, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1D, 0x90, 0x05, 0x22, 0xE0, \r
+0x90, 0x82, 0x5E, 0xF0, 0x7D, 0x29, 0xD1, 0x07, 0xBF, 0x01, 0x02, 0x51, 0x22, 0x90, 0x82, 0x5E, \r
+0xE0, 0xFF, 0x7D, 0x2A, 0x12, 0x4D, 0xA9, 0x80, 0x02, 0x51, 0x22, 0x71, 0x1A, 0xD0, 0xD0, 0x92, \r
+0xAF, 0x22, 0x90, 0x80, 0x45, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0x31, 0x69, 0x90, 0x82, 0x5C, \r
+0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x82, 0x5B, 0xE0, 0xFF, 0x51, 0x65, 0x54, 0x3F, \r
+0xF0, 0xEF, 0x60, 0x0A, 0x51, 0x58, 0x44, 0x10, 0x51, 0x64, 0x44, 0x80, 0xF0, 0x22, 0x51, 0x58, \r
+0x54, 0xEF, 0x51, 0x64, 0x44, 0x40, 0xF0, 0x22, 0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
+0xF5, 0x83, 0xE0, 0x22, 0xF0, 0x74, 0x1F, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
+0x22, 0x90, 0x80, 0x44, 0xE0, 0xFF, 0x90, 0x82, 0x4B, 0xE0, 0xFB, 0x7D, 0x01, 0x31, 0x69, 0x90, \r
+0x82, 0x4C, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x82, 0x4A, 0xE0, 0xFF, 0x51, 0x3C, \r
+0x90, 0x82, 0x4C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x04, 0x80, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, \r
+0x07, 0x71, 0x0E, 0x44, 0x01, 0xF0, 0x71, 0x0E, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x16, 0x2C, \r
+0x51, 0xFE, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
+0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
+0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, 0x53, 0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, \r
+0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0x71, 0x06, 0xE0, 0x54, \r
+0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0x71, 0x06, 0xED, 0xF0, 0x22, 0x74, 0x16, 0x2F, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x74, 0x11, \r
+0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, \r
+0x22, 0x90, 0x81, 0x45, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xAE, 0x07, 0x71, 0x42, 0xBF, 0x01, 0x0F, \r
+0xF1, 0xD4, 0x20, 0xE0, 0x0A, 0xAF, 0x06, 0x7D, 0x01, 0x12, 0x4B, 0xBE, 0x7F, 0x01, 0x22, 0x7F, \r
+0x00, 0x22, 0x90, 0x05, 0x43, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0x12, 0x47, \r
+0xF3, 0x70, 0x17, 0x90, 0x81, 0x49, 0xE0, 0x60, 0x11, 0x12, 0x72, 0xAE, 0xF0, 0x90, 0x81, 0x45, \r
+0xE0, 0x12, 0x72, 0xBA, 0x54, 0x07, 0x70, 0x02, 0x11, 0x53, 0x22, 0x90, 0x81, 0x49, 0xE0, 0x70, \r
+0x07, 0x90, 0x81, 0x40, 0xE0, 0x30, 0xE0, 0x11, 0x90, 0x81, 0x40, 0xE0, 0x30, 0xE0, 0x07, 0x71, \r
+0x42, 0xBF, 0x01, 0x05, 0x80, 0x04, 0x12, 0x4F, 0xBD, 0x22, 0x90, 0x81, 0x49, 0xE0, 0x64, 0x02, \r
+0x60, 0x11, 0x12, 0x54, 0x5E, 0x60, 0x0C, 0x12, 0x6E, 0xD7, 0xEF, 0x70, 0x06, 0xFD, 0x7F, 0x0C, \r
+0x12, 0x4B, 0xBE, 0x22, 0x71, 0xC2, 0x30, 0xE0, 0x0B, 0x71, 0xBB, 0x60, 0x07, 0x7D, 0x01, 0x7F, \r
+0x02, 0x12, 0x4B, 0xBE, 0x71, 0xBB, 0x60, 0x02, 0x71, 0x8A, 0x22, 0x90, 0x81, 0x44, 0xE0, 0x64, \r
+0x02, 0x22, 0x90, 0x81, 0x40, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0x90, 0x81, 0x45, \r
+0x71, 0xC5, 0x30, 0xE0, 0x1F, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x81, 0x46, \r
+0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x09, 0xE0, 0x54, 0xFE, 0x12, 0x73, 0x14, 0x74, \r
+0x04, 0xF0, 0x11, 0x53, 0x22, 0x90, 0x81, 0x45, 0xE0, 0x30, 0xE0, 0x19, 0x90, 0x81, 0x40, 0xE0, \r
+0xFF, 0x30, 0xE0, 0x0F, 0xC3, 0x13, 0x30, 0xE0, 0x08, 0x12, 0x75, 0xD8, 0xBF, 0x01, 0x06, 0x80, \r
+0x02, 0x80, 0x00, 0x91, 0x16, 0x22, 0x90, 0x81, 0x4C, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x0E, \r
+0x12, 0x6E, 0x94, 0xBF, 0x01, 0x08, 0x91, 0x2F, 0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, 0x22, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x63, 0xDE, 0x91, 0x40, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x12, 0x73, 0x1F, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x32, 0x1E, 0xE4, \r
+0xFF, 0x12, 0x63, 0x80, 0x90, 0x81, 0x46, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0x90, 0x81, 0x3F, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x04, 0x80, 0x0B, 0x71, 0x42, \r
+0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x91, 0x80, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x81, 0x43, 0xE0, 0x90, 0x82, 0x70, 0xF0, 0x6F, \r
+0x70, 0x02, 0xA1, 0x88, 0xEF, 0x14, 0x60, 0x42, 0x14, 0x60, 0x6D, 0x14, 0x70, 0x02, 0xA1, 0x33, \r
+0x14, 0x70, 0x02, 0xA1, 0x5E, 0x24, 0x04, 0x60, 0x02, 0xA1, 0x88, 0x90, 0x82, 0x70, 0xE0, 0xB4, \r
+0x04, 0x04, 0xD1, 0x72, 0xA1, 0x88, 0x90, 0x82, 0x70, 0xE0, 0xB4, 0x02, 0x04, 0xD1, 0x90, 0xA1, \r
+0x88, 0x90, 0x82, 0x70, 0xE0, 0xB4, 0x03, 0x04, 0xD1, 0x7C, 0xA1, 0x88, 0x90, 0x82, 0x70, 0xE0, \r
+0x64, 0x01, 0x60, 0x02, 0xA1, 0x88, 0xD1, 0x74, 0xA1, 0x88, 0x90, 0x82, 0x70, 0xE0, 0xB4, 0x04, \r
+0x04, 0xD1, 0x80, 0xA1, 0x88, 0x90, 0x82, 0x70, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0x57, 0xE2, 0xA1, \r
+0x88, 0x90, 0x82, 0x70, 0xE0, 0xB4, 0x03, 0x04, 0xD1, 0x9A, 0xA1, 0x88, 0x90, 0x82, 0x70, 0xE0, \r
+0x60, 0x02, 0xA1, 0x88, 0xD1, 0x4F, 0xA1, 0x88, 0x90, 0x82, 0x70, 0xE0, 0xB4, 0x04, 0x04, 0xB1, \r
+0xFD, 0x80, 0x75, 0x90, 0x82, 0x70, 0xE0, 0xB4, 0x01, 0x04, 0xB1, 0x8F, 0x80, 0x6A, 0x90, 0x82, \r
+0x70, 0xE0, 0xB4, 0x03, 0x04, 0xB1, 0x8D, 0x80, 0x5F, 0x90, 0x82, 0x70, 0xE0, 0x70, 0x59, 0xD1, \r
+0x03, 0x80, 0x55, 0x90, 0x82, 0x70, 0xE0, 0xB4, 0x04, 0x04, 0xD1, 0x62, 0x80, 0x4A, 0x90, 0x82, \r
+0x70, 0xE0, 0xB4, 0x01, 0x04, 0xD1, 0x54, 0x80, 0x3F, 0x90, 0x82, 0x70, 0xE0, 0xB4, 0x02, 0x04, \r
+0xD1, 0x95, 0x80, 0x34, 0x90, 0x82, 0x70, 0xE0, 0x70, 0x2E, 0xD1, 0x52, 0x80, 0x2A, 0x90, 0x82, \r
+0x70, 0xE0, 0xB4, 0x03, 0x04, 0xF1, 0xB1, 0x80, 0x1F, 0x90, 0x82, 0x70, 0xE0, 0xB4, 0x01, 0x05, \r
+0x12, 0x4F, 0xEA, 0x80, 0x13, 0x90, 0x82, 0x70, 0xE0, 0xB4, 0x02, 0x04, 0xF1, 0xC4, 0x80, 0x08, \r
+0x90, 0x82, 0x70, 0xE0, 0x70, 0x02, 0xD1, 0x6D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x80, 0x07, 0x7D, \r
+0x20, 0x7F, 0xFF, 0x12, 0x4D, 0xA9, 0xB1, 0x9F, 0x90, 0x81, 0x43, 0x74, 0x02, 0xF0, 0x22, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xD1, 0x0C, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xDA, 0xCC, 0xF0, \r
+0x00, 0xC0, 0x7F, 0x8C, 0x12, 0x56, 0x43, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x14, 0x12, 0x76, \r
+0x45, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xFD, 0xFF, 0x12, 0x67, 0xE1, 0xF1, 0xBD, \r
+0xEC, 0x44, 0x80, 0xFC, 0x90, 0x82, 0x57, 0x12, 0x20, 0xCE, 0x90, 0x82, 0x57, 0xD1, 0xA0, 0x7F, \r
+0x7C, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, \r
+0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD1, 0x88, 0x7D, \r
+0x23, 0x80, 0x8E, 0xD1, 0x4F, 0x80, 0x88, 0x7F, 0xFF, 0x12, 0x4D, 0xA9, 0xE4, 0x90, 0x82, 0x66, \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, 0x82, 0x67, 0xE0, 0x94, 0xE8, 0x90, \r
+0x82, 0x66, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, \r
+0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0x90, 0x82, 0x66, 0xF1, 0xB6, 0x80, 0xC4, 0x02, \r
+0x57, 0xE5, 0xD1, 0x4F, 0x7D, 0x21, 0x7F, 0xFF, 0x12, 0x4D, 0xA9, 0x90, 0x81, 0x43, 0x74, 0x03, \r
+0xF0, 0x22, 0x7D, 0x22, 0x7F, 0xFF, 0x12, 0x4D, 0xA9, 0xD1, 0x88, 0x80, 0xEE, 0xD1, 0x4F, 0x02, \r
+0x4F, 0xEA, 0xD1, 0x80, 0xF1, 0xCC, 0xE4, 0x90, 0x81, 0x43, 0xF0, 0x22, 0xD1, 0x9A, 0x80, 0xF4, \r
+0x12, 0x4F, 0x43, 0xD1, 0x88, 0x02, 0x57, 0xE5, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x22, \r
+0x12, 0x57, 0xE2, 0x80, 0xDF, 0x12, 0x55, 0xE5, 0x80, 0xC1, 0x12, 0x4F, 0x43, 0x02, 0x57, 0xE5, \r
+0x12, 0x44, 0xCF, 0x90, 0x85, 0xBB, 0x02, 0x20, 0xCE, 0x90, 0x82, 0x2B, 0xEF, 0xF0, 0xA3, 0xED, \r
+0xF0, 0xA3, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x90, 0x82, 0x39, 0xF0, 0x7F, 0x24, \r
+0x7E, 0x08, 0x12, 0x2D, 0x5C, 0x90, 0x82, 0x31, 0x12, 0x20, 0xCE, 0x90, 0x82, 0x2B, 0xE0, 0xFB, \r
+0x70, 0x04, 0xF1, 0x8B, 0x80, 0x06, 0xEB, 0xF1, 0x91, 0x12, 0x2D, 0x5C, 0x90, 0x82, 0x35, 0x12, \r
+0x20, 0xCE, 0x90, 0x82, 0x2C, 0x12, 0x6A, 0xD9, 0x78, 0x17, 0x12, 0x65, 0x7F, 0x90, 0x82, 0x35, \r
+0x12, 0x44, 0xCF, 0xED, 0x54, 0x7F, 0xFD, 0xEC, 0x54, 0x80, 0xFC, 0x12, 0x44, 0xC2, 0xEC, 0x44, \r
+0x80, 0xFC, 0x90, 0x82, 0x35, 0x12, 0x20, 0xCE, 0xF1, 0x8B, 0xEC, 0x54, 0x7F, 0xFC, 0xD1, 0xA3, \r
+0xF1, 0xA4, 0xF1, 0x91, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x82, 0x35, 0xD1, 0xA0, 0xD0, 0x07, 0xD0, \r
+0x06, 0x12, 0x2E, 0xA2, 0xF1, 0x8B, 0xEC, 0x44, 0x80, 0xFC, 0xD1, 0xA3, 0xF1, 0xA4, 0x70, 0x04, \r
+0x7F, 0x20, 0x80, 0x09, 0x90, 0x82, 0x2B, 0xE0, 0xB4, 0x01, 0x16, 0x7F, 0x28, 0x7E, 0x08, 0x12, \r
+0x2D, 0x5C, 0x78, 0x08, 0x12, 0x20, 0xA8, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0x90, 0x82, 0x39, 0xEF, \r
+0xF0, 0x90, 0x82, 0x39, 0xE0, 0x90, 0x82, 0x2B, 0x60, 0x0E, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, \r
+0x66, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0x80, 0x0C, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x64, 0xF5, \r
+0x82, 0xE4, 0x34, 0x87, 0xF1, 0x9C, 0x12, 0x2D, 0x5C, 0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x90, \r
+0x82, 0x2D, 0x12, 0x20, 0xCE, 0x90, 0x82, 0x2D, 0x02, 0x44, 0xCF, 0x90, 0x82, 0x31, 0x02, 0x44, \r
+0xCF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, \r
+0xA3, 0xE0, 0xFF, 0x22, 0x7F, 0x24, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x82, 0x2B, 0xE0, 0x22, \r
+0x22, 0x7D, 0x25, 0x02, 0x4F, 0xEC, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x44, 0x9F, 0x7F, 0x7C, 0x7E, \r
+0x08, 0x02, 0x2D, 0x5C, 0x12, 0x55, 0xE5, 0x7D, 0x24, 0x02, 0x4F, 0xEC, 0x90, 0x05, 0x27, 0xE0, \r
+0x54, 0xBF, 0xF0, 0x22, 0x90, 0x81, 0x40, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0xE4, 0xFB, \r
+0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x43, 0x4E, 0x90, 0x82, 0x0C, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x80, \r
+0x3C, 0xE0, 0xFF, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0xE5, 0xC2, 0xAF, 0xEF, 0x30, 0xE1, 0x09, 0x90, \r
+0x80, 0x3C, 0xE0, 0x54, 0xFD, 0xF0, 0x11, 0x1D, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x80, 0x3C, 0xE0, \r
+0xFF, 0x30, 0xE2, 0x05, 0x54, 0xFB, 0xF0, 0x31, 0xAC, 0xD2, 0xAF, 0x80, 0xD1, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x80, 0x9A, 0xE0, 0xFF, 0x90, 0x80, 0x99, 0xE0, 0xB5, 0x07, 0x04, \r
+0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x3F, 0x90, 0x80, 0x99, 0xE0, 0xFE, 0x75, 0xF0, \r
+0x08, 0x90, 0x80, 0x49, 0x12, 0x45, 0x00, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x4A, \r
+0xF9, 0x74, 0x80, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x4B, 0x24, 0x90, 0x80, 0x99, \r
+0x31, 0xA5, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x80, 0x99, 0xF0, 0x11, \r
+0x7D, 0x90, 0x80, 0x3C, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0xCC, \r
+0xE0, 0x54, 0x0F, 0x90, 0x82, 0x64, 0xF0, 0x90, 0x82, 0x64, 0xE0, 0xFD, 0x70, 0x02, 0x21, 0x7A, \r
+0x90, 0x80, 0x99, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, \r
+0x90, 0x80, 0x9A, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, \r
+0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x82, 0x62, 0x71, 0xD4, 0x80, 0x05, 0xC3, \r
+0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x21, 0x5D, 0xE4, 0x90, 0x82, \r
+0x65, 0xF0, 0x90, 0x82, 0x65, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x32, 0x31, 0x7C, 0xA4, 0xFF, \r
+0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0x31, 0x93, 0x90, 0x80, \r
+0x49, 0x31, 0x84, 0x31, 0x7B, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xF0, 0x31, 0x93, \r
+0x90, 0x80, 0x4D, 0x31, 0x84, 0xF0, 0x90, 0x82, 0x65, 0xE0, 0x04, 0xF0, 0x80, 0xC4, 0x90, 0x82, \r
+0x64, 0xE0, 0xFF, 0x90, 0x82, 0x62, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, \r
+0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x82, 0x64, 0xF0, 0x90, 0x82, 0x62, 0xE0, 0xFF, 0x74, 0x01, \r
+0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x82, 0x62, \r
+0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x80, 0x9A, 0x31, 0xA5, 0xB4, 0x0A, 0x02, 0x7F, \r
+0x01, 0xEF, 0x70, 0x02, 0x01, 0x87, 0xE4, 0x90, 0x80, 0x9A, 0xF0, 0x01, 0x87, 0x90, 0x01, 0xC0, \r
+0xE0, 0x44, 0x02, 0xF0, 0x90, 0x82, 0x62, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0x31, 0x7B, 0x90, \r
+0x01, 0xD0, 0x12, 0x45, 0x00, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0xF0, 0x90, 0x82, 0x62, 0xE0, \r
+0x75, 0xF0, 0x04, 0x22, 0x12, 0x45, 0x00, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, \r
+0x83, 0xEF, 0x22, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x80, 0x9A, \r
+0xE0, 0x75, 0xF0, 0x08, 0x22, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0x22, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x81, 0x32, 0xE0, 0xFE, 0x90, 0x81, 0x31, 0xE0, 0xFD, 0xB5, \r
+0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x41, 0x90, 0x01, 0xAF, \r
+0xE0, 0x70, 0x0A, 0xED, 0x51, 0x70, 0xFA, 0x7B, 0x01, 0x51, 0xC8, 0x7F, 0x01, 0xEF, 0x60, 0x2E, \r
+0x90, 0x81, 0x31, 0x31, 0xA5, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x81, \r
+0x31, 0xF0, 0x90, 0x81, 0x32, 0xE0, 0xFF, 0x90, 0x81, 0x31, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, \r
+0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x07, 0x90, 0x80, 0x3C, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x81, 0x31, 0xE0, 0xFF, 0x70, \r
+0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x81, 0x32, 0xE0, 0xB5, 0x07, \r
+0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, \r
+0xF0, 0x80, 0x28, 0xC0, 0x01, 0x90, 0x81, 0x32, 0xE0, 0x51, 0x70, 0xA8, 0x01, 0xFC, 0x7D, 0x01, \r
+0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x44, 0x79, 0x90, 0x81, 0x32, 0x31, 0xA5, 0xB4, 0x0A, \r
+0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x81, 0x32, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x9B, 0xF9, 0x74, 0x80, 0x35, 0xF0, 0x22, 0x90, 0x82, 0x1C, 0x74, \r
+0x12, 0xF0, 0x90, 0x82, 0x2A, 0x74, 0x05, 0xF0, 0x90, 0x82, 0x1E, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, \r
+0xA3, 0xEB, 0xF0, 0x90, 0x82, 0x1A, 0xE0, 0x90, 0x82, 0x21, 0xF0, 0x90, 0x82, 0x1B, 0xE0, 0x90, \r
+0x82, 0x22, 0xF0, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x1C, 0x51, 0x13, 0x7F, 0x04, 0x90, 0x82, 0x6A, \r
+0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x43, 0x27, 0x90, 0x80, 0x3C, 0xE0, 0xFF, 0x90, 0x82, 0x6A, 0xE0, \r
+0xFE, 0xEF, 0x4E, 0x90, 0x80, 0x3C, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
+0x82, 0x0D, 0x12, 0x45, 0x15, 0x90, 0x82, 0x63, 0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, \r
+0x12, 0x1F, 0xFC, 0x7F, 0xAF, 0x7E, 0x01, 0x71, 0x2B, 0xEF, 0x60, 0x3A, 0x90, 0x82, 0x0D, 0x12, \r
 0x45, 0x0C, 0x8B, 0x13, 0x8A, 0x14, 0x89, 0x15, 0x90, 0x00, 0x0E, 0x12, 0x1F, 0xBD, 0x24, 0x02, \r
-0xF5, 0x16, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x2B, 0xED, 0x90, 0x82, 0xA4, 0x12, 0x45, \r
+0xF5, 0x16, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x2B, 0xED, 0x90, 0x82, 0x0D, 0x12, 0x45, \r
 0x0C, 0x90, 0x00, 0x0E, 0x12, 0x1F, 0xBD, 0x90, 0x01, 0xAE, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, \r
 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
-0xC0, 0xD0, 0x90, 0x80, 0x9A, 0xE0, 0xFF, 0x90, 0x80, 0x99, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, \r
-0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x43, 0x90, 0x80, 0x99, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, \r
-0x80, 0x49, 0x12, 0x45, 0x00, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x4A, 0xF9, 0x74, \r
-0x80, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x5E, 0x51, 0x90, 0x80, 0x99, 0xE0, 0x04, \r
-0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x80, 0x99, \r
-0xF0, 0x31, 0x95, 0x90, 0x80, 0x3C, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x82, 0xE6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0x90, 0x82, 0xE6, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, \r
-0x2D, 0xC3, 0x90, 0x82, 0xE9, 0xE0, 0x94, 0xE8, 0x90, 0x82, 0xE8, 0xE0, 0x94, 0x03, 0x40, 0x0B, \r
-0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, 0x82, 0xE8, 0xE4, 0x75, \r
-0xF0, 0x01, 0x12, 0x44, 0x9F, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0x80, 0xC5, 0x7F, 0x01, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x82, 0xFB, 0xF0, 0x90, \r
-0x82, 0xFB, 0xE0, 0xFD, 0x70, 0x02, 0x41, 0xE4, 0x90, 0x80, 0x99, 0xE0, 0xFF, 0x70, 0x06, 0xA3, \r
-0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x80, 0x9A, 0xE0, 0xB5, 0x07, 0x04, 0x7F, \r
-0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, \r
-0x90, 0x82, 0xF9, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, \r
-0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x41, 0xC1, 0xE4, 0x90, 0x82, 0xFC, \r
-0xF0, 0x90, 0x82, 0xFC, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x73, 0x90, 0x82, 0xF9, 0xE0, 0x75, \r
-0xF0, 0x04, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, \r
-0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x80, 0x9A, 0xE0, 0x75, 0xF0, \r
-0x08, 0x90, 0x80, 0x49, 0x12, 0x45, 0x00, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, \r
-0x83, 0xEF, 0xF0, 0x90, 0x82, 0xF9, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, \r
-0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x80, 0x9A, \r
-0xE0, 0x75, 0xF0, 0x08, 0x90, 0x80, 0x4D, 0x12, 0x45, 0x00, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, \r
-0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x82, 0xFC, 0xE0, 0x04, 0xF0, 0x80, 0x83, 0x90, 0x82, \r
-0xFB, 0xE0, 0xFF, 0x90, 0x82, 0xF9, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, \r
-0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x82, 0xFB, 0xF0, 0x90, 0x82, 0xF9, 0xE0, 0xFF, 0x74, 0x01, \r
-0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x82, 0xF9, \r
-0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x80, 0x9A, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, \r
-0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x21, 0x9F, 0xE4, 0x90, 0x80, 0x9A, 0xF0, 0x21, \r
-0x9F, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x82, 0xF9, 0xE0, 0x44, 0x80, 0x90, 0x00, \r
-0x8A, 0xF0, 0x90, 0x82, 0xF9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x45, 0x00, 0xE0, \r
-0x90, 0x01, 0xC3, 0xF0, 0x22, 0x90, 0x82, 0xC2, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x20, \r
-0xDA, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x90, 0x82, 0xD0, 0xF0, 0x7F, 0x24, 0x7E, 0x08, 0x12, 0x2D, \r
-0x5C, 0x90, 0x82, 0xC8, 0x12, 0x20, 0xCE, 0x90, 0x82, 0xC2, 0xE0, 0xFB, 0x70, 0x08, 0x90, 0x82, \r
-0xC8, 0x12, 0x44, 0xCF, 0x80, 0x16, 0xEB, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, \r
-0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x2D, 0x5C, 0x90, 0x82, 0xCC, 0x12, \r
-0x20, 0xCE, 0x90, 0x82, 0xC3, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x17, 0x12, 0x20, 0xBB, \r
-0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x82, 0xCC, 0x12, 0x44, 0xCF, 0xED, 0x54, \r
-0x7F, 0xFD, 0xEC, 0x54, 0x80, 0xFC, 0x12, 0x44, 0xC2, 0xEC, 0x44, 0x80, 0xFC, 0x90, 0x82, 0xCC, \r
-0x12, 0x20, 0xCE, 0x90, 0x82, 0xC8, 0x12, 0x44, 0xCF, 0xEC, 0x54, 0x7F, 0xFC, 0x90, 0x85, 0xBB, \r
-0x12, 0x20, 0xCE, 0x7F, 0x24, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x82, 0xC2, 0xE0, 0x75, 0xF0, \r
-0x08, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, \r
-0xC0, 0x06, 0xC0, 0x07, 0x90, 0x82, 0xCC, 0x12, 0x44, 0xCF, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xCE, \r
-0xD0, 0x07, 0xD0, 0x06, 0x12, 0x2E, 0xA2, 0x90, 0x82, 0xC8, 0x12, 0x44, 0xCF, 0xEC, 0x44, 0x80, \r
-0xFC, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xCE, 0x7F, 0x24, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x82, \r
-0xC2, 0xE0, 0x70, 0x04, 0x7F, 0x20, 0x80, 0x09, 0x90, 0x82, 0xC2, 0xE0, 0xB4, 0x01, 0x16, 0x7F, \r
-0x28, 0x7E, 0x08, 0x12, 0x2D, 0x5C, 0x78, 0x08, 0x12, 0x20, 0xA8, 0xEF, 0x54, 0x01, 0xFF, 0xE4, \r
-0x90, 0x82, 0xD0, 0xEF, 0xF0, 0x90, 0x82, 0xD0, 0xE0, 0x90, 0x82, 0xC2, 0x60, 0x0E, 0xE0, 0x75, \r
-0xF0, 0x08, 0xA4, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0x80, 0x0C, 0xE0, 0x75, 0xF0, 0x08, \r
-0xA4, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, \r
-0x2D, 0x5C, 0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x90, 0x82, 0xC4, 0x12, 0x20, 0xCE, 0x90, 0x82, \r
-0xC4, 0x02, 0x44, 0xCF, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xF5, 0x1D, 0x90, 0x82, 0x20, 0xE0, 0xF5, \r
-0x1E, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8E, \r
-0x19, 0x8F, 0x1A, 0xE5, 0x1E, 0x54, 0x07, 0xC4, 0x33, 0x54, 0xE0, 0x85, 0x19, 0x83, 0x85, 0x1A, \r
-0x82, 0xF0, 0xE5, 0x1D, 0x54, 0x07, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0xE5, 0x1E, 0x13, 0x13, 0x13, \r
-0x54, 0x1F, 0x4F, 0xA3, 0xF0, 0xEB, 0x54, 0x07, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0xE5, 0x1D, 0x13, \r
-0x13, 0x13, 0x54, 0x1F, 0x4F, 0x85, 0x1A, 0x82, 0x85, 0x19, 0x83, 0xA3, 0xA3, 0xF0, 0xBD, 0x01, \r
-0x0D, 0x85, 0x1A, 0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0x74, 0x03, 0xF0, 0x80, 0x0C, 0x85, 0x1A, \r
-0x82, 0x85, 0x19, 0x83, 0xA3, 0xA3, 0xA3, 0x74, 0x01, 0xF0, 0x85, 0x1A, 0x82, 0x85, 0x19, 0x83, \r
-0xA3, 0xA3, 0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xF5, 0x4E, 0x90, 0x06, \r
-0xA9, 0xE0, 0xF5, 0x4E, 0x54, 0xC0, 0x70, 0x0D, 0x90, 0x81, 0x84, 0xE0, 0x54, 0xFE, 0xF0, 0x54, \r
-0xFD, 0xF0, 0x02, 0x47, 0x9F, 0xE5, 0x4E, 0x30, 0xE6, 0x22, 0x90, 0x81, 0x80, 0xE0, 0x64, 0x01, \r
-0x70, 0x21, 0x90, 0x81, 0x84, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x81, 0x7E, 0xE0, 0x54, 0x0F, 0x64, \r
-0x02, 0x60, 0x04, 0xD1, 0x51, 0x80, 0x0C, 0x12, 0x4E, 0x3E, 0x80, 0x07, 0x90, 0x81, 0x84, 0xE0, \r
-0x54, 0xFE, 0xF0, 0xE5, 0x4E, 0x90, 0x81, 0x84, 0x30, 0xE7, 0x0A, 0x91, 0x24, 0x90, 0x81, 0x7C, \r
-0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x82, \r
-0x30, 0xF0, 0xE0, 0xFD, 0x54, 0xC0, 0x70, 0x09, 0x90, 0x81, 0x84, 0xE0, 0x54, 0xFE, 0xF0, 0x80, \r
-0x6D, 0xED, 0x30, 0xE6, 0x4D, 0x90, 0x81, 0x80, 0xE0, 0x64, 0x02, 0x70, 0x2B, 0x90, 0x81, 0x7C, \r
-0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x09, 0x90, 0x81, 0x84, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x29, \r
-0x90, 0x81, 0x7E, 0xE0, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x2F, 0x90, 0x81, 0x84, 0xE0, 0x44, 0x04, \r
-0xF0, 0x7F, 0x01, 0x12, 0x4E, 0x9A, 0x80, 0x21, 0x90, 0x81, 0x84, 0xE0, 0x44, 0x01, 0xF0, 0x90, \r
-0x81, 0x7E, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x04, 0xD1, 0x51, 0x80, 0x0C, 0x12, 0x4E, 0x3E, \r
-0x80, 0x07, 0x90, 0x81, 0x84, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x82, 0x30, 0xE0, 0x90, 0x81, 0x84, \r
-0x30, 0xE7, 0x0A, 0x91, 0x24, 0x90, 0x81, 0x7C, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, \r
-0xF0, 0x22, 0x90, 0x81, 0x36, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xC1, 0x40, 0x90, 0x81, 0x80, 0xE0, \r
-0x70, 0x02, 0xC1, 0x40, 0x90, 0x81, 0x7E, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x26, \r
-0x90, 0x06, 0xAB, 0xE0, 0x90, 0x81, 0x87, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x04, 0x90, 0x81, 0x86, \r
-0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x81, 0x86, 0xE0, 0xFE, 0xFF, 0x80, 0x03, 0xEF, 0x04, \r
-0xFF, 0x90, 0x81, 0x87, 0xEF, 0xF0, 0x90, 0x81, 0x7C, 0xE0, 0x30, 0xE0, 0x02, 0xD1, 0x72, 0x90, \r
-0x81, 0x7D, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0x90, 0x81, 0x89, 0xF0, 0x90, 0x81, 0x8B, 0xA3, 0xE0, \r
-0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, \r
-0x81, 0x84, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, 0xF0, 0x90, 0x81, 0x7E, 0xE0, 0xFF, 0xC4, 0x54, \r
-0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x0D, 0x90, 0x81, 0x77, 0xE0, 0x30, 0xE0, 0x04, 0xB1, 0x0A, \r
-0x80, 0x02, 0x91, 0xAB, 0x90, 0x81, 0x7D, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x10, \r
-0x90, 0x81, 0x86, 0xE0, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x06, 0x12, 0x57, 0x76, 0x12, 0x55, 0x17, \r
-0x90, 0x81, 0x77, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x07, 0x90, 0x81, 0x7D, 0xE0, 0x44, 0x04, 0xF0, \r
-0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x1A, 0x90, 0x80, 0x43, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, \r
-0x12, 0x4F, 0x3A, 0x90, 0x82, 0x31, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, \r
-0xF0, 0x22, 0xE4, 0x90, 0x82, 0x30, 0xF0, 0xFD, 0xA3, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, \r
-0x05, 0x61, 0xE0, 0xFB, 0xEB, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, \r
-0x81, 0xB3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0xB3, \r
-0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3, 0x9F, 0xEA, 0x9E, 0x40, 0x28, 0xEB, 0x9F, 0xFF, 0x90, 0x81, \r
-0x95, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F, 0xFD, 0xC3, 0x94, 0x19, 0x50, 0x13, 0x74, 0x98, \r
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x93, 0xE0, 0x04, \r
-0xF0, 0xF1, 0x45, 0x90, 0x81, 0x93, 0xE0, 0xC3, 0x94, 0x64, 0x40, 0x68, 0xE4, 0x90, 0x82, 0x31, \r
-0xF0, 0x90, 0x82, 0x30, 0xF0, 0x90, 0x82, 0x30, 0xE0, 0xFF, 0xC3, 0x94, 0x19, 0x50, 0x47, 0x74, \r
-0x98, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x82, 0x31, 0xE0, 0x2F, \r
-0xF0, 0xE0, 0xD3, 0x94, 0x05, 0x40, 0x27, 0x90, 0x82, 0x30, 0xE0, 0xFF, 0x94, 0x0A, 0x40, 0x0A, \r
-0xEF, 0x24, 0xF6, 0x90, 0x81, 0x92, 0xF0, 0xE4, 0x80, 0x0E, 0xE4, 0x90, 0x81, 0x92, 0xF0, 0x90, \r
-0x82, 0x30, 0xE0, 0xFF, 0xC3, 0x74, 0x0A, 0x9F, 0x90, 0x81, 0x91, 0xF0, 0x80, 0x08, 0x90, 0x82, \r
-0x30, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0x81, 0x92, 0xE0, 0xFD, 0x7B, 0x08, 0xE4, 0xFF, 0xF1, \r
-0x77, 0x12, 0x77, 0xA3, 0x22, 0x90, 0x82, 0x1F, 0xE0, 0xFF, 0x90, 0x81, 0x89, 0xE0, 0xD3, 0x9F, \r
-0x40, 0x24, 0x90, 0x81, 0x97, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x94, 0x04, 0x50, 0x18, 0x90, 0x81, \r
-0x91, 0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0x81, 0x96, 0xF0, 0xFB, 0x90, 0x81, 0x91, 0xE0, \r
-0xFF, 0xA3, 0xE0, 0xFD, 0xF1, 0x77, 0x22, 0xAC, 0x07, 0x90, 0x81, 0x7C, 0xE0, 0x30, 0xE0, 0x32, \r
-0x90, 0x81, 0x92, 0xE0, 0xD3, 0x94, 0x03, 0x50, 0x07, 0x90, 0x81, 0x88, 0xEB, 0xF0, 0x80, 0x0A, \r
-0xED, 0x24, 0xFD, 0x2B, 0x90, 0x81, 0x88, 0xF0, 0x7D, 0x03, 0x90, 0x81, 0xB7, 0xE0, 0x24, 0x04, \r
-0xC3, 0x9D, 0x2C, 0xFF, 0x90, 0x81, 0x95, 0xF0, 0x90, 0x81, 0x8B, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, \r
-0x80, 0x0E, 0x90, 0x81, 0x8B, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0x81, 0x88, 0xEB, 0xF0, \r
-0x90, 0x81, 0x8B, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x90, 0x81, 0x36, 0xE0, 0xB4, 0x01, \r
-0x15, 0x90, 0x81, 0x80, 0xE0, 0x60, 0x0F, 0x90, 0x81, 0x7E, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, \r
-0x02, 0xC1, 0x51, 0x12, 0x4E, 0x3E, 0x22, 0xAC, 0x07, 0xED, 0xAD, 0x04, 0x78, 0x24, 0xF2, 0xED, \r
-0x08, 0xF2, 0xEB, 0xB4, 0x04, 0x07, 0x78, 0x27, 0x74, 0x01, 0xF2, 0x80, 0x0E, 0xEB, 0x78, 0x27, \r
-0xB4, 0x05, 0x05, 0x74, 0x02, 0xF2, 0x80, 0x03, 0x74, 0x04, 0xF2, 0xD3, 0x78, 0x25, 0xE2, 0x94, \r
-0xFF, 0x18, 0xE2, 0x94, 0x00, 0x50, 0x63, 0xE4, 0x78, 0x26, 0xF2, 0x78, 0x27, 0xE2, 0xFF, 0x18, \r
-0xE2, 0xFE, 0xC3, 0x9F, 0x40, 0x02, 0x21, 0x85, 0x74, 0x33, 0x2E, 0xF8, 0xE2, 0x78, 0x28, 0xF2, \r
-0x90, 0x82, 0xA2, 0xE0, 0x60, 0x2D, 0x74, 0x37, 0x2E, 0xF8, 0xE2, 0x78, 0x32, 0xF2, 0xEE, 0xFF, \r
-0x78, 0x25, 0xE2, 0x2F, 0xFF, 0x18, 0xE2, 0x34, 0x00, 0x8F, 0x82, 0xF5, 0x83, 0xE0, 0x78, 0x29, \r
-0xF2, 0x78, 0x32, 0xE2, 0xFF, 0xF4, 0xFE, 0x78, 0x29, 0xE2, 0x5E, 0xFE, 0x18, 0xE2, 0xFD, 0xEF, \r
-0x5D, 0x4E, 0xF2, 0x78, 0x24, 0x08, 0xE2, 0xFF, 0x08, 0xE2, 0x2F, 0xFF, 0x78, 0x28, 0xE2, 0xFD, \r
-0x12, 0x32, 0x1E, 0x78, 0x26, 0xE2, 0x04, 0xF2, 0x80, 0xA1, 0xD3, 0x78, 0x25, 0xE2, 0x94, 0xFF, \r
-0x18, 0xE2, 0x94, 0x07, 0x50, 0x69, 0xE4, 0x78, 0x26, 0xF2, 0x78, 0x27, 0xE2, 0xFF, 0x18, 0xE2, \r
-0xFE, 0xC3, 0x9F, 0x40, 0x02, 0x21, 0x85, 0x74, 0x33, 0x2E, 0xF8, 0xE2, 0x78, 0x28, 0xF2, 0x90, \r
-0x82, 0xA2, 0xE0, 0x60, 0x2D, 0x78, 0x26, 0xE2, 0xFF, 0xFD, 0x18, 0xE2, 0x2D, 0xFD, 0x18, 0xE2, \r
-0x34, 0x00, 0x8D, 0x82, 0xF5, 0x83, 0xE0, 0x78, 0x29, 0xF2, 0x74, 0x37, 0x2F, 0xF8, 0xE2, 0x78, \r
-0x32, 0xF2, 0xE2, 0xFF, 0xF4, 0xFE, 0x78, 0x29, 0xE2, 0x5E, 0xFE, 0x18, 0xE2, 0xFD, 0xEF, 0x5D, \r
-0x4E, 0xF2, 0x78, 0x28, 0xE2, 0xFF, 0x78, 0x26, 0xE2, 0xFD, 0x18, 0xE2, 0x2D, 0xFD, 0x18, 0xE2, \r
-0x34, 0x00, 0x8D, 0x82, 0xF5, 0x83, 0xEF, 0xF0, 0x78, 0x26, 0xE2, 0x04, 0xF2, 0x80, 0x9B, 0x90, \r
-0x82, 0xA2, 0xE0, 0x60, 0x0F, 0x78, 0x24, 0xE2, 0xFE, 0x08, 0xE2, 0xFF, 0x12, 0x2D, 0x5C, 0x78, \r
-0x2E, 0x12, 0x44, 0xF4, 0xE4, 0x78, 0x26, 0xF2, 0x78, 0x27, 0xE2, 0xFF, 0x18, 0xE2, 0xFE, 0xC3, \r
-0x9F, 0x50, 0x5D, 0x74, 0x33, 0x2E, 0xF8, 0xE2, 0x78, 0x28, 0xF2, 0x90, 0x82, 0xA2, 0xE0, 0x60, \r
-0x2B, 0x78, 0x2E, 0x12, 0x44, 0xDB, 0x78, 0x26, 0xE2, 0xFB, 0x75, 0xF0, 0x08, 0xA4, 0xF9, 0xF8, \r
-0x12, 0x20, 0xA8, 0x78, 0x29, 0xEF, 0xF2, 0x74, 0x37, 0x2B, 0xF8, 0xE2, 0x78, 0x32, 0xF2, 0xE2, \r
-0xFE, 0xF4, 0x5F, 0xFF, 0x78, 0x28, 0xE2, 0xFD, 0xEE, 0x5D, 0x4F, 0xF2, 0x78, 0x28, 0xE2, 0xFF, \r
-0x78, 0x26, 0xE2, 0xFD, 0xC3, 0x74, 0x03, 0x9D, 0xFD, 0xE4, 0x94, 0x00, 0xFC, 0x7B, 0xFE, 0x74, \r
-0x2A, 0x2D, 0xF9, 0x74, 0x80, 0x3C, 0xFA, 0xEF, 0x12, 0x1F, 0xEA, 0xE2, 0x04, 0xF2, 0x80, 0x98, \r
-0x78, 0x2A, 0x12, 0x44, 0xDB, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xCE, 0x78, 0x24, 0xE2, 0xFE, 0x08, \r
-0xE2, 0xFF, 0x12, 0x2E, 0xA2, 0x22, 0xE4, 0x90, 0x82, 0x50, 0xF0, 0x90, 0x87, 0x5F, 0xE0, 0x90, \r
-0x82, 0x4F, 0xF0, 0xE4, 0x90, 0x82, 0x5C, 0xF0, 0x90, 0x82, 0x4C, 0xF0, 0x90, 0x82, 0x4C, 0xE0, \r
-0xFF, 0xC3, 0x94, 0x40, 0x50, 0x15, 0x74, 0x5F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, \r
-0x74, 0xFF, 0xF0, 0x90, 0x82, 0x4C, 0xE0, 0x04, 0xF0, 0x80, 0xE1, 0xE4, 0x90, 0x82, 0x4C, 0xF0, \r
-0x90, 0x82, 0x4F, 0xE0, 0xFF, 0x90, 0x82, 0x4C, 0xE0, 0xFE, 0xC3, 0x9F, 0x40, 0x02, 0x41, 0x90, \r
-0x74, 0xDF, 0x2E, 0xF9, 0xE4, 0x34, 0x86, 0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, \r
-0x0A, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x41, 0x12, 0x2B, 0xED, 0x90, 0x82, 0x42, 0xE0, 0xFF, 0x12, \r
-0x2F, 0x27, 0xEF, 0x04, 0x90, 0x82, 0x5C, 0xF0, 0x90, 0x82, 0x41, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, \r
-0x12, 0x31, 0xEA, 0xEF, 0x24, 0xC8, 0x90, 0x82, 0x5E, 0xF0, 0x75, 0xF0, 0x08, 0xA4, 0xF0, 0x90, \r
-0x82, 0x42, 0xE0, 0x54, 0x0F, 0x90, 0x82, 0x5D, 0xF0, 0xE4, 0x90, 0x82, 0x4B, 0xF0, 0x90, 0x82, \r
-0x4D, 0xF0, 0x90, 0x82, 0x4D, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x57, 0x90, 0x82, 0x5D, 0xE0, \r
-0xFE, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x13, 0xD8, 0xFC, 0x20, 0xE0, 0x3E, 0x90, 0x82, 0x4D, \r
-0xE0, 0x25, 0xE0, 0xFF, 0x90, 0x82, 0x5E, 0xE0, 0x2F, 0x24, 0x5F, 0xF9, 0xE4, 0x34, 0x82, 0xFA, \r
-0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x01, 0x90, 0x82, 0x4B, 0xE0, 0x75, 0xF0, 0x02, 0xA4, 0x24, 0x43, \r
-0xF9, 0x74, 0x82, 0x35, 0xF0, 0x8B, 0x13, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, 0x02, 0xD0, 0x01, \r
-0xD0, 0x03, 0x12, 0x2B, 0xED, 0x90, 0x82, 0x4B, 0xE0, 0x04, 0xF0, 0x90, 0x82, 0x4D, 0xE0, 0x04, \r
-0xF0, 0x80, 0x9F, 0x90, 0x82, 0x5C, 0xE0, 0xFF, 0x90, 0x82, 0x4C, 0xE0, 0x2F, 0xF0, 0x21, 0xC0, \r
-0xE4, 0x90, 0x82, 0x50, 0xF0, 0x90, 0x82, 0x50, 0xE0, 0xC3, 0x94, 0x40, 0x40, 0x02, 0xA1, 0x2D, \r
-0xE0, 0xFF, 0x24, 0x5F, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0x90, 0x82, 0x52, 0xF0, \r
-0xE0, 0xFE, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFD, 0x90, 0x82, 0x51, 0xF0, 0xEE, 0x54, 0x0F, 0xFE, \r
-0xA3, 0xF0, 0x74, 0x60, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0x90, 0x82, 0x53, \r
-0xF0, 0xFC, 0xEE, 0xFE, 0xEC, 0xFB, 0xEB, 0xFF, 0x90, 0x82, 0x58, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
-0xED, 0x12, 0x45, 0x1E, 0x6B, 0x09, 0x00, 0x6B, 0x40, 0x01, 0x6B, 0xF1, 0x02, 0x6D, 0x1E, 0x03, \r
-0x6C, 0x0C, 0x04, 0x6C, 0x2D, 0x05, 0x6C, 0x2D, 0x06, 0x6C, 0x2D, 0x07, 0x6C, 0x2D, 0x08, 0x6C, \r
-0xB1, 0x09, 0x6C, 0xE7, 0x0A, 0x00, 0x00, 0x6D, 0x2D, 0x90, 0x82, 0x50, 0xE0, 0xFD, 0x24, 0x62, \r
-0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x61, 0x2D, 0xF5, 0x82, 0xE4, 0x34, \r
-0x82, 0xF5, 0x83, 0xE0, 0xFD, 0xED, 0xFF, 0x90, 0x82, 0x5A, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, \r
-0x90, 0x82, 0x53, 0xE0, 0xFF, 0x12, 0x2F, 0x96, 0x90, 0x82, 0x4E, 0x74, 0x02, 0xF0, 0xA1, 0x1E, \r
-0x90, 0x82, 0x50, 0xE0, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, \r
-0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12, 0x20, 0xBB, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, \r
-0x90, 0x82, 0x50, 0xE0, 0x24, 0x61, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, \r
-0xFC, 0xFD, 0xFE, 0x12, 0x44, 0xC2, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x82, \r
-0x50, 0xE0, 0x24, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, \r
-0xFE, 0x78, 0x10, 0x12, 0x20, 0xBB, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, \r
-0xC2, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x82, 0x50, 0xE0, 0x24, 0x64, 0xF5, \r
-0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x18, 0x12, 0x20, \r
-0xBB, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0xC2, 0x90, 0x82, 0x54, 0x12, \r
-0x20, 0xCE, 0x90, 0x82, 0x54, 0x12, 0x44, 0xCF, 0x90, 0x85, 0x96, 0x12, 0x20, 0xCE, 0x90, 0x82, \r
-0x58, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x2E, 0xE4, 0x90, 0x82, 0x4E, 0x74, 0x04, 0xF0, 0xA1, \r
-0x1E, 0x90, 0x82, 0x53, 0xE0, 0xFD, 0x90, 0x82, 0x50, 0xE0, 0x24, 0x61, 0xF5, 0x82, 0xE4, 0x34, \r
-0x82, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x30, 0xC7, 0x80, 0x19, 0x90, 0x82, 0x53, 0xE0, \r
-0xFD, 0x90, 0x82, 0x50, 0xE0, 0x24, 0x61, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFB, \r
-0xE4, 0xFF, 0x12, 0x30, 0x6A, 0x90, 0x82, 0x4E, 0x74, 0x01, 0xF0, 0xA1, 0x1E, 0x90, 0x82, 0x4E, \r
-0x74, 0x02, 0xF0, 0x90, 0x82, 0x50, 0xE0, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, \r
-0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12, 0x20, 0xBB, 0xA8, 0x04, 0xA9, 0x05, 0xAA, \r
-0x06, 0xAB, 0x07, 0x90, 0x82, 0x50, 0xE0, 0x24, 0x61, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, \r
-0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x12, 0x44, 0xC2, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, \r
-0x07, 0x90, 0x82, 0x52, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x10, 0x12, 0x20, 0xBB, 0xD0, \r
-0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0xC2, 0x90, 0x82, 0x54, 0x12, 0x20, 0xCE, \r
-0x90, 0x82, 0x51, 0xE0, 0x24, 0xFB, 0xFF, 0xC0, 0x07, 0x90, 0x82, 0x54, 0x12, 0x44, 0xCF, 0x90, \r
-0x82, 0xDD, 0x12, 0x20, 0xCE, 0x90, 0x82, 0x53, 0xE0, 0xFD, 0xD0, 0x07, 0x12, 0x5C, 0x32, 0x80, \r
-0x6D, 0x90, 0x82, 0x4E, 0x74, 0x01, 0xF0, 0x90, 0x82, 0x50, 0xE0, 0x24, 0x61, 0xF9, 0xE4, 0x34, \r
-0x82, 0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, 0x01, 0x7B, 0xFE, 0x7A, 0x80, 0x79, \r
-0x33, 0x12, 0x2B, 0xED, 0x90, 0x82, 0x53, 0xE0, 0xFF, 0x90, 0x82, 0x52, 0xE0, 0xFD, 0xE4, 0x90, \r
-0x82, 0xA2, 0xF0, 0x7B, 0x04, 0x80, 0x34, 0x90, 0x82, 0x4E, 0x74, 0x04, 0xF0, 0x90, 0x82, 0x50, \r
-0xE0, 0x24, 0x61, 0xF9, 0xE4, 0x34, 0x82, 0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, \r
-0x04, 0x7B, 0xFE, 0x7A, 0x80, 0x79, 0x33, 0x12, 0x2B, 0xED, 0x90, 0x82, 0x53, 0xE0, 0xFF, 0x90, \r
-0x82, 0x52, 0xE0, 0xFD, 0xE4, 0x90, 0x82, 0xA2, 0xF0, 0x7B, 0x06, 0x12, 0x67, 0xE7, 0x90, 0x82, \r
-0x4E, 0xE0, 0x24, 0x02, 0xFF, 0x90, 0x82, 0x50, 0xE0, 0x2F, 0xF0, 0x41, 0x95, 0x22, 0x90, 0x83, \r
-0x03, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x43, 0x27, 0x90, 0x80, 0x3C, 0xE0, 0xFF, 0x90, 0x83, 0x03, \r
-0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x80, 0x3C, 0xF0, 0x22, 0x90, 0x82, 0xB3, 0x74, 0x12, 0xF0, 0x90, \r
-0x82, 0xC1, 0x74, 0x05, 0xF0, 0x90, 0x82, 0xB5, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, \r
-0x90, 0x82, 0xB1, 0xE0, 0x90, 0x82, 0xB8, 0xF0, 0x90, 0x82, 0xB2, 0xE0, 0x90, 0x82, 0xB9, 0xF0, \r
-0x7B, 0x01, 0x7A, 0x82, 0x79, 0xB3, 0xB1, 0x7C, 0x7F, 0x04, 0x80, 0xB2, 0xD3, 0x10, 0xAF, 0x01, \r
-0xC3, 0xC0, 0xD0, 0x90, 0x81, 0x31, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, \r
-0xEF, 0x14, 0xFF, 0x90, 0x81, 0x32, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, \r
-0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01, 0x90, 0x81, \r
-0x32, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x9B, 0xF9, 0x74, 0x80, 0x35, 0xF0, 0xA8, 0x01, 0xFC, \r
-0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x44, 0x79, 0x90, 0x81, 0x32, 0xE0, 0x04, \r
-0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x81, 0x32, \r
-0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0xA8, 0x7F, 0xF5, 0x7E, 0x00, \r
-0x12, 0x2B, 0x27, 0xBF, 0x01, 0x06, 0x90, 0x82, 0xA8, 0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x82, \r
-0x79, 0xA8, 0x7F, 0xF6, 0x7E, 0x00, 0x12, 0x2B, 0x27, 0xBF, 0x01, 0x08, 0x90, 0x82, 0xA8, 0xE0, \r
-0x90, 0x82, 0xAA, 0xF0, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0xA8, 0x7F, 0xF4, 0x7E, 0x00, 0x12, 0x2B, \r
-0x27, 0xBF, 0x01, 0x08, 0x90, 0x82, 0xA8, 0xE0, 0x90, 0x82, 0xAB, 0xF0, 0x7B, 0x01, 0x7A, 0x82, \r
-0x79, 0xA8, 0x7F, 0xF3, 0x7E, 0x00, 0x12, 0x2B, 0x27, 0xBF, 0x01, 0x08, 0x90, 0x82, 0xA8, 0xE0, \r
-0x90, 0x82, 0xAC, 0xF0, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0xA8, 0x7F, 0xF2, 0x7E, 0x00, 0x12, 0x2B, \r
-0x27, 0xBF, 0x01, 0x08, 0x90, 0x82, 0xA8, 0xE0, 0x90, 0x82, 0xAD, 0xF0, 0x90, 0x82, 0xA9, 0xE0, \r
-0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x82, 0xB1, 0xF0, 0x90, 0x82, 0xAD, \r
-0xE0, 0x90, 0x82, 0xB2, 0xF0, 0xA1, 0x49, 0x90, 0x83, 0x04, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x43, \r
-0x27, 0x90, 0x80, 0x3D, 0xE0, 0xFF, 0x90, 0x83, 0x04, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x80, 0x3D, \r
-0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x52, 0x12, 0x1F, 0xA4, 0x25, 0x52, 0x90, 0x80, 0x42, \r
-0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x25, 0x52, 0x90, 0x80, 0x43, 0xF0, 0x90, 0x00, 0x02, \r
-0x12, 0x1F, 0xBD, 0x25, 0x52, 0x90, 0x80, 0x44, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0xBD, 0x25, \r
-0x52, 0x90, 0x80, 0x45, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0xBD, 0x25, 0x52, 0x90, 0x80, 0x46, \r
-0xF0, 0x90, 0x00, 0x05, 0x12, 0x1F, 0xBD, 0x25, 0x52, 0x90, 0x80, 0x47, 0xF0, 0x90, 0x00, 0x06, \r
-0x12, 0x1F, 0xBD, 0x25, 0x52, 0x90, 0x80, 0x48, 0xF0, 0x22, 0x90, 0x82, 0xA8, 0x12, 0x45, 0x15, \r
-0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x7F, 0x90, 0x81, 0x80, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, \r
-0x01, 0xA3, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, \r
-0x90, 0x81, 0x7E, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0xBD, 0x54, 0x01, \r
-0x25, 0xE0, 0xFE, 0x90, 0x81, 0x7C, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, \r
-0xF0, 0xFF, 0x90, 0x81, 0x7E, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, \r
-0x90, 0x81, 0x7F, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x1F, 0xBD, 0x30, 0xE0, 0x5E, 0xC3, 0x13, 0x54, \r
-0x07, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x81, 0x92, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x2E, 0x74, 0x03, \r
-0xF0, 0x90, 0x82, 0xA8, 0x12, 0x45, 0x0C, 0xE9, 0x24, 0x06, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x1F, \r
-0xA4, 0xFF, 0x74, 0x03, 0x24, 0xFD, 0xFE, 0xEF, 0xC4, 0x54, 0x0F, 0xFD, 0xEF, 0x54, 0x0F, 0xFF, \r
-0xED, 0x2E, 0x54, 0x0F, 0xFE, 0xC4, 0x54, 0xF0, 0x4F, 0x12, 0x1F, 0xEA, 0x90, 0x82, 0xA8, 0x12, \r
-0x45, 0x0C, 0x90, 0x00, 0x06, 0x12, 0x1F, 0xBD, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, \r
-0x81, 0x88, 0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x90, 0x82, 0xA8, 0x12, 0x45, \r
-0x0C, 0x90, 0x00, 0x04, 0x12, 0x1F, 0xBD, 0xFD, 0x7F, 0x02, 0x12, 0x4B, 0x09, 0x90, 0x82, 0xA8, \r
-0x12, 0x45, 0x0C, 0x12, 0x76, 0x4D, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0xF0, \r
-0x90, 0x81, 0x80, 0xE0, 0x90, 0x01, 0xBA, 0xF0, 0x90, 0x81, 0x82, 0xE0, 0x90, 0x01, 0xBB, 0xF0, \r
-0x90, 0x81, 0x7E, 0xE0, 0x54, 0x0F, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0x00, 0x02, 0x12, 0x1F, \r
-0xBD, 0xFF, 0x30, 0xE0, 0x26, 0x12, 0x1F, 0xA4, 0x90, 0x82, 0x1F, 0xF0, 0x90, 0x00, 0x01, 0x12, \r
-0x1F, 0xBD, 0x90, 0x82, 0x20, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, \r
-0x90, 0x00, 0x03, 0x12, 0x1F, 0xBD, 0x90, 0x82, 0x22, 0xF0, 0x22, 0x90, 0x82, 0x1F, 0x74, 0x03, \r
-0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, \r
-0x22, 0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x82, 0x26, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, \r
-0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x1F, 0xA4, 0xFE, 0x54, \r
-0x04, 0x25, 0xE0, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0x90, 0x82, 0x26, 0xF0, 0x90, 0x00, 0x01, 0x12, \r
-0x1F, 0xBD, 0xFF, 0x90, 0x05, 0x54, 0xE0, 0xC3, 0x9F, 0x90, 0x82, 0x27, 0xF0, 0xEE, 0x20, 0xE0, \r
-0x09, 0x12, 0x5D, 0x56, 0xE4, 0xFD, 0xFF, 0x12, 0x48, 0xC2, 0x90, 0x82, 0x26, 0xE0, 0xC3, 0x13, \r
-0x30, 0xE0, 0x19, 0x90, 0x81, 0x80, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x81, 0x82, 0xF0, 0x90, 0x81, \r
-0x7D, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x05, 0xF0, 0x22, 0xE4, 0x90, 0x81, 0x80, \r
-0xF0, 0x90, 0x81, 0x82, 0x74, 0x0C, 0xF0, 0x90, 0x81, 0x7C, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0xE0, \r
-0x54, 0xFB, 0xF0, 0x22, 0x12, 0x1F, 0xA4, 0x54, 0x01, 0xFF, 0x90, 0x82, 0x28, 0xE0, 0x54, 0xFE, \r
-0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x90, 0x82, 0x29, 0xF0, 0x90, 0x00, 0x02, 0x12, \r
-0x1F, 0xBD, 0x90, 0x82, 0x2A, 0xF0, 0x90, 0x82, 0x29, 0xE0, 0x90, 0x82, 0x2B, 0xF0, 0x90, 0x82, \r
-0x28, 0xE0, 0x54, 0x01, 0xFF, 0x02, 0x55, 0x33, 0x12, 0x1F, 0xA4, 0x90, 0x82, 0x2D, 0xF0, 0x90, \r
-0x00, 0x01, 0x12, 0x1F, 0xBD, 0x90, 0x82, 0x2E, 0xF0, 0x22, 0x90, 0x00, 0xF1, 0xE0, 0x54, 0xF0, \r
-0xC4, 0x54, 0x0F, 0xFF, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, \r
-0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, \r
-0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, \r
-0x01, 0x98, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0x82, 0x37, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x98, 0xE0, \r
-0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x45, 0xC3, 0x90, 0x82, 0x38, \r
-0xE0, 0x94, 0x88, 0x90, 0x82, 0x37, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, \r
-0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x27, 0x90, 0x82, 0x37, 0xE4, 0x75, 0xF0, \r
-0x01, 0x12, 0x44, 0x9F, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0xD3, 0x90, 0x82, 0x38, 0xE0, \r
-0x94, 0x32, 0x90, 0x82, 0x37, 0xE0, 0x94, 0x00, 0x40, 0xB2, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE3, \r
-0xAB, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x3D, 0xF5, 0x41, \r
-0xA3, 0xE0, 0x55, 0x3E, 0xF5, 0x42, 0xA3, 0xE0, 0x55, 0x3F, 0xF5, 0x43, 0xA3, 0xE0, 0x55, 0x40, \r
-0xF5, 0x44, 0x90, 0x01, 0x34, 0xE5, 0x41, 0xF0, 0xA3, 0xE5, 0x42, 0xF0, 0xA3, 0xE5, 0x43, 0xF0, \r
-0xA3, 0xE5, 0x44, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x45, 0xF5, 0x49, 0xA3, 0xE0, 0x55, \r
-0x46, 0xF5, 0x4A, 0xA3, 0xE0, 0x55, 0x47, 0xF5, 0x4B, 0xA3, 0xE0, 0x55, 0x48, 0xF5, 0x4C, 0x90, \r
-0x01, 0x3C, 0xE5, 0x49, 0xF0, 0xA3, 0xE5, 0x4A, 0xF0, 0xA3, 0xE5, 0x4B, 0xF0, 0xA3, 0xE5, 0x4C, \r
-0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0x82, 0x2E, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, \r
-0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x77, 0xE0, 0x30, 0xE0, \r
-0x11, 0xA3, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x77, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x03, 0x12, \r
-0x5F, 0x66, 0x51, 0x48, 0x90, 0x82, 0x26, 0xE0, 0x30, 0xE0, 0x1C, 0xE4, 0xFD, 0xFF, 0x12, 0x48, \r
-0xC2, 0x12, 0x5D, 0x56, 0x90, 0x82, 0x26, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x03, 0x12, 0x4B, 0x05, \r
-0x90, 0x82, 0x26, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE4, 0xF5, 0x4E, 0x90, 0x81, 0x80, 0xE0, 0x70, \r
-0x02, 0x61, 0x06, 0x90, 0x81, 0x36, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x61, 0x06, 0x90, 0x81, 0x7C, \r
-0xE0, 0x30, 0xE0, 0x1D, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, \r
-0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x81, 0xB5, 0xEE, 0xF0, 0xA3, 0xEF, \r
-0xF0, 0x90, 0x81, 0x7E, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, \r
-0x70, 0x1E, 0x90, 0x81, 0x87, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x81, 0x89, 0xE0, \r
-0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0x81, 0x86, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x4E, 0x01, \r
-0x90, 0x81, 0x77, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0x81, 0x7B, 0xE0, 0xB4, 0x02, 0x03, 0xE4, 0xF5, \r
-0x4E, 0x12, 0x47, 0xD4, 0xEF, 0x70, 0x02, 0xF5, 0x4E, 0xE5, 0x4E, 0x60, 0x39, 0x90, 0x81, 0x84, \r
-0xE0, 0x44, 0x10, 0xF0, 0x90, 0x81, 0x89, 0xE0, 0x60, 0x03, 0xB4, 0x01, 0x09, 0xE4, 0xF5, 0x1D, \r
-0x90, 0x81, 0x89, 0xE0, 0x80, 0x0D, 0xE4, 0xF5, 0x1D, 0x90, 0x81, 0x89, 0xE0, 0x75, 0xF0, 0x03, \r
-0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x81, 0x88, 0xE0, 0x2F, 0x12, 0x64, 0x2F, 0x90, 0x81, 0x83, 0xE0, \r
-0x20, 0xE2, 0x03, 0x12, 0x48, 0xCD, 0x22, 0x90, 0x81, 0x36, 0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, \r
-0x81, 0x80, 0xE0, 0x60, 0x20, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, \r
-0x90, 0x81, 0x7C, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x81, 0x84, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, \r
-0x70, 0x03, 0x12, 0x47, 0x9F, 0x22, 0x90, 0x81, 0x80, 0xE0, 0x70, 0x07, 0x90, 0x81, 0x77, 0xE0, \r
-0x30, 0xE0, 0x12, 0x90, 0x81, 0x77, 0xE0, 0x30, 0xE0, 0x08, 0x12, 0x47, 0xD4, 0xBF, 0x01, 0x05, \r
-0x80, 0x04, 0x12, 0x4C, 0x88, 0x22, 0x90, 0x81, 0x80, 0xE0, 0x64, 0x02, 0x60, 0x14, 0x90, 0x81, \r
-0x7E, 0xE0, 0x54, 0x0F, 0x60, 0x0C, 0x12, 0x57, 0xA3, 0xEF, 0x70, 0x06, 0xFD, 0x7F, 0x0C, 0x12, \r
-0x48, 0xD1, 0x22, 0x90, 0x81, 0x77, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0F, \r
-0x90, 0x81, 0x7B, 0xE0, 0x64, 0x02, 0x60, 0x07, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x48, 0xD1, 0x90, \r
-0x81, 0x7B, 0xE0, 0x64, 0x02, 0x60, 0x02, 0x71, 0x56, 0x22, 0x90, 0x81, 0x77, 0xE0, 0xFF, 0x30, \r
-0xE0, 0x3E, 0x90, 0x81, 0x7B, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0x81, 0x7A, \r
-0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x24, 0xEF, 0xC3, 0x13, 0x30, \r
-0xE0, 0x03, 0x02, 0x5F, 0x66, 0x71, 0x73, 0x90, 0x81, 0x7B, 0xE0, 0xB4, 0x08, 0x06, 0xE4, 0xFD, \r
-0x7F, 0x0C, 0x80, 0x09, 0x90, 0x81, 0x7B, 0xE0, 0x70, 0x06, 0xFD, 0x7F, 0x04, 0x12, 0x48, 0xD1, \r
-0x22, 0x90, 0x81, 0x80, 0xE0, 0x60, 0x13, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x02, 0x80, 0x0B, \r
-0x90, 0x81, 0x7C, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x47, 0x9F, 0x22, 0x90, 0x81, 0x7C, 0xE0, 0x13, \r
-0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, \r
-0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0xF5, 0x1D, 0x90, 0x82, 0x21, 0xE0, 0xC3, \r
-0x13, 0x54, 0x7F, 0xF5, 0x1E, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x64, 0x38, 0x90, \r
-0x81, 0x7C, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x91, 0xAA, 0x90, 0x82, 0x33, 0xEF, 0xF0, 0x30, 0xE0, \r
-0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x4B, 0x09, 0x90, 0x82, 0x33, 0xE0, \r
-0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, \r
-0x2F, 0x74, 0x80, 0xF0, 0x90, 0x81, 0x7C, 0xE0, 0x30, 0xE0, 0x25, 0x90, 0x81, 0xB7, 0xE0, 0x24, \r
-0x04, 0xFF, 0x90, 0x81, 0x92, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0xFF, 0x90, 0x81, 0x95, 0xF0, 0x90, \r
-0x81, 0x8B, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0xEC, 0xE0, 0x54, 0xDD, 0xF0, 0x80, 0x10, \r
-0x90, 0x81, 0x8B, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0x04, 0xEC, 0xE0, 0x44, 0x22, 0xF0, \r
-0x90, 0x81, 0x8B, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0xE4, 0x90, 0x82, 0x34, 0xF0, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0x90, 0x82, 0x34, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xFE, \r
-0x90, 0x82, 0x34, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x82, 0x36, 0xE0, 0x94, 0x64, \r
-0x90, 0x82, 0x35, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, \r
-0x82, 0x34, 0xE0, 0xFF, 0x22, 0x90, 0x82, 0x35, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x44, 0x9F, 0x80, \r
-0xC2, 0x90, 0x82, 0x2D, 0xE0, 0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x01, 0xF0, \r
-0x90, 0x05, 0xFD, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x81, 0x77, 0xE0, 0xFF, 0x30, 0xE0, 0x3F, 0x90, \r
-0x81, 0x7B, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0x81, 0x7A, 0xE0, 0x7D, 0x00, \r
-0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x25, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x03, 0x02, \r
-0x5F, 0x66, 0xB1, 0x4F, 0x90, 0x81, 0x7B, 0xE0, 0xB4, 0x0C, 0x06, 0xE4, 0xFD, 0x7F, 0x08, 0x80, \r
-0x0A, 0x90, 0x81, 0x7B, 0xE0, 0xB4, 0x04, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x48, 0xD1, 0x22, 0x90, \r
-0x01, 0x57, 0xE0, 0x60, 0x48, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x81, 0x7C, \r
-0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0x81, 0x84, \r
-0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x81, 0x89, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x84, 0xE0, 0x54, \r
-0xEF, 0xF0, 0x90, 0x82, 0x1F, 0xE0, 0xFF, 0x90, 0x81, 0x89, 0xE0, 0xD3, 0x9F, 0x40, 0x0E, 0x90, \r
-0x81, 0x36, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0x81, 0x7D, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x90, 0x81, \r
-0x7C, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x27, 0xEF, 0x54, 0xBF, 0xF0, 0x90, \r
-0x04, 0xE0, 0xE0, 0x90, 0x81, 0x7D, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x10, 0xE0, \r
-0x54, 0xFE, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x12, \r
-0x47, 0x9F, 0x22, 0x90, 0x81, 0x7C, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, \r
-0x2C, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x81, 0x7D, 0x30, 0xE1, 0x06, 0xE0, \r
-0x44, 0x02, 0xF0, 0x80, 0x0F, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, \r
-0x01, 0xB8, 0x04, 0xF0, 0x90, 0x81, 0x80, 0xE0, 0x60, 0x03, 0x12, 0x47, 0x9F, 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, 0x90, 0x81, 0x7C, 0xE0, \r
-0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x81, 0x89, 0xF0, 0x90, 0x81, 0x84, 0xF0, 0x22, 0x90, 0x82, 0xAB, \r
-0x12, 0x45, 0x15, 0xD1, 0x3C, 0x90, 0x81, 0x80, 0xE0, 0xFF, 0x12, 0x55, 0x8C, 0x90, 0x81, 0x80, \r
-0xE0, 0x60, 0x18, 0x90, 0x82, 0xAB, 0x12, 0x45, 0x0C, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x54, \r
-0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0xFD, 0xD1, 0x7C, 0x22, 0xEF, 0x24, 0xFE, 0x60, \r
-0x0B, 0x04, 0x70, 0x27, 0x90, 0x81, 0x86, 0x74, 0x02, 0xF0, 0x80, 0x16, 0xED, 0x70, 0x0A, 0x90, \r
-0x82, 0x22, 0xE0, 0x90, 0x81, 0x86, 0xF0, 0x80, 0x05, 0x90, 0x81, 0x86, 0xED, 0xF0, 0x90, 0x81, \r
-0x86, 0xE0, 0xA3, 0xF0, 0x90, 0x81, 0x7D, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x12, 0x57, 0xA3, 0xEF, \r
-0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x67, 0x90, 0x81, 0x84, 0xE0, \r
-0xFF, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x56, 0x90, 0x81, 0x82, \r
-0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x44, 0xEF, \r
-0x30, 0xE2, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x38, 0x90, 0x81, 0x84, 0xE0, 0x30, \r
-0xE4, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, 0x29, 0x90, 0x81, 0x7D, 0xE0, 0x13, 0x13, \r
-0x54, 0x3F, 0x20, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x20, 0xF0, 0x80, 0x16, 0x90, 0x82, 0x25, \r
-0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x80, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, \r
-0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x7D, 0x2E, 0x7F, 0x6F, \r
-0x12, 0x48, 0xC2, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x4B, 0x09, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, \r
-0xF0, 0x90, 0x81, 0x7B, 0x74, 0x02, 0xF0, 0x22, 0xE4, 0x90, 0x82, 0x33, 0xF0, 0x90, 0x81, 0x80, \r
-0xE0, 0x60, 0x4F, 0x90, 0x81, 0x36, 0xE0, 0x64, 0x01, 0x70, 0x47, 0x90, 0x82, 0x33, 0x04, 0xF0, \r
-0xE4, 0x90, 0x81, 0x87, 0xF0, 0x90, 0x81, 0x77, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x81, 0x7B, 0xE0, \r
-0xB4, 0x02, 0x05, 0xE4, 0x90, 0x82, 0x33, 0xF0, 0x12, 0x47, 0xD4, 0xEF, 0x70, 0x04, 0x90, 0x82, \r
-0x33, 0xF0, 0x90, 0x82, 0x33, 0xE0, 0x60, 0x1A, 0x90, 0x81, 0x84, 0xE0, 0x44, 0x10, 0xF0, 0xE4, \r
-0xF5, 0x1D, 0x90, 0x81, 0x88, 0x12, 0x64, 0x2E, 0x90, 0x81, 0x83, 0xE0, 0x20, 0xE2, 0x03, 0x12, \r
-0x48, 0xCD, 0x22, 0xE4, 0xFF, 0x74, 0x98, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE4, \r
-0xF0, 0x0F, 0xEF, 0xB4, 0x19, 0xEF, 0xE4, 0x90, 0x81, 0x93, 0xF0, 0x90, 0x81, 0x97, 0xF0, 0x90, \r
-0x81, 0x91, 0xF0, 0x22, 0x90, 0x81, 0x7C, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11, \r
-0xEF, 0x54, 0xFB, 0xF0, 0x90, 0x81, 0x84, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x2E, 0x80, \r
-0x29, 0x90, 0x81, 0x89, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x84, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x82, \r
-0x1F, 0xE0, 0xFF, 0x90, 0x81, 0x89, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90, 0x81, 0x36, 0xE0, 0xB4, \r
-0x01, 0x0B, 0x90, 0x81, 0x7D, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x47, 0x9F, 0x22, 0x22, 0x90, \r
-0x83, 0x02, 0xE0, 0x60, 0x4C, 0x90, 0x82, 0x26, 0xE0, 0x30, 0xE0, 0x45, 0x90, 0x83, 0x01, 0xE0, \r
-0x04, 0xF0, 0xE0, 0xD3, 0x94, 0xC8, 0x40, 0x39, 0x90, 0x81, 0x8A, 0x74, 0xD0, 0xF0, 0x90, 0x00, \r
-0xCC, 0xE0, 0x44, 0x04, 0xFD, 0x7F, 0xCC, 0x12, 0x32, 0x1E, 0x90, 0x00, 0x02, 0xE0, 0x54, 0xFB, \r
-0xFD, 0x7F, 0x02, 0x12, 0x32, 0x1E, 0xE4, 0x90, 0x83, 0x02, 0xF0, 0x90, 0x82, 0x26, 0xE0, 0xC3, \r
-0x13, 0x30, 0xE0, 0x0D, 0x90, 0x81, 0x7C, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x81, 0x8A, 0x74, 0xD0, \r
-0xF0, 0x22, 0x7D, 0x1F, 0x7F, 0x6F, 0x12, 0x48, 0xC2, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, \r
-0x90, 0x81, 0x7A, 0x74, 0x04, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x81, \r
-0x7A, 0xE0, 0x90, 0x83, 0x08, 0xF0, 0x6F, 0x70, 0x02, 0x21, 0x87, 0xEF, 0x14, 0x60, 0x46, 0x14, \r
-0x60, 0x73, 0x14, 0x70, 0x02, 0x21, 0x32, 0x14, 0x70, 0x02, 0x21, 0x5E, 0x24, 0x04, 0x60, 0x02, \r
-0x21, 0x87, 0x90, 0x83, 0x08, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0x5F, 0xD4, 0x21, 0x87, 0x90, 0x83, \r
-0x08, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0x5F, 0xC5, 0x21, 0x87, 0x90, 0x83, 0x08, 0xE0, 0xB4, 0x03, \r
-0x05, 0x12, 0x5F, 0xD9, 0x21, 0x87, 0x90, 0x83, 0x08, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x21, 0x87, \r
-0x12, 0x5F, 0xC7, 0x21, 0x87, 0x90, 0x83, 0x08, 0xE0, 0xB4, 0x04, 0x04, 0x31, 0xBF, 0x21, 0x87, \r
-0x90, 0x83, 0x08, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0x5F, 0xB6, 0x21, 0x87, 0x90, 0x83, 0x08, 0xE0, \r
-0xB4, 0x03, 0x05, 0x12, 0x5F, 0xDD, 0x21, 0x87, 0x90, 0x83, 0x08, 0xE0, 0x60, 0x02, 0x21, 0x87, \r
-0x12, 0x4F, 0xF3, 0x21, 0x87, 0x90, 0x83, 0x08, 0xE0, 0xB4, 0x04, 0x04, 0x31, 0xAC, 0x80, 0x77, \r
-0x90, 0x83, 0x08, 0xE0, 0xB4, 0x01, 0x05, 0x12, 0x4F, 0xE3, 0x80, 0x6B, 0x90, 0x83, 0x08, 0xE0, \r
-0xB4, 0x03, 0x04, 0x31, 0xA2, 0x80, 0x60, 0x90, 0x83, 0x08, 0xE0, 0x70, 0x5A, 0x12, 0x4F, 0xEF, \r
-0x80, 0x55, 0x90, 0x83, 0x08, 0xE0, 0xB4, 0x04, 0x04, 0x31, 0xD3, 0x80, 0x4A, 0x90, 0x83, 0x08, \r
-0xE0, 0xB4, 0x01, 0x04, 0x31, 0x94, 0x80, 0x3F, 0x90, 0x83, 0x08, 0xE0, 0xB4, 0x02, 0x05, 0x12, \r
-0x5F, 0x9E, 0x80, 0x33, 0x90, 0x83, 0x08, 0xE0, 0x70, 0x2D, 0x31, 0x91, 0x80, 0x29, 0x90, 0x83, \r
-0x08, 0xE0, 0xB4, 0x03, 0x04, 0x31, 0xE8, 0x80, 0x1E, 0x90, 0x83, 0x08, 0xE0, 0xB4, 0x01, 0x04, \r
-0x11, 0x62, 0x80, 0x13, 0x90, 0x83, 0x08, 0xE0, 0xB4, 0x02, 0x04, 0x31, 0xFD, 0x80, 0x08, 0x90, \r
-0x83, 0x08, 0xE0, 0x70, 0x02, 0x31, 0x8C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x4F, 0xF3, 0x01, \r
-0x62, 0x12, 0x4F, 0xF3, 0x7D, 0x21, 0x7F, 0xFF, 0x12, 0x48, 0xC2, 0x90, 0x81, 0x7A, 0x74, 0x03, \r
-0xF0, 0x22, 0x12, 0x4C, 0xC8, 0x90, 0x81, 0x7A, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, \r
-0x44, 0x40, 0xF0, 0x7D, 0x23, 0x12, 0x4C, 0xC4, 0x90, 0x81, 0x7A, 0x74, 0x02, 0xF0, 0x22, 0xE4, \r
-0xFD, 0xFF, 0x12, 0x48, 0xC2, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x81, 0x7A, 0x74, \r
-0x01, 0xF0, 0x22, 0x7D, 0x22, 0x7F, 0xFF, 0x12, 0x48, 0xC2, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, \r
-0xF0, 0x90, 0x81, 0x7A, 0x74, 0x03, 0xF0, 0x22, 0x7D, 0x25, 0x7F, 0x6F, 0x12, 0x48, 0xC2, 0x90, \r
-0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x81, 0x7A, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x5D, 0x56, \r
-0x7D, 0x24, 0x7F, 0x6F, 0x12, 0x48, 0xC2, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x81, \r
-0x7A, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x80, 0x44, 0xE0, 0xFF, 0x90, 0x82, 0xE2, 0xE0, 0xFB, 0x7D, \r
-0x01, 0x12, 0x4F, 0x3A, 0x90, 0x82, 0xE3, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x82, \r
-0xE1, 0xE0, 0xFF, 0x12, 0x4E, 0xEF, 0x90, 0x82, 0xE3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x04, \r
-0x80, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
-0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
-0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
-0x44, 0xFA, 0xF0, 0x74, 0x15, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, \r
-0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0F, \r
-0xF0, 0x90, 0x04, 0x53, 0xE4, 0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, 0x74, 0xFF, 0xF0, \r
-0x90, 0x04, 0x50, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
-0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, \r
-0xF0, 0x22, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, \r
-0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0xC6, 0xBE,  \r
-};\r
-u4Byte ArrayLength_MP_8188E_FW_NIC_T = 15096;\r
-\r
-\r
-void\r
-ODM_ReadFirmware_MP_8188E_FW_NIC_T(\r
-     IN   PDM_ODM_T    pDM_Odm,\r
-     OUT  u1Byte       *pFirmware,\r
-     OUT  u4Byte       *pFirmwareSize\r
-)\r
-{\r
-#if(DM_ODM_SUPPORT_TYPE & (ODM_CE))\r
-       *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8188E_FW_NIC_T;\r
-#else\r
-       ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8188E_FW_NIC_T, ArrayLength_MP_8188E_FW_NIC_T);\r
-#endif\r
-       *pFirmwareSize = ArrayLength_MP_8188E_FW_NIC_T;\r
-}\r
-\r
-\r
-u1Byte Array_MP_8188E_FW_WoWLAN_S[] = {\r
-0xE2, 0x88, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x02, 0x22, 0x10, 0x14, 0x26, 0x43, 0x02, 0x00, \r
-0xCD, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x02, 0x4E, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x4F, 0xFD, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x4F, 0xAD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x57, 0xF3, 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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0xE7, 0x09, 0xF6, 0x08, 0xDF, 0xFA, 0x80, 0x46, 0xE7, 0x09, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x3E, \r
-0x88, 0x82, 0x8C, 0x83, 0xE7, 0x09, 0xF0, 0xA3, 0xDF, 0xFA, 0x80, 0x32, 0xE3, 0x09, 0xF6, 0x08, \r
-0xDF, 0xFA, 0x80, 0x78, 0xE3, 0x09, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x70, 0x88, 0x82, 0x8C, 0x83, \r
-0xE3, 0x09, 0xF0, 0xA3, 0xDF, 0xFA, 0x80, 0x64, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xA3, 0xF6, 0x08, \r
-0xDF, 0xFA, 0x80, 0x58, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xA3, 0xF2, 0x08, 0xDF, 0xFA, 0x80, 0x4C, \r
-0x80, 0xD2, 0x80, 0xFA, 0x80, 0xC6, 0x80, 0xD4, 0x80, 0x69, 0x80, 0xF2, 0x80, 0x33, 0x80, 0x10, \r
-0x80, 0xA6, 0x80, 0xEA, 0x80, 0x9A, 0x80, 0xA8, 0x80, 0xDA, 0x80, 0xE2, 0x80, 0xCA, 0x80, 0x33, \r
-0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, \r
-0xCC, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, \r
-0x0D, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xA3, 0xF6, 0x08, 0xDF, 0xF9, 0xEC, 0xFA, 0xA9, 0xF0, \r
-0xED, 0xFB, 0x22, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, \r
-0xC5, 0x83, 0xCC, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xEA, 0xDE, \r
-0xE8, 0x80, 0xDB, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xA3, 0xF2, 0x08, 0xDF, 0xF9, 0x80, 0xCC, \r
-0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, 0x60, 0xC3, 0x88, 0xF0, 0xED, 0x24, 0x02, 0xB4, 0x04, \r
-0x00, 0x50, 0xB9, 0xF5, 0x82, 0xEB, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0xAF, 0x23, 0x23, 0x45, \r
-0x82, 0x23, 0x90, 0x48, 0x50, 0x73, 0xBB, 0x01, 0x09, 0x89, 0x82, 0x8A, 0x83, 0xF8, 0xE0, 0x28, \r
-0xF0, 0x22, 0x50, 0x03, 0x27, 0xF7, 0x22, 0xBB, 0xFE, 0x05, 0xF8, 0xE3, 0x28, 0xF3, 0x22, 0x8A, \r
-0x83, 0x89, 0x82, 0xF8, 0xE4, 0x93, 0x28, 0x22, 0xBB, 0x01, 0x0F, 0xF8, 0xE5, 0x82, 0x29, 0xF5, \r
-0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x28, 0xF0, 0x22, 0x50, 0x09, 0xC5, 0x82, 0x29, 0xF8, \r
-0xE5, 0x82, 0x26, 0xF6, 0x22, 0xBB, 0xFE, 0x09, 0xC5, 0x82, 0x29, 0xF8, 0xE2, 0x25, 0x82, 0xF2, \r
-0x22, 0xF8, 0xEA, 0x25, 0x83, 0xF5, 0x83, 0xE9, 0x93, 0x28, 0x22, 0xC5, 0xF0, 0xF8, 0xA3, 0xE0, \r
-0x28, 0xF0, 0xC5, 0xF0, 0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0x38, 0xF0, \r
-0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xE0, 0xFC, \r
-0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xA4, 0x25, 0x82, 0xF5, 0x82, 0xE5, \r
-0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, \r
-0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xBB, 0x01, 0x1A, 0x89, 0x82, 0x8A, 0x83, 0xD0, \r
-0xF0, 0xD0, 0xE0, 0xF8, 0xD0, 0xE0, 0xF9, 0xD0, 0xE0, 0xFA, 0xD0, 0xE0, 0xFB, 0xE8, 0xC0, 0xE0, \r
-0xC0, 0xF0, 0x02, 0x49, 0x8F, 0x50, 0x16, 0xE9, 0xF8, 0xD0, 0x83, 0xD0, 0x82, 0xD0, 0xE0, 0xF9, \r
-0xD0, 0xE0, 0xFA, 0xD0, 0xE0, 0xFB, 0xC0, 0x82, 0xC0, 0x83, 0x02, 0x4C, 0x3C, 0xBB, 0xFE, 0x16, \r
-0xE9, 0xF8, 0xD0, 0x83, 0xD0, 0x82, 0xD0, 0xE0, 0xF9, 0xD0, 0xE0, 0xFA, 0xD0, 0xE0, 0xFB, 0xC0, \r
-0x82, 0xC0, 0x83, 0x02, 0x4C, 0x45, 0x22, 0xBB, 0x01, 0x20, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, \r
-0x83, 0x3A, 0xF5, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0xF8, 0xD0, 0xE0, 0xF9, 0xD0, 0xE0, 0xFA, 0xD0, \r
-0xE0, 0xFB, 0xE8, 0xC0, 0xE0, 0xC0, 0xF0, 0x02, 0x49, 0x8F, 0x50, 0x18, 0xE9, 0x25, 0x82, 0xF8, \r
-0xD0, 0x83, 0xD0, 0x82, 0xD0, 0xE0, 0xF9, 0xD0, 0xE0, 0xFA, 0xD0, 0xE0, 0xFB, 0xC0, 0x82, 0xC0, \r
-0x83, 0x02, 0x4C, 0x3C, 0xBB, 0xFE, 0x18, 0xE9, 0x25, 0x82, 0xF8, 0xD0, 0x83, 0xD0, 0x82, 0xD0, \r
-0xE0, 0xF9, 0xD0, 0xE0, 0xFA, 0xD0, 0xE0, 0xFB, 0xC0, 0x82, 0xC0, 0x83, 0x02, 0x4C, 0x45, 0x22, \r
-0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, \r
-0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, \r
-0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xE3, 0xF5, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, 0x6B, 0xDF, \r
-0xF5, 0x80, 0x67, 0xE3, 0xF5, 0xF0, 0x09, 0xE6, 0x08, 0xB5, 0xF0, 0x5E, 0xDF, 0xF5, 0x80, 0x5A, \r
-0x87, 0xF0, 0x09, 0xE6, 0x08, 0xB5, 0xF0, 0x52, 0xDF, 0xF6, 0x80, 0x4E, 0x87, 0xF0, 0x09, 0xE2, \r
-0x08, 0xB5, 0xF0, 0x46, 0xDF, 0xF6, 0x80, 0x42, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE0, \r
-0xA3, 0xB5, 0xF0, 0x36, 0xDF, 0xF6, 0x80, 0x32, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE4, \r
-0x93, 0xA3, 0xB5, 0xF0, 0x25, 0xDF, 0xF5, 0x80, 0x21, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, \r
-0x09, 0xE0, 0xA3, 0xB5, 0xF0, 0x14, 0xDF, 0xF5, 0x80, 0x10, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, \r
-0xF0, 0x09, 0xE4, 0x93, 0xA3, 0xB5, 0xF0, 0x02, 0xDF, 0xF4, 0x02, 0x4B, 0x95, 0x80, 0x87, 0x80, \r
-0xE9, 0x80, 0x90, 0x80, 0xD4, 0x80, 0x3E, 0x80, 0x15, 0x80, 0x6E, 0x80, 0x7E, 0x80, 0x9D, 0x80, \r
-0xB7, 0x80, 0x8D, 0x80, 0xA3, 0x80, 0x51, 0x80, 0x74, 0x80, 0x3C, 0x02, 0x4B, 0xA1, 0x89, 0x82, \r
-0x8A, 0x83, 0xEC, 0xFA, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, \r
-0xCC, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x76, 0xDF, \r
-0xE3, 0xDE, 0xE1, 0x80, 0x70, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, \r
-0xB5, 0xF0, 0x62, 0xDF, 0xF4, 0x80, 0x5E, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE6, \r
-0x08, 0xB5, 0xF0, 0x51, 0xDF, 0xF5, 0x80, 0x4D, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, \r
-0xE2, 0x08, 0xB5, 0xF0, 0x40, 0xDF, 0xF5, 0x80, 0x3C, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, \r
-0xF0, 0xA3, 0xE6, 0x08, 0xB5, 0xF0, 0x2E, 0xDF, 0xF4, 0x80, 0x2A, 0x80, 0x02, 0x80, 0x57, 0x89, \r
-0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, \r
-0x83, 0xCC, 0xE0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x06, 0xDF, \r
-0xE4, 0xDE, 0xE2, 0x80, 0x00, 0x7F, 0xFF, 0xB5, 0xF0, 0x02, 0x0F, 0x22, 0x40, 0x02, 0x7F, 0x01, \r
-0x22, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, \r
-0xC5, 0x83, 0xCC, 0xE0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0xD5, \r
-0xDF, 0xE5, 0xDE, 0xE3, 0x80, 0xCF, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, \r
-0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, \r
-0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0xAF, 0xDF, 0xE4, 0xDE, 0xE2, 0x80, 0xA9, 0x88, 0xF0, 0xEF, 0x60, \r
-0x01, 0x0E, 0x4E, 0x60, 0xAB, 0xED, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0x98, 0xF5, 0x82, 0xEB, \r
-0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0x8E, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x4A, 0xDD, 0x73, \r
-0xEF, 0x4E, 0x60, 0x12, 0xEF, 0x60, 0x01, 0x0E, 0xED, 0xBB, 0x01, 0x0B, 0x89, 0x82, 0x8A, 0x83, \r
-0xF0, 0xA3, 0xDF, 0xFC, 0xDE, 0xFA, 0x22, 0x89, 0xF0, 0x50, 0x07, 0xF7, 0x09, 0xDF, 0xFC, 0xA9, \r
-0xF0, 0x22, 0xBB, 0xFE, 0xFC, 0xF3, 0x09, 0xDF, 0xFC, 0xA9, 0xF0, 0x22, 0xEB, 0xF6, 0x08, 0xEA, \r
-0xF6, 0x08, 0xE9, 0xF6, 0x22, 0xEB, 0xF2, 0x08, 0xEA, 0xF2, 0x08, 0xE9, 0xF2, 0x22, 0xC2, 0xAF, \r
-0x80, 0xFE, 0x32, 0x12, 0x4C, 0x52, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, 0xC2, 0x8C, \r
-0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, 0xEC, 0x24, \r
-0x8B, 0xF8, 0xE6, 0xBC, 0x04, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, 0x40, 0xCE, \r
-0x79, 0x05, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, 0x03, 0x44, \r
-0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, 0x23, 0x24, \r
-0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x05, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, 0xE4, 0xF2, \r
-0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x8A, 0x25, 0x0C, 0xF8, 0xE6, 0xFD, \r
-0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x04, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, 0x6D, 0x60, \r
-0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, 0x0C, 0x24, \r
-0x8B, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x04, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, 0xF8, 0xE5, \r
-0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x8A, 0xC8, 0xF6, \r
-0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, 0xE6, 0x30, \r
-0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, 0x08, 0x54, \r
-0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x8A, 0xA6, 0x81, 0x74, \r
-0x04, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x05, 0xE4, 0x78, 0x80, 0xF6, 0x08, \r
-0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x4F, 0xA3, 0x74, 0x01, 0x93, 0xC0, 0xE0, \r
-0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, 0x8C, 0xD2, \r
-0xAF, 0x22, 0x04, 0xEF, 0xD3, 0x94, 0x04, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, 0x2F, 0x2F, \r
-0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, 0x0C, 0xEE, \r
-0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x8A, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, 0xBE, 0x04, \r
-0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, 0x09, 0x80, \r
-0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, 0xEE, 0xD3, \r
-0x9F, 0x40, 0x22, 0x74, 0x8A, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, 0xA9, 0x81, \r
-0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, 0xF7, 0x19, \r
-0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x8A, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, 0x04, 0x90, \r
-0x4F, 0xA3, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x04, \r
-0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, 0xC2, 0xAF, \r
-0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x8A, 0x2F, 0xF8, 0xE6, \r
-0xF5, 0x81, 0x02, 0x4C, 0x9B, 0x50, 0x2E, 0x74, 0x8B, 0x2F, 0xF8, 0xE6, 0xBF, 0x04, 0x02, 0x74, \r
-0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x8A, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, 0x60, 0x08, \r
-0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, 0x0C, 0xB5, \r
-0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x8B, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, 0x0F, 0x74, \r
-0x8A, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, 0x81, 0xED, \r
-0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, 0x07, 0xDE, \r
-0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x04, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, \r
-0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, 0xD2, 0xE2, \r
-0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x4C, 0x9A, 0x8F, 0xF0, 0xE4, 0xFF, \r
-0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, 0xE6, 0x60, \r
-0x0B, 0x2D, 0xF6, 0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, 0x60, 0x25, \r
-0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30, 0xE2, 0x0C, \r
-0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC, 0x4E, 0xF6, \r
-0xD2, 0xAF, 0x02, 0x4C, 0x9B, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, 0x56, 0xC6, \r
-0xD2, 0xAF, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0x02, 0x4F, 0x35, 0x02, 0x4D, 0x2B, 0xE4, 0x93, 0xA3, \r
-0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, \r
-0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, \r
-0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, \r
-0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x4F, 0x7A, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, \r
-0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, \r
-0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, \r
-0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, \r
-0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x00, 0x41, 0x83, 0xA7, 0x00, 0x41, \r
-0x83, 0xA8, 0x00, 0x41, 0x83, 0xB3, 0x00, 0x44, 0x83, 0x4F, 0x00, 0x50, 0xF2, 0x01, 0x44, 0x83, \r
-0x53, 0x00, 0x0F, 0xAC, 0x01, 0x44, 0x83, 0x57, 0x00, 0x0F, 0xAC, 0x03, 0x44, 0x83, 0x5B, 0x00, \r
-0x0F, 0xAC, 0x04, 0x59, 0x92, 0x60, 0xED, 0x61, 0x0B, 0x62, 0x4F, 0x63, 0x74, 0xC0, 0xE0, 0xC0, \r
-0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, \r
-0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xAD, 0xF0, \r
-0x74, 0x4F, 0xA3, 0xF0, 0x12, 0x6C, 0x7D, 0x74, 0xAD, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x4F, \r
-0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, \r
-0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, \r
-0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, \r
-0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xFD, 0xF0, \r
-0x74, 0x4F, 0xA3, 0xF0, 0x12, 0x6C, 0xB7, 0xE5, 0x41, 0x30, 0xE3, 0x02, 0xF1, 0xE6, 0xE5, 0x41, \r
-0x30, 0xE4, 0x05, 0x7F, 0x02, 0x12, 0x4E, 0x75, 0xE5, 0x43, 0x30, 0xE1, 0x02, 0x11, 0x65, 0x74, \r
-0xFD, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x4F, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, \r
-0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, \r
-0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x51, 0x2B, 0x90, 0x81, 0xFB, 0xE0, 0x30, 0xE0, 0x2D, 0x90, 0x80, \r
-0xA3, 0xE0, 0xB4, 0x01, 0x26, 0x90, 0x83, 0xB3, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, \r
-0x81, 0xFD, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x83, 0xB3, 0xF0, 0x90, 0x81, 0xFD, 0xE0, 0xFF, 0x90, \r
-0x81, 0xFC, 0xE0, 0xB5, 0x07, 0x05, 0xE4, 0xA3, 0xF0, 0x11, 0x9C, 0x22, 0xE4, 0xFF, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x4E, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x19, 0x90, 0x05, 0x22, \r
-0xE0, 0xF5, 0x51, 0x74, 0xFF, 0xF0, 0x12, 0x6F, 0x85, 0xBF, 0x01, 0x02, 0x31, 0x20, 0x90, 0x05, \r
-0x22, 0xE5, 0x51, 0xF0, 0x80, 0x02, 0x31, 0x20, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x74, 0x1F, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
-0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x1D, 0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
-0xE0, 0x44, 0x10, 0xF0, 0x74, 0x1F, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, \r
-0x80, 0xF0, 0x22, 0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, \r
-0xF0, 0x74, 0x1F, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, \r
-0x90, 0x80, 0x04, 0xE0, 0xFF, 0x7D, 0x01, 0x31, 0xC1, 0x8E, 0x4F, 0x8F, 0x50, 0xAD, 0x50, 0xAC, \r
-0x4F, 0xAF, 0x4E, 0x11, 0xD5, 0xAF, 0x50, 0xAE, 0x4F, 0x90, 0x04, 0x80, 0xE0, 0x54, 0x0F, 0xFD, \r
-0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, \r
-0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, \r
-0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x15, \r
-0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, \r
-0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, 0x53, 0xE4, \r
-0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, 0x74, 0xFD, \r
-0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, \r
-0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0xE0, 0xFF, 0x7D, \r
-0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x83, 0xAA, 0xED, 0xF0, 0x90, 0x83, 0xA9, \r
-0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0x5D, 0x8E, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0x83, 0xA9, 0xE0, \r
-0x90, 0x04, 0x25, 0xF0, 0x90, 0x83, 0xAA, 0xE0, 0x60, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x08, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
-0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x21, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, \r
-0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x81, 0xFE, 0xE0, 0x30, \r
-0xE0, 0x2C, 0x90, 0x82, 0x01, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x90, 0x81, 0xFF, 0xE0, 0xB5, 0x07, \r
-0x1D, 0x90, 0x06, 0x92, 0xE0, 0x54, 0x1C, 0x70, 0x0A, 0x11, 0x9C, 0x90, 0x82, 0x02, 0xE0, 0x04, \r
-0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, 0x1C, 0xF0, 0xE4, 0x90, 0x82, 0x01, 0xF0, 0x22, 0x90, \r
-0x81, 0xFE, 0xE0, 0x30, 0xE0, 0x47, 0x90, 0x82, 0x02, 0xE0, 0xFD, 0x60, 0x40, 0x74, 0x01, 0x7E, \r
-0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, \r
-0xE0, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x06, 0xE4, 0x90, 0x82, 0x02, 0xF0, 0x22, 0x90, 0x82, 0x00, \r
-0xE0, 0xD3, 0x9D, 0x50, 0x10, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0x51, 0xAE, 0x90, 0x81, 0xFE, \r
-0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x11, 0x9C, 0x90, 0x82, 0x02, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x80, \r
-0x01, 0xE0, 0x64, 0x02, 0x70, 0x4B, 0x90, 0x80, 0xE6, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, \r
-0x01, 0x30, 0xE0, 0x08, 0x90, 0x01, 0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x22, 0x90, 0x80, 0xE5, 0xE0, \r
-0xFE, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x13, 0xEF, 0x54, 0x7F, 0xFF, 0xE4, 0xFD, 0xD1, 0xD0, \r
-0x90, 0x80, 0xE6, 0xE0, 0x54, 0x7F, 0xFF, 0x7D, 0x01, 0x80, 0x14, 0x90, 0x80, 0xE6, 0xE0, 0x54, \r
-0x7F, 0xFF, 0x7D, 0x01, 0xD1, 0xD0, 0x90, 0x80, 0xE6, 0xE0, 0x54, 0x7F, 0xFF, 0xE4, 0xFD, 0xC1, \r
-0xD0, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x90, 0x82, 0x37, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, 0x90, 0x82, 0x42, 0xF0, \r
-0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x90, 0x06, 0x31, 0xE0, 0x54, 0xEF, 0x44, 0x08, 0xF0, 0x90, \r
-0x82, 0x37, 0xA3, 0xE0, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0x12, 0x5D, 0xF8, \r
-0x90, 0x82, 0x37, 0xA3, 0xE0, 0x2F, 0xFF, 0x90, 0x82, 0x44, 0xE0, 0x2F, 0x90, 0x82, 0x46, 0xF0, \r
-0x7E, 0x00, 0x7F, 0x83, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0x55, 0x12, 0x4C, 0x10, 0x90, \r
-0x82, 0x46, 0xE0, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFB, 0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, \r
-0x75, 0x16, 0x01, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0x55, 0x12, 0x2B, 0xED, 0x90, 0x82, 0x46, 0xE0, \r
-0x24, 0x01, 0xF9, 0xE4, 0x34, 0xFB, 0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, 0x01, \r
-0x7B, 0x01, 0x7A, 0x81, 0x79, 0x56, 0x12, 0x2B, 0xED, 0x90, 0x82, 0x46, 0xE0, 0x24, 0x02, 0xF9, \r
-0xE4, 0x34, 0xFB, 0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, 0x02, 0x7B, 0x01, 0x7A, \r
-0x81, 0x79, 0x57, 0x12, 0x2B, 0xED, 0x90, 0x82, 0x46, 0xE0, 0x24, 0x04, 0xF9, 0xE4, 0x34, 0xFB, \r
-0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, 0x01, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0x59, \r
-0x12, 0x2B, 0xED, 0x90, 0x82, 0x46, 0xE0, 0x24, 0x05, 0xF9, 0xE4, 0x34, 0xFB, 0x75, 0x13, 0x01, \r
-0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, 0x02, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0x5A, 0x12, 0x2B, 0xED, \r
-0x90, 0x82, 0x46, 0xE0, 0x24, 0x07, 0xF9, 0xE4, 0x34, 0xFB, 0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, \r
-0x15, 0x75, 0x16, 0x02, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0x5C, 0x12, 0x2B, 0xED, 0xE4, 0x90, 0x82, \r
-0x45, 0xF0, 0x90, 0x82, 0x45, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x32, 0xA3, 0xE0, 0x24, 0x09, \r
-0xD1, 0x9A, 0x7E, 0x00, 0x90, 0x82, 0x40, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x00, 0xF5, 0x82, \r
-0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x82, 0x45, 0xE0, 0x24, 0x5E, 0xF5, 0x82, 0xE4, \r
-0x34, 0x81, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x82, 0x45, 0xE0, 0x04, 0xF0, 0x80, 0xC4, 0xE4, 0x90, \r
-0x82, 0x45, 0xF0, 0x90, 0x82, 0x45, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x32, 0xA3, 0xE0, 0x24, \r
-0x11, 0xD1, 0x9A, 0x7E, 0x00, 0x90, 0x82, 0x40, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x00, 0xF5, \r
-0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x82, 0x45, 0xE0, 0x24, 0x66, 0xF5, 0x82, \r
-0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x82, 0x45, 0xE0, 0x04, 0xF0, 0x80, 0xC4, 0xE4, \r
-0x90, 0x82, 0x45, 0xF0, 0x90, 0x82, 0x45, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x32, 0xA3, 0xE0, \r
-0x24, 0x31, 0xD1, 0x9A, 0x7E, 0x00, 0x90, 0x82, 0x40, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x00, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x82, 0x45, 0xE0, 0x24, 0x86, 0xF5, \r
-0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x82, 0x45, 0xE0, 0x04, 0xF0, 0x80, 0xC4, \r
-0xE4, 0x90, 0x82, 0x45, 0xF0, 0x90, 0x82, 0x45, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x32, 0xA3, \r
-0xE0, 0x24, 0x41, 0xD1, 0x9A, 0x7E, 0x00, 0x90, 0x82, 0x40, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, \r
-0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x82, 0x45, 0xE0, 0x24, 0x96, \r
-0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x82, 0x45, 0xE0, 0x04, 0xF0, 0x80, \r
-0xC4, 0xE4, 0x90, 0x82, 0x45, 0xF0, 0x90, 0x82, 0x45, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x32, \r
-0xA3, 0xE0, 0x24, 0x49, 0xD1, 0x9A, 0x7E, 0x00, 0x90, 0x82, 0x40, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
-0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x82, 0x45, 0xE0, 0x24, \r
-0x9E, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x82, 0x45, 0xE0, 0x04, 0xF0, \r
-0x80, 0xC4, 0xE4, 0x90, 0x82, 0x45, 0xF0, 0x90, 0x82, 0x45, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, \r
-0x32, 0xA3, 0xE0, 0x24, 0x51, 0xD1, 0x9A, 0x7E, 0x00, 0x90, 0x82, 0x40, 0xEE, 0xF0, 0xA3, 0xEF, \r
-0xF0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x82, 0x45, 0xE0, \r
-0x24, 0xA6, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x82, 0x45, 0xE0, 0x04, \r
-0xF0, 0x80, 0xC4, 0xE4, 0x90, 0x82, 0x45, 0xF0, 0x90, 0x82, 0x45, 0xE0, 0xFF, 0xC3, 0x94, 0x02, \r
-0x50, 0x32, 0xA3, 0xE0, 0x24, 0x61, 0xD1, 0x9A, 0x7E, 0x00, 0x90, 0x82, 0x40, 0xEE, 0xF0, 0xA3, \r
-0xEF, 0xF0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x82, 0x45, \r
-0xE0, 0x24, 0xB6, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x82, 0x45, 0xE0, \r
-0x04, 0xF0, 0x80, 0xC4, 0xE4, 0x90, 0x82, 0x45, 0xF0, 0x90, 0x82, 0x45, 0xE0, 0xFF, 0xC3, 0x94, \r
-0x20, 0x50, 0x32, 0xA3, 0xE0, 0x24, 0x63, 0xD1, 0x9A, 0x7E, 0x00, 0x90, 0x82, 0x40, 0xEE, 0xF0, \r
-0xA3, 0xEF, 0xF0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x82, \r
-0x45, 0xE0, 0x24, 0xB8, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x82, 0x45, \r
-0xE0, 0x04, 0xF0, 0x80, 0xC4, 0x90, 0x81, 0x57, 0xE0, 0xFC, 0xA3, 0xE0, 0xFA, 0xEC, 0xFF, 0xEA, \r
-0xFE, 0x90, 0x82, 0x3C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x81, 0xB6, 0xE0, 0xFE, 0xA3, 0xE0, \r
-0xFD, 0xED, 0xFF, 0x90, 0x82, 0x3E, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x81, 0x5A, 0xE0, 0xFE, \r
-0xA3, 0xE0, 0xFD, 0xED, 0xFF, 0x90, 0x82, 0x3A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x30, 0xE3, 0x04, \r
-0x51, 0xAE, 0x80, 0x3F, 0x90, 0x82, 0x3A, 0xA3, 0xE0, 0xFF, 0x7C, 0x00, 0x54, 0x07, 0xFD, 0x64, \r
-0x01, 0x60, 0x05, 0xED, 0x64, 0x02, 0x70, 0x2B, 0xED, 0x64, 0x02, 0x4C, 0x70, 0x25, 0xEF, 0x54, \r
-0x30, 0xFF, 0xE4, 0xC4, 0xF8, 0x54, 0xF0, 0xC8, 0xEF, 0xC4, 0x54, 0x0F, 0x48, 0x90, 0x81, 0xEE, \r
-0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xE4, 0xFD, 0x12, 0x77, 0xFE, 0x90, 0x06, 0x31, 0xE0, 0x54, 0xF7, \r
-0x44, 0x10, 0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xFD, 0xE4, 0x33, 0xFC, 0x7E, 0x00, \r
-0xED, 0x2F, 0xFF, 0xEE, 0x3C, 0xFE, 0x90, 0x82, 0x39, 0xE0, 0xFD, 0xC3, 0xEE, 0x94, 0x01, 0x40, \r
-0x1E, 0x90, 0xFD, 0x11, 0xE0, 0xB5, 0x05, 0x14, 0x90, 0x01, 0x17, 0xE0, 0xB5, 0x05, 0x07, 0x90, \r
-0xFD, 0x11, 0xE4, 0xF0, 0x80, 0x06, 0xED, 0x04, 0x90, 0xFD, 0x11, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x83, 0xAE, 0xED, 0xF0, 0x90, 0x83, 0xAD, 0xEF, \r
-0xF0, 0xD3, 0x94, 0x07, 0x50, 0x70, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, \r
-0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x47, 0xE0, 0x5F, 0xFD, 0x7F, 0x47, 0x12, 0x32, 0x1E, \r
-0x90, 0x83, 0xAD, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, \r
-0xFF, 0x90, 0x00, 0x46, 0xE0, 0x4F, 0xFD, 0x7F, 0x46, 0x12, 0x32, 0x1E, 0x90, 0x83, 0xAE, 0xE0, \r
-0x60, 0x18, 0x90, 0x83, 0xAD, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, \r
-0xD8, 0xFC, 0xFF, 0x90, 0x00, 0x45, 0xE0, 0x4F, 0x80, 0x17, 0x90, 0x83, 0xAD, 0xE0, 0xFF, 0x74, \r
-0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x45, 0xE0, \r
-0x5F, 0xFD, 0x7F, 0x45, 0x80, 0x7E, 0x90, 0x83, 0xAD, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0x24, 0x04, \r
-0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, \r
-0x43, 0xE0, 0x5F, 0xFD, 0x7F, 0x43, 0x12, 0x32, 0x1E, 0x90, 0x83, 0xAD, 0xE0, 0xFF, 0x74, 0x01, \r
-0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xFF, 0x90, 0x00, 0x43, 0xE0, 0x4F, 0xFD, \r
-0x7F, 0x43, 0x12, 0x32, 0x1E, 0x90, 0x83, 0xAE, 0xE0, 0x60, 0x1D, 0x90, 0x83, 0xAD, 0xE0, 0x24, \r
-0x04, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xFF, 0x90, 0x00, \r
-0x42, 0xE0, 0x4F, 0xFD, 0x7F, 0x42, 0x80, 0x1C, 0x90, 0x83, 0xAD, 0xE0, 0x24, 0x04, 0xFF, 0x74, \r
-0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x42, 0xE0, \r
-0x5F, 0xFD, 0x7F, 0x42, 0x12, 0x32, 0x1E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x01, 0x67, 0xE4, 0xFF, \r
-0x41, 0x5F, 0x7F, 0x01, 0x41, 0x5F, 0x90, 0x80, 0xE4, 0xE0, 0x30, 0xE0, 0x05, 0x7F, 0x04, 0x12, \r
-0x4E, 0x75, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, \r
-0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, \r
-0x90, 0x01, 0xC4, 0x74, 0xF3, 0xF0, 0x74, 0x57, 0xA3, 0xF0, 0x11, 0x64, 0xE5, 0x4C, 0x30, 0xE1, \r
-0x05, 0x7F, 0x03, 0x12, 0x4E, 0x75, 0xE5, 0x4C, 0x30, 0xE4, 0x03, 0x12, 0x57, 0xDC, 0xE5, 0x4C, \r
-0x30, 0xE5, 0x03, 0x12, 0x57, 0xDE, 0xE5, 0x4C, 0x30, 0xE6, 0x03, 0x12, 0x57, 0xE2, 0x74, 0xF3, \r
-0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x57, 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, 0x01, 0x3C, 0xE0, 0x55, 0x45, 0xF5, 0x49, 0xA3, 0xE0, 0x55, 0x46, \r
-0xF5, 0x4A, 0xA3, 0xE0, 0x55, 0x47, 0xF5, 0x4B, 0xA3, 0xE0, 0x55, 0x48, 0xF5, 0x4C, 0x90, 0x01, \r
-0x3C, 0xE5, 0x49, 0xF0, 0xA3, 0xE5, 0x4A, 0xF0, 0xA3, 0xE5, 0x4B, 0xF0, 0xA3, 0xE5, 0x4C, 0xF0, \r
-0x53, 0x91, 0xDF, 0x22, 0x90, 0x01, 0xC8, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, \r
-0x82, 0x79, 0x03, 0x7F, 0xFF, 0xFE, 0x12, 0x2B, 0x27, 0xBF, 0x01, 0x09, 0x90, 0x82, 0x03, 0xE0, \r
-0x64, 0x03, 0x60, 0x03, 0x22, 0x21, 0x56, 0xE4, 0x90, 0x82, 0x08, 0xF0, 0x90, 0x82, 0x08, 0xE0, \r
-0xFF, 0xC3, 0x94, 0x02, 0x40, 0x02, 0x21, 0x91, 0xC3, 0x74, 0xFE, 0x9F, 0xFF, 0xE4, 0x94, 0x00, \r
-0xFE, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x04, 0x12, 0x2B, 0x27, 0xEF, 0x64, 0x01, 0x70, 0x77, 0x90, \r
-0x82, 0x04, 0xE0, 0xFF, 0x54, 0xC0, 0xFE, 0x60, 0x05, 0xEF, 0x54, 0x0C, 0x70, 0x16, 0x90, 0x82, \r
-0x04, 0xE0, 0xFF, 0x54, 0x30, 0x60, 0x67, 0xEF, 0x54, 0x03, 0x60, 0x62, 0x90, 0x82, 0x05, 0x74, \r
-0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x82, 0x05, 0xF0, 0x90, 0x82, 0x05, 0xE0, 0x90, 0x82, 0x04, \r
-0x70, 0x16, 0xE0, 0xFF, 0xEE, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x82, 0x06, 0xF0, 0xEF, 0x54, 0x0C, \r
-0x13, 0x13, 0x54, 0x3F, 0xA3, 0xF0, 0x80, 0x0D, 0xE0, 0xFE, 0x54, 0x30, 0x90, 0x82, 0x06, 0xF0, \r
-0xEE, 0x54, 0x03, 0xA3, 0xF0, 0x90, 0x82, 0x06, 0xE0, 0x64, 0x30, 0x70, 0x54, 0xA3, 0xE0, 0x64, \r
-0x02, 0x70, 0x4E, 0x90, 0x00, 0xF5, 0xE0, 0x54, 0x40, 0x90, 0x82, 0x09, 0xF0, 0xE0, 0x70, 0x41, \r
-0xA3, 0x74, 0x02, 0xF0, 0x80, 0x10, 0x90, 0x82, 0x0A, 0x74, 0x01, 0xF0, 0x80, 0x08, 0x90, 0x82, \r
-0x08, 0xE0, 0x04, 0xF0, 0x01, 0xBC, 0x90, 0x01, 0xC4, 0x74, 0x94, 0xF0, 0x74, 0x58, 0xA3, 0xF0, \r
-0x90, 0x82, 0x0A, 0xE0, 0x90, 0x01, 0xC8, 0xF0, 0x90, 0x82, 0x04, 0xE0, 0x90, 0x01, 0xC9, 0xF0, \r
-0x90, 0x82, 0x05, 0xE0, 0x90, 0x01, 0xCA, 0xF0, 0xE4, 0xFD, 0x7F, 0x1F, 0x12, 0x32, 0x1E, 0x80, \r
-0xD5, 0x22, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x32, 0x1E, 0x90, 0xFD, \r
-0x00, 0xE0, 0x54, 0xBF, 0xF0, 0x11, 0x94, 0xF1, 0x76, 0x12, 0x32, 0x77, 0x12, 0x6B, 0xF7, 0xF1, \r
-0x51, 0x7F, 0x01, 0x12, 0x4D, 0x63, 0x7F, 0x02, 0x12, 0x4D, 0x63, 0x7F, 0x03, 0x12, 0x4D, 0x63, \r
-0x7F, 0x04, 0x12, 0x4D, 0x63, 0x31, 0xFF, 0x31, 0xE4, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xFD, \r
-0x7F, 0x80, 0x12, 0x32, 0x1E, 0x75, 0x20, 0xFF, 0xF1, 0x67, 0x12, 0x6C, 0x27, 0xF1, 0x7E, 0xE4, \r
-0xFF, 0x02, 0x4D, 0xEC, 0xF1, 0x55, 0xF1, 0x6E, 0x51, 0x42, 0xF1, 0x88, 0x90, 0x81, 0xFE, 0xE0, \r
-0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xF1, \r
-0xC7, 0x90, 0x80, 0x01, 0xEF, 0xF0, 0x51, 0x11, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x02, 0x2D, \r
-0xA7, 0x12, 0x6B, 0x58, 0x12, 0x6B, 0x88, 0x12, 0x6B, 0xB9, 0x12, 0x6B, 0xD8, 0xE4, 0xF5, 0x35, \r
-0xF5, 0x36, 0xF5, 0x37, 0xF5, 0x38, 0xAD, 0x35, 0x7F, 0x50, 0x12, 0x32, 0x1E, 0xAD, 0x36, 0x7F, \r
-0x51, 0x12, 0x32, 0x1E, 0xAD, 0x37, 0x7F, 0x52, 0x12, 0x32, 0x1E, 0xAD, 0x38, 0x7F, 0x53, 0x02, \r
-0x32, 0x1E, 0x90, 0x80, 0xE4, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x80, 0xE9, 0xE0, 0x54, 0xFE, 0xF0, \r
-0x90, 0x06, 0x90, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x80, 0xE5, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, \r
-0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, \r
-0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0x80, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, \r
-0x90, 0x80, 0xE6, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x80, 0xE8, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0xEF, \r
-0x60, 0x58, 0x90, 0x04, 0xEC, 0xE0, 0x54, 0xDD, 0xF0, 0x90, 0x81, 0xF1, 0xE0, 0xFF, 0x60, 0x02, \r
-0x71, 0x3D, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, \r
-0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x80, 0x9F, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x06, \r
-0x09, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x05, 0x22, 0x74, 0xFF, 0xF0, 0x71, 0x9C, 0x90, 0x02, 0x86, \r
-0xE0, 0x44, 0x04, 0xF0, 0x71, 0x09, 0xF1, 0x4F, 0x91, 0x2A, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, \r
-0x01, 0x34, 0x74, 0x08, 0xF0, 0xFD, 0xE4, 0xFF, 0xE1, 0x9A, 0x90, 0x04, 0xEC, 0xE0, 0x44, 0x22, \r
-0xF0, 0x7D, 0x08, 0xE4, 0xFF, 0xF1, 0xAF, 0x90, 0x06, 0x90, 0xE4, 0xF0, 0x90, 0x02, 0x86, 0xE0, \r
-0x54, 0xFB, 0xF0, 0x71, 0x1A, 0xF1, 0x50, 0x41, 0x42, 0x12, 0x65, 0xC1, 0x90, 0x02, 0x87, 0xE0, \r
-0x70, 0xF7, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x02, 0xF0, 0x22, 0x51, 0x57, 0x90, 0x01, 0x3F, 0x74, \r
-0x04, 0xF0, 0x90, 0x80, 0x01, 0xE0, 0xFF, 0xB4, 0x01, 0x07, 0x90, 0xFD, 0x00, 0xE0, 0x54, 0xEF, \r
-0xF0, 0xEF, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0xB1, 0x8E, 0x7E, \r
-0x00, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, \r
-0x16, 0x08, 0x7B, 0x01, 0x7A, 0x80, 0x79, 0xFB, 0x12, 0x2B, 0xED, 0x90, 0x80, 0xFB, 0xE0, 0x90, \r
-0x81, 0x03, 0xF0, 0x90, 0x80, 0xFC, 0xE0, 0x90, 0x81, 0x04, 0xF0, 0x90, 0x80, 0xFD, 0xE0, 0x90, \r
-0x81, 0x05, 0xF0, 0x90, 0x80, 0xFE, 0xE0, 0x90, 0x81, 0x06, 0xF0, 0x90, 0x80, 0xFF, 0xE0, 0x90, \r
-0x81, 0x07, 0xF0, 0x90, 0x81, 0x00, 0xE0, 0x90, 0x81, 0x08, 0xF0, 0x90, 0x81, 0x01, 0xE0, 0x90, \r
-0x81, 0x09, 0xF0, 0x90, 0x81, 0x02, 0xE0, 0x90, 0x81, 0x0A, 0xF0, 0x22, 0x12, 0x6F, 0x85, 0x90, \r
-0x85, 0xBB, 0x12, 0x20, 0xDA, 0xCC, 0xF0, 0x00, 0xC0, 0x7F, 0x8C, 0x7E, 0x08, 0x12, 0x2E, 0xA2, \r
-0x90, 0x85, 0xBB, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x14, 0x7F, 0x70, 0x7E, 0x0E, 0x12, 0x2E, \r
-0xA2, 0x90, 0x83, 0x97, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xFD, 0xFF, 0x91, 0x07, \r
-0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2D, 0x5C, 0xEC, 0x44, 0x80, 0xFC, 0x90, 0x83, 0xA3, 0x12, 0x20, \r
-0xCE, 0x90, 0x83, 0xA3, 0x12, 0x49, 0x6E, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xCE, 0x7F, 0x7C, 0x7E, \r
-0x08, 0x12, 0x2E, 0xA2, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, \r
-0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, 0x07, \r
-0xC0, 0x05, 0x90, 0x83, 0x97, 0x12, 0x49, 0x6E, 0x90, 0x83, 0x70, 0x12, 0x20, 0xCE, 0xD0, 0x05, \r
-0xD0, 0x07, 0x12, 0x69, 0x30, 0xD0, 0xD0, 0x92, 0xAF, 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, 0xF0, 0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2D, \r
-0x5C, 0xEC, 0x54, 0x7F, 0xFC, 0x90, 0x83, 0x9F, 0x12, 0x20, 0xCE, 0x90, 0x83, 0x9F, 0x12, 0x49, \r
-0x6E, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xCE, 0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x85, \r
-0xBB, 0x12, 0x20, 0xDA, 0xCC, 0xC0, 0x00, 0xC0, 0x7F, 0x8C, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, \r
-0x85, 0xBB, 0x12, 0x20, 0xDA, 0x00, 0xC0, 0x00, 0x14, 0x7F, 0x70, 0x7E, 0x0E, 0x12, 0x2E, 0xA2, \r
-0x90, 0x83, 0x97, 0x12, 0x20, 0xDA, 0x00, 0x03, 0x3E, 0x60, 0xE4, 0xFD, 0xFF, 0x91, 0x07, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x1F, 0xA4, 0xFF, 0x54, \r
-0x01, 0xFE, 0x90, 0x80, 0xE4, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, \r
-0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x1F, 0xA4, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, \r
-0xFF, 0x90, 0x80, 0xE4, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, \r
-0x1F, 0xA4, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x80, 0xE4, 0xF0, 0xEE, \r
-0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, \r
-0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x80, 0x9F, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, \r
-0x80, 0xE4, 0xE0, 0xC3, 0x13, 0x54, 0x01, 0xFF, 0xB1, 0x49, 0x90, 0x80, 0xE4, 0xE0, 0x13, 0x13, \r
-0x54, 0x01, 0xFF, 0xF1, 0x5B, 0x90, 0x80, 0xE4, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFF, 0xB1, \r
-0x54, 0x90, 0x80, 0xE4, 0xE0, 0xC4, 0x54, 0x01, 0xFF, 0xF1, 0x61, 0x90, 0x80, 0xE4, 0xE0, 0x54, \r
-0x01, 0xFF, 0x51, 0x8F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x60, 0x07, 0x90, 0x81, 0xF2, 0xE0, \r
-0xFF, 0xB1, 0xA2, 0x22, 0xE4, 0xFD, 0xFC, 0xEF, 0x60, 0x33, 0x90, 0x81, 0xF5, 0xE0, 0xFF, 0xB1, \r
-0x8E, 0x7C, 0x00, 0xAD, 0x07, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, \r
-0x82, 0x1A, 0x12, 0x49, 0x8F, 0x90, 0x82, 0x1A, 0x12, 0x49, 0x86, 0x8B, 0x13, 0x8A, 0x14, 0x89, \r
-0x15, 0x75, 0x16, 0x4A, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0x0B, 0x12, 0x2B, 0xED, 0x22, 0xE4, 0xFE, \r
-0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, \r
-0x06, 0x22, 0xB1, 0x8E, 0x7E, 0x00, 0x90, 0x83, 0xB1, 0xB1, 0xEA, 0x90, 0x83, 0xB1, 0xA3, 0xE0, \r
-0x2F, 0x24, 0x36, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, \r
-0x04, 0x7B, 0x01, 0x7A, 0x80, 0x79, 0xF6, 0x12, 0x2B, 0xED, 0xE4, 0xFF, 0x74, 0x18, 0x2F, 0xF5, \r
-0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0xEA, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x80, \r
-0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x06, 0xE3, 0x22, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, \r
-0x20, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xE4, 0x90, 0x83, 0xB4, 0xF0, 0xFF, 0x12, 0x1F, \r
-0xA4, 0x30, 0xE7, 0x08, 0x90, 0x83, 0xB4, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x83, 0xB4, \r
-0xF0, 0x12, 0x6E, 0xF9, 0x90, 0x83, 0xB4, 0xE0, 0x24, 0x18, 0x2F, 0xFF, 0x22, 0x90, 0x82, 0x17, \r
-0x12, 0x49, 0x8F, 0xEF, 0x12, 0x4A, 0x40, 0x5E, 0x49, 0x00, 0x5E, 0x52, 0x01, 0x5E, 0x5A, 0x02, \r
-0x5E, 0x63, 0x03, 0x5E, 0x6C, 0x04, 0x5E, 0x7C, 0x80, 0x5E, 0x74, 0x81, 0x5E, 0x84, 0x82, 0x5E, \r
-0x8D, 0x83, 0x5E, 0x96, 0x84, 0x00, 0x00, 0x5E, 0x9F, 0x90, 0x82, 0x17, 0x12, 0x49, 0x86, 0x02, \r
-0x6A, 0xD1, 0x90, 0x82, 0x17, 0x12, 0x49, 0x86, 0x80, 0x79, 0x90, 0x82, 0x17, 0x12, 0x49, 0x86, \r
-0x02, 0x6B, 0x19, 0x90, 0x82, 0x17, 0x12, 0x49, 0x86, 0x02, 0x70, 0x53, 0x90, 0x82, 0x17, 0x12, \r
-0x49, 0x86, 0x80, 0x33, 0x90, 0x82, 0x17, 0x12, 0x49, 0x86, 0x81, 0xA4, 0x90, 0x82, 0x17, 0x12, \r
-0x49, 0x86, 0xE1, 0xE1, 0x90, 0x82, 0x17, 0x12, 0x49, 0x86, 0x02, 0x71, 0xB9, 0x90, 0x82, 0x17, \r
-0x12, 0x49, 0x86, 0x02, 0x71, 0xD3, 0x90, 0x82, 0x17, 0x12, 0x49, 0x86, 0x02, 0x72, 0x35, 0x90, \r
-0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x31, 0xEC, 0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x01, 0xFE, \r
-0x90, 0x81, 0xFE, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x14, 0x90, 0x00, \r
-0x01, 0x12, 0x1F, 0xBD, 0x90, 0x81, 0xFF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0x90, 0x82, \r
-0x00, 0xF0, 0x22, 0x90, 0x82, 0x1A, 0x12, 0x49, 0x8F, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0xFF, \r
-0xFE, 0x12, 0x1F, 0xA4, 0xFD, 0xC3, 0x13, 0x30, 0xE0, 0x12, 0x90, 0x82, 0x1A, 0x12, 0x49, 0x86, \r
-0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0x90, 0x82, 0x1E, 0xF0, 0x80, 0x05, 0x90, 0x82, 0x1E, 0xEF, \r
-0xF0, 0x90, 0x82, 0x1D, 0xEE, 0xF0, 0x90, 0x82, 0x1E, 0xE0, 0xFE, 0x90, 0x82, 0x1D, 0xE0, 0xFF, \r
-0xD3, 0x9E, 0x50, 0x38, 0x90, 0x82, 0x1A, 0x12, 0x49, 0x86, 0x12, 0x1F, 0xA4, 0x54, 0x01, 0xFE, \r
-0x74, 0xA3, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0xA3, 0x2F, 0xF5, \r
-0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE0, 0x70, 0x04, 0xF1, 0x4E, 0x80, 0x07, 0x90, 0x82, 0x1D, \r
-0xE0, 0xFF, 0xF1, 0x4D, 0x90, 0x82, 0x1D, 0xE0, 0x04, 0xF0, 0x80, 0xBA, 0x22, 0x22, 0x22, 0x22, \r
-0x22, 0xE4, 0xF5, 0x4D, 0x22, 0xE4, 0x90, 0x80, 0xA3, 0xF0, 0x22, 0x90, 0x82, 0x1A, 0xEF, 0xF0, \r
-0x22, 0x90, 0x82, 0x1A, 0xEF, 0xF0, 0x22, 0x75, 0xE8, 0x03, 0x75, 0xA8, 0x84, 0x22, 0xE4, 0x90, \r
-0x80, 0x9D, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x01, \r
-0xE4, 0x74, 0x0C, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x81, 0xFB, 0xE0, 0x54, 0xFE, 0xF0, 0x54, \r
-0x7F, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0x74, 0x3D, 0x2F, 0xF8, 0xE6, 0x4D, \r
-0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x74, \r
-0x3D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x00, 0xF7, 0xE0, 0x20, 0xE7, 0x09, 0xE0, 0x7F, \r
-0x01, 0x20, 0xE6, 0x0C, 0x7F, 0x02, 0x22, 0x90, 0x00, 0xF7, 0xE0, 0x30, 0xE6, 0x02, 0x7F, 0x03, \r
-0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x1F, 0xA4, 0xFC, 0x20, 0xE0, 0x05, 0x71, \r
-0x1A, 0x02, 0x60, 0xE8, 0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x80, 0xE5, 0xE0, 0x54, \r
-0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x1F, \r
-0xA4, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x80, 0xE5, 0xF0, 0xEE, 0x54, \r
-0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, 0x1F, 0xA4, 0xFE, 0x54, 0x10, 0xFD, 0xEF, \r
-0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x80, 0xE5, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, \r
-0xFF, 0xF0, 0x12, 0x1F, 0xA4, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0x90, 0x80, \r
-0xE5, 0xF0, 0xEE, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, \r
-0xBD, 0xFD, 0x54, 0x80, 0xFF, 0x90, 0x80, 0xE6, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0xEC, 0x13, 0x13, \r
-0x54, 0x3F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x04, 0xF0, 0x12, 0x1F, 0xA4, 0x13, \r
-0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x80, \r
-0x01, 0xE0, 0x64, 0x02, 0x70, 0x44, 0x90, 0x80, 0xE6, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, \r
-0x01, 0x20, 0xE0, 0x36, 0xED, 0x54, 0x7F, 0xFE, 0xEF, 0x54, 0x80, 0x4E, 0x90, 0x80, 0xE6, 0xF0, \r
-0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0x90, 0x80, 0xE7, 0xF0, 0x90, 0x80, 0xE5, 0xE0, 0xC4, 0x13, \r
-0x54, 0x07, 0x30, 0xE0, 0x09, 0xA3, 0xE0, 0x54, 0x7F, 0xFF, 0xE4, 0xFD, 0x80, 0x09, 0x90, 0x80, \r
-0xE6, 0xE0, 0x54, 0x7F, 0xFF, 0x7D, 0x01, 0x12, 0x56, 0xD0, 0x90, 0x80, 0x01, 0xE0, 0xB4, 0x01, \r
-0x07, 0x90, 0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x82, \r
-0x0B, 0xF0, 0x90, 0x82, 0x0B, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xED, 0x90, 0x01, 0xC4, 0xF0, 0x74, \r
-0x60, 0xA3, 0xF0, 0x31, 0x0A, 0x12, 0x4C, 0x9B, 0x80, 0xE8, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, \r
-0x01, 0x12, 0x4E, 0x9C, 0x90, 0x82, 0x0C, 0xEF, 0xF0, 0x60, 0xF0, 0x31, 0x1F, 0x80, 0xEC, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x82, 0x0D, 0xF0, \r
-0x90, 0x82, 0x0D, 0xE0, 0xFD, 0x70, 0x02, 0x41, 0x4A, 0x90, 0x83, 0xA7, 0xE0, 0xFF, 0x74, 0x01, \r
-0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, \r
-0x5D, 0x70, 0x02, 0x41, 0x43, 0x90, 0x83, 0xA7, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, \r
-0x49, 0x7A, 0xE0, 0x90, 0x82, 0x0E, 0xF0, 0x75, 0x13, 0x01, 0x75, 0x14, 0x82, 0x75, 0x15, 0x0E, \r
-0x75, 0x16, 0x01, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x0F, 0x12, 0x2B, 0xED, 0x90, 0x83, 0xA7, 0xE0, \r
-0x75, 0xF0, 0x04, 0x90, 0x01, 0xD1, 0x12, 0x49, 0x7A, 0xE0, 0x90, 0x82, 0x10, 0xF0, 0x90, 0x83, \r
-0xA7, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD2, 0x12, 0x49, 0x7A, 0xE0, 0x90, 0x82, 0x11, 0xF0, \r
-0x90, 0x83, 0xA7, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD3, 0x12, 0x49, 0x7A, 0xE0, 0x90, 0x82, \r
-0x12, 0xF0, 0x90, 0x83, 0xA7, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF0, 0x12, 0x49, 0x7A, 0xE0, \r
-0x90, 0x82, 0x13, 0xF0, 0x90, 0x83, 0xA7, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF1, 0x12, 0x49, \r
-0x7A, 0xE0, 0x90, 0x82, 0x14, 0xF0, 0x90, 0x83, 0xA7, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xF2, \r
-0x12, 0x49, 0x7A, 0xE0, 0x90, 0x82, 0x15, 0xF0, 0x90, 0x83, 0xA7, 0xE0, 0x75, 0xF0, 0x04, 0x90, \r
-0x01, 0xF3, 0x12, 0x49, 0x7A, 0xE0, 0x90, 0x82, 0x16, 0xF0, 0x90, 0x82, 0x0D, 0xE0, 0xFF, 0x90, \r
-0x83, 0xA7, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, \r
-0x5F, 0x90, 0x82, 0x0D, 0xF0, 0x90, 0x83, 0xA7, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, \r
-0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x82, 0x0F, 0xE0, 0xFF, 0x7B, 0x01, \r
-0x7A, 0x82, 0x79, 0x10, 0x12, 0x5E, 0x1D, 0x90, 0x83, 0xA7, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, \r
-0xF0, 0x21, 0x30, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, \r
-0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x4E, 0x9C, 0x90, 0x82, 0x1F, 0xEF, 0xF0, 0x60, 0xF0, 0x51, \r
-0x63, 0x80, 0xEC, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x80, 0x9E, 0xE0, \r
-0xFE, 0x90, 0x80, 0x9D, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, \r
-0x64, 0x01, 0x60, 0x32, 0x90, 0x01, 0xAF, 0xE0, 0x70, 0x13, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, \r
-0x07, 0xF9, 0x74, 0x80, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x51, 0xBB, 0x7F, 0x01, 0xEF, 0x60, 0x16, \r
-0x90, 0x80, 0x9D, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, \r
-0x05, 0xE4, 0x90, 0x80, 0x9D, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
-0xC0, 0xD0, 0x90, 0x82, 0x20, 0x12, 0x49, 0x8F, 0x90, 0x83, 0xA8, 0xE0, 0xFF, 0x04, 0xF0, 0x90, \r
-0x00, 0x01, 0xEF, 0x12, 0x1F, 0xFC, 0x7F, 0xAF, 0x7E, 0x01, 0x71, 0x1E, 0xEF, 0x60, 0x3A, 0x90, \r
-0x82, 0x20, 0x12, 0x49, 0x86, 0x8B, 0x13, 0x8A, 0x14, 0x89, 0x15, 0x90, 0x00, 0x0E, 0x12, 0x1F, \r
-0xBD, 0x24, 0x02, 0xF5, 0x16, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x12, 0x2B, 0xED, 0x90, 0x82, \r
-0x20, 0x12, 0x49, 0x86, 0x90, 0x00, 0x0E, 0x12, 0x1F, 0xBD, 0x90, 0x01, 0xAE, 0xF0, 0xA3, 0x74, \r
-0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x83, 0x9B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, \r
-0xA3, 0xF0, 0x90, 0x83, 0x9B, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, \r
-0xC3, 0x90, 0x83, 0x9E, 0xE0, 0x94, 0xE8, 0x90, 0x83, 0x9D, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, \r
-0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, 0x83, 0x9D, 0xE4, 0x75, 0xF0, \r
-0x01, 0x12, 0x49, 0x4B, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0x80, 0xC5, 0x7F, 0x01, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x4E, 0x9C, 0x90, 0x82, 0x23, \r
-0xEF, 0xF0, 0x60, 0xF0, 0xD1, 0xEB, 0xBF, 0x01, 0xEB, 0x71, 0x8D, 0x80, 0xE7, 0xD3, 0x10, 0xAF, \r
-0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x82, 0x2E, 0x74, 0x08, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0xE0, 0x7C, 0x00, 0x24, 0x00, \r
-0xFF, 0xEC, 0x3E, 0x90, 0x82, 0x24, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x82, 0xE0, 0x90, 0x82, \r
-0x2D, 0xF0, 0x90, 0x80, 0xE4, 0xE0, 0x20, 0xE0, 0x02, 0xA1, 0xA9, 0x90, 0x80, 0xE9, 0xE0, 0x20, \r
-0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x18, 0x90, 0x80, 0x01, 0xE0, 0xB4, 0x01, 0x0E, \r
-0x90, 0xFD, 0x01, 0xE0, 0x20, 0xE6, 0x07, 0x90, 0xFD, 0x00, 0xE0, 0x44, 0x10, 0xF0, 0x12, 0x52, \r
-0xAE, 0xE4, 0x90, 0x82, 0x2C, 0xF0, 0x90, 0x82, 0x2D, 0xE0, 0xFF, 0x90, 0x82, 0x2C, 0xE0, 0xC3, \r
-0x9F, 0x40, 0x02, 0xA1, 0xA9, 0x90, 0x82, 0x24, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x90, \r
-0xFD, 0x11, 0xF0, 0x90, 0x82, 0x26, 0xED, 0xF0, 0x90, 0x82, 0x30, 0xEF, 0xF0, 0x90, 0x82, 0x26, \r
-0xE0, 0xFF, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, \r
-0x33, 0x54, 0xF8, 0x90, 0x82, 0x2A, 0xF0, 0xEF, 0x24, 0x18, 0xFF, 0xE0, 0xFE, 0x2F, 0x90, 0x82, \r
-0x27, 0xF0, 0x90, 0x82, 0x25, 0xE0, 0x24, 0x18, 0xFD, 0x90, 0x82, 0x24, 0xE0, 0x34, 0x00, 0xFC, \r
-0xEE, 0x7E, 0x00, 0x2D, 0xFF, 0xEE, 0x3C, 0x90, 0x82, 0x28, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x82, \r
-0x27, 0xE0, 0xFD, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xFC, 0x90, \r
-0x82, 0x2B, 0xF0, 0x74, 0x00, 0x2D, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0x12, 0x5D, 0xF8, \r
-0x90, 0x82, 0x2F, 0xEF, 0xF0, 0x90, 0x82, 0x26, 0xE0, 0xFD, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, \r
-0xFB, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, \r
-0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x54, 0x3F, 0xFE, 0x90, 0x82, 0x31, 0xF0, 0xA3, 0xEF, \r
-0xF0, 0x90, 0x82, 0x2A, 0xE0, 0x24, 0x18, 0xFD, 0xEC, 0x33, 0xFC, 0xED, 0x2F, 0xFF, 0xEC, 0x3E, \r
-0xFE, 0xD1, 0x85, 0x90, 0x82, 0x26, 0xE0, 0x24, 0x0F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, \r
-0xE0, 0xFD, 0x90, 0x82, 0x24, 0xEE, 0x8F, 0xF0, 0x12, 0x49, 0x4B, 0x90, 0x80, 0x9F, 0xE0, 0xFE, \r
-0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x82, 0x25, 0xE0, 0x9F, 0x90, 0x82, 0x24, 0xE0, 0x9E, 0x40, 0x1B, \r
-0x90, 0x80, 0xA0, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x80, 0x9F, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0x90, \r
-0x82, 0x25, 0xE0, 0x9F, 0xF0, 0x90, 0x82, 0x24, 0xE0, 0x9E, 0xF0, 0xED, 0x30, 0xE7, 0x06, 0x90, \r
-0x01, 0xC7, 0x74, 0x21, 0xF0, 0xED, 0x30, 0xE6, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF0, 0xED, \r
-0x30, 0xE5, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x23, 0xF0, 0x90, 0x82, 0x2B, 0xE0, 0x24, 0x40, 0x60, \r
-0x04, 0x24, 0x20, 0x70, 0x21, 0x90, 0x80, 0xE5, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, \r
-0x30, 0xE0, 0x43, 0x90, 0x82, 0x27, 0xE0, 0xFF, 0xF1, 0x28, 0xEF, 0x60, 0x39, 0x90, 0x82, 0x2B, \r
-0xE0, 0xFF, 0xD1, 0xAE, 0x80, 0x30, 0x90, 0x82, 0x27, 0xE0, 0xFF, 0x90, 0x82, 0x2F, 0xE0, 0xFD, \r
-0x90, 0x82, 0x2E, 0xE0, 0xFB, 0x90, 0x82, 0x30, 0xE0, 0x90, 0x82, 0x36, 0xF0, 0xF1, 0x7B, 0x90, \r
-0x80, 0xE4, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x0D, 0x90, 0x82, 0x27, 0xE0, 0xFF, 0x90, 0x82, \r
-0x2F, 0xE0, 0xFD, 0x12, 0x70, 0x73, 0x90, 0x80, 0xE9, 0xE0, 0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, \r
-0xE0, 0x30, 0xE2, 0x03, 0x12, 0x52, 0xAE, 0xD1, 0xC5, 0xBF, 0x01, 0x0D, 0x90, 0x82, 0x24, 0xB1, \r
-0xAE, 0x90, 0x82, 0x2C, 0xE0, 0x04, 0xF0, 0x61, 0xF6, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0xFE, \r
-0xA3, 0xE0, 0xFF, 0x90, 0x02, 0x84, 0xEF, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, \r
-0x22, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, \r
-0x3E, 0x90, 0x82, 0x1A, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x87, 0xE0, 0xF9, 0x90, 0x80, 0xE4, \r
-0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x84, 0xEC, 0xC3, 0x99, 0x40, 0x02, 0xC1, 0x84, 0x90, 0x82, 0x1A, \r
-0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, 0x03, 0xAD, 0x07, 0x74, 0x02, \r
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, \r
-0xFB, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x75, 0x83, 0x00, 0x24, 0x00, 0xFF, 0xE5, 0x83, \r
-0x3E, 0x54, 0x3F, 0xFE, 0xEB, 0x24, 0x18, 0xFB, 0xE4, 0x33, 0xFA, 0xEB, 0x2F, 0xFF, 0xEA, 0x3E, \r
-0xFE, 0xD1, 0x85, 0x90, 0x82, 0x1A, 0xEE, 0x8F, 0xF0, 0x12, 0x49, 0x4B, 0x90, 0x80, 0x9F, 0xE0, \r
-0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x82, 0x1B, 0xE0, 0x9F, 0x90, 0x82, 0x1A, 0xE0, 0x9E, 0x40, \r
-0x1B, 0x90, 0x80, 0xA0, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x80, 0x9F, 0xE0, 0x34, 0x00, 0xFE, 0xC3, \r
-0x90, 0x82, 0x1B, 0xE0, 0x9F, 0xF0, 0x90, 0x82, 0x1A, 0xE0, 0x9E, 0xF0, 0x90, 0x82, 0x1A, 0xB1, \r
-0xAE, 0x0C, 0xA1, 0xE6, 0x22, 0x7D, 0x7F, 0xEF, 0x5D, 0xC3, 0x60, 0x14, 0x74, 0xFF, 0x9D, 0xFD, \r
-0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, 0x24, 0x80, 0xFF, 0xE4, 0x3E, 0xFE, 0x80, 0x0D, \r
-0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, 0xFF, 0x22, 0xEF, 0x90, \r
-0x01, 0xC7, 0xB4, 0xA0, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x80, 0xE9, \r
-0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x80, 0xE9, 0xE0, 0xFF, 0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, \r
-0xE0, 0x30, 0xE2, 0x14, 0xEF, 0x44, 0x01, 0x90, 0x80, 0xE9, 0xF0, 0x90, 0x80, 0xE5, 0xE0, 0xC4, \r
-0x54, 0x0F, 0x20, 0xE0, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x83, 0xAF, 0xF0, \r
-0xA3, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x2C, 0xC3, 0x90, 0x83, 0xB0, 0xE0, 0x94, 0xD0, \r
-0x90, 0x83, 0xAF, 0xE0, 0x94, 0x07, 0x40, 0x0A, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x7F, \r
-0x00, 0x22, 0x90, 0x83, 0xAF, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x49, 0x4B, 0x7F, 0x0A, 0x7E, 0x00, \r
-0x12, 0x32, 0xAA, 0x80, 0xCD, 0x7F, 0x01, 0x22, 0xE4, 0xFE, 0x74, 0x10, 0x2E, 0xF5, 0x82, 0xE4, \r
-0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFD, 0x74, 0x39, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, \r
-0xED, 0xF0, 0xEF, 0x2E, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFD, 0x74, \r
-0x33, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xED, 0xF0, 0x0E, 0xEE, 0xB4, 0x06, 0xCA, \r
-0x78, 0x39, 0x7C, 0x82, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x33, 0x7E, 0x00, 0x7F, 0x06, \r
-0x12, 0x4B, 0xEC, 0xEF, 0x7F, 0x00, 0x70, 0x02, 0x7F, 0x01, 0x22, 0x74, 0x00, 0x2F, 0xF5, 0x82, \r
-0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0C, 0x64, 0x08, 0x70, 0x64, 0xEF, 0x2D, 0xFE, 0x24, \r
-0x06, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x64, 0x88, 0x70, 0x53, 0x74, 0x07, 0x2E, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x64, 0x8E, 0x70, 0x44, 0xEF, 0x2D, 0x2B, 0xFE, \r
-0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x64, 0x03, 0x70, 0x32, 0x74, 0x06, \r
-0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x30, 0xE3, 0x1A, 0x90, 0x80, 0xE5, 0xE0, \r
-0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x18, 0x90, 0x01, 0xC7, 0x74, 0x01, 0xF0, 0x90, 0x80, \r
-0xE9, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x7E, 0x00, 0x90, 0x82, 0x36, 0xE0, 0xFD, 0x12, 0x53, 0x09, \r
-0x22, 0x90, 0x83, 0x5F, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, \r
-0x00, 0xE4, 0x90, 0x83, 0x6D, 0xF0, 0x7F, 0x24, 0x7E, 0x08, 0x12, 0x2D, 0x5C, 0x90, 0x83, 0x65, \r
-0x12, 0x20, 0xCE, 0x90, 0x83, 0x5F, 0xE0, 0xFB, 0x70, 0x08, 0x90, 0x83, 0x65, 0x12, 0x49, 0x6E, \r
-0x80, 0x16, 0xEB, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, \r
-0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x2D, 0x5C, 0x90, 0x83, 0x69, 0x12, 0x20, 0xCE, 0x90, 0x83, \r
-0x60, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x17, 0x12, 0x20, 0xBB, 0xA8, 0x04, 0xA9, 0x05, \r
-0xAA, 0x06, 0xAB, 0x07, 0x90, 0x83, 0x69, 0x12, 0x49, 0x6E, 0xED, 0x54, 0x7F, 0xFD, 0xEC, 0x54, \r
-0x80, 0xFC, 0x12, 0x49, 0x61, 0xEC, 0x44, 0x80, 0xFC, 0x90, 0x83, 0x69, 0x12, 0x20, 0xCE, 0x90, \r
-0x83, 0x65, 0x12, 0x49, 0x6E, 0xEC, 0x54, 0x7F, 0xFC, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xCE, 0x7F, \r
-0x24, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x83, 0x5F, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x62, \r
-0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC0, 0x06, 0xC0, 0x07, \r
-0x90, 0x83, 0x69, 0x12, 0x49, 0x6E, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xCE, 0xD0, 0x07, 0xD0, 0x06, \r
-0x12, 0x2E, 0xA2, 0x90, 0x83, 0x65, 0x12, 0x49, 0x6E, 0xEC, 0x44, 0x80, 0xFC, 0x90, 0x85, 0xBB, \r
-0x12, 0x20, 0xCE, 0x7F, 0x24, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x83, 0x5F, 0xE0, 0x70, 0x04, \r
-0x7F, 0x20, 0x80, 0x09, 0x90, 0x83, 0x5F, 0xE0, 0xB4, 0x01, 0x16, 0x7F, 0x28, 0x7E, 0x08, 0x12, \r
-0x2D, 0x5C, 0x78, 0x08, 0x12, 0x20, 0xA8, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0x90, 0x83, 0x6D, 0xEF, \r
-0xF0, 0x90, 0x83, 0x6D, 0xE0, 0x90, 0x83, 0x5F, 0x60, 0x0E, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, \r
-0x66, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0x80, 0x0C, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x64, 0xF5, \r
-0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x2D, 0x5C, 0xED, 0x54, \r
-0x0F, 0xFD, 0xE4, 0xFC, 0x90, 0x83, 0x61, 0x12, 0x20, 0xCE, 0x90, 0x83, 0x61, 0x02, 0x49, 0x6E, \r
-0x90, 0x83, 0x6E, 0xEF, 0xF0, 0xAB, 0x05, 0x90, 0x83, 0x74, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, \r
-0x00, 0xAF, 0x03, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x14, 0x12, 0x20, 0xBB, 0xA8, 0x04, 0xA9, 0x05, \r
-0xAA, 0x06, 0xAB, 0x07, 0x90, 0x83, 0x70, 0x12, 0x49, 0x6E, 0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, \r
-0x12, 0x49, 0x61, 0xEC, 0x54, 0x0F, 0xFC, 0x90, 0x83, 0x74, 0x12, 0x20, 0xCE, 0x90, 0x83, 0x6E, \r
-0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x60, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, \r
-0xA3, 0xE0, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x83, 0x74, 0x12, 0x49, 0x6E, 0x90, 0x85, 0xBB, \r
-0x12, 0x20, 0xCE, 0xD0, 0x07, 0xD0, 0x06, 0x02, 0x2E, 0xA2, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x12, 0x67, 0xF1, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8E, 0x19, 0x8F, 0x1A, 0xE5, 0x1E, 0x54, \r
-0x07, 0xC4, 0x33, 0x54, 0xE0, 0x85, 0x19, 0x83, 0x85, 0x1A, 0x82, 0xF0, 0xE5, 0x1D, 0x54, 0x07, \r
-0xC4, 0x33, 0x54, 0xE0, 0xFF, 0xE5, 0x1E, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x4F, 0xA3, 0xF0, 0xEB, \r
-0x54, 0x07, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0xE5, 0x1D, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x4F, 0x85, \r
-0x1A, 0x82, 0x85, 0x19, 0x83, 0xA3, 0xA3, 0xF0, 0xBD, 0x01, 0x0C, 0x85, 0x1A, 0x82, 0x8E, 0x83, \r
-0xA3, 0xA3, 0xA3, 0x74, 0x03, 0xF0, 0x22, 0x85, 0x1A, 0x82, 0x85, 0x19, 0x83, 0xA3, 0xA3, 0xA3, \r
-0x74, 0x01, 0xF0, 0x22, 0x90, 0x83, 0x78, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xAD, 0x03, 0xAC, 0x02, \r
-0xE4, 0x90, 0x83, 0x80, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xC4, 0x74, 0x04, 0xF0, 0x74, 0x6A, 0xA3, \r
-0xF0, 0xEC, 0x54, 0x3F, 0xFC, 0x90, 0x01, 0x40, 0xED, 0xF0, 0xAE, 0x04, 0xEE, 0xA3, 0xF0, 0x90, \r
-0x83, 0x78, 0xE0, 0x24, 0x81, 0x60, 0x34, 0x24, 0xDA, 0x60, 0x1C, 0x24, 0x3C, 0x70, 0x41, 0x90, \r
-0x83, 0x79, 0xE0, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0x90, 0x83, 0x7D, 0xF0, 0xA3, 0x74, 0x69, \r
-0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x80, 0x2C, 0x90, 0x83, 0x79, 0xE0, 0x54, 0x01, 0x90, 0x83, 0x7D, \r
-0xF0, 0xA3, 0x74, 0xA5, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0x80, 0x18, 0x90, 0x83, 0x79, 0xE0, 0xC4, \r
-0x54, 0x10, 0x90, 0x83, 0x7D, 0xF0, 0xA3, 0x74, 0x7F, 0xF0, 0xA3, 0x74, 0x10, 0xF0, 0x80, 0x03, \r
-0x7F, 0x00, 0x22, 0x90, 0x83, 0x7E, 0xE0, 0x90, 0x01, 0x06, 0xF0, 0x90, 0x83, 0x7D, 0xE0, 0x60, \r
-0x0E, 0x90, 0x01, 0x42, 0xF0, 0x90, 0x83, 0x7C, 0xE0, 0x90, 0x01, 0x43, 0xF0, 0x80, 0x0D, 0x90, \r
-0x01, 0x43, 0xE4, 0xF0, 0x90, 0x83, 0x7D, 0xE0, 0x90, 0x01, 0x42, 0xF0, 0x90, 0x83, 0x7F, 0xE0, \r
-0xFF, 0x90, 0x01, 0x42, 0xE0, 0x5F, 0xFF, 0x90, 0x83, 0x7D, 0xE0, 0x6F, 0x60, 0xEE, 0x74, 0x04, \r
-0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x6A, 0xA3, 0xF0, 0x90, 0x01, 0x43, 0xE4, 0xF0, 0x7F, 0x01, \r
-0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x1F, 0xA4, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x80, \r
-0x02, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0xFF, 0xED, 0x2F, 0x90, 0x80, 0x03, 0xF0, 0x90, \r
-0x00, 0x02, 0x12, 0x1F, 0xBD, 0xFF, 0xED, 0x2F, 0x90, 0x80, 0x04, 0xF0, 0x90, 0x00, 0x03, 0x12, \r
-0x1F, 0xBD, 0xFF, 0xED, 0x2F, 0x90, 0x80, 0x05, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0xBD, 0xFF, \r
-0xAE, 0x05, 0xED, 0x2F, 0x90, 0x80, 0x06, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x12, 0x1F, 0xA4, 0xFF, 0x90, 0x80, 0xE3, 0xF0, 0xBF, 0x01, 0x12, 0x90, 0x00, 0x01, 0x12, 0x1F, \r
-0xBD, 0x64, 0x01, 0x60, 0x17, 0x90, 0x05, 0x22, 0x74, 0x6F, 0xF0, 0x80, 0x0F, 0x90, 0x00, 0x01, \r
-0x12, 0x1F, 0xBD, 0x64, 0x01, 0x60, 0x05, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0x8F, 0x0F, 0x22, 0x8F, 0x1F, 0x22, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, \r
-0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x32, \r
-0x1E, 0xE4, 0xFD, 0x7F, 0x53, 0x02, 0x32, 0x1E, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, \r
-0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, \r
-0x54, 0x12, 0x32, 0x1E, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x32, 0x1E, 0x7D, 0xFF, 0x7F, 0x56, 0x12, \r
-0x32, 0x1E, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x32, 0x1E, 0x75, 0x3D, 0x10, 0xE4, 0xF5, 0x3E, 0x75, \r
-0x3F, 0x07, 0x75, 0x40, 0x02, 0x90, 0x01, 0x30, 0xE5, 0x3D, 0xF0, 0xA3, 0xE5, 0x3E, 0xF0, 0xA3, \r
-0xE5, 0x3F, 0xF0, 0xA3, 0xE5, 0x40, 0xF0, 0x22, 0x75, 0x45, 0x0E, 0x75, 0x46, 0x01, 0x75, 0x47, \r
-0x03, 0x75, 0x48, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x45, 0xF0, 0xA3, 0xE5, 0x46, 0xF0, 0xA3, 0xE5, \r
-0x47, 0xF0, 0xA3, 0xE5, 0x48, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, \r
-0x9C, 0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, 0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, \r
-0x90, 0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, 0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, \r
-0xF0, 0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0x82, 0x03, 0xF0, 0xA3, 0xF0, 0x90, 0x01, \r
-0x98, 0xE0, 0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, 0x3E, 0xC3, 0x90, \r
-0x82, 0x04, 0xE0, 0x94, 0x88, 0x90, 0x82, 0x03, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC1, \r
-0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x82, 0x03, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x49, 0x4B, 0x7F, \r
-0x14, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0xD3, 0x90, 0x82, 0x04, 0xE0, 0x94, 0x32, 0x90, 0x82, 0x03, \r
-0xE0, 0x94, 0x00, 0x40, 0xB9, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xB2, 0x22, 0x90, 0x00, 0x54, \r
-0xE0, 0x55, 0x35, 0xF5, 0x39, 0xA3, 0xE0, 0x55, 0x36, 0xF5, 0x3A, 0xA3, 0xE0, 0x55, 0x37, 0xF5, \r
-0x3B, 0xA3, 0xE0, 0x55, 0x38, 0xF5, 0x3C, 0xAD, 0x39, 0x7F, 0x54, 0x12, 0x32, 0x1E, 0xAD, 0x3A, \r
-0x7F, 0x55, 0x12, 0x32, 0x1E, 0xAD, 0x3B, 0x7F, 0x56, 0x12, 0x32, 0x1E, 0xAD, 0x3C, 0x7F, 0x57, \r
-0x12, 0x32, 0x1E, 0x53, 0x91, 0xEF, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x3D, 0xF5, 0x41, 0xA3, \r
-0xE0, 0x55, 0x3E, 0xF5, 0x42, 0xA3, 0xE0, 0x55, 0x3F, 0xF5, 0x43, 0xA3, 0xE0, 0x55, 0x40, 0xF5, \r
-0x44, 0x90, 0x01, 0x34, 0xE5, 0x41, 0xF0, 0xA3, 0xE5, 0x42, 0xF0, 0xA3, 0xE5, 0x43, 0xF0, 0xA3, \r
-0xE5, 0x44, 0xF0, 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, 0x90, 0x82, 0x49, 0x12, 0x49, 0x8F, 0x91, 0xE4, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xA1, \r
-0xE0, 0x90, 0x81, 0xF2, 0x12, 0x51, 0xBD, 0x90, 0x82, 0x50, 0x12, 0x5D, 0xEA, 0x90, 0x82, 0x52, \r
-0xEF, 0xF0, 0x90, 0x82, 0x50, 0xA3, 0xE0, 0x24, 0x20, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, \r
-0x90, 0x82, 0x4F, 0xE0, 0xFD, 0xB1, 0xE1, 0x90, 0x82, 0x50, 0xA3, 0xE0, 0x24, 0x30, 0xF9, 0xE4, \r
-0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x82, 0x4C, 0x12, 0x49, \r
-0x86, 0x8B, 0x13, 0x8A, 0x14, 0x89, 0x15, 0x75, 0x16, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, \r
-0x12, 0x2B, 0xED, 0x90, 0x82, 0x50, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x3A, 0xF9, 0xE4, \r
-0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x82, 0x4C, 0x12, 0x49, \r
-0x86, 0x8B, 0x13, 0x8A, 0x14, 0x89, 0x15, 0x75, 0x16, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, \r
-0x12, 0x2B, 0xED, 0x90, 0x82, 0x50, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x40, 0xF9, 0xE4, \r
-0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x82, 0x49, 0x12, 0x49, \r
-0x86, 0x8B, 0x13, 0x8A, 0x14, 0x89, 0x15, 0x75, 0x16, 0x04, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, \r
-0x12, 0x2B, 0xED, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, \r
-0x22, 0x90, 0x82, 0xEE, 0xED, 0xF0, 0x90, 0x82, 0xEB, 0x12, 0x49, 0x8F, 0xE4, 0x90, 0x82, 0xEF, \r
-0xF0, 0xA3, 0xF0, 0x12, 0x5D, 0xF8, 0x90, 0x82, 0xEF, 0xEF, 0xF0, 0x90, 0x82, 0xEB, 0x12, 0x49, \r
-0x86, 0xD1, 0xF9, 0x90, 0x82, 0xF0, 0xEF, 0xF0, 0x90, 0x80, 0xFA, 0xE0, 0x24, 0xFE, 0x60, 0x1D, \r
-0x24, 0xFE, 0x60, 0x19, 0x14, 0x60, 0x07, 0x14, 0x60, 0x04, 0x24, 0x05, 0x70, 0x60, 0x7B, 0x01, \r
-0x7A, 0x80, 0x79, 0xFB, 0x90, 0x82, 0xEE, 0xE0, 0xFD, 0xD1, 0x7F, 0x80, 0x23, 0x7B, 0x01, 0x7A, \r
-0x81, 0x79, 0x03, 0x90, 0x82, 0xF4, 0x12, 0x49, 0x8F, 0x90, 0x82, 0xEE, 0xE0, 0x90, 0x82, 0xF7, \r
-0xF0, 0x90, 0x80, 0xFA, 0xE0, 0x90, 0x82, 0xF8, 0xF0, 0x7A, 0x80, 0x79, 0xFB, 0x12, 0x80, 0xDC, \r
-0x90, 0x82, 0xF0, 0xE0, 0xFF, 0x90, 0x82, 0xEB, 0x12, 0x49, 0x86, 0x90, 0x82, 0xEF, 0xE0, 0x7C, \r
-0x00, 0x29, 0xF9, 0xEC, 0x3A, 0xFA, 0xC3, 0xE9, 0x9F, 0xF9, 0xEA, 0x94, 0x00, 0xFA, 0x75, 0x13, \r
-0x01, 0x75, 0x14, 0x80, 0x75, 0x15, 0xFB, 0xA3, 0xE0, 0xF5, 0x16, 0x12, 0x2B, 0xED, 0x22, 0x90, \r
-0x82, 0xF4, 0xED, 0xF0, 0x90, 0x82, 0xF1, 0x12, 0x49, 0x8F, 0x90, 0x00, 0x03, 0x12, 0x1F, 0xBD, \r
-0x90, 0x82, 0xF8, 0xF0, 0x90, 0x82, 0xF1, 0x12, 0x49, 0x86, 0x8B, 0x13, 0x8A, 0x14, 0x89, 0x15, \r
-0x75, 0x16, 0x03, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0xF5, 0x12, 0x2B, 0xED, 0x90, 0x82, 0xF4, 0xE0, \r
-0x70, 0x46, 0xFF, 0x74, 0xF5, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xB4, 0xFF, \r
-0x0E, 0x74, 0xF5, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x0F, 0x74, \r
-0xF5, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, \r
-0xB4, 0x03, 0xD0, 0x75, 0x13, 0x01, 0x75, 0x14, 0x82, 0x75, 0x15, 0xF5, 0x75, 0x16, 0x03, 0x90, \r
-0x82, 0xF1, 0x12, 0x49, 0x86, 0x12, 0x2B, 0xED, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x90, 0x83, 0x82, 0x12, 0x49, 0x8F, 0xE4, 0x90, 0x83, 0x85, 0xF0, 0x90, 0x83, 0x82, 0x12, 0x49, \r
-0x86, 0xE9, 0x24, 0x04, 0xF9, 0xE4, 0x3A, 0x8B, 0x13, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, 0x06, \r
-0x7B, 0x01, 0x7A, 0x83, 0x79, 0x86, 0x12, 0x2B, 0xED, 0x90, 0x83, 0x86, 0xE0, 0x20, 0xE0, 0x05, \r
-0x90, 0x81, 0xEF, 0x80, 0x03, 0x90, 0x81, 0xF0, 0xE0, 0x90, 0x80, 0xFA, 0xF0, 0x90, 0x80, 0xFA, \r
-0xE0, 0x14, 0x60, 0x11, 0x14, 0x60, 0x16, 0x24, 0xFE, 0x60, 0x12, 0x14, 0x60, 0x07, 0x14, 0x60, \r
-0x04, 0x24, 0x06, 0x80, 0x10, 0x90, 0x83, 0x85, 0x74, 0x04, 0xF0, 0x80, 0x0D, 0x90, 0x83, 0x85, \r
-0x74, 0x08, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x83, 0x85, 0xF0, 0x90, 0x83, 0x85, 0xE0, 0xFF, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, 0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, \r
-0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xE4, 0x90, 0x83, 0xAB, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, \r
-0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, \r
-0x22, 0xD3, 0x90, 0x83, 0xAC, 0xE0, 0x94, 0xE8, 0x90, 0x83, 0xAB, 0xE0, 0x94, 0x03, 0x40, 0x0A, \r
-0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x32, \r
-0xAA, 0x90, 0x83, 0xAB, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x49, 0x4B, 0x80, 0xBF, 0x74, 0x45, 0x2F, \r
-0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, \r
-0xF0, 0x22, 0x74, 0x45, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x14, \r
-0x90, 0x80, 0x03, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x51, 0xC1, 0x8E, 0x0D, 0x8F, 0x0E, 0x90, 0x04, \r
-0x1F, 0x74, 0x20, 0xF0, 0x22, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, \r
-0x90, 0x80, 0xA0, 0xE0, 0x9B, 0x90, 0x80, 0x9F, 0xE0, 0x9A, 0x50, 0x13, 0xA3, 0xE0, 0x24, 0x01, \r
-0xFF, 0x90, 0x80, 0x9F, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, \r
-0x90, 0xFD, 0x11, 0xF0, 0xAF, 0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, \r
-0xE0, 0xFF, 0x22, 0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x81, 0xFB, 0xE0, 0x54, 0xFE, \r
-0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x90, 0x81, \r
-0xFC, 0xF0, 0x22, 0x90, 0x82, 0x33, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x78, 0x3B, 0x7C, 0x82, 0x7D, \r
-0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0xC0, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x48, 0xD0, 0x78, 0x41, \r
-0x7C, 0x82, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0xC6, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x48, \r
-0xD0, 0x78, 0x45, 0x7C, 0x82, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0xCA, 0x7E, 0x00, 0x7F, \r
-0x04, 0x12, 0x48, 0xD0, 0x90, 0x82, 0x34, 0xE0, 0xFF, 0x90, 0x82, 0x33, 0xE0, 0x2F, 0xFF, 0x24, \r
-0x06, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x21, 0xB8, 0x74, \r
-0x07, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x64, 0x06, 0x60, 0x02, 0x21, 0xB8, \r
-0x90, 0x06, 0x30, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x82, 0x33, 0xE0, 0x24, 0x0A, 0xF9, 0xE4, 0x34, \r
-0xFB, 0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, 0x06, 0x7B, 0x01, 0x7A, 0x82, 0x79, \r
-0x35, 0x12, 0x2B, 0xED, 0x90, 0x82, 0x34, 0xE0, 0xFF, 0x90, 0x82, 0x33, 0xE0, 0x2F, 0x24, 0x10, \r
-0xF9, 0xE4, 0x34, 0xFB, 0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, 0x06, 0x7B, 0x01, \r
-0x7A, 0x82, 0x79, 0x3B, 0x12, 0x2B, 0xED, 0x90, 0x82, 0x34, 0xE0, 0xFF, 0x90, 0x82, 0x33, 0xE0, \r
-0x2F, 0x24, 0x16, 0xF9, 0xE4, 0x34, 0xFB, 0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, \r
-0x04, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x41, 0x12, 0x2B, 0xED, 0x78, 0x35, 0x7C, 0x82, 0x7D, 0x01, \r
-0x7B, 0x01, 0x7A, 0x80, 0x79, 0xEA, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x4B, 0xEC, 0xEF, 0x70, 0x58, \r
-0x90, 0x82, 0x34, 0xE0, 0xFF, 0x90, 0x82, 0x33, 0xE0, 0x2F, 0x24, 0x20, 0xF9, 0xE4, 0x34, 0xFB, \r
-0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, 0x04, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x45, \r
-0x12, 0x2B, 0xED, 0x78, 0x45, 0x7C, 0x82, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x80, 0x79, 0xF6, 0x7E, \r
-0x00, 0x7F, 0x04, 0x12, 0x4B, 0xEC, 0xEF, 0x70, 0x18, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x3B, 0x90, \r
-0x82, 0x4C, 0x12, 0x49, 0x8F, 0xE4, 0x90, 0x82, 0x4F, 0xF0, 0x7A, 0x82, 0x79, 0x41, 0x02, 0x6D, \r
-0x12, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x20, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x82, 0x1A, \r
-0xF0, 0x12, 0x1F, 0xA4, 0x90, 0x81, 0xEF, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x90, 0x81, \r
-0xF0, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x1F, 0xA4, 0xFE, 0xAF, 0x05, 0xED, 0x2E, \r
-0x90, 0x81, 0xF1, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0xFF, 0xED, 0x2F, 0x90, 0x81, 0xF2, \r
-0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0xFF, 0xED, 0x2F, 0x90, 0x81, 0xF3, 0xF0, 0x90, 0x00, \r
-0x03, 0x12, 0x1F, 0xBD, 0xFF, 0xED, 0x2F, 0x90, 0x81, 0xF4, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, \r
-0xBD, 0xFF, 0xED, 0x2F, 0x90, 0x81, 0xF5, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x1F, 0xBD, 0xFF, 0xED, \r
-0x2F, 0x90, 0x81, 0xF6, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x1F, 0xBD, 0xFF, 0xAE, 0x05, 0xED, 0x2F, \r
-0x90, 0x81, 0xF7, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x1F, 0xA4, 0xFE, 0xAF, 0x05, \r
-0xED, 0x2E, 0x90, 0x81, 0xF8, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0xFF, 0xED, 0x2F, 0x90, \r
-0x81, 0xF9, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x81, \r
-0xFA, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x82, 0xEB, 0x12, 0x49, 0x8F, \r
-0x90, 0x82, 0xEE, 0xED, 0xF0, 0xE4, 0x90, 0x83, 0x3A, 0xF0, 0x90, 0x83, 0x3A, 0xE0, 0xFF, 0xC3, \r
-0x94, 0x40, 0x50, 0x14, 0x74, 0xF7, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE4, 0xF0, \r
-0x90, 0x83, 0x3A, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0x90, 0x82, 0xEB, 0x12, 0x49, 0x86, 0x8B, 0x13, \r
-0x8A, 0x14, 0x89, 0x15, 0x90, 0x82, 0xEE, 0xE0, 0xF5, 0x16, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0xF7, \r
-0x12, 0x2B, 0xED, 0xE4, 0x90, 0x82, 0xF6, 0xF0, 0x90, 0x82, 0xF6, 0xE0, 0xFF, 0xC3, 0x94, 0x40, \r
-0x50, 0x16, 0x74, 0xF7, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0x64, 0x36, 0xF0, \r
-0x90, 0x82, 0xF6, 0xE0, 0x04, 0xF0, 0x80, 0xE0, 0x90, 0x82, 0xEF, 0x12, 0x49, 0x86, 0x90, 0x82, \r
-0xF2, 0xE0, 0xFF, 0xF5, 0x82, 0x75, 0x83, 0x00, 0x74, 0x80, 0x12, 0x1F, 0xFC, 0xEF, 0x75, 0xF0, \r
-0x08, 0xA4, 0x24, 0x00, 0xFF, 0xE5, 0xF0, 0x34, 0x02, 0xFC, 0x90, 0x00, 0x7E, 0x12, 0x1F, 0xFC, \r
-0xEF, 0x90, 0x00, 0x7F, 0x12, 0x1F, 0xFC, 0xE4, 0x90, 0x83, 0x37, 0xF0, 0xA3, 0xF0, 0x90, 0x83, \r
-0x37, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x94, 0xC0, 0xEE, 0x94, 0x00, 0x40, 0x02, 0x81, 0xBD, \r
-0xC3, 0xEF, 0x94, 0x40, 0xEE, 0x94, 0x00, 0x50, 0x52, 0xA3, 0x74, 0x40, 0xF0, 0x74, 0xF7, 0x2F, \r
-0xF9, 0xE4, 0x34, 0x82, 0xFA, 0x7B, 0x01, 0x74, 0x40, 0x44, 0x88, 0xFD, 0x12, 0x28, 0x08, 0x90, \r
-0x83, 0x37, 0xA3, 0xE0, 0x24, 0xFB, 0xF9, 0xE4, 0x34, 0x82, 0xFA, 0x7B, 0x01, 0xA3, 0xE0, 0x44, \r
-0x89, 0xFD, 0x12, 0x28, 0x08, 0x90, 0x83, 0x37, 0xA3, 0xE0, 0x24, 0xFF, 0xF9, 0xE4, 0x34, 0x82, \r
-0xFA, 0x7B, 0x01, 0xA3, 0xE0, 0x44, 0x8A, 0xFD, 0x12, 0x28, 0x08, 0x90, 0x83, 0x37, 0xA3, 0xE0, \r
-0x24, 0x03, 0xF9, 0xE4, 0x34, 0x83, 0xFA, 0x7B, 0x01, 0x61, 0xFE, 0xE4, 0x90, 0x83, 0x39, 0xF0, \r
-0x90, 0x82, 0xEF, 0x12, 0x49, 0x86, 0x90, 0x83, 0x37, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, \r
-0x3E, 0xFA, 0xE9, 0x24, 0xC0, 0xF9, 0xEA, 0x34, 0xFF, 0xFA, 0x74, 0x88, 0xFD, 0x12, 0x28, 0x08, \r
-0x90, 0x82, 0xEF, 0x12, 0x49, 0x86, 0x90, 0x83, 0x37, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, \r
-0x3E, 0xFA, 0xE9, 0x24, 0xC4, 0xF9, 0xEA, 0x34, 0xFF, 0xFA, 0xA3, 0xE0, 0x44, 0x89, 0xFD, 0x12, \r
-0x28, 0x08, 0x90, 0x82, 0xEF, 0x12, 0x49, 0x86, 0x90, 0x83, 0x37, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, \r
-0xF9, 0xEA, 0x3E, 0xFA, 0xE9, 0x24, 0xC8, 0xF9, 0xEA, 0x34, 0xFF, 0xFA, 0xA3, 0xE0, 0x44, 0x8A, \r
-0xFD, 0x12, 0x28, 0x08, 0x90, 0x82, 0xEF, 0x12, 0x49, 0x86, 0x90, 0x83, 0x37, 0xE0, 0xFE, 0xA3, \r
-0xE0, 0x29, 0xF9, 0xEA, 0x3E, 0xFA, 0xE9, 0x24, 0xCC, 0xF9, 0xEA, 0x34, 0xFF, 0xFA, 0xA3, 0xE0, \r
-0x44, 0x8B, 0xFD, 0x12, 0x28, 0x08, 0x90, 0x83, 0x39, 0xE0, 0x44, 0x90, 0x90, 0x01, 0x8C, 0xF0, \r
-0xE4, 0x90, 0x83, 0x3B, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x8C, 0xE0, 0x30, 0xE4, 0x22, 0xC3, 0x90, \r
-0x83, 0x3C, 0xE0, 0x94, 0xE8, 0x90, 0x83, 0x3B, 0xE0, 0x94, 0x03, 0x50, 0x13, 0x7F, 0x01, 0x7E, \r
-0x00, 0x12, 0x32, 0xAA, 0x90, 0x83, 0x3B, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x49, 0x4B, 0x80, 0xD7, \r
-0x90, 0x83, 0x3B, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x0C, \r
-0x90, 0x06, 0x31, 0xE0, 0x44, 0x01, 0xF0, 0xEE, 0x90, 0x06, 0x36, 0xF0, 0x90, 0x83, 0x38, 0xE0, \r
-0x54, 0x3F, 0x64, 0x30, 0x70, 0x4B, 0x90, 0x83, 0x3B, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x8C, 0xE0, \r
-0x20, 0xE5, 0x22, 0xC3, 0x90, 0x83, 0x3C, 0xE0, 0x94, 0xE8, 0x90, 0x83, 0x3B, 0xE0, 0x94, 0x03, \r
-0x50, 0x13, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0x90, 0x83, 0x3B, 0xE4, 0x75, 0xF0, 0x01, \r
-0x12, 0x49, 0x4B, 0x80, 0xD7, 0x90, 0x83, 0x3B, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x94, 0xE8, \r
-0xEE, 0x94, 0x03, 0x40, 0x0C, 0x90, 0x06, 0x31, 0xE0, 0x44, 0x02, 0xF0, 0xEE, 0x90, 0x06, 0x36, \r
-0xF0, 0x90, 0x83, 0x37, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x49, 0x4B, 0x61, 0x0E, 0x90, 0x82, 0xF3, \r
-0x12, 0x49, 0x86, 0xE9, 0x24, 0x10, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x80, 0x12, 0x2A, 0x8F, 0x90, \r
-0x82, 0xF3, 0x12, 0x49, 0x86, 0xE9, 0x24, 0x0C, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x81, 0x12, 0x2A, \r
-0x8F, 0x90, 0x82, 0xF3, 0x12, 0x49, 0x86, 0xE9, 0x24, 0x08, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x82, \r
-0x12, 0x2A, 0x8F, 0x90, 0x82, 0xF3, 0x12, 0x49, 0x86, 0xE9, 0x24, 0x04, 0xF9, 0xE4, 0x3A, 0xFA, \r
-0x7D, 0x83, 0x12, 0x2A, 0x8F, 0x90, 0x82, 0xF3, 0x12, 0x49, 0x86, 0x7D, 0x84, 0x12, 0x2A, 0x8F, \r
-0xE4, 0x90, 0x83, 0x3A, 0xF0, 0x90, 0x83, 0x3A, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x14, 0x74, \r
-0xF7, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x83, 0x3A, 0xE0, 0x04, \r
-0xF0, 0x80, 0xE2, 0x90, 0x82, 0xEB, 0x12, 0x49, 0x86, 0x8B, 0x13, 0x8A, 0x14, 0x89, 0x15, 0x90, \r
-0x82, 0xEE, 0xE0, 0xF5, 0x16, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0xF7, 0x12, 0x2B, 0xED, 0xE4, 0x90, \r
-0x82, 0xF6, 0xF0, 0x90, 0x82, 0xF6, 0xE0, 0xFF, 0xC3, 0x94, 0x40, 0x50, 0x16, 0x74, 0xF7, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0x64, 0x5C, 0xF0, 0x90, 0x82, 0xF6, 0xE0, 0x04, \r
-0xF0, 0x80, 0xE0, 0xE4, 0x90, 0x82, 0xF6, 0xF0, 0x90, 0x82, 0xF3, 0x12, 0x49, 0x86, 0x90, 0x82, \r
-0xF6, 0xE0, 0xFF, 0xF5, 0x82, 0x75, 0x83, 0x00, 0x12, 0x1F, 0xBD, 0xFE, 0x90, 0x82, 0xEF, 0x12, \r
-0x49, 0x86, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xEE, 0x12, 0x1F, 0xFC, 0x90, 0x82, 0xF6, 0xE0, 0x04, \r
-0xF0, 0xE0, 0xB4, 0x14, 0xD3, 0x90, 0x82, 0xEF, 0x12, 0x49, 0x86, 0x90, 0x00, 0x14, 0x74, 0x80, \r
-0x12, 0x1F, 0xFC, 0x90, 0x82, 0xF6, 0x74, 0x15, 0xF0, 0x90, 0x82, 0xF6, 0xE0, 0xFF, 0xC3, 0x94, \r
-0x3E, 0x50, 0x17, 0x90, 0x82, 0xEF, 0x12, 0x49, 0x86, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xE4, 0x12, \r
-0x1F, 0xFC, 0x90, 0x82, 0xF6, 0xE0, 0x04, 0xF0, 0x80, 0xDF, 0x90, 0x82, 0xEF, 0x12, 0x49, 0x86, \r
-0x90, 0x00, 0x3E, 0x74, 0x02, 0x12, 0x1F, 0xFC, 0x90, 0x00, 0x3F, 0x74, 0xA0, 0x12, 0x1F, 0xFC, \r
-0xE4, 0x90, 0x83, 0x37, 0xF0, 0xA3, 0xF0, 0x90, 0x83, 0x37, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, \r
-0x94, 0x80, 0xEE, 0x94, 0x00, 0x40, 0x02, 0xE1, 0xA6, 0xC3, 0xEF, 0x94, 0x40, 0xEE, 0x94, 0x00, \r
-0x50, 0x52, 0xA3, 0x74, 0x40, 0xF0, 0x74, 0xF7, 0x2F, 0xF9, 0xE4, 0x34, 0x82, 0xFA, 0x7B, 0x01, \r
-0x74, 0x40, 0x44, 0x88, 0xFD, 0x12, 0x28, 0x08, 0x90, 0x83, 0x37, 0xA3, 0xE0, 0x24, 0xFB, 0xF9, \r
-0xE4, 0x34, 0x82, 0xFA, 0x7B, 0x01, 0xA3, 0xE0, 0x44, 0x89, 0xFD, 0x12, 0x28, 0x08, 0x90, 0x83, \r
-0x37, 0xA3, 0xE0, 0x24, 0xFF, 0xF9, 0xE4, 0x34, 0x82, 0xFA, 0x7B, 0x01, 0xA3, 0xE0, 0x44, 0x8A, \r
-0xFD, 0x12, 0x28, 0x08, 0x90, 0x83, 0x37, 0xA3, 0xE0, 0x24, 0x03, 0xF9, 0xE4, 0x34, 0x83, 0xFA, \r
-0x7B, 0x01, 0xC1, 0xE7, 0xE4, 0x90, 0x83, 0x39, 0xF0, 0x90, 0x82, 0xEF, 0x12, 0x49, 0x86, 0x90, \r
-0x83, 0x37, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, 0x3E, 0xFA, 0xE9, 0x24, 0xC0, 0xF9, 0xEA, \r
-0x34, 0xFF, 0xFA, 0x74, 0x88, 0xFD, 0x12, 0x28, 0x08, 0x90, 0x82, 0xEF, 0x12, 0x49, 0x86, 0x90, \r
-0x83, 0x37, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, 0x3E, 0xFA, 0xE9, 0x24, 0xC4, 0xF9, 0xEA, \r
-0x34, 0xFF, 0xFA, 0xA3, 0xE0, 0x44, 0x89, 0xFD, 0x12, 0x28, 0x08, 0x90, 0x82, 0xEF, 0x12, 0x49, \r
-0x86, 0x90, 0x83, 0x37, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, 0x3E, 0xFA, 0xE9, 0x24, 0xC8, \r
-0xF9, 0xEA, 0x34, 0xFF, 0xFA, 0xA3, 0xE0, 0x44, 0x8A, 0xFD, 0x12, 0x28, 0x08, 0x90, 0x82, 0xEF, \r
-0x12, 0x49, 0x86, 0x90, 0x83, 0x37, 0xE0, 0xFE, 0xA3, 0xE0, 0x29, 0xF9, 0xEA, 0x3E, 0xFA, 0xE9, \r
-0x24, 0xCC, 0xF9, 0xEA, 0x34, 0xFF, 0xFA, 0xA3, 0xE0, 0x44, 0x8B, 0xFD, 0x12, 0x28, 0x08, 0x90, \r
-0x83, 0x39, 0xE0, 0x44, 0x90, 0x90, 0x01, 0x8C, 0xF0, 0xE4, 0x90, 0x83, 0x3B, 0xF0, 0xA3, 0xF0, \r
-0x90, 0x01, 0x8C, 0xE0, 0x30, 0xE4, 0x22, 0xC3, 0x90, 0x83, 0x3C, 0xE0, 0x94, 0xE8, 0x90, 0x83, \r
-0x3B, 0xE0, 0x94, 0x03, 0x50, 0x13, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0x90, 0x83, 0x3B, \r
-0xE4, 0x75, 0xF0, 0x01, 0x12, 0x49, 0x4B, 0x80, 0xD7, 0x90, 0x83, 0x3B, 0xE0, 0xFE, 0xA3, 0xE0, \r
-0xFF, 0xC3, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x0C, 0x90, 0x06, 0x31, 0xE0, 0x44, 0x01, 0xF0, \r
-0xEE, 0x90, 0x06, 0x36, 0xF0, 0x90, 0x83, 0x38, 0xE0, 0x54, 0x3F, 0x64, 0x30, 0x70, 0x4B, 0x90, \r
-0x83, 0x3B, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x8C, 0xE0, 0x20, 0xE5, 0x22, 0xC3, 0x90, 0x83, 0x3C, \r
-0xE0, 0x94, 0xE8, 0x90, 0x83, 0x3B, 0xE0, 0x94, 0x03, 0x50, 0x13, 0x7F, 0x01, 0x7E, 0x00, 0x12, \r
-0x32, 0xAA, 0x90, 0x83, 0x3B, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x49, 0x4B, 0x80, 0xD7, 0x90, 0x83, \r
-0x3B, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x40, 0x0C, 0x90, 0x06, \r
-0x31, 0xE0, 0x44, 0x02, 0xF0, 0xEE, 0x90, 0x06, 0x36, 0xF0, 0x90, 0x83, 0x37, 0xE4, 0x75, 0xF0, \r
-0x10, 0x12, 0x49, 0x4B, 0xA1, 0xF7, 0x90, 0x82, 0xF3, 0x12, 0x49, 0x86, 0xE9, 0x24, 0x10, 0xF9, \r
-0xE4, 0x3A, 0xFA, 0x7D, 0x80, 0x12, 0x2A, 0x8F, 0x90, 0x82, 0xF3, 0x12, 0x49, 0x86, 0xE9, 0x24, \r
-0x0C, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x81, 0x12, 0x2A, 0x8F, 0x90, 0x82, 0xF3, 0x12, 0x49, 0x86, \r
-0xE9, 0x24, 0x08, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x82, 0x12, 0x2A, 0x8F, 0x90, 0x82, 0xF3, 0x12, \r
-0x49, 0x86, 0xE9, 0x24, 0x04, 0xF9, 0xE4, 0x3A, 0xFA, 0x7D, 0x83, 0x12, 0x2A, 0x8F, 0x90, 0x82, \r
-0xF3, 0x12, 0x49, 0x86, 0x7D, 0x84, 0x12, 0x2A, 0x8F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x82, \r
-0x49, 0xED, 0xF0, 0x90, 0x82, 0x47, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x51, 0xF1, 0x90, 0x82, 0x47, \r
-0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
-0x82, 0x4A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x82, 0x62, 0x74, 0x18, 0xF0, \r
-0x7E, 0x00, 0x7F, 0x80, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x6A, 0x12, 0x4C, 0x10, 0x90, \r
-0x81, 0xF4, 0xE0, 0xFF, 0x12, 0x5D, 0x8E, 0x90, 0x82, 0x61, 0xEF, 0xF0, 0xF9, 0xE0, 0xFE, 0x24, \r
-0x21, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x41, 0xF0, 0xEE, 0x24, 0x20, 0xFD, 0xE4, \r
-0x33, 0xFC, 0x90, 0x82, 0x62, 0xE0, 0x7A, 0x00, 0x2D, 0xFE, 0xEA, 0x3C, 0x90, 0x82, 0x66, 0xF0, \r
-0xA3, 0xCE, 0xF0, 0x74, 0x20, 0x29, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x82, 0x4C, \r
-0xE0, 0xFD, 0x12, 0x6D, 0xE1, 0x90, 0x82, 0x66, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x49, 0x4B, 0x90, \r
-0x82, 0x66, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x49, 0x4B, 0x90, 0x82, 0x66, 0xE0, 0xFF, 0xA3, 0xE0, \r
-0x90, 0x82, 0x64, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x82, 0x6A, 0x74, 0x01, 0xF0, 0xA3, 0x74, \r
-0x03, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0x74, 0x5F, 0xF0, 0x90, 0x82, 0x66, 0xE4, 0x75, 0xF0, 0x04, \r
-0x12, 0x49, 0x4B, 0x90, 0x81, 0x59, 0xE0, 0xFF, 0x7E, 0x02, 0xB4, 0xFE, 0x02, 0x7E, 0xFE, 0x90, \r
-0x82, 0x66, 0xA3, 0xE0, 0xFD, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEE, 0xF0, \r
-0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x82, 0x6E, 0xF0, 0x90, \r
-0x82, 0x66, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x49, 0x4B, 0x90, 0x81, 0xEE, 0xE0, 0x90, 0x82, 0x4A, \r
-0xB4, 0x01, 0x0B, 0xE0, 0x44, 0x03, 0xFC, 0xA3, 0xE0, 0x44, 0x10, 0xFD, 0x80, 0x09, 0xE0, 0x44, \r
-0x03, 0xFC, 0xA3, 0xE0, 0x44, 0x20, 0xFD, 0x90, 0x82, 0x68, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, \r
-0x82, 0x6F, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x12, 0xF0, 0x90, 0x82, 0x66, 0xE4, 0x75, 0xF0, 0x02, \r
-0x12, 0x49, 0x4B, 0xEF, 0x64, 0xFE, 0x70, 0x37, 0x90, 0x82, 0x66, 0xA3, 0xE0, 0x24, 0x00, 0xF9, \r
-0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x13, 0x75, 0x14, 0x81, 0x75, 0x15, 0x5C, \r
-0x75, 0x16, 0x02, 0xD0, 0x03, 0x12, 0x2B, 0xED, 0x75, 0x13, 0x01, 0x75, 0x14, 0x81, 0x75, 0x15, \r
-0x5C, 0x75, 0x16, 0x02, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x71, 0x12, 0x2B, 0xED, 0x80, 0x60, 0x90, \r
-0x81, 0x0B, 0xE0, 0xFF, 0xB4, 0x02, 0x2B, 0x90, 0x82, 0x66, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x24, \r
-0x00, 0xF5, 0x82, 0x74, 0xFC, 0x3C, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0x74, \r
-0xFC, 0x3C, 0xF5, 0x83, 0x74, 0x20, 0xF0, 0xE4, 0x90, 0x82, 0x71, 0xF0, 0xA3, 0x74, 0x20, 0xF0, \r
-0x80, 0x2D, 0xEF, 0xB4, 0x04, 0x29, 0x90, 0x82, 0x66, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x24, 0x00, \r
-0xF5, 0x82, 0x74, 0xFC, 0x3E, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0x74, 0xFC, \r
-0x3E, 0xF5, 0x83, 0x74, 0x10, 0xF0, 0xE4, 0x90, 0x82, 0x71, 0xF0, 0xA3, 0x74, 0x10, 0xF0, 0x90, \r
-0x82, 0x66, 0xE4, 0x75, 0xF0, 0x02, 0x12, 0x49, 0x4B, 0xE4, 0x90, 0x82, 0x63, 0xF0, 0x90, 0x82, \r
-0x63, 0xE0, 0xFF, 0x24, 0x5E, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0x82, \r
-0x66, 0xA3, 0xE0, 0xFD, 0xEF, 0x2D, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEE, \r
-0xF0, 0x90, 0x82, 0x63, 0xE0, 0xFF, 0x24, 0x5E, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, \r
-0xFE, 0x74, 0x73, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x82, 0x63, \r
-0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xB7, 0x90, 0x82, 0x66, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x49, \r
-0x4B, 0x90, 0x82, 0x66, 0xE4, 0x75, 0xF0, 0x20, 0x12, 0x49, 0x4B, 0x90, 0x82, 0x66, 0xE4, 0x75, \r
-0xF0, 0x10, 0x12, 0x49, 0x4B, 0x90, 0x82, 0x66, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x49, 0x4B, 0x90, \r
-0x82, 0x66, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x49, 0x4B, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x6A, 0x90, \r
-0x82, 0xEF, 0x12, 0x49, 0x8F, 0x90, 0x82, 0xF2, 0x74, 0x63, 0xF0, 0x7A, 0x82, 0x79, 0x4D, 0xA3, \r
-0x12, 0x49, 0x8F, 0x7A, 0x81, 0x79, 0x0D, 0x7D, 0x10, 0x12, 0x72, 0x63, 0xE4, 0x90, 0x82, 0x63, \r
-0xF0, 0x90, 0x82, 0x63, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x42, 0x90, 0x82, 0x66, 0xA3, 0xE0, \r
-0xFE, 0xEF, 0x2E, 0xFF, 0x90, 0x82, 0xEA, 0xF0, 0x7E, 0x00, 0x90, 0x81, 0xF4, 0xE0, 0xFD, 0x12, \r
-0x6F, 0x74, 0x90, 0x82, 0x61, 0xEF, 0xF0, 0x90, 0x82, 0x63, 0xE0, 0x24, 0x4D, 0xF5, 0x82, 0xE4, \r
-0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x82, 0x61, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, \r
-0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x82, 0x63, 0xE0, 0x04, 0xF0, 0x80, 0xB4, 0x12, 0x6C, 0xE4, \r
-0xBF, 0x01, 0x19, 0x90, 0x81, 0xF4, 0x12, 0x51, 0xBD, 0x90, 0x82, 0x61, 0xEF, 0xF0, 0x90, 0x81, \r
-0xF4, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x81, 0xF0, 0xE0, 0xFD, 0xB4, 0x02, 0x0C, \r
-0x90, 0x82, 0x81, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x80, 0x0E, 0xED, 0xB4, 0x04, 0x0A, \r
-0x90, 0x82, 0x81, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x10, 0xF0, 0xEF, 0x64, 0x02, 0x4E, 0x60, 0x02, \r
-0x61, 0xDC, 0x90, 0x81, 0x56, 0xE0, 0xFF, 0x64, 0xFE, 0x70, 0x02, 0x61, 0xDC, 0xEF, 0x64, 0x02, \r
-0x60, 0x07, 0xEF, 0x64, 0x03, 0x60, 0x02, 0x61, 0xDC, 0x90, 0x81, 0xB6, 0xE0, 0xFE, 0xA3, 0xE0, \r
-0xFD, 0xED, 0xFF, 0x90, 0x82, 0x85, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, 0x20, 0x7D, \r
-0x00, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x61, 0x12, 0x4C, 0x10, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xB8, \r
-0x90, 0x86, 0x67, 0x12, 0x49, 0x8F, 0x7A, 0x82, 0x79, 0x61, 0x90, 0x86, 0x6A, 0x12, 0x49, 0x8F, \r
-0x7A, 0x81, 0x79, 0x1D, 0x7D, 0x03, 0x12, 0x02, 0x00, 0x75, 0x13, 0x01, 0x75, 0x14, 0x82, 0x75, \r
-0x15, 0x69, 0x75, 0x16, 0x10, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x4A, 0x12, 0x2B, 0xED, 0x90, 0x82, \r
-0x67, 0xE0, 0xFF, 0x54, 0x03, 0x90, 0x82, 0x87, 0xF0, 0x70, 0x02, 0x04, 0xF0, 0xEF, 0x54, 0x04, \r
-0x90, 0x82, 0x88, 0xF0, 0x90, 0x82, 0x87, 0xE0, 0xFF, 0x90, 0x82, 0x5A, 0xF0, 0x90, 0x82, 0x82, \r
-0xE0, 0x2F, 0xFE, 0x90, 0x82, 0x81, 0xE0, 0x34, 0x00, 0x90, 0x82, 0x83, 0xF0, 0xA3, 0xCE, 0xF0, \r
-0x7E, 0x00, 0x7F, 0x06, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x5B, 0x12, 0x4C, 0x10, 0x90, \r
-0x82, 0x5A, 0xE0, 0xFF, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x4A, 0x71, 0xE1, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0x90, 0x82, 0x89, 0xEF, 0xF0, 0xA3, 0x12, 0x49, 0x8F, 0x90, 0x82, 0x8A, 0x12, 0x49, 0x86, \r
-0x12, 0x1F, 0xA4, 0x90, 0x06, 0x74, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x90, 0x06, 0x75, \r
-0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0x90, 0x06, 0x76, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, \r
-0xBD, 0x90, 0x06, 0x77, 0xF0, 0x90, 0x82, 0x89, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, 0x90, \r
-0x06, 0x70, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x7F, 0x01, 0x7E, \r
-0x00, 0x12, 0x32, 0xAA, 0x90, 0x82, 0x8A, 0x12, 0x49, 0x86, 0x90, 0x00, 0x04, 0x12, 0x1F, 0xBD, \r
-0x90, 0x06, 0x74, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x1F, 0xBD, 0x90, 0x06, 0x75, 0xF0, 0x90, 0x00, \r
-0x06, 0x12, 0x1F, 0xBD, 0x90, 0x06, 0x76, 0xF0, 0x90, 0x00, 0x07, 0x12, 0x1F, 0xBD, 0x90, 0x06, \r
-0x77, 0xF0, 0x90, 0x82, 0x89, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0x90, 0x06, 0x70, 0xF0, \r
-0xA3, 0xE4, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x32, \r
-0xAA, 0x90, 0x82, 0x8A, 0x12, 0x49, 0x86, 0x90, 0x00, 0x08, 0x12, 0x1F, 0xBD, 0x90, 0x06, 0x74, \r
-0xF0, 0x90, 0x00, 0x09, 0x12, 0x1F, 0xBD, 0x90, 0x06, 0x75, 0xF0, 0x90, 0x00, 0x0A, 0x12, 0x1F, \r
-0xBD, 0x90, 0x06, 0x76, 0xF0, 0x90, 0x00, 0x0B, 0x12, 0x1F, 0xBD, 0x90, 0x06, 0x77, 0xF0, 0x90, \r
-0x82, 0x89, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, 0x90, 0x06, 0x70, 0xF0, 0xA3, 0xE4, 0xF0, \r
-0xA3, 0x04, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0x90, 0x82, \r
-0x8A, 0x12, 0x49, 0x86, 0x90, 0x00, 0x0C, 0x12, 0x1F, 0xBD, 0x90, 0x06, 0x74, 0xF0, 0x90, 0x00, \r
-0x0D, 0x12, 0x1F, 0xBD, 0x90, 0x06, 0x75, 0xF0, 0x90, 0x00, 0x0E, 0x12, 0x1F, 0xBD, 0x90, 0x06, \r
-0x76, 0xF0, 0x90, 0x00, 0x0F, 0x12, 0x1F, 0xBD, 0x90, 0x06, 0x77, 0xF0, 0x90, 0x82, 0x89, 0xE0, \r
-0x75, 0xF0, 0x08, 0xA4, 0x24, 0x05, 0x90, 0x06, 0x70, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x04, 0xF0, \r
-0xA3, 0x74, 0x80, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0x90, 0x82, 0x89, 0xE0, 0xFF, \r
-0x44, 0x10, 0x90, 0x06, 0x74, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, \r
-0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x90, 0x06, 0x70, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, \r
-0x74, 0x80, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0x90, 0x06, 0x74, 0x74, 0xFF, 0xF0, \r
-0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x82, 0x89, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x04, 0x90, \r
-0x06, 0x70, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x7F, 0x01, 0x7E, \r
-0x00, 0x12, 0x32, 0xAA, 0x90, 0x06, 0x72, 0xE4, 0xF0, 0x22, 0x90, 0x83, 0x8C, 0x12, 0x49, 0x8F, \r
-0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0xFD, 0x70, 0x04, 0xFE, 0x7F, 0x01, 0x22, 0xED, 0xC3, 0x94, \r
-0x06, 0x40, 0x68, 0x90, 0x83, 0x8C, 0x12, 0x49, 0x86, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0xA8, \r
-0x01, 0xFC, 0xAD, 0x03, 0x7B, 0x01, 0x7A, 0x83, 0x79, 0x4F, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x4B, \r
-0xEC, 0xEF, 0x70, 0x47, 0x90, 0x83, 0x8C, 0x12, 0x49, 0x86, 0x90, 0x00, 0x06, 0x12, 0x1F, 0xBD, \r
-0x64, 0x01, 0x70, 0x37, 0x90, 0x00, 0x07, 0x12, 0x1F, 0xBD, 0x70, 0x2F, 0x90, 0x83, 0x8C, 0x12, \r
-0x49, 0x86, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x83, 0x92, 0x12, 0x49, 0x86, 0x12, 0x49, \r
-0x98, 0x90, 0x83, 0x8C, 0x12, 0x49, 0x86, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x24, 0x02, 0xFF, \r
-0x90, 0x83, 0x92, 0x12, 0x49, 0x86, 0x90, 0x00, 0x03, 0xC1, 0xDF, 0x90, 0x83, 0x8F, 0x12, 0x49, \r
-0x86, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x83, 0x8C, 0x12, 0x49, 0x86, 0xE9, 0x24, 0x05, \r
-0xF9, 0xE4, 0x3A, 0xFA, 0xC3, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0xE9, 0x95, 0x82, 0xEA, 0x95, \r
-0x83, 0x50, 0x53, 0x90, 0x83, 0x8C, 0x12, 0x49, 0x86, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0xC3, \r
-0x94, 0x14, 0x40, 0x42, 0x90, 0x83, 0x8C, 0x12, 0x49, 0x86, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, \r
-0xA8, 0x01, 0xFC, 0xAD, 0x03, 0x7B, 0x01, 0x7A, 0x83, 0x79, 0x5B, 0x7E, 0x00, 0x7F, 0x04, 0x12, \r
-0x4B, 0xEC, 0xEF, 0x70, 0x21, 0x90, 0x83, 0x8C, 0x12, 0x49, 0x86, 0xE9, 0x24, 0x06, 0xF9, 0xE4, \r
-0x3A, 0xFA, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x83, 0x92, 0x12, 0x49, 0x86, 0x90, 0x00, \r
-0x08, 0x12, 0x49, 0xE7, 0xE1, 0x54, 0x90, 0x83, 0x8C, 0x12, 0x49, 0x86, 0x90, 0x00, 0x01, 0x12, \r
-0x1F, 0xBD, 0xD3, 0x94, 0x06, 0x40, 0x5E, 0x90, 0x83, 0x8C, 0x12, 0x49, 0x86, 0xE9, 0x24, 0x02, \r
-0xF9, 0xE4, 0x3A, 0xA8, 0x01, 0xFC, 0xAD, 0x03, 0x7B, 0x01, 0x7A, 0x83, 0x79, 0x53, 0x7E, 0x00, \r
-0x7F, 0x04, 0x12, 0x4B, 0xEC, 0xEF, 0x70, 0x3D, 0x90, 0x83, 0x8C, 0x12, 0x49, 0x86, 0xE9, 0x24, \r
-0x06, 0xF9, 0xE4, 0x3A, 0xFA, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x83, 0x92, 0x12, 0x49, \r
-0x86, 0x90, 0x00, 0x0B, 0x12, 0x49, 0xE7, 0x90, 0x83, 0x8C, 0x12, 0x49, 0x86, 0x90, 0x00, 0x01, \r
-0x12, 0x1F, 0xBD, 0x24, 0xFC, 0xFF, 0x90, 0x83, 0x92, 0x12, 0x49, 0x86, 0x90, 0x00, 0x0E, 0xEF, \r
-0x12, 0x1F, 0xFC, 0x80, 0x6F, 0x90, 0x83, 0x8C, 0x12, 0x49, 0x86, 0x90, 0x00, 0x01, 0x12, 0x1F, \r
-0xBD, 0xD3, 0x94, 0x06, 0x40, 0x5E, 0x90, 0x83, 0x8C, 0x12, 0x49, 0x86, 0xE9, 0x24, 0x02, 0xF9, \r
-0xE4, 0x3A, 0xA8, 0x01, 0xFC, 0xAD, 0x03, 0x7B, 0x01, 0x7A, 0x83, 0x79, 0x57, 0x7E, 0x00, 0x7F, \r
-0x04, 0x12, 0x4B, 0xEC, 0xEF, 0x70, 0x3D, 0x90, 0x83, 0x8C, 0x12, 0x49, 0x86, 0xE9, 0x24, 0x06, \r
-0xF9, 0xE4, 0x3A, 0xFA, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x83, 0x92, 0x12, 0x49, 0x86, \r
-0x90, 0x00, 0x0F, 0x12, 0x49, 0xE7, 0x90, 0x83, 0x8C, 0x12, 0x49, 0x86, 0x90, 0x00, 0x01, 0x12, \r
-0x1F, 0xBD, 0x24, 0xFC, 0xFF, 0x90, 0x83, 0x92, 0x12, 0x49, 0x86, 0x90, 0x00, 0x12, 0xEF, 0x12, \r
-0x1F, 0xFC, 0x80, 0x00, 0xE4, 0xFE, 0xFF, 0x22, 0x90, 0x83, 0x40, 0x12, 0x20, 0xCE, 0x90, 0x83, \r
-0x3D, 0x12, 0x49, 0x8F, 0xE4, 0x90, 0x83, 0x4D, 0xF0, 0xA3, 0xF0, 0x90, 0x83, 0x47, 0x12, 0x49, \r
-0x8F, 0x90, 0x83, 0x40, 0x12, 0x49, 0x6E, 0xE9, 0x2F, 0xF9, 0xEA, 0x3E, 0xFA, 0xEB, 0x3D, 0xFB, \r
-0x90, 0x83, 0x4A, 0x12, 0x49, 0x8F, 0x90, 0x83, 0x4A, 0x12, 0x49, 0x86, 0xC0, 0x03, 0xC0, 0x02, \r
-0xC0, 0x01, 0x90, 0x83, 0x47, 0x12, 0x49, 0x86, 0xE9, 0x24, 0x01, 0xF9, 0xE4, 0x3A, 0xFA, 0xC3, \r
-0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0xE9, 0x95, 0x82, 0xEA, 0x95, 0x83, 0x40, 0x03, 0x02, 0x80, \r
-0xD3, 0x90, 0x83, 0x47, 0x12, 0x49, 0x86, 0x12, 0x1F, 0xA4, 0xB4, 0xDD, 0x4F, 0x90, 0x83, 0x40, \r
-0x12, 0x49, 0x6E, 0x90, 0x83, 0x3D, 0x12, 0x49, 0x86, 0xE9, 0x2F, 0xF9, 0xEA, 0x3E, 0xFA, 0xEB, \r
-0x3D, 0xFB, 0xE9, 0x24, 0xFF, 0xF9, 0xEA, 0x34, 0xFF, 0xFA, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, \r
-0x90, 0x83, 0x47, 0x12, 0x49, 0x86, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x6B, 0x70, 0x08, 0xE9, \r
-0x65, 0x82, 0x70, 0x03, 0xEA, 0x65, 0x83, 0x70, 0x03, 0x02, 0x80, 0xD3, 0x90, 0x83, 0x47, 0x12, \r
-0x49, 0x86, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x70, 0x02, 0x01, 0xD3, 0x90, 0x83, 0x4A, 0x12, \r
-0x49, 0x86, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x83, 0x47, 0x12, 0x49, 0x86, 0x90, 0x00, \r
-0x01, 0x12, 0x1F, 0xBD, 0xFF, 0x7E, 0x00, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0xFA, 0xE9, 0x2F, \r
-0xF9, 0xEE, 0x3A, 0xFA, 0xD3, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0xE9, 0x95, 0x82, 0xEA, 0x95, \r
-0x83, 0x40, 0x02, 0x01, 0xD3, 0x90, 0x83, 0x47, 0x12, 0x49, 0x86, 0x12, 0x1F, 0xA4, 0xFF, 0xB4, \r
-0x30, 0x36, 0x90, 0x83, 0x47, 0x12, 0x49, 0x86, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x83, \r
-0x44, 0x12, 0x49, 0x86, 0x90, 0x00, 0x04, 0x12, 0x49, 0xE7, 0x90, 0x83, 0x47, 0x12, 0x49, 0x86, \r
-0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x24, 0x02, 0xFE, 0x90, 0x83, 0x44, 0x12, 0x49, 0x86, 0x90, \r
-0x00, 0x07, 0xEE, 0x12, 0x1F, 0xFC, 0x80, 0x2F, 0xEF, 0xB4, 0xDD, 0x2B, 0x90, 0x83, 0x4A, 0x12, \r
-0x49, 0x86, 0x90, 0x83, 0x8F, 0x12, 0x49, 0x8F, 0x90, 0x83, 0x44, 0x12, 0x49, 0x86, 0x90, 0x83, \r
-0x92, 0x12, 0x49, 0x8F, 0x90, 0x83, 0x47, 0x12, 0x49, 0x86, 0x12, 0x7D, 0x7A, 0x90, 0x83, 0x4D, \r
-0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x1C, 0x90, 0x83, 0x47, 0x12, 0x49, 0x86, 0x90, 0x00, 0x01, \r
-0x12, 0x1F, 0xBD, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0x90, 0x83, 0x48, 0x8F, 0xF0, 0x12, 0x49, 0x4B, \r
-0x02, 0x7F, 0x86, 0x90, 0x83, 0x4D, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x90, 0x82, 0xF1, 0x12, \r
-0x49, 0x8F, 0x90, 0x82, 0xF7, 0xE0, 0x60, 0x02, 0x21, 0xB0, 0x90, 0x82, 0xF4, 0x12, 0x49, 0x86, \r
-0x12, 0x1F, 0xA4, 0xF4, 0x60, 0x02, 0x21, 0xA5, 0x12, 0x1F, 0xEA, 0x90, 0x82, 0xF4, 0x12, 0x49, \r
-0x86, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0xF4, 0x60, 0x02, 0x21, 0x95, 0x90, 0x00, 0x01, 0x12, \r
-0x1F, 0xFC, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0xF4, 0x70, 0x6F, 0x90, 0x82, 0xF4, 0x12, 0x49, \r
-0x86, 0x90, 0x00, 0x02, 0xE4, 0x12, 0x1F, 0xFC, 0x90, 0x00, 0x03, 0x12, 0x1F, 0xBD, 0xF4, 0x70, \r
-0x4E, 0x90, 0x82, 0xF4, 0x12, 0x49, 0x86, 0x90, 0x00, 0x03, 0xE4, 0x12, 0x1F, 0xFC, 0x90, 0x00, \r
-0x04, 0x12, 0x1F, 0xBD, 0xF4, 0x70, 0x2D, 0x90, 0x82, 0xF4, 0x12, 0x49, 0x86, 0x90, 0x00, 0x04, \r
-0xE4, 0x12, 0x1F, 0xFC, 0x90, 0x00, 0x05, 0x12, 0x1F, 0xBD, 0x90, 0x82, 0xF4, 0xB4, 0xFF, 0x0C, \r
-0x12, 0x49, 0x86, 0x90, 0x00, 0x05, 0xE4, 0x12, 0x1F, 0xFC, 0x80, 0x44, 0x12, 0x49, 0x86, 0x90, \r
-0x00, 0x05, 0x80, 0x2A, 0x90, 0x82, 0xF4, 0x12, 0x49, 0x86, 0x90, 0x00, 0x04, 0x80, 0x1F, 0x90, \r
-0x82, 0xF4, 0x12, 0x49, 0x86, 0x90, 0x00, 0x03, 0x80, 0x14, 0x90, 0x82, 0xF4, 0x12, 0x49, 0x86, \r
-0x90, 0x00, 0x02, 0x80, 0x09, 0x90, 0x82, 0xF4, 0x12, 0x49, 0x86, 0x90, 0x00, 0x01, 0x74, 0x01, \r
-0x12, 0x49, 0x18, 0x80, 0x0B, 0x90, 0x82, 0xF4, 0x12, 0x49, 0x86, 0x74, 0x01, 0x12, 0x48, 0xF6, \r
-0x90, 0x82, 0xF8, 0xE0, 0xFF, 0x64, 0x04, 0x60, 0x02, 0x41, 0x5F, 0x90, 0x82, 0xF4, 0x12, 0x49, \r
-0x86, 0x12, 0x1F, 0xA4, 0xFE, 0x90, 0x82, 0xF1, 0x12, 0x49, 0x86, 0xEE, 0x12, 0x1F, 0xEA, 0x90, \r
-0x82, 0xF4, 0x12, 0x49, 0x86, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0xFE, 0x90, 0x82, 0xF1, 0x12, \r
-0x49, 0x86, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x1F, 0xFC, 0x90, 0x00, 0x02, 0xE4, 0x12, 0x1F, 0xFC, \r
-0x90, 0x00, 0x03, 0x74, 0x20, 0x12, 0x1F, 0xFC, 0x90, 0x82, 0xF4, 0x12, 0x49, 0x86, 0x90, 0x00, \r
-0x02, 0x12, 0x1F, 0xBD, 0xFE, 0x90, 0x82, 0xF1, 0x12, 0x49, 0x86, 0x90, 0x00, 0x04, 0xEE, 0x12, \r
-0x1F, 0xFC, 0x90, 0x82, 0xF4, 0x12, 0x49, 0x86, 0x90, 0x00, 0x03, 0x12, 0x1F, 0xBD, 0xFE, 0x90, \r
-0x82, 0xF1, 0x12, 0x49, 0x86, 0x90, 0x00, 0x05, 0xEE, 0x12, 0x1F, 0xFC, 0x90, 0x82, 0xF4, 0x12, \r
-0x49, 0x86, 0x90, 0x00, 0x04, 0x12, 0x1F, 0xBD, 0xFE, 0x90, 0x82, 0xF1, 0x12, 0x49, 0x86, 0x90, \r
-0x00, 0x06, 0xEE, 0x12, 0x1F, 0xFC, 0x90, 0x82, 0xF4, 0x12, 0x49, 0x86, 0x90, 0x00, 0x05, 0x12, \r
-0x1F, 0xBD, 0xFE, 0x90, 0x82, 0xF1, 0x12, 0x49, 0x86, 0x90, 0x00, 0x07, 0xEE, 0x61, 0x1F, 0xEF, \r
-0x64, 0x02, 0x60, 0x02, 0x61, 0x22, 0x90, 0x82, 0xF4, 0x12, 0x49, 0x86, 0x12, 0x1F, 0xA4, 0xFF, \r
-0x90, 0x82, 0xF1, 0x12, 0x49, 0x86, 0xEF, 0x12, 0x1F, 0xEA, 0x90, 0x82, 0xF4, 0x12, 0x49, 0x86, \r
-0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x44, 0x20, 0x54, 0x7F, 0xFF, 0x90, 0x82, 0xF1, 0x12, 0x49, \r
-0x86, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x1F, 0xFC, 0x90, 0x82, 0xF4, 0x12, 0x49, 0x86, 0x90, 0x00, \r
-0x01, 0x12, 0x1F, 0xBD, 0xFF, 0x90, 0x82, 0xF1, 0x12, 0x49, 0x86, 0x90, 0x00, 0x02, 0xEF, 0x12, \r
-0x1F, 0xFC, 0x90, 0x00, 0x03, 0x74, 0x20, 0x12, 0x1F, 0xFC, 0x90, 0x82, 0xF4, 0x12, 0x49, 0x86, \r
-0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0xFF, 0x90, 0x82, 0xF1, 0x12, 0x49, 0x86, 0x90, 0x00, 0x04, \r
-0xEF, 0x12, 0x1F, 0xFC, 0x90, 0x82, 0xF4, 0x12, 0x49, 0x86, 0x90, 0x00, 0x03, 0x12, 0x1F, 0xBD, \r
-0xFF, 0x90, 0x82, 0xF1, 0x12, 0x49, 0x86, 0x90, 0x00, 0x05, 0xEF, 0x12, 0x1F, 0xFC, 0x90, 0x82, \r
-0xF4, 0x12, 0x49, 0x86, 0x90, 0x00, 0x04, 0x12, 0x1F, 0xBD, 0xFF, 0x90, 0x82, 0xF1, 0x12, 0x49, \r
-0x86, 0x90, 0x00, 0x06, 0xEF, 0x12, 0x1F, 0xFC, 0x90, 0x82, 0xF4, 0x12, 0x49, 0x86, 0x90, 0x00, \r
-0x05, 0x12, 0x1F, 0xBD, 0xFF, 0x90, 0x82, 0xF1, 0x12, 0x49, 0x86, 0x90, 0x00, 0x07, 0xEF, 0x12, \r
-0x1F, 0xFC, 0x22, 0x00, 0xAF, 0x8C, \r
+0xC0, 0xD0, 0x90, 0x82, 0x4F, 0xEE, 0xF0, 0xA3, 0x71, 0x78, 0x90, 0x82, 0x4F, 0xE0, 0xFE, 0xA3, \r
+0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x29, 0xC3, 0x90, 0x82, 0x52, 0xE0, 0x94, 0xE8, 0x90, \r
+0x82, 0x51, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, \r
+0x80, 0x11, 0x90, 0x82, 0x51, 0x12, 0x5F, 0xB6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0x80, \r
+0xC9, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, \r
+0x90, 0x81, 0xA9, 0x71, 0x78, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, \r
+0x90, 0x81, 0xA9, 0xE0, 0x6F, 0x60, 0x35, 0xC3, 0x90, 0x81, 0xAB, 0xE0, 0x94, 0x88, 0x90, 0x81, \r
+0xAA, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x81, \r
+0xAA, 0x12, 0x5F, 0xB6, 0x71, 0xCD, 0xD3, 0x90, 0x81, 0xAB, 0xE0, 0x94, 0x32, 0x90, 0x81, 0xAA, \r
+0xE0, 0x94, 0x00, 0x40, 0xC0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB9, 0x22, 0x7F, 0x14, 0x7E, \r
+0x00, 0x02, 0x32, 0xAA, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x22, 0x90, 0x81, \r
+0x46, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x81, 0x54, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x32, 0x1E, 0x90, \r
+0x81, 0x4A, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, \r
+0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, 0x7F, 0x08, \r
+0x12, 0x32, 0x1E, 0x7F, 0x01, 0x71, 0x80, 0x90, 0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, \r
+0x12, 0x32, 0x1E, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x32, 0xAA, 0xE4, 0x90, 0x81, 0xA0, 0xF0, 0xA3, \r
+0xF0, 0x90, 0x01, 0x98, 0xE0, 0x7F, 0x00, 0x30, 0xE4, 0x02, 0x7F, 0x01, 0xEF, 0x64, 0x01, 0x60, \r
+0x3C, 0xC3, 0x90, 0x81, 0xA1, 0xE0, 0x94, 0x88, 0x90, 0x81, 0xA0, 0xE0, 0x94, 0x13, 0x40, 0x0F, \r
+0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x1E, 0x90, \r
+0x81, 0xA0, 0x12, 0x5F, 0xB6, 0x71, 0xCD, 0xD3, 0x90, 0x81, 0xA1, 0xE0, 0x94, 0x32, 0x90, 0x81, \r
+0xA0, 0xE0, 0x94, 0x00, 0x40, 0xBB, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xB4, 0x90, 0x01, 0xC7, \r
+0x74, 0xFE, 0xF0, 0x22, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x11, 0x7F, 0xF5, 0x7E, 0x00, 0x12, 0x2B, \r
+0x27, 0xBF, 0x01, 0x06, 0x90, 0x82, 0x11, 0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x11, \r
+0x7F, 0xF6, 0x7E, 0x00, 0x12, 0x2B, 0x27, 0xBF, 0x01, 0x08, 0x90, 0x82, 0x11, 0xE0, 0x90, 0x82, \r
+0x13, 0xF0, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x11, 0x7F, 0xF4, 0x7E, 0x00, 0x12, 0x2B, 0x27, 0xBF, \r
+0x01, 0x08, 0x90, 0x82, 0x11, 0xE0, 0x90, 0x82, 0x14, 0xF0, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x11, \r
+0x7F, 0xF3, 0x7E, 0x00, 0x12, 0x2B, 0x27, 0xBF, 0x01, 0x08, 0x90, 0x82, 0x11, 0xE0, 0x90, 0x82, \r
+0x15, 0xF0, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x11, 0x7F, 0xF2, 0x7E, 0x00, 0x12, 0x2B, 0x27, 0xBF, \r
+0x01, 0x08, 0x90, 0x82, 0x11, 0xE0, 0x90, 0x82, 0x16, 0xF0, 0x90, 0x82, 0x12, 0xE0, 0xFF, 0xA3, \r
+0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x82, 0x1A, 0xF0, 0x90, 0x82, 0x16, 0xE0, 0x90, \r
+0x82, 0x1B, 0xF0, 0x41, 0x7C, 0x12, 0x1F, 0xA4, 0xFF, 0x90, 0x81, 0x35, 0xF0, 0xBF, 0x01, 0x07, \r
+0x91, 0x84, 0xE4, 0x90, 0x81, 0x35, 0xF0, 0x22, 0x90, 0x82, 0x3A, 0xEF, 0xF0, 0xAB, 0x05, 0x90, \r
+0x82, 0x40, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x03, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, \r
+0x14, 0xB1, 0x7F, 0x90, 0x82, 0x3C, 0x12, 0x44, 0xCF, 0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x12, \r
+0x44, 0xC2, 0xEC, 0x54, 0x0F, 0xFC, 0x90, 0x82, 0x40, 0x12, 0x20, 0xCE, 0x90, 0x82, 0x3A, 0xE0, \r
+0x75, 0xF0, 0x08, 0xA4, 0x24, 0x60, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0x12, 0x5F, 0x9C, 0xC0, 0x06, \r
+0xC0, 0x07, 0x90, 0x82, 0x40, 0x12, 0x5E, 0xA0, 0xD0, 0x07, 0xD0, 0x06, 0x02, 0x2E, 0xA2, 0x12, \r
+0x20, 0xBB, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x22, 0x78, 0x10, 0x74, 0x01, 0xF2, \r
+0x90, 0x02, 0x09, 0xE0, 0x78, 0x00, 0xF2, 0x08, 0x74, 0x20, 0xF2, 0x18, 0xE2, 0xFF, 0x30, 0xE0, \r
+0x05, 0x08, 0xE2, 0x24, 0x80, 0xF2, 0xEF, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x78, 0x01, 0xE2, \r
+0xF1, 0xB4, 0x78, 0x03, 0xF2, 0x64, 0x04, 0x60, 0x0D, 0xE2, 0xFF, 0x64, 0x08, 0x60, 0x07, 0xEF, \r
+0x64, 0x0C, 0x60, 0x02, 0xE1, 0xAA, 0xE4, 0x78, 0x02, 0xF2, 0x78, 0x03, 0xE2, 0xFF, 0x18, 0xE2, \r
+0xC3, 0x9F, 0x50, 0x25, 0xE2, 0xFD, 0x18, 0xE2, 0x2D, 0x90, 0x81, 0xA9, 0xF0, 0xE0, 0xFF, 0xF1, \r
+0xB4, 0xFE, 0x74, 0x04, 0x2D, 0xF8, 0xEE, 0xF2, 0xEF, 0xB4, 0xFF, 0x06, 0x90, 0xFD, 0x10, 0xE0, \r
+0x04, 0xF0, 0x78, 0x02, 0xE2, 0x04, 0xF2, 0x80, 0xD1, 0x78, 0x04, 0xE2, 0x78, 0x12, 0xF2, 0xFF, \r
+0x78, 0x05, 0xE2, 0x78, 0x11, 0xF2, 0x78, 0x06, 0xE2, 0x78, 0x13, 0xF2, 0x78, 0x07, 0xE2, 0x78, \r
+0x14, 0xF2, 0x78, 0x08, 0xE2, 0x78, 0x33, 0xF2, 0x78, 0x09, 0xE2, 0x78, 0x34, 0xF2, 0x78, 0x0A, \r
+0xE2, 0x78, 0x35, 0xF2, 0x78, 0x0B, 0xE2, 0x78, 0x36, 0xF2, 0x78, 0x0C, 0xE2, 0x78, 0x37, 0xF2, \r
+0x78, 0x0D, 0xE2, 0x78, 0x38, 0xF2, 0x78, 0x0E, 0xE2, 0x78, 0x39, 0xF2, 0x78, 0x0F, 0xE2, 0x78, \r
+0x3A, 0xF2, 0xE4, 0x78, 0x15, 0xF2, 0xEF, 0x24, 0xF8, 0x60, 0x56, 0x24, 0xFC, 0x60, 0x4D, 0x24, \r
+0x08, 0x60, 0x02, 0xE1, 0x8C, 0x78, 0x11, 0xE2, 0xB4, 0x01, 0x05, 0x12, 0x29, 0xC5, 0xE1, 0x91, \r
+0x78, 0x11, 0xE2, 0xB4, 0x02, 0x05, 0x12, 0x11, 0xBD, 0xE1, 0x91, 0x78, 0x11, 0xE2, 0xB4, 0x03, \r
+0x05, 0x12, 0x68, 0x03, 0xE1, 0x91, 0x78, 0x11, 0xE2, 0xB4, 0x10, 0x07, 0xF1, 0xBF, 0x12, 0x32, \r
+0xAA, 0xE1, 0x91, 0x78, 0x11, 0xE2, 0xB4, 0x11, 0x07, 0xF1, 0xBF, 0x12, 0x32, 0x06, 0xE1, 0x91, \r
+0x78, 0x11, 0xE2, 0xF4, 0x60, 0x02, 0xE1, 0x91, 0x18, 0xF2, 0xE1, 0x91, 0x78, 0x15, 0x74, 0x01, \r
+0xF2, 0x78, 0x11, 0xE2, 0x64, 0x07, 0x60, 0x02, 0xE1, 0x75, 0x78, 0x34, 0xF1, 0xAD, 0x78, 0x08, \r
+0x12, 0x20, 0xBB, 0xC0, 0x04, 0xB1, 0x84, 0x78, 0x33, 0xF1, 0xAD, 0xD0, 0x00, 0x12, 0x44, 0xC2, \r
+0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x78, 0x35, 0xF1, 0xAD, 0x78, 0x10, 0x12, 0x20, \r
+0xBB, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0xC2, 0x78, 0x18, 0x12, 0x44, \r
+0xF4, 0x78, 0x15, 0xE2, 0x60, 0x79, 0x18, 0xE2, 0xFF, 0x18, 0xE2, 0xFD, 0xF1, 0xD2, 0x78, 0x1C, \r
+0x12, 0x44, 0xF4, 0x78, 0x38, 0xF1, 0xAD, 0x78, 0x08, 0x12, 0x20, 0xBB, 0xC0, 0x04, 0xB1, 0x84, \r
+0x78, 0x37, 0xF1, 0xAD, 0xD0, 0x00, 0x12, 0x44, 0xC2, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, \r
+0x07, 0x78, 0x39, 0xF1, 0xAD, 0x78, 0x10, 0x12, 0x20, 0xBB, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, \r
+0xD0, 0x00, 0x12, 0x44, 0xC2, 0x78, 0x20, 0x12, 0x44, 0xF4, 0x78, 0x20, 0x12, 0x44, 0xDB, 0x12, \r
+0x20, 0x9B, 0x78, 0x1C, 0x12, 0x44, 0xE7, 0x12, 0x44, 0xB5, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, \r
+0xC0, 0x07, 0x78, 0x18, 0x12, 0x44, 0xDB, 0x78, 0x20, 0x12, 0x44, 0xE7, 0x12, 0x44, 0xB5, 0xD0, \r
+0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0xC2, 0x78, 0x18, 0x12, 0x44, 0xF4, 0x78, \r
+0x18, 0x12, 0x44, 0xDB, 0x90, 0x82, 0x46, 0x12, 0x20, 0xCE, 0x78, 0x13, 0xE2, 0xFD, 0x08, 0xE2, \r
+0xFF, 0xF1, 0xE1, 0x80, 0x1C, 0x78, 0x13, 0xE2, 0xFF, 0x08, 0xE2, 0xFD, 0x78, 0x11, 0xE2, 0xFB, \r
+0x78, 0x15, 0xE2, 0x90, 0x82, 0x0B, 0xF0, 0x12, 0x6B, 0x2F, 0x80, 0x05, 0x78, 0x10, 0x74, 0x02, \r
+0xF2, 0x78, 0x10, 0xE2, 0xFF, 0xC3, 0x94, 0x02, 0x50, 0x10, 0xEF, 0x60, 0x0A, 0x78, 0x02, 0xE2, \r
+0xFF, 0x18, 0xE2, 0x2F, 0xF2, 0xA1, 0xAD, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xE2, 0xFF, 0xE4, \r
+0xFC, 0xFD, 0xFE, 0x22, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x78, \r
+0x14, 0xE2, 0xFE, 0x18, 0xE2, 0xFD, 0xED, 0xFF, 0x78, 0x16, 0xEE, 0xF2, 0xFE, 0x08, 0xEF, 0xF2, \r
+0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x5E, 0xA9, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, 0x07, 0xC0, 0x05, 0x90, 0x82, 0x46, 0x12, \r
+0x44, 0xCF, 0x90, 0x82, 0x3C, 0x12, 0x20, 0xCE, 0xD0, 0x05, 0xD0, 0x07, 0xB1, 0x28, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0xE4, 0x90, 0x81, 0xB9, 0xF0, 0x90, 0x87, 0x5F, 0xE0, 0x90, 0x81, 0xB8, 0xF0, \r
+0xE4, 0x90, 0x81, 0xC5, 0xF0, 0x90, 0x81, 0xB5, 0xF0, 0x90, 0x81, 0xB5, 0xE0, 0xFF, 0xC3, 0x94, \r
+0x40, 0x50, 0x10, 0x74, 0xC8, 0x2F, 0x71, 0x06, 0x74, 0xFF, 0xF0, 0x90, 0x81, 0xB5, 0xE0, 0x04, \r
+0xF0, 0x80, 0xE6, 0xE4, 0x90, 0x81, 0xB5, 0xF0, 0x90, 0x81, 0xB8, 0xE0, 0xFF, 0x90, 0x81, 0xB5, \r
+0xE0, 0xFE, 0xC3, 0x9F, 0x40, 0x02, 0x21, 0x03, 0x74, 0xDF, 0x2E, 0xF9, 0xE4, 0x34, 0x86, 0x51, \r
+0xFE, 0x75, 0x16, 0x0A, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xAA, 0x12, 0x2B, 0xED, 0x90, 0x81, 0xAB, \r
+0xE0, 0xFF, 0x12, 0x2F, 0x27, 0xEF, 0x04, 0x90, 0x81, 0xC5, 0xF0, 0x90, 0x81, 0xAA, 0xE0, 0xFF, \r
+0xA3, 0xE0, 0xFD, 0x12, 0x31, 0xEA, 0xEF, 0x24, 0xC8, 0x90, 0x81, 0xC7, 0xF0, 0x75, 0xF0, 0x08, \r
+0xA4, 0xF0, 0x90, 0x81, 0xAB, 0xE0, 0x54, 0x0F, 0x90, 0x81, 0xC6, 0xF0, 0xE4, 0x90, 0x81, 0xB4, \r
+0xF0, 0x90, 0x81, 0xB6, 0xF0, 0x90, 0x81, 0xB6, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x57, 0x90, \r
+0x81, 0xC6, 0xE0, 0xFE, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x13, 0xD8, 0xFC, 0x20, 0xE0, 0x3E, \r
+0x90, 0x81, 0xB6, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0x81, 0xC7, 0xE0, 0x2F, 0x24, 0xC8, 0xF9, 0xE4, \r
+0x34, 0x81, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x01, 0x90, 0x81, 0xB4, 0xE0, 0x75, 0xF0, 0x02, \r
+0xA4, 0x24, 0xAC, 0xF9, 0x74, 0x81, 0x35, 0xF0, 0x8B, 0x13, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, \r
+0x02, 0xD0, 0x01, 0xD0, 0x03, 0x12, 0x2B, 0xED, 0x90, 0x81, 0xB4, 0xE0, 0x04, 0xF0, 0x90, 0x81, \r
+0xB6, 0xE0, 0x04, 0xF0, 0x80, 0x9F, 0x90, 0x81, 0xC5, 0xE0, 0xFF, 0x90, 0x81, 0xB5, 0xE0, 0x2F, \r
+0xF0, 0x01, 0x38, 0xE4, 0x90, 0x81, 0xB9, 0xF0, 0x90, 0x81, 0xB9, 0xE0, 0xC3, 0x94, 0x40, 0x40, \r
+0x02, 0x41, 0xAB, 0xE0, 0xFF, 0x24, 0xC8, 0x71, 0x06, 0xE0, 0x90, 0x81, 0xBB, 0xF0, 0xE0, 0xFE, \r
+0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFD, 0x90, 0x81, 0xBA, 0xF0, 0xEE, 0x54, 0x0F, 0xFE, 0xA3, 0xF0, \r
+0x74, 0xC9, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0x90, 0x81, 0xBC, 0xF0, 0xFC, \r
+0xEE, 0xFE, 0xEC, 0xFB, 0xEB, 0xFF, 0x90, 0x81, 0xC1, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xED, 0x12, \r
+0x45, 0x1E, 0x69, 0x77, 0x00, 0x69, 0xA9, 0x01, 0x6A, 0x16, 0x02, 0x6A, 0x9C, 0x03, 0x6A, 0x21, \r
+0x04, 0x6A, 0x32, 0x05, 0x6A, 0x32, 0x06, 0x6A, 0x32, 0x07, 0x6A, 0x32, 0x08, 0x6A, 0x7A, 0x09, \r
+0x6A, 0x8B, 0x0A, 0x00, 0x00, 0x6A, 0xAB, 0x90, 0x81, 0xB9, 0xE0, 0xFD, 0x24, 0xCB, 0xF5, 0x82, \r
+0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0xCA, 0x2D, 0x51, 0xEB, 0xE0, 0xFD, 0xED, 0xFF, \r
+0x90, 0x81, 0xC3, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0x90, 0x81, 0xBC, 0xE0, 0xFF, 0x12, 0x2F, \r
+0x96, 0x90, 0x81, 0xB7, 0x74, 0x02, 0xF0, 0x41, 0x9C, 0x51, 0xAC, 0x12, 0x44, 0xC2, 0xC0, 0x04, \r
+0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x81, 0xB9, 0xE0, 0x24, 0xCC, 0xF5, 0x82, 0xE4, 0x34, \r
+0x81, 0x51, 0xD7, 0x78, 0x10, 0x12, 0x20, 0xBB, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, \r
+0x12, 0x44, 0xC2, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x81, 0xB9, 0xE0, 0x24, \r
+0xCD, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0x51, 0xD7, 0x78, 0x18, 0x12, 0x20, 0xBB, 0xD0, 0x03, 0xD0, \r
+0x02, 0xD0, 0x01, 0xD0, 0x00, 0x71, 0x0E, 0x90, 0x81, 0xBD, 0x12, 0x44, 0xCF, 0x90, 0x85, 0x96, \r
+0x12, 0x20, 0xCE, 0x90, 0x81, 0xC1, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x2E, 0xE4, 0x90, 0x81, \r
+0xB7, 0x74, 0x04, 0xF0, 0x41, 0x9C, 0x51, 0xE0, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x30, 0xC7, 0x80, \r
+0x09, 0x51, 0xE0, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x30, 0x6A, 0x90, 0x81, 0xB7, 0x74, 0x01, 0xF0, \r
+0x80, 0x6A, 0x90, 0x81, 0xB7, 0x74, 0x02, 0xF0, 0x51, 0xAC, 0x12, 0x44, 0xC2, 0xC0, 0x04, 0xC0, \r
+0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x81, 0xBB, 0x51, 0xD9, 0x78, 0x10, 0x12, 0x20, 0xBB, 0xD0, \r
+0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x71, 0x0E, 0x90, 0x81, 0xBA, 0xE0, 0x24, 0xFB, 0xFF, \r
+0xC0, 0x07, 0x90, 0x81, 0xBD, 0x12, 0x44, 0xCF, 0x90, 0x82, 0x46, 0x12, 0x20, 0xCE, 0x90, 0x81, \r
+0xBC, 0xE0, 0xFD, 0xD0, 0x07, 0x12, 0x67, 0xE1, 0x80, 0x22, 0x90, 0x81, 0xB7, 0x74, 0x01, 0x51, \r
+0xF3, 0x75, 0x16, 0x01, 0x71, 0x17, 0xF0, 0x7B, 0x04, 0x80, 0x0F, 0x90, 0x81, 0xB7, 0x74, 0x04, \r
+0x51, 0xF3, 0x75, 0x16, 0x04, 0x71, 0x17, 0xF0, 0x7B, 0x06, 0x71, 0x2F, 0x90, 0x81, 0xB7, 0xE0, \r
+0x24, 0x02, 0xFF, 0x90, 0x81, 0xB9, 0xE0, 0x2F, 0xF0, 0x21, 0x08, 0x22, 0x90, 0x81, 0xB9, 0xE0, \r
+0x24, 0xCB, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, \r
+0x08, 0x12, 0x20, 0xBB, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x81, 0xB9, 0xE0, \r
+0x24, 0xCA, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x22, \r
+0x90, 0x81, 0xBC, 0xE0, 0xFD, 0x90, 0x81, 0xB9, 0xE0, 0x24, 0xCA, 0xF5, 0x82, 0xE4, 0x34, 0x81, \r
+0xF5, 0x83, 0x22, 0xF0, 0x90, 0x81, 0xB9, 0xE0, 0x24, 0xCA, 0xF9, 0xE4, 0x34, 0x81, 0x75, 0x13, \r
+0x01, 0xF5, 0x14, 0x89, 0x15, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, 0x12, 0x44, \r
+0xC2, 0x90, 0x81, 0xBD, 0x02, 0x20, 0xCE, 0x7B, 0xFE, 0x7A, 0x80, 0x79, 0x33, 0x12, 0x2B, 0xED, \r
+0x90, 0x81, 0xBC, 0xE0, 0xFF, 0x90, 0x81, 0xBB, 0xE0, 0xFD, 0xE4, 0x90, 0x82, 0x0B, 0x22, 0xAC, \r
+0x07, 0xED, 0xAD, 0x04, 0x78, 0x24, 0xF2, 0xED, 0x08, 0xF2, 0xEB, 0xB4, 0x04, 0x07, 0x78, 0x27, \r
+0x74, 0x01, 0xF2, 0x80, 0x0E, 0xEB, 0x78, 0x27, 0xB4, 0x05, 0x05, 0x74, 0x02, 0xF2, 0x80, 0x03, \r
+0x74, 0x04, 0xF2, 0x91, 0x71, 0xE2, 0x94, 0x00, 0x50, 0x45, 0xE4, 0x78, 0x26, 0xF2, 0x91, 0x4B, \r
+0x9F, 0x40, 0x02, 0x81, 0x4A, 0x91, 0x54, 0x60, 0x1F, 0x74, 0x37, 0x2E, 0xF8, 0xE2, 0x78, 0x32, \r
+0xF2, 0xEE, 0xFF, 0x78, 0x25, 0xE2, 0x2F, 0xFF, 0x18, 0xE2, 0x34, 0x00, 0x8F, 0x82, 0xF5, 0x83, \r
+0xE0, 0x78, 0x29, 0xF2, 0x78, 0x32, 0x91, 0x87, 0x78, 0x24, 0x08, 0xE2, 0xFF, 0x08, 0xE2, 0x2F, \r
+0xFF, 0x78, 0x28, 0xE2, 0xFD, 0x12, 0x32, 0x1E, 0x78, 0x26, 0xE2, 0x04, 0xF2, 0x80, 0xBF, 0x91, \r
+0x71, 0xE2, 0x94, 0x07, 0x50, 0x30, 0xE4, 0x78, 0x26, 0xF2, 0x91, 0x4B, 0x9F, 0x40, 0x02, 0x81, \r
+0x4A, 0x91, 0x54, 0x60, 0x14, 0x78, 0x26, 0xE2, 0xFF, 0x91, 0x79, 0xE0, 0x78, 0x29, 0xF2, 0x74, \r
+0x37, 0x2F, 0xF8, 0xE2, 0x78, 0x32, 0xF2, 0x91, 0x87, 0x91, 0x69, 0x91, 0x79, 0xEF, 0xF0, 0x78, \r
+0x26, 0xE2, 0x04, 0xF2, 0x80, 0xD4, 0x90, 0x82, 0x0B, 0xE0, 0x60, 0x0A, 0x91, 0x61, 0x12, 0x2D, \r
+0x5C, 0x78, 0x2E, 0x12, 0x44, 0xF4, 0xE4, 0x78, 0x26, 0xF2, 0x91, 0x4B, 0x9F, 0x50, 0x4E, 0x91, \r
+0x54, 0x60, 0x2B, 0x78, 0x2E, 0x12, 0x44, 0xDB, 0x78, 0x26, 0xE2, 0xFB, 0x75, 0xF0, 0x08, 0xA4, \r
+0xF9, 0xF8, 0x12, 0x20, 0xA8, 0x78, 0x29, 0xEF, 0xF2, 0x74, 0x37, 0x2B, 0xF8, 0xE2, 0x78, 0x32, \r
+0xF2, 0xE2, 0xFE, 0xF4, 0x5F, 0xFF, 0x78, 0x28, 0xE2, 0xFD, 0xEE, 0x5D, 0x4F, 0xF2, 0x91, 0x69, \r
+0xFD, 0xC3, 0x74, 0x03, 0x9D, 0xFD, 0xE4, 0x94, 0x00, 0xFC, 0x7B, 0xFE, 0x74, 0x2A, 0x2D, 0xF9, \r
+0x74, 0x80, 0x3C, 0xFA, 0xEF, 0x12, 0x1F, 0xEA, 0xE2, 0x04, 0xF2, 0x80, 0xAD, 0x78, 0x2A, 0x12, \r
+0x44, 0xDB, 0x12, 0x5E, 0xA3, 0x91, 0x61, 0x12, 0x2E, 0xA2, 0x22, 0x78, 0x27, 0xE2, 0xFF, 0x18, \r
+0xE2, 0xFE, 0xC3, 0x22, 0x74, 0x33, 0x2E, 0xF8, 0xE2, 0x78, 0x28, 0xF2, 0x90, 0x82, 0x0B, 0xE0, \r
+0x22, 0x78, 0x24, 0xE2, 0xFE, 0x08, 0xE2, 0xFF, 0x22, 0x78, 0x28, 0xE2, 0xFF, 0x78, 0x26, 0xE2, \r
+0x22, 0xD3, 0x78, 0x25, 0xE2, 0x94, 0xFF, 0x18, 0x22, 0xFD, 0x18, 0xE2, 0x2D, 0xFD, 0x18, 0xE2, \r
+0x34, 0x00, 0x8D, 0x82, 0xF5, 0x83, 0x22, 0xE2, 0xFF, 0xF4, 0xFE, 0x78, 0x29, 0xE2, 0x5E, 0xFE, \r
+0x18, 0xE2, 0xFD, 0xEF, 0x5D, 0x4E, 0xF2, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, \r
+0x2D, 0xA7, 0xE4, 0xF5, 0x51, 0x12, 0x32, 0x9E, 0xEF, 0x60, 0x72, 0x63, 0x51, 0x01, 0xE5, 0x51, \r
+0x24, 0x98, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x6C, 0xA3, 0xF0, 0x90, 0x00, 0x88, 0xE0, 0xF5, 0x4F, \r
+0xF5, 0x50, 0x54, 0x0F, 0x60, 0xDF, 0xE5, 0x4F, 0x30, 0xE0, 0x0B, 0x20, 0xE4, 0x03, 0x12, 0x29, \r
+0xC5, 0x53, 0x50, 0xEE, 0x80, 0x3E, 0xE5, 0x4F, 0x30, 0xE1, 0x16, 0x20, 0xE5, 0x0E, 0x12, 0x11, \r
+0xBD, 0xEF, 0x70, 0x03, 0x43, 0x50, 0x20, 0x90, 0x01, 0x06, 0xE4, 0xF0, 0x53, 0x50, 0xFD, 0x80, \r
+0x23, 0xE5, 0x4F, 0x30, 0xE2, 0x0A, 0x20, 0xE6, 0x02, 0x11, 0x03, 0x53, 0x50, 0xFB, 0x80, 0x14, \r
+0xE5, 0x4F, 0x30, 0xE3, 0x0F, 0x20, 0xE7, 0x09, 0x12, 0x65, 0x8B, 0xEF, 0x70, 0x03, 0x43, 0x50, \r
+0x80, 0x53, 0x50, 0xF7, 0xAD, 0x50, 0x7F, 0x88, 0x12, 0x32, 0x1E, 0x80, 0x88, 0xD0, 0xD0, 0x92, \r
+0xAF, 0x22, 0x12, 0x1F, 0xA4, 0x54, 0x01, 0xFF, 0x90, 0x81, 0x96, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, \r
+0x22, 0x12, 0x1F, 0xA4, 0x90, 0x81, 0x54, 0xF0, 0x22, 0x12, 0x1F, 0xA4, 0x90, 0x81, 0x8C, 0xF0, \r
+0x22, 0x12, 0x1F, 0xA4, 0x90, 0x81, 0x94, 0x12, 0x53, 0x47, 0x90, 0x81, 0x95, 0xF0, 0x22, 0xE4, \r
+0x90, 0x81, 0x31, 0xF0, 0xA3, 0xF0, 0x90, 0x80, 0x99, 0xF0, 0xA3, 0xF0, 0x22, 0x22, 0x22, 0x75, \r
+0x3D, 0x10, 0xE4, 0xF5, 0x3E, 0x75, 0x3F, 0x07, 0x75, 0x40, 0x02, 0x90, 0x01, 0x30, 0xE5, 0x3D, \r
+0xF0, 0xA3, 0xE5, 0x3E, 0xF0, 0xA3, 0xE5, 0x3F, 0xF0, 0xA3, 0xE5, 0x40, 0xF0, 0x22, 0x75, 0x45, \r
+0x06, 0x75, 0x46, 0x01, 0x43, 0x46, 0x10, 0x75, 0x47, 0x03, 0x75, 0x48, 0x62, 0x90, 0x01, 0x38, \r
+0xE5, 0x45, 0xF0, 0xA3, 0xE5, 0x46, 0xF0, 0xA3, 0xE5, 0x47, 0xF0, 0xA3, 0xE5, 0x48, 0xF0, 0x22, \r
+0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x01, \r
+0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9C, 0x74, 0x7E, 0xF0, 0xA3, 0x74, 0x92, 0xF0, 0xA3, 0x74, \r
+0xA0, 0xF0, 0xA3, 0x74, 0x24, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x49, 0xF0, 0x90, 0x01, 0x9A, 0x74, \r
+0xE0, 0xF0, 0x90, 0x01, 0x99, 0xE4, 0xF0, 0x90, 0x01, 0x98, 0x04, 0xF0, 0x22, 0x7D, 0x02, 0x90, \r
+0x01, 0xC4, 0x74, 0xDD, 0xF0, 0x74, 0x6D, 0xA3, 0xF0, 0x90, 0x81, 0x93, 0xE0, 0xFF, 0xED, 0xC3, \r
+0x9F, 0x50, 0x14, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x07, 0xD1, 0x15, 0xA3, \r
+0xF0, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE2, 0x74, 0xDD, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x6D, \r
+0xA3, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x22, 0xD1, 0xD7, 0xEF, 0x64, \r
+0x01, 0x60, 0x04, 0xD1, 0x8D, 0x80, 0x5D, 0x90, 0x81, 0x4D, 0xE0, 0xFF, 0x54, 0x03, 0x60, 0x08, \r
+0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x4C, 0x90, 0x81, 0x4B, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, \r
+0x50, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x3A, 0xEF, 0x30, 0xE2, 0x04, 0xD1, 0x15, \r
+0x80, 0x32, 0x90, 0x81, 0x4D, 0xE0, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, \r
+0x23, 0x90, 0x81, 0x46, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, \r
+0x20, 0xF0, 0x80, 0x10, 0x90, 0x81, 0x8C, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x80, 0xF0, \r
+0x80, 0x02, 0x80, 0x4B, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x01, 0xB8, \r
+0x74, 0x01, 0xF0, 0x22, 0x90, 0x81, 0x8F, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x27, 0x90, 0x02, 0x87, \r
+0xE0, 0x60, 0x04, 0xD1, 0x8D, 0x80, 0x1F, 0x90, 0x02, 0x96, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, \r
+0x74, 0x10, 0xF0, 0x80, 0x11, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB8, 0x74, \r
+0x04, 0xF0, 0x80, 0x02, 0x80, 0x09, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x7F, 0x00, 0x22, 0x90, \r
+0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, \r
+0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, \r
+0xD1, 0xD7, 0xEF, 0x70, 0x03, 0x12, 0x4F, 0xBD, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x14, 0xF0, 0xA3, \r
+0xE4, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x3D, 0xF5, 0x41, 0xA3, 0xE0, 0x55, 0x3E, 0xF5, \r
+0x42, 0xA3, 0xE0, 0x55, 0x3F, 0xF5, 0x43, 0xA3, 0xE0, 0x55, 0x40, 0xF5, 0x44, 0x90, 0x01, 0x34, \r
+0xE5, 0x41, 0xF0, 0xA3, 0xE5, 0x42, 0xF0, 0xA3, 0xE5, 0x43, 0xF0, 0xA3, 0xE5, 0x44, 0xF0, 0x22, \r
+0x90, 0x01, 0x3C, 0xE0, 0x55, 0x45, 0xF5, 0x49, 0xA3, 0xE0, 0x55, 0x46, 0xF5, 0x4A, 0xA3, 0xE0, \r
+0x55, 0x47, 0xF5, 0x4B, 0xA3, 0xE0, 0x55, 0x48, 0xF5, 0x4C, 0x90, 0x01, 0x3C, 0xE5, 0x49, 0xF0, \r
+0xA3, 0xE5, 0x4A, 0xF0, 0xA3, 0xE5, 0x4B, 0xF0, 0xA3, 0xE5, 0x4C, 0xF0, 0x53, 0x91, 0xDF, 0x22, \r
+0x90, 0x01, 0xCF, 0xE0, 0x90, 0x82, 0x6D, 0xF0, 0xE0, 0xFF, 0x30, 0xE0, 0x07, 0x90, 0x01, 0xCF, \r
+0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x23, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xDF, 0xF0, 0x90, \r
+0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x12, 0x52, 0x7C, 0x90, 0x00, 0x03, \r
+0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x32, 0x1E, 0x80, 0xFE, 0x22, 0x90, 0x81, 0x40, 0xE0, \r
+0x30, 0xE0, 0x05, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x81, 0x95, 0xE0, 0x60, 0x0F, 0xE4, \r
+0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x05, 0xFC, 0xE0, 0x04, 0xF0, 0x90, 0x81, \r
+0x40, 0xE0, 0x30, 0xE0, 0x11, 0xA3, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x40, 0xE0, 0xFF, 0xC3, 0x13, \r
+0x30, 0xE0, 0x03, 0x12, 0x5C, 0x5C, 0x12, 0x74, 0xCF, 0x90, 0x81, 0x8D, 0xE0, 0x30, 0xE0, 0x14, \r
+0x12, 0x4F, 0x43, 0x12, 0x55, 0xE5, 0x90, 0x81, 0x8D, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x03, 0x12, \r
+0x4D, 0xF9, 0xF1, 0xF5, 0x22, 0x90, 0x81, 0x8D, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x81, 0x8D, \r
+0xE0, 0x30, 0xE0, 0x0A, 0xE4, 0xF5, 0x1D, 0xA3, 0x12, 0x47, 0x84, 0x12, 0x6F, 0xF5, 0x90, 0x81, \r
+0x8D, 0xE0, 0x30, 0xE0, 0x34, 0x90, 0x82, 0x69, 0xE0, 0x70, 0x37, 0x90, 0x82, 0x68, 0xE0, 0x04, \r
+0xF0, 0xE0, 0xD3, 0x94, 0x06, 0x40, 0x2B, 0x90, 0x81, 0x54, 0x74, 0xD0, 0xF0, 0x90, 0x82, 0x69, \r
+0x74, 0x01, 0xF0, 0x90, 0x81, 0x8D, 0xE0, 0x13, 0x30, 0xE0, 0x17, 0x90, 0x81, 0x45, 0xE0, 0x44, \r
+0x01, 0xF0, 0x90, 0x81, 0x54, 0x74, 0xD0, 0xF0, 0x22, 0xE4, 0x90, 0x82, 0x69, 0xF0, 0x90, 0x82, \r
+0x68, 0xF0, 0x22, 0x90, 0x81, 0x40, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x81, 0x42, 0x74, 0x01, 0xF0, \r
+0x90, 0x81, 0x49, 0xE0, 0x60, 0x26, 0x11, 0xA3, 0x30, 0xE0, 0x0A, 0x90, 0x01, 0x3B, 0xE0, 0x30, \r
+0xE4, 0x03, 0x12, 0x49, 0x7C, 0x90, 0x82, 0x6C, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x80, 0x40, \r
+0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0x6F, 0xFD, 0x90, \r
+0x81, 0x8F, 0xE0, 0x30, 0xE0, 0x0C, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x05, 0x12, 0x49, 0x7C, \r
+0x11, 0xAE, 0x22, 0x90, 0x81, 0x46, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, 0x90, 0x81, \r
+0x91, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x90, 0x81, 0x40, 0xE0, 0xFF, 0x30, 0xE0, 0x05, 0x12, \r
+0x5B, 0xBB, 0x60, 0x1B, 0x90, 0x81, 0x49, 0xE0, 0x70, 0x04, 0xEF, 0x30, 0xE0, 0x0B, 0x90, 0x81, \r
+0x4C, 0xE0, 0x64, 0x02, 0x60, 0x09, 0x12, 0x56, 0xB2, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x22, \r
+0x31, 0x99, 0x90, 0x81, 0x9C, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, \r
+0xFD, 0xFF, 0x12, 0x4D, 0xFD, 0x90, 0x81, 0x9C, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, \r
+0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90, 0x81, 0x45, \r
+0xE0, 0x90, 0x04, 0xEC, 0x30, 0xE0, 0x06, 0xE0, 0x54, 0xDD, 0xF0, 0x80, 0x04, 0xE0, 0x44, 0x22, \r
+0xF0, 0x90, 0x81, 0x5B, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0x81, 0x62, 0xE0, 0xFB, 0xAC, 0x07, \r
+0x90, 0x81, 0x45, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x81, 0x7F, 0xE0, 0x24, 0x04, 0x90, 0x81, 0x5E, \r
+0xF0, 0x90, 0x81, 0x7F, 0xE0, 0x24, 0x03, 0x90, 0x81, 0x5D, 0xF0, 0x80, 0x0B, 0x90, 0x81, 0x5E, \r
+0x74, 0x02, 0xF0, 0x90, 0x81, 0x5D, 0x14, 0xF0, 0x90, 0x81, 0x5D, 0xE0, 0xFA, 0x90, 0x81, 0x5C, \r
+0xE0, 0xD3, 0x9A, 0x50, 0x09, 0x90, 0x81, 0x51, 0xEB, 0x31, 0x91, 0x2C, 0x80, 0x0B, 0xAD, 0x02, \r
+0xC3, 0xED, 0x9D, 0x2B, 0x90, 0x81, 0x51, 0x31, 0x91, 0x90, 0x81, 0x61, 0xF0, 0x90, 0x81, 0x61, \r
+0xE0, 0xFF, 0x7E, 0x00, 0x90, 0x81, 0x55, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x05, 0x58, 0xF0, \r
+0x22, 0xF0, 0x90, 0x81, 0x5E, 0xE0, 0xC3, 0x9D, 0x22, 0xE4, 0x90, 0x81, 0x9D, 0xF0, 0xA3, 0xF0, \r
+0xA3, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0x90, 0x81, 0x9D, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xFE, 0x90, \r
+0x81, 0x9D, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x81, 0x9F, 0xE0, 0x94, 0x64, 0x90, \r
+0x81, 0x9E, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x81, \r
+0x9D, 0xE0, 0xFF, 0x22, 0x90, 0x81, 0x9E, 0x12, 0x5F, 0xB6, 0x80, 0xC6, 0x90, 0x81, 0x94, 0xE0, \r
+0x60, 0x0F, 0xE4, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x05, 0xFD, 0xE0, 0x04, \r
+0xF0, 0x22, 0x90, 0x81, 0x40, 0xE0, 0xFF, 0x30, 0xE0, 0x3F, 0x90, 0x81, 0x44, 0xE0, 0x7E, 0x00, \r
+0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0x81, 0x43, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, \r
+0xED, 0x4E, 0x70, 0x25, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x03, 0x02, 0x5C, 0x5C, 0x12, 0x5B, 0xA4, \r
+0x90, 0x81, 0x44, 0xE0, 0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F, 0x0C, 0x80, 0x09, 0x90, 0x81, 0x44, \r
+0xE0, 0x70, 0x06, 0xFD, 0x7F, 0x04, 0x12, 0x4B, 0xBE, 0x22, 0x90, 0x81, 0x40, 0xE0, 0xFF, 0x30, \r
+0xE0, 0x3F, 0x90, 0x81, 0x44, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0x81, 0x43, \r
+0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x25, 0xEF, 0xC3, 0x13, 0x30, \r
+0xE0, 0x03, 0x02, 0x5C, 0x5C, 0x51, 0x82, 0x90, 0x81, 0x44, 0xE0, 0xB4, 0x0C, 0x06, 0xE4, 0xFD, \r
+0x7F, 0x08, 0x80, 0x0A, 0x90, 0x81, 0x44, 0xE0, 0xB4, 0x04, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x4B, \r
+0xBE, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x1B, 0x51, 0xB1, 0xF0, 0x51, 0xA4, 0x30, 0xE0, 0x02, \r
+0x80, 0x27, 0x51, 0xC5, 0x9F, 0x40, 0x0C, 0xE4, 0xFF, 0x12, 0x52, 0xC9, 0xBF, 0x01, 0x04, 0x12, \r
+0x57, 0xDB, 0xF0, 0x22, 0x90, 0x81, 0x45, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x22, 0x90, 0x01, \r
+0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0x22, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0x81, 0x4D, \r
+0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x81, 0x52, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x4D, 0xE0, 0x54, \r
+0xEF, 0xF0, 0x90, 0x81, 0x86, 0xE0, 0xFF, 0x90, 0x81, 0x52, 0xE0, 0xD3, 0x22, 0x22, 0x90, 0x81, \r
+0x45, 0xE0, 0xFF, 0x71, 0x0D, 0x30, 0xE0, 0x24, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, \r
+0x90, 0x81, 0x46, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x07, 0xE0, 0x54, 0xFD, 0x71, \r
+0x14, 0x04, 0xF0, 0x90, 0x81, 0x49, 0xE0, 0x60, 0x03, 0x12, 0x58, 0x53, 0x22, 0xC4, 0x13, 0x13, \r
+0x13, 0x54, 0x01, 0x22, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x22, 0x90, \r
+0x01, 0xC4, 0x74, 0x1F, 0xF0, 0x74, 0x73, 0xA3, 0xF0, 0x90, 0x00, 0x90, 0xE0, 0x20, 0xE0, 0xF9, \r
+0x74, 0x1F, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x73, 0xA3, 0xF0, 0x22, 0x74, 0x45, 0x71, 0x43, \r
+0x02, 0x49, 0x6D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0x22, 0x90, 0x81, 0x45, 0xE0, 0x54, \r
+0xFB, 0xF0, 0xE4, 0x90, 0x81, 0x52, 0xF0, 0xA3, 0xF0, 0x90, 0x81, 0x4D, 0xF0, 0x90, 0x81, 0x46, \r
+0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x12, 0x49, 0x06, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x49, \r
+0x0A, 0x7D, 0x10, 0x7F, 0x03, 0x80, 0xC5, 0x71, 0xAC, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, \r
+0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0xF5, 0x1D, \r
+0x90, 0x81, 0x88, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0xF5, 0x1E, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, \r
+0x01, 0x12, 0x47, 0x8E, 0x90, 0x81, 0x45, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x81, 0x45, 0xE0, \r
+0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, 0x7E, 0x00, 0x7F, 0x41, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x81, \r
+0x79, 0x45, 0x12, 0x45, 0x44, 0x91, 0x6D, 0x12, 0x45, 0x44, 0x90, 0x81, 0x48, 0x74, 0x02, 0xF0, \r
+0x90, 0x81, 0x4F, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0x81, 0x55, 0xE4, 0xF0, \r
+0xA3, 0x74, 0x02, 0xF0, 0x91, 0x57, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x4D, 0xFD, 0x7D, 0x0C, 0x7F, \r
+0x02, 0x12, 0x4D, 0xFD, 0x12, 0x4D, 0xF9, 0x90, 0x80, 0x41, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, \r
+0x81, 0x54, 0x74, 0x99, 0xF0, 0x80, 0x29, 0xEF, 0xB4, 0x03, 0x08, 0x90, 0x81, 0x54, 0x74, 0x90, \r
+0xF0, 0x80, 0x1D, 0x90, 0x81, 0x54, 0x74, 0x40, 0xF0, 0x90, 0x00, 0x2C, 0xE0, 0x54, 0x0F, 0xFF, \r
+0xBF, 0x05, 0x08, 0x90, 0x81, 0x7F, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x81, 0x7F, 0xF0, \r
+0x12, 0x55, 0x14, 0x91, 0x57, 0xF0, 0x7E, 0x00, 0x7F, 0x02, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x81, \r
+0x79, 0x8A, 0x12, 0x45, 0x44, 0x91, 0x65, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x12, 0x4F, \r
+0x43, 0xE4, 0x90, 0x81, 0x8C, 0xF0, 0x22, 0x90, 0x81, 0x7F, 0xE0, 0x24, 0x04, 0x90, 0x81, 0x61, \r
+0xF0, 0xA3, 0x74, 0x08, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x22, 0x7E, 0x00, 0x7F, \r
+0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0x8F, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0B, 0x04, \r
+0x70, 0x24, 0x90, 0x81, 0x4F, 0x74, 0x02, 0xF0, 0x80, 0x13, 0xED, 0x70, 0x06, 0x90, 0x81, 0x89, \r
+0xE0, 0x80, 0x02, 0xED, 0x14, 0x90, 0x81, 0x4F, 0xF0, 0x90, 0x81, 0x4F, 0xE0, 0xA3, 0xF0, 0x90, \r
+0x81, 0x46, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x7D, 0x2E, 0x7F, 0x6F, 0x12, 0x4D, 0xA9, 0x7D, 0x02, \r
+0x7F, 0x01, 0x12, 0x4D, 0xFD, 0x12, 0x5F, 0xCC, 0x90, 0x81, 0x44, 0x74, 0x02, 0xF0, 0x22, 0x12, \r
+0x4F, 0x43, 0x12, 0x4F, 0xD9, 0x12, 0x5E, 0x88, 0x90, 0x81, 0x44, 0x74, 0x04, 0xF0, 0x22, 0xE4, \r
+0xF5, 0x4E, 0x90, 0x81, 0x49, 0xE0, 0x60, 0x7B, 0x12, 0x47, 0xF3, 0x70, 0x76, 0x90, 0x81, 0x47, \r
+0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0x81, \r
+0x50, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x81, 0x52, 0xE0, 0x60, 0x0E, 0xEF, 0x70, \r
+0x08, 0x90, 0x81, 0x4F, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x4E, 0x01, 0x90, 0x81, 0x40, 0xE0, \r
+0x30, 0xE0, 0x12, 0x90, 0x81, 0x44, 0xE0, 0xB4, 0x02, 0x03, 0xE4, 0xF5, 0x4E, 0x12, 0x5B, 0x42, \r
+0xEF, 0x70, 0x02, 0xF5, 0x4E, 0xE5, 0x4E, 0x60, 0x2A, 0xB1, 0x5C, 0x90, 0x81, 0x52, 0xE0, 0x60, \r
+0x03, 0xB4, 0x01, 0x04, 0xB1, 0x54, 0x80, 0x08, 0xB1, 0x54, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, \r
+0xFF, 0x90, 0x81, 0x51, 0xE0, 0x2F, 0x12, 0x47, 0x85, 0x90, 0x81, 0x4C, 0xE0, 0x20, 0xE2, 0x03, \r
+0x12, 0x4B, 0xBA, 0x22, 0xE4, 0xF5, 0x1D, 0x90, 0x81, 0x52, 0xE0, 0x22, 0x90, 0x81, 0x4D, 0xE0, \r
+0x44, 0x10, 0xF0, 0x22, 0xE4, 0x90, 0x81, 0x9C, 0xF0, 0x90, 0x81, 0x49, 0xE0, 0x60, 0x4B, 0x12, \r
+0x47, 0xF3, 0x70, 0x46, 0xB1, 0xBB, 0xF0, 0x90, 0x81, 0x9C, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x81, \r
+0x50, 0xF0, 0x90, 0x81, 0x40, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x81, 0x44, 0xE0, 0xB4, 0x02, 0x05, \r
+0xE4, 0x90, 0x81, 0x9C, 0xF0, 0x12, 0x5B, 0x42, 0xEF, 0x70, 0x04, 0x90, 0x81, 0x9C, 0xF0, 0x90, \r
+0x81, 0x9C, 0xE0, 0x60, 0x15, 0xB1, 0x5C, 0xE4, 0xF5, 0x1D, 0x90, 0x81, 0x51, 0x12, 0x47, 0x84, \r
+0x90, 0x81, 0x4C, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x4B, 0xBA, 0x22, 0x90, 0x81, 0x4F, 0xE0, 0x90, \r
+0x05, 0x73, 0x22, 0x90, 0x81, 0x8D, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0xE4, 0xA3, 0xF0, \r
+0x90, 0x81, 0x8D, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x90, 0x81, 0x43, 0xE0, 0x64, 0x02, 0x7F, 0x01, \r
+0x60, 0x02, 0x7F, 0x00, 0x22, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, \r
+0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, \r
+0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x1F, 0xA4, 0xFE, 0x22, 0xE0, 0x90, \r
+0x01, 0xBA, 0xF0, 0x90, 0x81, 0x4B, 0xE0, 0x90, 0x01, 0xBB, 0x22, 0xEF, 0x13, 0x13, 0x13, 0x54, \r
+0x1F, 0xFE, 0xEF, 0x54, 0x07, 0xFF, 0x22, 0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x01, 0xFE, 0x22, 0x90, \r
+0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0x22, 0xF0, 0x90, 0x81, 0x55, 0xA3, 0xE0, \r
+0x90, 0x05, 0x58, 0xF0, 0x22, 0x7F, 0x70, 0x7E, 0x0E, 0x12, 0x2E, 0xA2, 0x90, 0x82, 0x46, 0x22, \r
+0x8B, 0x52, 0x8A, 0x53, 0x89, 0x54, 0x22, 0x90, 0x81, 0x8F, 0xE0, 0x54, 0xFE, 0x4E, 0x22, 0x7D, \r
+0x02, 0x7F, 0x02, 0x02, 0x49, 0x86, 0x4D, 0xFF, 0x90, 0x81, 0x40, 0xF0, 0xEE, 0x22, 0x3D, 0xA1, \r
 };\r
-u4Byte ArrayLength_MP_8188E_FW_WoWLAN_S = 17222;\r
+u4Byte ArrayLength_MP_8188E_FW_NIC_89EM = 13968;\r
 \r
 \r
 void\r
-ODM_ReadFirmware_MP_8188E_FW_WoWLAN_S(\r
+ODM_ReadFirmware_MP_8188E_FW_NIC_89EM(\r
      IN   PDM_ODM_T    pDM_Odm,\r
      OUT  u1Byte       *pFirmware,\r
      OUT  u4Byte       *pFirmwareSize\r
 )\r
 {\r
-#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))\r
-       *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8188E_FW_WoWLAN_S;\r
+ #if (DM_ODM_SUPPORT_TYPE & (ODM_CE))\r
+     *((SIZE_PTR*)pFirmware) = (SIZE_PTR)Array_MP_8188E_FW_NIC_89EM;\r
 #else\r
-       ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8188E_FW_WoWLAN_S, ArrayLength_MP_8188E_FW_WoWLAN_S);\r
+     ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8188E_FW_NIC_89EM, ArrayLength_MP_8188E_FW_NIC_89EM);\r
 #endif\r
-       *pFirmwareSize = ArrayLength_MP_8188E_FW_WoWLAN_S;\r
+     *pFirmwareSize = ArrayLength_MP_8188E_FW_NIC_89EM;\r
 }\r
 \r
 \r
-u1Byte Array_MP_8188E_FW_WoWLAN_T[] = {\r
-0xE1, 0x88, 0x30, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x01, 0x23, 0x32, 0x2A, 0x3D, 0x00, 0x00, \r
-0x8C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x02, 0x46, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0xE1, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+u1Byte Array_MP_8188E_FW_WoWLAN[] = {\r
+0xE1, 0x88, 0x30, 0x00, 0x14, 0x00, 0x00, 0x00, 0x09, 0x11, 0x20, 0x13, 0x2E, 0x3A, 0x00, 0x00, \r
+0xEE, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x02, 0x46, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0xE1, 0xF4, 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
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0xE1, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x4F, 0xF5, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0xE1, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x57, 0xFC, 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
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
@@ -4143,937 +2822,890 @@ u1Byte Array_MP_8188E_FW_WoWLAN_T[] = {
 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0xAF, 0xDF, 0xE4, 0xDE, 0xE2, 0x80, 0xA9, 0x88, \r
 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, 0x60, 0xAB, 0xED, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0x98, \r
 0xF5, 0x82, 0xEB, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0x8E, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, \r
-0x42, 0xE0, 0x73, 0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x44, 0x17, 0x85, 0xD0, 0x0B, 0x75, 0xD0, \r
-0x08, 0xAA, 0xE0, 0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, \r
-0x8C, 0xD2, 0x8C, 0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, \r
-0xB4, 0x40, 0x00, 0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, \r
-0xE6, 0x30, 0xE1, 0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, \r
-0xE5, 0x0C, 0xFF, 0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, \r
-0x81, 0xE6, 0x30, 0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, \r
-0x25, 0x0C, 0xF8, 0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, \r
-0xCD, 0xF8, 0xE8, 0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, \r
-0x40, 0x27, 0xE5, 0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, \r
-0x18, 0xE6, 0xCD, 0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, \r
-0x0C, 0x24, 0x86, 0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, \r
-0x04, 0xC2, 0xAF, 0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, \r
-0xE3, 0x04, 0x7F, 0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, \r
-0x78, 0x86, 0xA6, 0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, \r
-0xE4, 0x78, 0x80, 0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x47, 0x50, \r
-0x74, 0x01, 0x93, 0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, \r
-0x8C, 0x79, 0xD2, 0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, \r
-0x22, 0x74, 0x81, 0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, \r
-0xD2, 0xAF, 0xAE, 0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, \r
-0x08, 0xE6, 0x18, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, \r
-0x19, 0xF7, 0x09, 0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, \r
-0x81, 0x05, 0x81, 0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, \r
-0xB5, 0x0C, 0x02, 0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, \r
-0xE7, 0x09, 0x09, 0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, \r
-0xF8, 0xEF, 0x2F, 0x04, 0x90, 0x47, 0x50, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, \r
-0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, \r
-0x30, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, \r
-0x74, 0x86, 0x2F, 0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x44, 0x60, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, \r
-0xE6, 0xBF, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, \r
-0xFC, 0xE9, 0x6C, 0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, \r
-0x05, 0x1F, 0xE5, 0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, \r
-0x18, 0x86, 0x01, 0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, \r
-0x07, 0x02, 0xAC, 0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, \r
-0xE5, 0x0C, 0xB5, 0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, \r
-0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, \r
-0x02, 0xD2, 0xE4, 0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x44, \r
-0x5F, 0x8F, 0xF0, 0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, \r
-0x0D, 0x7F, 0x08, 0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, \r
-0x06, 0xED, 0xF6, 0x60, 0x25, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, \r
-0x23, 0x0E, 0x30, 0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, \r
-0x13, 0x54, 0xEC, 0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x44, 0x60, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, \r
-0xF4, 0xC2, 0xAF, 0x56, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0x02, 0x46, 0xFA, 0x02, \r
-0x44, 0xF0, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, \r
-0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, \r
-0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, \r
-0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x47, 0x3F, 0xE4, 0x7E, 0x01, \r
-0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, \r
-0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, \r
-0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, \r
-0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x00, \r
-0x41, 0x83, 0xF1, 0x00, 0x41, 0x83, 0xF2, 0x00, 0x41, 0x84, 0x04, 0x00, 0x41, 0x84, 0x05, 0x00, \r
-0x59, 0xA7, 0x5F, 0xDF, 0x61, 0xAD, 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, 0x56, 0xF0, 0x74, 0x47, 0xA3, 0xF0, 0x12, 0x67, 0xE5, \r
-0xE5, 0x3C, 0x30, 0xE7, 0x02, 0xF1, 0xAD, 0x74, 0x56, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x47, \r
-0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, \r
-0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x7F, 0x01, 0x7E, \r
-0x00, 0x12, 0x32, 0x06, 0x90, 0x00, 0xF2, 0xE0, 0x20, 0xE6, 0x0C, 0x90, 0x00, 0x05, 0xE0, 0x44, \r
-0x80, 0xFD, 0x7F, 0x05, 0x12, 0x32, 0x1E, 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, 0xC8, 0xF0, 0x74, 0x47, 0xA3, 0xF0, 0x12, \r
-0x68, 0x1F, 0xE5, 0x41, 0x30, 0xE3, 0x03, 0x12, 0x57, 0xA3, 0xE5, 0x41, 0x30, 0xE4, 0x03, 0x12, \r
-0x57, 0x9C, 0xE5, 0x43, 0x30, 0xE0, 0x02, 0x11, 0x66, 0xE5, 0x43, 0x30, 0xE1, 0x03, 0x12, 0x68, \r
-0x7C, 0xE5, 0x43, 0x30, 0xE2, 0x03, 0x12, 0x68, 0xF3, 0xE5, 0x43, 0x30, 0xE3, 0x03, 0x12, 0x6F, \r
-0xD8, 0xE5, 0x43, 0x30, 0xE4, 0x03, 0x12, 0x6F, 0xF4, 0xE5, 0x43, 0x30, 0xE5, 0x03, 0x12, 0x6E, \r
-0x88, 0xE5, 0x43, 0x30, 0xE6, 0x03, 0x12, 0x70, 0x23, 0xE5, 0x44, 0x30, 0xE1, 0x02, 0xF1, 0xDF, \r
-0x74, 0xC8, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x47, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, \r
-0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, \r
-0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0xF5, 0x19, 0x90, 0x81, 0x3E, 0xE0, 0x60, 0x72, 0x90, \r
-0x80, 0xF9, 0xE0, 0x64, 0x01, 0x70, 0x6A, 0x90, 0x81, 0x3C, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x22, \r
-0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0x81, 0x45, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, \r
-0x06, 0x90, 0x81, 0x47, 0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0x81, 0x44, 0xE0, 0xA3, 0xF0, \r
-0x80, 0x00, 0x75, 0x19, 0x01, 0xE5, 0x19, 0x60, 0x38, 0x90, 0x81, 0x42, 0xE0, 0x44, 0x10, 0xF0, \r
-0x90, 0x81, 0x47, 0xE0, 0x60, 0x03, 0xB4, 0x01, 0x09, 0xE4, 0xF5, 0x52, 0x90, 0x81, 0x47, 0xE0, \r
-0x80, 0x0D, 0xE4, 0xF5, 0x52, 0x90, 0x81, 0x47, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, \r
-0x90, 0x81, 0x46, 0xE0, 0x2F, 0x12, 0x57, 0xF7, 0x90, 0x81, 0x41, 0xE0, 0x20, 0xE2, 0x02, 0x11, \r
-0xE2, 0x22, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x84, 0x01, \r
-0xED, 0xF0, 0x90, 0x81, 0x3A, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x41, \r
-0x3D, 0xEE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0x41, 0x3D, 0x90, 0x81, 0x41, \r
-0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x41, 0x3D, 0xEF, 0x70, 0x02, 0x21, 0xA5, 0x24, 0xFE, 0x70, 0x02, \r
-0x21, 0xDE, 0x24, 0xFE, 0x60, 0x47, 0x24, 0xFC, 0x70, 0x02, 0x41, 0x18, 0x24, 0xFC, 0x60, 0x02, \r
-0x41, 0x2D, 0xEE, 0xB4, 0x0E, 0x02, 0x51, 0xA9, 0x90, 0x81, 0x41, 0xE0, 0x70, 0x04, 0x7F, 0x01, \r
-0x51, 0xCC, 0x90, 0x81, 0x41, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0x88, 0x90, 0x81, 0x41, 0xE0, 0xB4, \r
-0x04, 0x0D, 0x90, 0x84, 0x01, 0xE0, 0xFF, 0x60, 0x04, 0x71, 0xE7, 0x80, 0x02, 0xF1, 0x1F, 0x90, \r
-0x81, 0x41, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x41, 0x2D, 0x71, 0xA5, 0x41, 0x2D, 0x90, 0x81, 0x41, \r
-0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0xCC, 0x90, 0x81, 0x41, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0x88, \r
-0x90, 0x81, 0x41, 0xE0, 0xB4, 0x0E, 0x07, 0x51, 0x42, 0xBF, 0x01, 0x02, 0x51, 0xA9, 0x90, 0x81, \r
-0x41, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x41, 0x2D, 0x51, 0x42, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x41, \r
-0x2D, 0x51, 0xF8, 0x41, 0x2D, 0x90, 0x81, 0x41, 0xE0, 0xB4, 0x0E, 0x07, 0x51, 0x42, 0xBF, 0x01, \r
-0x02, 0x51, 0xA9, 0x90, 0x81, 0x41, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0x88, 0x90, 0x81, 0x41, 0xE0, \r
-0xB4, 0x0C, 0x07, 0x51, 0x42, 0xBF, 0x01, 0x02, 0x51, 0xF8, 0x90, 0x81, 0x41, 0xE0, 0x64, 0x04, \r
-0x70, 0x5B, 0x12, 0x72, 0x9F, 0xEF, 0x64, 0x01, 0x70, 0x53, 0x71, 0xB2, 0x80, 0x4F, 0x90, 0x81, \r
-0x41, 0xE0, 0xB4, 0x0E, 0x07, 0x51, 0x42, 0xBF, 0x01, 0x02, 0x51, 0xA9, 0x90, 0x81, 0x41, 0xE0, \r
-0xB4, 0x06, 0x02, 0x51, 0x88, 0x90, 0x81, 0x41, 0xE0, 0xB4, 0x0C, 0x07, 0x51, 0x42, 0xBF, 0x01, \r
-0x02, 0x51, 0xF8, 0x90, 0x81, 0x41, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0xCC, 0x90, 0x81, 0x41, \r
-0xE0, 0xB4, 0x04, 0x19, 0xF1, 0x13, 0x80, 0x15, 0x90, 0x81, 0x41, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, \r
-0x81, 0x3B, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0x71, 0x9B, 0x90, 0x81, 0x41, \r
-0xE0, 0x90, 0x01, 0xBA, 0xF0, 0x90, 0x81, 0x40, 0xE0, 0x90, 0x01, 0xBB, 0xF0, 0xD0, 0xD0, 0x92, \r
-0xAF, 0x22, 0x12, 0x72, 0x86, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, \r
-0x80, 0x2D, 0x90, 0x81, 0x3A, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0x01, \r
-0xB8, 0x74, 0x02, 0xF0, 0x80, 0x19, 0x90, 0x81, 0x40, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x08, 0x90, \r
-0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, \r
-0x01, 0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x81, 0x3B, 0xE0, 0x90, 0x06, 0x04, 0x20, \r
-0xE0, 0x08, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x04, 0x80, 0x06, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, \r
-0x7F, 0x01, 0x71, 0x33, 0xE4, 0xFD, 0xFF, 0x80, 0x44, 0x90, 0x81, 0x3B, 0xE0, 0xC3, 0x13, 0x20, \r
-0xE0, 0x04, 0x7D, 0x0C, 0x80, 0x0D, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, \r
-0xF0, 0x7D, 0x04, 0x7F, 0x01, 0x71, 0x33, 0xE4, 0xFD, 0xFF, 0x80, 0x21, 0x90, 0x84, 0x00, 0xEF, \r
-0xF0, 0xD1, 0x98, 0x90, 0x84, 0x00, 0xE0, 0x60, 0x05, 0xE4, 0xFD, 0xFF, 0x51, 0xED, 0x7D, 0x04, \r
-0x7F, 0x01, 0x80, 0x4F, 0xE4, 0xFD, 0x7F, 0x0C, 0x11, 0xE6, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, \r
-0xEF, 0xF0, 0x90, 0x80, 0x05, 0xED, 0xF0, 0x22, 0x90, 0x80, 0xF9, 0xE0, 0x64, 0x01, 0x70, 0x2E, \r
-0x90, 0x81, 0x3B, 0xE0, 0x54, 0xFD, 0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x51, 0xED, 0x7D, 0x08, 0x7F, \r
-0x01, 0x91, 0x29, 0xBF, 0x01, 0x0D, 0x90, 0x81, 0x3A, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, \r
-0x01, 0x80, 0x10, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, 0xF0, 0x22, 0x7D, \r
-0x0C, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xAC, 0x07, 0xEF, 0x14, 0x60, 0x15, \r
-0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, 0x01, 0xFE, 0x90, 0x81, 0x3A, 0xE0, 0x54, \r
-0xFE, 0x4E, 0xF0, 0x80, 0x0C, 0x90, 0x81, 0x41, 0xED, 0xF0, 0x80, 0x05, 0x90, 0x81, 0x40, 0xED, \r
-0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE4, 0x2E, 0xEC, 0x14, 0x60, 0x07, 0x14, 0x60, 0x1D, 0x24, \r
-0x02, 0x70, 0x23, 0x90, 0x81, 0x3A, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, \r
-0x90, 0x81, 0x41, 0xE0, 0x54, 0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, 0x81, 0x40, 0xE0, \r
-0xFD, 0x7F, 0x89, 0x12, 0x32, 0x1E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7D, 0x2F, 0x91, 0xF4, 0x7D, \r
-0x08, 0x7F, 0x01, 0x80, 0x8E, 0xD1, 0x98, 0xE4, 0xFD, 0xFF, 0x51, 0xED, 0x7D, 0x0C, 0x7F, 0x01, \r
-0x80, 0x81, 0x7D, 0x2D, 0xB1, 0x6E, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0xF1, \r
-0xCA, 0x91, 0xF8, 0xE4, 0xFD, 0x7F, 0x01, 0x61, 0x33, 0x90, 0x81, 0x3E, 0xE0, 0x64, 0x01, 0x70, \r
-0x15, 0x90, 0x81, 0x3C, 0xE0, 0x54, 0x0F, 0x60, 0x05, 0x51, 0xE4, 0x02, 0x56, 0x81, 0x90, 0x81, \r
-0x41, 0xE0, 0x70, 0x02, 0x11, 0xE2, 0x22, 0xEF, 0x60, 0x3A, 0x90, 0x80, 0xF9, 0xE0, 0x64, 0x01, \r
-0x70, 0x32, 0x90, 0x81, 0x3B, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x2B, 0x7F, 0x0F, 0x51, 0xED, 0x90, \r
-0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x91, 0x25, 0xBF, 0x01, 0x0D, 0x90, 0x81, 0x3A, 0xE0, 0x44, \r
-0x40, 0xF0, 0x7D, 0x06, 0x7F, 0x01, 0x61, 0x33, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, \r
-0xB8, 0x74, 0x08, 0xF0, 0x22, 0x7D, 0x08, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x90, 0x83, 0xD5, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x04, \r
-0x1D, 0xE0, 0x60, 0x21, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x83, 0xD9, 0xF0, 0x7D, 0x26, 0xB1, 0x6E, \r
-0xEF, 0x64, 0x01, 0x70, 0x03, 0x12, 0x6D, 0x92, 0x90, 0x83, 0xD9, 0xE0, 0xFF, 0x7D, 0x27, 0x51, \r
-0xED, 0x91, 0x77, 0x80, 0x05, 0x91, 0x77, 0x12, 0x6D, 0x92, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, \r
-0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x83, 0xD5, 0xE0, 0xFF, 0xD3, 0x10, 0xAF, 0x01, \r
-0xC3, 0xC0, 0xD0, 0x90, 0x84, 0x02, 0xEF, 0xF0, 0x90, 0x80, 0x09, 0xE0, 0xFF, 0x90, 0x04, 0x1C, \r
-0xE0, 0x6F, 0x70, 0x4B, 0x90, 0x81, 0x41, 0xE0, 0x64, 0x0E, 0x70, 0x18, 0x90, 0x84, 0x02, 0xE0, \r
-0x70, 0x3D, 0x90, 0x81, 0x3A, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, \r
-0x71, 0x2F, 0x80, 0x26, 0x90, 0x81, 0x41, 0xE0, 0x64, 0x06, 0x70, 0x23, 0x90, 0x84, 0x02, 0xE0, \r
-0x60, 0x1D, 0x90, 0x81, 0x3A, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, \r
-0xE0, 0x44, 0x80, 0xF0, 0x90, 0x81, 0x41, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x51, 0xED, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0x12, 0x56, 0x81, 0x90, 0x81, 0x41, 0xE0, 0x64, 0x0C, 0x60, 0x04, 0x51, \r
-0xE4, 0x91, 0x25, 0x22, 0x7F, 0xFF, 0x51, 0xED, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xB1, \r
-0x72, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xDA, 0xCC, 0xF0, 0x00, 0xC0, 0x7F, 0x8C, 0x7E, 0x08, 0x12, \r
-0x2E, 0xA2, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x14, 0x7F, 0x70, 0x7E, 0x0E, \r
-0x12, 0x2E, 0xA2, 0x90, 0x83, 0xCB, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xFD, 0xFF, \r
-0x12, 0x65, 0x00, 0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2D, 0x5C, 0xEC, 0x44, 0x80, 0xFC, 0x90, 0x83, \r
-0xE6, 0x12, 0x20, 0xCE, 0x90, 0x83, 0xE6, 0x12, 0x42, 0x19, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xCE, \r
-0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, \r
-0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xFF, \r
-0x51, 0xED, 0xE4, 0x90, 0x83, 0xF7, 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, 0xD3, 0x90, \r
-0x83, 0xF8, 0xE0, 0x94, 0xE8, 0x90, 0x83, 0xF7, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, \r
-0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0x90, 0x83, \r
-0xF7, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x41, 0xF6, 0x80, 0xBF, 0xEF, 0x60, 0x59, 0x90, 0x04, 0xEC, \r
-0xE0, 0x54, 0xDD, 0xF0, 0x90, 0x83, 0x30, 0xE0, 0xFF, 0x60, 0x03, 0x12, 0x5F, 0x95, 0x90, 0x01, \r
-0xC7, 0xE4, 0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, \r
-0xFF, 0xEC, 0x3E, 0x90, 0x80, 0xF7, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x06, 0x09, 0xE0, 0x54, 0xFE, \r
-0xF0, 0x7D, 0x35, 0x91, 0xF4, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0x12, 0x79, 0x09, 0xF1, \r
-0xF3, 0xD1, 0x98, 0xE4, 0xFD, 0xFF, 0x51, 0xED, 0x12, 0x7B, 0xCE, 0x90, 0x01, 0x34, 0x74, 0x08, \r
-0xF0, 0xFD, 0xE4, 0xFF, 0xE1, 0xCA, 0x90, 0x04, 0xEC, 0xE0, 0x44, 0x22, 0xF0, 0x7D, 0x08, 0xE4, \r
-0xFF, 0x12, 0x68, 0xDB, 0x90, 0x06, 0x90, 0xE0, 0x54, 0xF0, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x54, \r
-0xFB, 0xF0, 0x12, 0x79, 0x5A, 0xF1, 0xF4, 0x90, 0x81, 0x7D, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x81, \r
-0x85, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x20, 0xF0, 0xD3, 0x10, 0xAF, 0x01, \r
-0xC3, 0xC0, 0xD0, 0x90, 0x81, 0x80, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, \r
-0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, \r
-0xE0, 0x54, 0x80, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x81, 0x84, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x81, \r
-0x81, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x81, 0x84, 0xE0, 0x54, 0xFD, 0xF0, 0xE4, 0xFD, 0x7F, 0x8F, \r
-0x12, 0x32, 0x1E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
-0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, \r
-0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2D, 0x5C, 0xEC, \r
-0x54, 0x7F, 0xFC, 0x90, 0x83, 0xE2, 0x12, 0x20, 0xCE, 0x90, 0x83, 0xE2, 0x12, 0x42, 0x19, 0x90, \r
-0x85, 0xBB, 0x12, 0x20, 0xCE, 0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x85, 0xBB, 0x12, \r
-0x20, 0xDA, 0xCC, 0xC0, 0x00, 0xC0, 0x7F, 0x8C, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x85, 0xBB, \r
-0x12, 0x20, 0xDA, 0x00, 0xC0, 0x00, 0x14, 0x7F, 0x70, 0x7E, 0x0E, 0x12, 0x2E, 0xA2, 0x90, 0x83, \r
-0xCB, 0x12, 0x20, 0xDA, 0x00, 0x03, 0x3E, 0x60, 0xE4, 0xFD, 0xFF, 0x12, 0x65, 0x00, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x7D, 0x2E, 0x7F, 0x6F, 0x51, 0xED, 0x7D, 0x02, 0x7F, 0x01, 0x61, 0x33, 0x90, \r
-0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0xE4, 0xFD, 0xFF, 0x51, 0xED, 0x7D, 0x0C, 0x7F, 0x01, 0x61, \r
-0x33, 0xEF, 0x70, 0x4E, 0x7D, 0x78, 0x7F, 0x02, 0x12, 0x68, 0xDB, 0x7D, 0x02, 0x7F, 0x03, 0x12, \r
-0x68, 0xDB, 0x7D, 0xC8, 0x7F, 0x02, 0x12, 0x71, 0x5D, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, \r
-0x3C, 0x74, 0x02, 0xF0, 0x90, 0x80, 0xF9, 0xE0, 0x70, 0x13, 0xD1, 0x98, 0xF1, 0x1F, 0x90, 0x81, \r
-0x3A, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x06, 0x7D, 0x01, 0x7F, \r
-0x0C, 0x11, 0xE6, 0x90, 0x81, 0x3A, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, \r
-0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0xF1, \r
-0xCA, 0x7D, 0x02, 0x7F, 0x03, 0xF1, 0xCA, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x90, 0x81, \r
-0x49, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x80, 0xF9, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0x81, \r
-0x3B, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x81, 0x41, 0xE0, 0x20, 0xE2, 0x0D, 0x7D, 0x01, 0x7F, 0x04, \r
-0x01, 0xE6, 0x90, 0x81, 0x3B, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x74, 0x3D, 0x2F, 0xF8, 0xE6, 0x4D, \r
-0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, \r
-0x81, 0x3E, 0xE0, 0x60, 0x02, 0x71, 0xC9, 0x22, 0xE4, 0xFD, 0xFF, 0x51, 0xED, 0x7D, 0x04, 0x7F, \r
-0x01, 0x61, 0x33, 0x22, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, \r
-0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, \r
-0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xF5, 0xF0, 0x74, 0x4F, 0xA3, 0xF0, 0x12, 0x68, 0x4C, 0xE5, \r
-0x49, 0x30, 0xE1, 0x02, 0x11, 0x79, 0xE5, 0x49, 0x30, 0xE2, 0x02, 0x11, 0x94, 0xE5, 0x4A, 0x30, \r
-0xE0, 0x03, 0x12, 0x70, 0x3F, 0xE5, 0x4C, 0x30, 0xE1, 0x04, 0x7F, 0x04, 0xF1, 0x8D, 0xE5, 0x4C, \r
-0x30, 0xE4, 0x02, 0x11, 0x82, 0xE5, 0x4C, 0x30, 0xE5, 0x02, 0x11, 0xDC, 0xE5, 0x4C, 0x30, 0xE6, \r
-0x02, 0x31, 0x60, 0x74, 0xF5, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x4F, 0xA3, 0xF0, 0xD0, 0x07, \r
+0x42, 0xE0, 0x73, 0xEF, 0x4E, 0x60, 0x12, 0xEF, 0x60, 0x01, 0x0E, 0xED, 0xBB, 0x01, 0x0B, 0x89, \r
+0x82, 0x8A, 0x83, 0xF0, 0xA3, 0xDF, 0xFC, 0xDE, 0xFA, 0x22, 0x89, 0xF0, 0x50, 0x07, 0xF7, 0x09, \r
+0xDF, 0xFC, 0xA9, 0xF0, 0x22, 0xBB, 0xFE, 0xFC, 0xF3, 0x09, 0xDF, 0xFC, 0xA9, 0xF0, 0x22, 0xC2, \r
+0xAF, 0x80, 0xFE, 0x32, 0x12, 0x44, 0x43, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, 0xC2, \r
+0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, 0xEC, \r
+0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, 0x40, \r
+0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, 0x03, \r
+0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, 0x23, \r
+0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, 0xE4, \r
+0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, 0xE6, \r
+0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, 0x6D, \r
+0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, 0x0C, \r
+0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, 0xF8, \r
+0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86, 0xC8, \r
+0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, 0xE6, \r
+0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, 0x08, \r
+0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, 0x81, \r
+0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, 0xF6, \r
+0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x47, 0x7C, 0x74, 0x01, 0x93, 0xC0, \r
+0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, 0x8C, \r
+0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, 0x2F, \r
+0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, 0x0C, \r
+0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, 0xBE, \r
+0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, 0x09, \r
+0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, 0xEE, \r
+0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, 0xA9, \r
+0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, 0xF7, \r
+0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, 0x04, \r
+0x90, 0x47, 0x7C, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, \r
+0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, 0xC2, \r
+0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, 0xF8, \r
+0xE6, 0xF5, 0x81, 0x02, 0x44, 0x8C, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, 0x02, \r
+0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, 0x60, \r
+0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, 0x0C, \r
+0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, 0x0F, \r
+0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, 0x81, \r
+0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, 0x07, \r
+0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, \r
+0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, 0xD2, \r
+0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x44, 0x8B, 0x8F, 0xF0, 0xE4, \r
+0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, 0xE6, \r
+0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, 0x60, \r
+0x25, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30, 0xE2, \r
+0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC, 0x4E, \r
+0xF6, 0xD2, 0xAF, 0x02, 0x44, 0x8C, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, 0x56, \r
+0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0x02, 0x47, 0x26, 0x02, 0x45, 0x1C, 0xE4, 0x93, \r
+0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, \r
+0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, \r
+0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, \r
+0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x47, 0x6B, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, \r
+0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, \r
+0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, \r
+0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, \r
+0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x41, 0x84, 0x2A, 0x00, 0x41, \r
+0x84, 0x2B, 0x00, 0x41, 0x84, 0x3C, 0x00, 0x41, 0x84, 0x3D, 0x00, 0x00, 0x67, 0xE3, 0x68, 0x57, \r
+0x6B, 0x1A, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, \r
+0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, \r
+0x01, 0xC4, 0x74, 0x82, 0xF0, 0x74, 0x47, 0xA3, 0xF0, 0x12, 0x71, 0xA8, 0xE5, 0x3C, 0x30, 0xE7, \r
+0x02, 0xF1, 0xD9, 0x74, 0x82, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x47, 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, 0x90, 0x81, 0x3E, 0xE0, 0x60, 0x02, 0xF1, \r
-0x44, 0x22, 0x11, 0xAD, 0x90, 0x81, 0x44, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, \r
-0x02, 0x02, 0x4F, 0xCA, 0x90, 0x81, 0x3E, 0xE0, 0x60, 0x12, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, \r
-0x02, 0xC1, 0x81, 0x90, 0x81, 0x3A, 0xE0, 0x54, 0xF7, 0xF0, 0x31, 0x9D, 0x22, 0x90, 0x81, 0x3E, \r
-0xE0, 0x60, 0x28, 0x90, 0x80, 0xF9, 0xE0, 0x64, 0x01, 0x70, 0x20, 0x90, 0x81, 0x45, 0xF0, 0x04, \r
-0x60, 0x19, 0x90, 0x81, 0x42, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0xF5, 0x52, 0x90, 0x81, 0x46, 0xF1, \r
-0xF6, 0x90, 0x81, 0x41, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x48, 0xE2, 0x22, 0x90, 0x81, 0x3A, 0xE0, \r
-0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x26, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, \r
-0xE0, 0x90, 0x81, 0x3B, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x10, 0xE0, 0x54, 0xFE, \r
-0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x31, 0x9D, 0xE4, \r
-0xFF, 0x90, 0x83, 0x44, 0xE0, 0x30, 0xE0, 0x47, 0x90, 0x83, 0x49, 0xE0, 0xFD, 0x60, 0x40, 0x74, \r
-0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, \r
-0x90, 0x04, 0xE0, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x0B, 0xE4, 0x90, 0x83, 0x49, 0xF0, 0x90, 0x83, \r
-0x4B, 0x04, 0xF0, 0x22, 0x90, 0x83, 0x46, 0xE0, 0xD3, 0x9D, 0x50, 0x0A, 0x31, 0xA7, 0x90, 0x83, \r
-0x44, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x12, 0x4C, 0x25, 0x90, 0x83, 0x49, 0xE0, 0x04, 0xF0, 0x22, \r
-0x90, 0x81, 0x3A, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x2B, 0xEF, 0x54, \r
-0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x81, 0x3B, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, \r
-0x80, 0x0F, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x04, \r
-0xF0, 0x90, 0x81, 0x3E, 0xE0, 0x60, 0x02, 0x31, 0x9D, 0x7F, 0x01, 0x21, 0x11, 0x90, 0x81, 0x40, \r
-0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x48, 0xE6, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0x7F, 0x01, 0x90, \r
-0x84, 0x03, 0xEF, 0xF0, 0x90, 0x80, 0x06, 0xE0, 0x64, 0x02, 0x70, 0x1F, 0x90, 0x84, 0x03, 0xE0, \r
-0xFF, 0x64, 0x01, 0x70, 0x24, 0x90, 0x81, 0x81, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, \r
-0x30, 0xE0, 0x14, 0x90, 0x01, 0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x22, 0x90, 0x06, 0x90, 0xE0, 0x44, \r
-0x01, 0xF0, 0x90, 0x84, 0x03, 0xE0, 0xFF, 0x31, 0xEA, 0x22, 0xAD, 0x07, 0x90, 0x81, 0x82, 0xE0, \r
-0x75, 0xF0, 0x40, 0xA4, 0xFF, 0x90, 0x83, 0xEA, 0xE5, 0xF0, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, \r
-0xF0, 0x90, 0x81, 0x83, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x83, 0xED, 0xF0, 0xED, 0x64, 0x01, \r
-0x60, 0x02, 0x41, 0xBA, 0x90, 0x83, 0xEA, 0xE0, 0x70, 0x02, 0xA3, 0xE0, 0x60, 0x0B, 0x90, 0x83, \r
-0xEA, 0x74, 0xFF, 0x75, 0xF0, 0xD0, 0x12, 0x41, 0xF6, 0x90, 0x81, 0x81, 0xE0, 0x54, 0x7F, 0xFF, \r
-0x90, 0x81, 0x80, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, \r
-0x51, 0xCC, 0x51, 0xBB, 0x90, 0x81, 0x83, 0xE0, 0x30, 0xE0, 0x6F, 0x90, 0x83, 0xEA, 0xE0, 0xFE, \r
-0xA3, 0xE0, 0xFF, 0x12, 0x32, 0xAA, 0x90, 0x81, 0x81, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x81, 0x80, \r
-0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x51, 0xCC, 0xE4, \r
-0x90, 0x83, 0xEC, 0xF0, 0x90, 0x83, 0xED, 0xE0, 0xFF, 0x90, 0x83, 0xEC, 0xE0, 0xC3, 0x9F, 0x50, \r
-0x39, 0x90, 0x83, 0xEA, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x32, 0xAA, 0x51, 0xBB, 0x90, 0x83, \r
-0xEA, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x32, 0xAA, 0x90, 0x81, 0x81, 0xE0, 0x54, 0x7F, 0xFF, \r
-0x90, 0x81, 0x80, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, \r
-0x51, 0xCC, 0x90, 0x83, 0xEC, 0xE0, 0x04, 0xF0, 0x80, 0xBA, 0x22, 0x90, 0x81, 0x81, 0xE0, 0x54, \r
-0x7F, 0xFF, 0x90, 0x81, 0x80, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x01, 0xFD, 0xD3, 0x10, 0xAF, 0x01, \r
-0xC3, 0xC0, 0xD0, 0x90, 0x83, 0xFA, 0xED, 0xF0, 0x90, 0x83, 0xF9, 0xEF, 0xF0, 0xD3, 0x94, 0x07, \r
-0x50, 0x70, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, \r
-0xFF, 0x90, 0x00, 0x47, 0xE0, 0x5F, 0xFD, 0x7F, 0x47, 0x12, 0x32, 0x1E, 0x90, 0x83, 0xF9, 0xE0, \r
-0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xFF, 0x90, 0x00, 0x46, \r
-0xE0, 0x4F, 0xFD, 0x7F, 0x46, 0x12, 0x32, 0x1E, 0x90, 0x83, 0xFA, 0xE0, 0x60, 0x18, 0x90, 0x83, \r
-0xF9, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xFF, 0x90, \r
-0x00, 0x45, 0xE0, 0x4F, 0x80, 0x17, 0x90, 0x83, 0xF9, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, \r
+0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x32, 0x06, \r
+0x90, 0x00, 0xF2, 0xE0, 0x20, 0xE6, 0x0C, 0x90, 0x00, 0x05, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x05, \r
+0x12, 0x32, 0x1E, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, \r
+0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, \r
+0x07, 0x90, 0x01, 0xC4, 0x74, 0xF4, 0xF0, 0x74, 0x47, 0xA3, 0xF0, 0x12, 0x71, 0xE2, 0xE5, 0x41, \r
+0x30, 0xE3, 0x03, 0x12, 0x6E, 0x43, 0xE5, 0x41, 0x30, 0xE4, 0x03, 0x12, 0x6D, 0xB6, 0xE5, 0x43, \r
+0x30, 0xE0, 0x02, 0x11, 0x90, 0xE5, 0x43, 0x30, 0xE1, 0x03, 0x12, 0x72, 0x7B, 0xE5, 0x43, 0x30, \r
+0xE2, 0x03, 0x12, 0x76, 0x8E, 0xE5, 0x43, 0x30, 0xE3, 0x02, 0x91, 0x99, 0xE5, 0x43, 0x30, 0xE4, \r
+0x02, 0x91, 0xC6, 0xE5, 0x43, 0x30, 0xE5, 0x02, 0x91, 0xAC, 0xE5, 0x43, 0x30, 0xE6, 0x03, 0x12, \r
+0x76, 0xA5, 0xE5, 0x44, 0x30, 0xE1, 0x03, 0x12, 0x77, 0x69, 0x74, 0xF4, 0x04, 0x90, 0x01, 0xC4, \r
+0xF0, 0x74, 0x47, 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, 0x19, 0x90, 0x81, 0x08, 0xE0, 0x60, 0x71, 0x91, 0x5F, 0x64, 0x01, 0x70, 0x6B, 0x12, \r
+0x74, 0xC0, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x12, 0x76, 0x82, 0x90, 0x81, 0x06, 0xE0, \r
+0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0x81, 0x0F, 0xE0, \r
+0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x81, 0x11, 0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, \r
+0x81, 0x0E, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x19, 0x01, 0xE5, 0x19, 0x60, 0x2C, 0x12, 0x76, \r
+0x51, 0x90, 0x81, 0x11, 0xE0, 0x60, 0x03, 0xB4, 0x01, 0x05, 0x12, 0x7A, 0x1C, 0x80, 0x09, 0x12, \r
+0x7A, 0x1C, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x81, 0x10, 0xE0, 0x2F, 0x12, 0x6F, \r
+0xDD, 0x90, 0x81, 0x0B, 0xE0, 0x20, 0xE2, 0x02, 0x31, 0x0B, 0x22, 0x7D, 0x01, 0x7F, 0x04, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x84, 0x39, 0xED, 0xF0, 0x90, 0x81, 0x04, 0xE0, 0xFE, \r
+0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x41, 0x5A, 0xEE, 0x12, 0x5E, 0x80, 0x30, 0xE0, \r
+0x02, 0x41, 0x5A, 0x90, 0x81, 0x0B, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x41, 0x5A, 0xEF, 0x70, 0x02, \r
+0x21, 0xCD, 0x24, 0xFE, 0x70, 0x02, 0x41, 0x06, 0x24, 0xFE, 0x60, 0x49, 0x24, 0xFC, 0x70, 0x02, \r
+0x41, 0x41, 0x24, 0xFC, 0x60, 0x02, 0x41, 0x53, 0xEE, 0xB4, 0x0E, 0x02, 0x51, 0x91, 0x90, 0x81, \r
+0x0B, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0xCD, 0x90, 0x81, 0x0B, 0xE0, 0xB4, 0x06, 0x02, 0x51, \r
+0xAC, 0x90, 0x81, 0x0B, 0xE0, 0xB4, 0x04, 0x0E, 0x90, 0x84, 0x39, 0xE0, 0xFF, 0x60, 0x04, 0x71, \r
+0xD6, 0x80, 0x03, 0x12, 0x59, 0x65, 0x90, 0x81, 0x0B, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x41, 0x53, \r
+0x12, 0x5E, 0xF6, 0x41, 0x53, 0x90, 0x81, 0x0B, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0xCD, 0x90, \r
+0x81, 0x0B, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0xAC, 0x90, 0x81, 0x0B, 0xE0, 0xB4, 0x0E, 0x07, 0x51, \r
+0x5F, 0xBF, 0x01, 0x02, 0x51, 0x91, 0x90, 0x81, 0x0B, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x41, 0x53, \r
+0x51, 0x5F, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x41, 0x53, 0x51, 0xE4, 0x41, 0x53, 0x90, 0x81, 0x0B, \r
+0xE0, 0xB4, 0x0E, 0x07, 0x51, 0x5F, 0xBF, 0x01, 0x02, 0x51, 0x91, 0x90, 0x81, 0x0B, 0xE0, 0xB4, \r
+0x06, 0x02, 0x51, 0xAC, 0x90, 0x81, 0x0B, 0xE0, 0xB4, 0x0C, 0x07, 0x51, 0x5F, 0xBF, 0x01, 0x02, \r
+0x51, 0xE4, 0x90, 0x81, 0x0B, 0xE0, 0x64, 0x04, 0x70, 0x59, 0x12, 0x6A, 0x0C, 0xEF, 0x64, 0x01, \r
+0x70, 0x51, 0x71, 0xB8, 0x80, 0x4D, 0x90, 0x81, 0x0B, 0xE0, 0xB4, 0x0E, 0x07, 0x51, 0x5F, 0xBF, \r
+0x01, 0x02, 0x51, 0x91, 0x90, 0x81, 0x0B, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0xAC, 0x90, 0x81, 0x0B, \r
+0xE0, 0xB4, 0x0C, 0x07, 0x51, 0x5F, 0xBF, 0x01, 0x02, 0x51, 0xE4, 0x90, 0x81, 0x0B, 0xE0, 0x70, \r
+0x04, 0x7F, 0x01, 0x51, 0xCD, 0x90, 0x81, 0x0B, 0xE0, 0xB4, 0x04, 0x17, 0x12, 0x77, 0xD6, 0x80, \r
+0x12, 0x90, 0x81, 0x0B, 0xE0, 0xB4, 0x0C, 0x0B, 0x90, 0x81, 0x05, 0x12, 0x5F, 0xC9, 0x30, 0xE0, \r
+0x02, 0x71, 0x92, 0x90, 0x81, 0x0B, 0x12, 0x79, 0xCB, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, \r
+0x6E, 0x4F, 0xEF, 0x64, 0x01, 0x60, 0x05, 0x12, 0x6A, 0x80, 0x80, 0x1C, 0x12, 0x70, 0x83, 0x30, \r
+0xE0, 0x05, 0x12, 0x6A, 0x79, 0x80, 0x11, 0x90, 0x81, 0x0A, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x05, \r
+0x12, 0x6A, 0x05, 0x80, 0x03, 0x02, 0x6A, 0x87, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x7F, 0x00, \r
+0x22, 0x90, 0x81, 0x05, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, 0x7D, 0x0C, 0x80, 0x05, 0x12, 0x78, \r
+0x43, 0x7D, 0x04, 0x7F, 0x01, 0x71, 0x2A, 0xE4, 0xFD, 0xFF, 0x80, 0x6F, 0x90, 0x81, 0x05, 0xE0, \r
+0x90, 0x06, 0x04, 0x20, 0xE0, 0x08, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x04, 0x80, 0x06, 0xE0, 0x54, \r
+0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0x71, 0x2A, 0xE4, 0xFD, 0xFF, 0x80, 0x4E, 0x90, 0x84, 0x38, \r
+0xEF, 0xF0, 0x12, 0x59, 0x85, 0x90, 0x84, 0x38, 0xE0, 0x60, 0x03, 0x12, 0x5A, 0xCD, 0x7D, 0x04, \r
+0x7F, 0x01, 0x80, 0x46, 0x91, 0x5F, 0x64, 0x01, 0x70, 0x27, 0x90, 0x81, 0x05, 0xE0, 0x54, 0xFD, \r
+0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x71, 0x1B, 0x7D, 0x08, 0x7F, 0x01, 0x91, 0x0F, 0xBF, 0x01, 0x0D, \r
+0x90, 0x81, 0x04, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0x80, 0x1D, 0xF1, 0xFC, 0x04, \r
+0xF0, 0x22, 0xE4, 0xFD, 0x7F, 0x0C, 0x31, 0x0F, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, 0xF0, \r
+0x90, 0x80, 0x05, 0xED, 0xF0, 0x22, 0x7D, 0x0C, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0xAC, 0x07, 0xEF, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, \r
+0x01, 0xFE, 0x90, 0x81, 0x04, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0x80, 0x0C, 0x90, 0x81, 0x0B, 0xED, \r
+0xF0, 0x80, 0x05, 0x90, 0x81, 0x0A, 0xED, 0xF0, 0x90, 0x00, 0x8F, 0xE0, 0x30, 0xE4, 0x2E, 0xEC, \r
+0x14, 0x60, 0x07, 0x14, 0x60, 0x1D, 0x24, 0x02, 0x70, 0x23, 0x90, 0x81, 0x04, 0xE0, 0x54, 0x01, \r
+0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x90, 0x81, 0x0B, 0xE0, 0x54, 0x7F, 0x4F, 0xFD, 0x7F, \r
+0x88, 0x80, 0x07, 0x90, 0x81, 0x0A, 0xE0, 0xFD, 0x7F, 0x89, 0x12, 0x32, 0x1E, 0xD0, 0xD0, 0x92, \r
+0xAF, 0x22, 0x7D, 0x2F, 0x12, 0x5B, 0x03, 0x7D, 0x08, 0x7F, 0x01, 0x80, 0x8D, 0x90, 0x81, 0x08, \r
+0xE0, 0x64, 0x01, 0x70, 0x12, 0x12, 0x57, 0xDD, 0x60, 0x05, 0x71, 0x12, 0x02, 0x70, 0x4E, 0x90, \r
+0x81, 0x0B, 0xE0, 0x70, 0x02, 0x31, 0x0B, 0x22, 0x7D, 0x2D, 0x7F, 0xFF, 0x71, 0x1B, 0x12, 0x6F, \r
+0x83, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x58, 0x91, 0x12, 0x5B, 0x08, \r
+0xE4, 0xFD, 0x7F, 0x01, 0x61, 0x2A, 0xEF, 0x60, 0x31, 0x91, 0x5F, 0x64, 0x01, 0x70, 0x2B, 0x90, \r
+0x81, 0x05, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x2B, 0x7F, 0x0F, 0x71, 0x1B, 0x90, 0x06, 0x04, 0xE0, \r
+0x54, 0xBF, 0xF0, 0x91, 0x0B, 0xBF, 0x01, 0x0D, 0x90, 0x81, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0x7D, \r
+0x06, 0x7F, 0x01, 0x61, 0x2A, 0xF1, 0xFC, 0x74, 0x08, 0xF0, 0x22, 0x7D, 0x08, 0xE4, 0xFF, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x84, 0x0E, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x80, \r
+0x03, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x26, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x84, \r
+0x12, 0xF0, 0x7D, 0x26, 0x7F, 0xFF, 0x71, 0x1B, 0x12, 0x6F, 0x83, 0xEF, 0x64, 0x01, 0x70, 0x02, \r
+0xB1, 0x03, 0x90, 0x84, 0x12, 0xE0, 0xFF, 0x7D, 0x27, 0x71, 0x1B, 0x12, 0x77, 0xE4, 0x80, 0x05, \r
+0x12, 0x77, 0xE4, 0xB1, 0x03, 0xF1, 0xF4, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF0, 0xE4, \r
+0xFF, 0x91, 0x65, 0xEF, 0x22, 0x12, 0x79, 0xF0, 0x12, 0x5F, 0x83, 0xE0, 0xFD, 0x7C, 0x00, 0x12, \r
+0x6D, 0xD2, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, \r
+0x5D, 0x4E, 0x7F, 0x00, 0x60, 0x02, 0x7F, 0x01, 0x22, 0x12, 0x70, 0x4E, 0x90, 0x81, 0x0B, 0xE0, \r
+0x64, 0x0C, 0x60, 0x04, 0x71, 0x12, 0x91, 0x0B, 0x22, 0x91, 0x5F, 0x64, 0x01, 0x70, 0x0C, 0x90, \r
+0x81, 0x08, 0xE0, 0x60, 0x06, 0x12, 0x76, 0x6C, 0x12, 0x6F, 0xD5, 0x22, 0xE4, 0xFF, 0x91, 0x65, \r
+0xBF, 0x01, 0x12, 0x90, 0x81, 0x08, 0xE0, 0x60, 0x0C, 0x12, 0x57, 0xDD, 0x64, 0x02, 0x60, 0x03, \r
+0x02, 0x76, 0xD7, 0x91, 0x89, 0x22, 0x91, 0x5F, 0x64, 0x01, 0x70, 0x18, 0x90, 0x81, 0x08, 0xE0, \r
+0x60, 0x12, 0x12, 0x76, 0x6C, 0xF0, 0x90, 0x81, 0x04, 0xE0, 0x12, 0x76, 0x77, 0x54, 0x07, 0x70, \r
+0x03, 0x12, 0x5D, 0x9C, 0x22, 0xF1, 0xB8, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x0B, 0xF1, 0xAC, 0xE0, \r
+0x44, 0x10, 0xF1, 0xB7, 0x44, 0x80, 0xF0, 0x22, 0xF1, 0xAC, 0xE0, 0x54, 0xEF, 0xF1, 0xB7, 0x44, \r
+0x40, 0xF0, 0x22, 0x90, 0x80, 0x09, 0xE0, 0xFF, 0x90, 0x84, 0x0F, 0xE0, 0xFB, 0x7D, 0x01, 0xB1, \r
+0x91, 0x90, 0x84, 0x10, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x84, 0x0E, 0xE0, 0xFF, \r
+0x91, 0xE5, 0x90, 0x84, 0x10, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x04, 0x80, 0xE0, 0x54, 0x0F, \r
+0xFD, 0xAC, 0x07, 0x12, 0x79, 0xE4, 0x44, 0x01, 0xF0, 0x12, 0x79, 0xE4, 0x54, 0xFB, 0xF0, 0xAC, \r
+0x07, 0x74, 0x16, 0x2C, 0xF1, 0xDF, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x15, 0x2C, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, 0x53, 0xE4, 0xF0, 0x90, 0x04, 0x52, \r
+0xF0, 0x90, 0x04, 0x51, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, \r
+0x12, 0x7A, 0x14, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0x12, 0x7A, 0x14, 0xED, 0xF0, \r
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x84, 0x18, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, \r
+0x90, 0x84, 0x17, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0x78, 0x4F, 0x7C, 0x00, 0xAD, 0x07, 0x90, \r
+0x84, 0x17, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x84, 0x18, 0xE0, 0x60, 0x0E, 0x74, 0x0F, 0x2F, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x08, 0x2F, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0xAF, 0x05, 0xF1, 0xDC, 0xE0, 0x54, 0x01, 0xFE, 0x90, \r
+0x84, 0x19, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0xF1, 0xDC, 0xEE, \r
+0xF0, 0x74, 0x21, 0x2F, 0xF1, 0xAF, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x83, 0xC1, 0x12, 0x42, 0x3A, \r
+0x78, 0xCD, 0x7C, 0x83, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0xCE, 0x12, 0x67, 0x32, 0x90, \r
+0x05, 0x22, 0xE0, 0x90, 0x83, 0xCC, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x0E, 0x7D, 0x33, 0x7F, \r
+0xFF, 0x71, 0x1B, 0x12, 0x6F, 0x83, 0xBF, 0x01, 0x15, 0x80, 0x00, 0x90, 0x83, 0x68, 0xE0, 0xFF, \r
+0x7B, 0x18, 0x7D, 0x01, 0xB1, 0x91, 0x90, 0x83, 0xC9, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x83, \r
+0xC9, 0x12, 0x78, 0xF8, 0x90, 0x83, 0xCB, 0xEF, 0xF0, 0x90, 0x83, 0xC9, 0xA3, 0xE0, 0x24, 0x20, \r
+0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x83, 0xC7, 0xE0, 0xFD, 0x12, 0x56, 0x84, 0x90, \r
+0x83, 0xC8, 0xE0, 0x70, 0x49, 0xF1, 0xD2, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, \r
+0xF1, 0xE7, 0x75, 0x16, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0xF1, 0x30, 0xF1, 0xC4, 0xFA, \r
+0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xF1, 0xE7, 0x75, 0x16, 0x06, 0xD0, 0x01, 0xD0, \r
+0x02, 0xD0, 0x03, 0xF1, 0x30, 0xF1, 0xCB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, \r
+0x90, 0x83, 0xC1, 0xF1, 0xEA, 0x75, 0x16, 0x04, 0xD0, 0x01, 0xD0, 0x02, 0x80, 0x46, 0x90, 0x83, \r
+0xC8, 0xE0, 0x64, 0x01, 0x70, 0x43, 0xF1, 0xD2, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x13, 0x75, \r
+0x14, 0x81, 0x75, 0x15, 0xD3, 0x75, 0x16, 0x06, 0xD0, 0x03, 0xF1, 0x30, 0xF1, 0xC4, 0xFA, 0x7B, \r
+0x01, 0xC0, 0x03, 0x8B, 0x13, 0x75, 0x14, 0x81, 0x75, 0x15, 0xDD, 0x75, 0x16, 0x06, 0xD0, 0x03, \r
+0xF1, 0x30, 0xF1, 0xCB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x13, 0x75, 0x14, 0x81, 0x75, 0x15, \r
+0xE3, 0x75, 0x16, 0x04, 0xD0, 0x03, 0x12, 0x2B, 0xED, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x10, 0xF0, \r
+0x90, 0x83, 0xCC, 0xE0, 0xFF, 0x7D, 0x34, 0x71, 0x1B, 0xF1, 0xF4, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x12, 0x2B, 0xED, 0x90, 0x83, 0xC9, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x22, 0x12, 0x78, 0x4F, \r
+0x90, 0x84, 0x27, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x84, 0x27, 0x12, 0x78, 0xF8, 0x90, 0x84, \r
+0x29, 0xEF, 0xF0, 0x90, 0x84, 0x27, 0xF1, 0xD3, 0xF1, 0x9D, 0x75, 0x16, 0x06, 0x7B, 0x01, 0x7A, \r
+0x81, 0x79, 0xD3, 0xF1, 0xA5, 0xF1, 0x36, 0x24, 0x36, 0xF9, 0xE4, 0x34, 0xFC, 0xF1, 0x9D, 0x75, \r
+0x16, 0x04, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xD9, 0xF1, 0xA5, 0xF1, 0x36, 0xF1, 0xC4, 0xF1, 0x9D, \r
+0x75, 0x16, 0x06, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xDD, 0xF1, 0xA5, 0xF1, 0x36, 0xF1, 0xCB, 0xF1, \r
+0x9D, 0x75, 0x16, 0x04, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xE3, 0x02, 0x2B, 0xED, 0x75, 0x13, 0x01, \r
+0xF5, 0x14, 0x89, 0x15, 0x22, 0x12, 0x2B, 0xED, 0x90, 0x84, 0x27, 0x22, 0x74, 0x21, 0x2D, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF0, 0x74, 0x1F, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
+0xF5, 0x83, 0xE0, 0x22, 0x24, 0x3A, 0xF9, 0xE4, 0x34, 0xFC, 0x22, 0x24, 0x40, 0xF9, 0xE4, 0x34, \r
+0xFC, 0x22, 0xA3, 0xA3, 0xE0, 0x24, 0x30, 0xF9, 0xE4, 0x34, 0xFC, 0x22, 0x74, 0x16, 0x2F, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x90, 0x83, 0xC4, 0x12, 0x42, 0x31, 0x8B, 0x13, 0x8A, \r
+0x14, 0x89, 0x15, 0x22, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0xF0, 0x90, 0x01, 0xB9, 0x74, \r
+0x01, 0xF0, 0x90, 0x01, 0xB8, 0x22, 0xF1, 0xAD, 0xFF, 0x54, 0x7F, 0x90, 0x81, 0x08, 0xF0, 0xEF, \r
+0x12, 0x5E, 0x80, 0xA3, 0x71, 0x09, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x81, 0x06, \r
+0xE0, 0x54, 0xF0, 0x4E, 0xB1, 0xC9, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0x81, 0x04, 0xE0, 0x54, \r
+0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0xF1, 0xDD, 0xB1, 0x86, 0x90, 0x81, \r
+0x07, 0x91, 0x65, 0x30, 0xE0, 0x4C, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x81, \r
+0x1B, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x24, 0x74, 0x03, 0x11, 0xB1, 0xE9, 0x24, 0x06, 0xF1, 0xD5, \r
+0xFF, 0x74, 0x03, 0x24, 0xFD, 0xFE, 0xEF, 0xC4, 0x54, 0x0F, 0xFD, 0xEF, 0x54, 0x0F, 0xFF, 0xED, \r
+0x2E, 0x54, 0x0F, 0xFE, 0xC4, 0x54, 0xF0, 0x4F, 0x12, 0x1F, 0xEA, 0x11, 0xB2, 0x91, 0x66, 0xC4, \r
+0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x81, 0x10, 0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02, \r
+0xEF, 0xF0, 0x11, 0xB2, 0xD1, 0x47, 0xFD, 0x7F, 0x02, 0x12, 0x4B, 0x2A, 0x11, 0xB2, 0xF1, 0x19, \r
+0x12, 0x4F, 0xFC, 0xF0, 0x90, 0x81, 0x08, 0x12, 0x79, 0xCB, 0xF1, 0xDC, 0x90, 0x01, 0xBE, 0xF0, \r
+0x22, 0xF0, 0x90, 0x83, 0x9A, 0x02, 0x42, 0x31, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, \r
+0xAD, 0x20, 0xE0, 0x05, 0x12, 0x5A, 0xDE, 0x21, 0x7B, 0x90, 0x82, 0x87, 0x74, 0x05, 0x11, 0xB1, \r
+0xF1, 0xA5, 0x90, 0x81, 0xB6, 0x71, 0x18, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x71, 0x10, 0xF1, \r
+0xE4, 0x71, 0x26, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x71, 0x10, 0xF1, 0xEC, 0x71, 0x26, 0x54, \r
+0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x71, 0x10, 0xF1, 0xF4, 0x71, 0x09, 0x54, 0x80, 0xFF, 0x90, 0x81, \r
+0xB7, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x12, 0x1F, 0xA4, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, \r
+0x90, 0x06, 0x90, 0xE0, 0x44, 0x04, 0xF0, 0x11, 0xB2, 0x12, 0x1F, 0xA4, 0x13, 0x13, 0x13, 0x54, \r
+0x1F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x80, 0x06, 0xE0, 0xB4, \r
+0x02, 0x0A, 0x90, 0x81, 0xB7, 0xE0, 0x12, 0x5E, 0x80, 0x20, 0xE0, 0x31, 0x71, 0x0A, 0x54, 0x7F, \r
+0xFF, 0x90, 0x81, 0xB7, 0xE0, 0x54, 0x80, 0xB1, 0x86, 0x90, 0x81, 0xB8, 0xB1, 0xC9, 0xFF, 0x54, \r
+0x01, 0xFE, 0x90, 0x81, 0xB9, 0x12, 0x79, 0xFC, 0x54, 0xFE, 0xFF, 0xEE, 0x54, 0x01, 0x4F, 0xF0, \r
+0x51, 0xFA, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x31, 0x80, 0x90, 0x80, 0x06, \r
+0xE0, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x84, 0x31, 0xED, 0xF0, 0x90, 0x84, 0x30, 0xEF, \r
+0xF0, 0xD3, 0x94, 0x07, 0x50, 0x4C, 0x51, 0x53, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, \r
+0x90, 0x00, 0x47, 0xE0, 0x5F, 0xFD, 0x7F, 0x47, 0x51, 0x4D, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, \r
+0xFF, 0x90, 0x00, 0x46, 0xE0, 0x4F, 0xFD, 0x7F, 0x46, 0x12, 0x7A, 0x24, 0x60, 0x10, 0x51, 0x50, \r
+0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xFF, 0x90, 0x00, 0x45, 0xE0, 0x4F, 0x80, 0x0F, 0x51, 0x50, \r
 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x45, 0xE0, 0x5F, 0xFD, 0x7F, 0x45, \r
-0x80, 0x7E, 0x90, 0x83, 0xF9, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0x24, 0x04, 0xFF, 0x74, 0x01, 0xA8, \r
-0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x43, 0xE0, 0x5F, 0xFD, \r
-0x7F, 0x43, 0x12, 0x32, 0x1E, 0x90, 0x83, 0xF9, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, \r
-0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xFF, 0x90, 0x00, 0x43, 0xE0, 0x4F, 0xFD, 0x7F, 0x43, 0x12, 0x32, \r
-0x1E, 0x90, 0x83, 0xFA, 0xE0, 0x60, 0x1D, 0x90, 0x83, 0xF9, 0xE0, 0x24, 0x04, 0xFF, 0x74, 0x01, \r
-0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xFF, 0x90, 0x00, 0x42, 0xE0, 0x4F, 0xFD, \r
-0x7F, 0x42, 0x80, 0x1C, 0x90, 0x83, 0xF9, 0xE0, 0x24, 0x04, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, \r
-0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x42, 0xE0, 0x5F, 0xFD, 0x7F, 0x42, \r
-0x12, 0x32, 0x1E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
-0x83, 0x65, 0x74, 0x08, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x83, \r
-0x6C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0xE0, 0x7C, \r
-0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x83, 0x5D, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x82, \r
-0xE0, 0x90, 0x83, 0x64, 0xF0, 0x90, 0x81, 0x7D, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x7C, 0x90, 0x81, \r
-0x85, 0xE0, 0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x19, 0x90, 0x80, 0x06, 0xE0, \r
-0xB4, 0x01, 0x0E, 0x90, 0xFD, 0x01, 0xE0, 0x20, 0xE6, 0x07, 0x90, 0xFD, 0x00, 0xE0, 0x44, 0x10, \r
-0xF0, 0x7F, 0x01, 0x31, 0xAF, 0xE4, 0x90, 0x83, 0x63, 0xF0, 0x90, 0x83, 0x64, 0xE0, 0xFF, 0x90, \r
-0x83, 0x63, 0xE0, 0xC3, 0x9F, 0x40, 0x02, 0xC1, 0x7C, 0x90, 0x83, 0x5D, 0xE0, 0xFC, 0xA3, 0xE0, \r
-0xFD, 0xEC, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0xAE, 0x05, 0xAA, 0x06, 0x90, 0x83, 0x67, 0xEF, 0xF0, \r
-0x74, 0x02, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, \r
-0x54, 0xF8, 0xFF, 0x74, 0x03, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x03, \r
-0xFE, 0xEF, 0x24, 0x18, 0x2E, 0x90, 0x83, 0x6C, 0xF0, 0xE0, 0xFF, 0x2A, 0x90, 0x83, 0x5F, 0xF0, \r
-0x7E, 0x00, 0x90, 0x83, 0x5D, 0xE0, 0xFC, 0xA3, 0xE0, 0x2F, 0xFF, 0xEE, 0x3C, 0x90, 0x83, 0x60, \r
-0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x83, 0x5F, 0xE0, 0xFD, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, \r
-0xF5, 0x83, 0xE0, 0xFE, 0x54, 0xFC, 0x90, 0x83, 0x62, 0xF0, 0xAF, 0x06, 0x74, 0x01, 0x2D, 0xF5, \r
-0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFD, 0x90, 0x83, 0x5F, 0xE0, 0x24, 0x04, 0xF5, 0x82, \r
-0xE4, 0x34, 0xFB, 0xF1, 0x1F, 0x90, 0x83, 0x66, 0xEF, 0xF0, 0x74, 0x01, 0x2A, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, \r
-0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x54, 0x3F, 0xFE, 0x90, 0x83, 0x68, 0xF0, 0xA3, \r
-0xEF, 0xF0, 0x90, 0x83, 0x6C, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0x12, 0x77, 0xE6, 0x74, 0x0F, \r
-0x2A, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFD, 0x90, 0x83, 0x5D, 0xEE, 0x8F, 0xF0, \r
-0x12, 0x41, 0xF6, 0x90, 0x80, 0xF7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x83, 0x5D, 0xE0, 0xFA, \r
-0xA3, 0xE0, 0xD3, 0x9F, 0xEA, 0x9E, 0x40, 0x22, 0x90, 0x83, 0x5D, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, \r
-0x90, 0x80, 0xF7, 0xE0, 0xFA, 0xA3, 0xE0, 0x24, 0x01, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0xEF, 0x9B, \r
-0xFF, 0xEE, 0x9A, 0x90, 0x83, 0x5D, 0xF0, 0xA3, 0xEF, 0xF0, 0xED, 0x30, 0xE7, 0x06, 0x90, 0x01, \r
-0xC7, 0x74, 0x21, 0xF0, 0xED, 0x30, 0xE6, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF0, 0xED, 0x30, \r
-0xE5, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x23, 0xF0, 0x90, 0x83, 0x62, 0xE0, 0x24, 0x40, 0x60, 0x04, \r
-0x24, 0x20, 0x70, 0x1E, 0x90, 0x81, 0x80, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, \r
-0xE0, 0x02, 0xC1, 0x23, 0xD1, 0xBD, 0xEF, 0x60, 0x7A, 0x90, 0x83, 0x62, 0xE0, 0xFF, 0xF1, 0xD8, \r
-0x80, 0x71, 0xD1, 0xBD, 0xEF, 0x60, 0x26, 0x90, 0x83, 0x60, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, \r
-0x83, 0x66, 0xE0, 0xFD, 0x90, 0x83, 0x65, 0xE0, 0xFB, 0x90, 0x83, 0x67, 0xE0, 0x90, 0x83, 0x73, \r
-0xF0, 0x12, 0x75, 0xE3, 0xEF, 0x60, 0x06, 0x90, 0x83, 0x6E, 0x74, 0x01, 0xF0, 0x90, 0x81, 0x7D, \r
-0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x19, 0x90, 0x83, 0x60, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x83, \r
-0x66, 0xE0, 0xFD, 0x12, 0x73, 0xF1, 0xEF, 0x60, 0x06, 0x90, 0x83, 0x6E, 0x74, 0x01, 0xF0, 0x90, \r
-0x81, 0x7D, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x16, 0x90, 0x83, 0x6E, \r
-0xE0, 0x70, 0x10, 0x90, 0x83, 0x60, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x83, 0x66, 0xE0, 0xFD, \r
-0x12, 0x76, 0xC6, 0x90, 0x81, 0x85, 0xE0, 0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, \r
-0x04, 0x7F, 0x01, 0x31, 0xAF, 0x12, 0x7A, 0xE4, 0xEF, 0x64, 0x01, 0x70, 0x3F, 0xF1, 0xC2, 0x90, \r
-0x83, 0x6D, 0xEF, 0xF0, 0x64, 0x01, 0x60, 0x27, 0x90, 0x81, 0x85, 0xE0, 0x44, 0x01, 0xF0, 0x90, \r
-0x83, 0x6D, 0xE0, 0xFF, 0xB4, 0x02, 0x08, 0x90, 0x01, 0xC7, 0x74, 0x42, 0xF0, 0x80, 0x0A, 0xEF, \r
-0xB4, 0x04, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x43, 0xF0, 0x7F, 0x01, 0x31, 0xAF, 0x80, 0x0D, 0x90, \r
-0x83, 0x5D, 0xF1, 0xAF, 0x90, 0x83, 0x63, 0xE0, 0x04, 0xF0, 0x81, 0x4A, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0x90, 0x81, 0x3A, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, \r
-0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0xF5, \r
-0x52, 0x90, 0x81, 0x78, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0xF5, 0x53, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, \r
-0x7E, 0x01, 0x12, 0x58, 0x00, 0x90, 0x81, 0x3A, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x83, 0x5F, \r
-0xE0, 0xFF, 0xE4, 0xFE, 0xEF, 0x2E, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, \r
-0xFD, 0x74, 0x6F, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x83, 0xF5, 0x83, 0xED, 0xF0, 0x0E, 0xEE, 0xB4, \r
-0x06, 0xE2, 0x78, 0x86, 0x7C, 0x81, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x83, 0x79, 0x6F, 0x7E, 0x00, \r
-0x7F, 0x06, 0x12, 0x43, 0xEF, 0xEF, 0x7F, 0x00, 0x70, 0x02, 0x7F, 0x01, 0x22, 0xA3, 0xE0, 0xFE, \r
-0x24, 0x20, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x21, 0x2E, 0xF5, 0x82, \r
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFD, 0x74, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
-0x83, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x30, 0xE7, 0x04, 0x7C, 0x02, 0x80, 0x02, 0xE4, 0xFC, 0xED, \r
-0x30, 0xE6, 0x09, 0xAF, 0x03, 0x12, 0x6E, 0xA5, 0xAE, 0x07, 0x80, 0x02, 0xE4, 0xFE, 0xEC, 0x24, \r
-0x18, 0x2E, 0xFF, 0x22, 0x90, 0x81, 0x3A, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11, \r
-0xEF, 0x54, 0xFB, 0xF0, 0x90, 0x81, 0x42, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x2D, 0x80, \r
-0x29, 0x90, 0x81, 0x47, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x42, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x81, \r
-0x76, 0xE0, 0xFF, 0x90, 0x81, 0x47, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90, 0x80, 0xF9, 0xE0, 0xB4, \r
-0x01, 0x0A, 0x90, 0x81, 0x3B, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x31, 0x9D, 0x22, 0x8F, 0x0D, 0x7F, \r
-0x02, 0x12, 0x46, 0x3A, 0x90, 0x80, 0x01, 0xE0, 0x45, 0x0D, 0xF0, 0x22, 0x12, 0x66, 0x2B, 0x7F, \r
-0x02, 0x80, 0xEA, 0x90, 0x81, 0x7D, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x10, 0xF1, 0x8D, 0x22, 0xE0, \r
-0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x02, 0x84, 0xEF, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xE0, 0x44, 0x01, \r
-0xF0, 0x22, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE2, 0x03, 0x7F, 0x04, 0x22, 0x90, 0x02, 0x86, 0xE0, \r
-0x7F, 0x01, 0x20, 0xE1, 0x02, 0x7F, 0x02, 0x22, 0xEF, 0x90, 0x01, 0xC7, 0xB4, 0xA0, 0x05, 0x74, \r
-0x04, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x81, 0x85, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xF0, \r
-0xE4, 0xF5, 0x52, 0x90, 0x81, 0x77, 0xE0, 0xF5, 0x53, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8E, 0x4E, 0x8F, 0x4F, 0xE5, 0x53, 0x54, 0x07, 0xC4, \r
-0x33, 0x54, 0xE0, 0x85, 0x4E, 0x83, 0x85, 0x4F, 0x82, 0xF0, 0xE5, 0x52, 0x54, 0x07, 0xC4, 0x33, \r
-0x54, 0xE0, 0xFF, 0xE5, 0x53, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x4F, 0xA3, 0xF0, 0xEB, 0x54, 0x07, \r
-0xC4, 0x33, 0x54, 0xE0, 0xFF, 0xE5, 0x52, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x4F, 0x85, 0x4F, 0x82, \r
-0x85, 0x4E, 0x83, 0xA3, 0xA3, 0xF0, 0xBD, 0x01, 0x0D, 0x85, 0x4F, 0x82, 0x8E, 0x83, 0xA3, 0xA3, \r
-0xA3, 0x74, 0x03, 0xF0, 0x80, 0x0C, 0x85, 0x4F, 0x82, 0x85, 0x4E, 0x83, 0xA3, 0xA3, 0xA3, 0x74, \r
-0x01, 0xF0, 0x85, 0x4F, 0x82, 0x85, 0x4E, 0x83, 0xA3, 0xA3, 0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x90, 0x00, 0xF7, 0xE0, 0x20, 0xE7, 0x09, 0xE0, 0x7F, 0x01, 0x20, 0xE6, 0x0C, \r
-0x7F, 0x02, 0x22, 0x90, 0x00, 0xF7, 0xE0, 0x30, 0xE6, 0x02, 0x7F, 0x03, 0x22, 0x11, 0x73, 0x90, \r
-0x80, 0x06, 0xEF, 0xF0, 0x11, 0x9F, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x02, 0x2D, 0xA7, 0x31, \r
-0x0B, 0x31, 0x3B, 0x11, 0xCD, 0x11, 0xEC, 0xE4, 0xF5, 0x35, 0xF5, 0x36, 0xF5, 0x37, 0x75, 0x38, \r
-0x80, 0xAD, 0x35, 0x7F, 0x50, 0x12, 0x32, 0x1E, 0xAD, 0x36, 0x7F, 0x51, 0x12, 0x32, 0x1E, 0xAD, \r
-0x37, 0x7F, 0x52, 0x12, 0x32, 0x1E, 0xAD, 0x38, 0x7F, 0x53, 0x02, 0x32, 0x1E, 0x75, 0x3D, 0x10, \r
-0xE4, 0xF5, 0x3E, 0x75, 0x3F, 0x07, 0x75, 0x40, 0x02, 0x90, 0x01, 0x30, 0xE5, 0x3D, 0xF0, 0xA3, \r
-0xE5, 0x3E, 0xF0, 0xA3, 0xE5, 0x3F, 0xF0, 0xA3, 0xE5, 0x40, 0xF0, 0x22, 0x75, 0x45, 0x06, 0x75, \r
-0x46, 0x01, 0x75, 0x47, 0x03, 0x75, 0x48, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x45, 0xF0, 0xA3, 0xE5, \r
-0x46, 0xF0, 0xA3, 0xE5, 0x47, 0xF0, 0xA3, 0xE5, 0x48, 0xF0, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, \r
-0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, \r
-0xFD, 0x7F, 0x50, 0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, \r
-0x52, 0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x53, 0x02, 0x32, 0x1E, 0x90, 0x01, 0x34, 0x74, 0xFF, \r
-0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0xFD, 0x7F, 0x54, 0x12, 0x32, 0x1E, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x32, 0x1E, 0x7D, 0xFF, \r
-0x7F, 0x56, 0x12, 0x32, 0x1E, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x32, 0x1E, 0x90, 0x01, 0xCF, 0xE0, \r
-0x90, 0x83, 0xFF, 0xF0, 0xE0, 0xFF, 0x30, 0xE0, 0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, \r
-0xEF, 0x30, 0xE5, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, \r
-0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x31, 0x0B, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, \r
-0x03, 0x12, 0x32, 0x1E, 0x80, 0xFE, 0x22, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, \r
-0x12, 0x32, 0x1E, 0x90, 0xFD, 0x00, 0xE0, 0x54, 0xBF, 0xF0, 0x51, 0x39, 0x12, 0x32, 0x77, 0x51, \r
-0x1A, 0x51, 0x54, 0x7F, 0x01, 0x12, 0x45, 0x28, 0x90, 0x83, 0x3F, 0x74, 0x02, 0xF0, 0xFF, 0x12, \r
-0x45, 0x28, 0x90, 0x83, 0x3F, 0xE0, 0x04, 0xF0, 0x11, 0x8D, 0x31, 0xF6, 0x90, 0x00, 0x80, 0xE0, \r
-0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x32, 0x1E, 0x75, 0x20, 0xFF, 0x51, 0x21, 0x51, 0x28, 0x51, \r
-0x2F, 0xE4, 0xFF, 0x02, 0x45, 0xB1, 0x51, 0x1B, 0x51, 0x46, 0x12, 0x71, 0x75, 0x12, 0x4E, 0x37, \r
-0x51, 0x62, 0x51, 0x79, 0x90, 0x83, 0x4C, 0xE0, 0x54, 0x7F, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0xDF, \r
-0xF0, 0x54, 0xF0, 0xF0, 0xE4, 0x90, 0x83, 0x4E, 0xF0, 0x22, 0x22, 0xE4, 0x90, 0x80, 0xF9, 0xF0, \r
-0x22, 0x75, 0xE8, 0x03, 0x75, 0xA8, 0x84, 0x22, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x90, \r
-0x01, 0xE4, 0x74, 0x10, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, \r
-0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x80, 0xF5, 0xF0, 0xA3, 0xF0, 0x90, 0x80, 0x5D, \r
-0xF0, 0xA3, 0xF0, 0x22, 0xE4, 0x90, 0x80, 0x01, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0x22, 0x90, 0x83, 0x40, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xFB, 0xF0, 0xA3, \r
-0x74, 0x0A, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x83, 0x44, 0xE0, 0x54, 0xFE, 0xF0, \r
-0xA3, 0x74, 0x08, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xE4, 0x90, 0x83, 0x48, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0x90, 0x83, 0x44, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x83, 0x47, 0xF0, 0x90, 0x83, 0x4B, \r
-0xF0, 0x22, 0x51, 0x79, 0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x83, 0x44, 0xE0, 0x54, \r
-0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x2C, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x90, \r
-0x83, 0x45, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0x90, 0x83, 0x46, 0xF0, 0x12, 0x1F, 0xA4, \r
-0x54, 0x04, 0xFF, 0x90, 0x83, 0x44, 0xE0, 0x54, 0xFB, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, \r
-0xBD, 0x90, 0x83, 0x47, 0xF0, 0x22, 0x90, 0x83, 0x5E, 0x12, 0x42, 0x3A, 0x90, 0x83, 0x5D, 0xEF, \r
-0xF0, 0x12, 0x42, 0x43, 0x5B, 0x28, 0x00, 0x5B, 0x31, 0x01, 0x5B, 0x39, 0x02, 0x5B, 0x42, 0x03, \r
-0x5B, 0x4A, 0x04, 0x5B, 0x52, 0x14, 0x5B, 0x5A, 0x20, 0x5B, 0x62, 0x21, 0x5B, 0x6B, 0x23, 0x5B, \r
-0x73, 0x25, 0x5B, 0x83, 0x80, 0x5B, 0x7B, 0x81, 0x5B, 0x8C, 0x82, 0x5B, 0x94, 0x83, 0x5B, 0x9D, \r
-0x84, 0x5B, 0xA6, 0x88, 0x00, 0x00, 0x5B, 0xAE, 0x90, 0x83, 0x5E, 0x12, 0x42, 0x31, 0x02, 0x65, \r
-0x58, 0x90, 0x83, 0x5E, 0x12, 0x42, 0x31, 0x81, 0x22, 0x90, 0x83, 0x5E, 0x12, 0x42, 0x31, 0x02, \r
-0x65, 0xA4, 0x90, 0x83, 0x5E, 0x12, 0x42, 0x31, 0xE1, 0xB3, 0x90, 0x83, 0x5E, 0x12, 0x42, 0x31, \r
-0x41, 0xA2, 0x90, 0x83, 0x5E, 0x12, 0x42, 0x31, 0xE1, 0x37, 0x90, 0x83, 0x5E, 0x12, 0x42, 0x31, \r
-0xA1, 0xF5, 0x90, 0x83, 0x5E, 0x12, 0x42, 0x31, 0x02, 0x65, 0xE7, 0x90, 0x83, 0x5E, 0x12, 0x42, \r
-0x31, 0xE1, 0x27, 0x90, 0x83, 0x5E, 0x12, 0x42, 0x31, 0xE1, 0x2F, 0x90, 0x83, 0x5E, 0x12, 0x42, \r
-0x31, 0x81, 0xA1, 0x90, 0x83, 0x5E, 0x12, 0x42, 0x31, 0x02, 0x79, 0xA8, 0x90, 0x83, 0x5E, 0x12, \r
-0x42, 0x31, 0xE1, 0x7B, 0x90, 0x83, 0x5E, 0x12, 0x42, 0x31, 0x02, 0x7B, 0x0A, 0x90, 0x83, 0x5E, \r
-0x12, 0x42, 0x31, 0x02, 0x7B, 0x6C, 0x90, 0x83, 0x5E, 0x12, 0x42, 0x31, 0xE1, 0x46, 0x90, 0x01, \r
-0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x83, 0x5D, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x80, 0x5E, 0xE0, 0xFF, 0x90, 0x80, 0x5D, 0xE0, 0xB5, 0x07, \r
-0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x43, 0x90, 0x80, 0x5D, 0xE0, 0xFE, 0x75, \r
-0xF0, 0x08, 0x90, 0x80, 0x0D, 0x12, 0x42, 0x25, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, \r
-0x0E, 0xF9, 0x74, 0x80, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x51, 0xE6, 0x90, 0x80, 0x5D, \r
-0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, \r
-0x80, 0x5D, 0xF0, 0x12, 0x66, 0x2B, 0x90, 0x80, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, \r
-0xAF, 0x22, 0x8B, 0x1A, 0x8A, 0x1B, 0x89, 0x1C, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0xFF, 0xF5, \r
-0x1E, 0x12, 0x1F, 0xA4, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, \r
-0xF5, 0x1F, 0x80, 0x02, 0x8F, 0x1F, 0x85, 0x1E, 0x1D, 0xE5, 0x1D, 0xD3, 0x95, 0x1F, 0x50, 0x33, \r
-0xAB, 0x1A, 0xAA, 0x1B, 0xA9, 0x1C, 0x12, 0x1F, 0xA4, 0x54, 0x01, 0xFF, 0x74, 0xF9, 0x25, 0x1D, \r
-0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0xF9, 0x25, 0x1D, 0xF5, 0x82, 0xE4, \r
-0x34, 0x80, 0xF5, 0x83, 0xE0, 0xAF, 0x1D, 0x70, 0x04, 0xF1, 0x26, 0x80, 0x02, 0xF1, 0x25, 0x05, \r
-0x1D, 0x80, 0xC6, 0xE5, 0x1E, 0x70, 0x19, 0x90, 0x80, 0xF9, 0xE0, 0x70, 0x13, 0x12, 0x4E, 0x98, \r
-0x12, 0x4F, 0x1F, 0x90, 0x81, 0x3A, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, \r
-0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x01, 0xFE, 0x90, \r
-0x81, 0x7D, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, \r
-0xFF, 0xF0, 0x12, 0x1F, 0xA4, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x81, \r
-0x7D, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, 0x1F, 0xA4, 0xFE, \r
-0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x81, 0x7D, 0xF0, 0xEE, 0x54, 0x20, 0xFE, \r
-0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12, 0x1F, 0xA4, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, \r
-0x4D, 0xFF, 0x90, 0x81, 0x7D, 0xF0, 0xEE, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0xF0, 0x90, \r
-0x00, 0x02, 0x12, 0x1F, 0xBD, 0x54, 0x01, 0xFF, 0x90, 0x81, 0x7F, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, \r
-0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, \r
-0x90, 0x80, 0xF7, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x81, 0x7D, 0xE0, 0xC3, 0x13, 0x54, 0x01, 0xFF, \r
-0xB1, 0x51, 0x90, 0x81, 0x7D, 0xE0, 0x54, 0x01, 0xFF, 0x12, 0x4D, 0xBA, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0xEF, 0x60, 0x07, 0x90, 0x83, 0x31, 0xE0, 0xFF, 0xB1, 0x5C, 0x22, 0xF1, 0x67, 0x90, 0x83, \r
-0xEE, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x83, 0xEE, 0x12, 0x56, 0xFD, 0x90, 0x83, 0xF0, 0xEF, \r
-0xF0, 0x90, 0x83, 0xEE, 0xA3, 0xE0, 0x24, 0x30, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x13, 0x01, 0xF5, \r
-0x14, 0x89, 0x15, 0x75, 0x16, 0x06, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0x9C, 0x12, 0x2B, 0xED, 0x90, \r
-0x83, 0xEE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x36, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x13, \r
-0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, 0x04, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xA2, 0x12, 0x2B, \r
-0xED, 0x90, 0x83, 0xEE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x3A, 0xF9, 0xE4, 0x34, 0xFC, \r
-0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, 0x06, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xA6, \r
-0x12, 0x2B, 0xED, 0x90, 0x83, 0xEE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x40, 0xF9, 0xE4, \r
-0x34, 0xFC, 0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, 0x04, 0x7B, 0x01, 0x7A, 0x81, \r
-0x79, 0xAC, 0x02, 0x2B, 0xED, 0x90, 0x83, 0x61, 0x12, 0x42, 0x3A, 0x12, 0x1F, 0xA4, 0xFF, 0x54, \r
-0x7F, 0x90, 0x81, 0x3E, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90, 0x00, \r
-0x01, 0x12, 0x1F, 0xBD, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x81, 0x3C, 0xE0, 0x54, \r
-0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0xBD, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0x81, \r
-0x3A, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x81, 0x3C, \r
-0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0x90, 0x81, 0x3D, 0xF0, 0x90, \r
-0x00, 0x06, 0x12, 0x1F, 0xBD, 0x30, 0xE0, 0x5E, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, \r
-0x90, 0x81, 0x50, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x2E, 0x74, 0x03, 0xF0, 0x90, 0x83, 0x61, 0x12, \r
-0x42, 0x31, 0xE9, 0x24, 0x06, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x1F, 0xA4, 0xFF, 0x74, 0x03, 0x24, \r
-0xFD, 0xFE, 0xEF, 0xC4, 0x54, 0x0F, 0xFD, 0xEF, 0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F, 0xFE, \r
-0xC4, 0x54, 0xF0, 0x4F, 0x12, 0x1F, 0xEA, 0x90, 0x83, 0x61, 0x12, 0x42, 0x31, 0x90, 0x00, 0x06, \r
-0x12, 0x1F, 0xBD, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x81, 0x46, 0x50, 0x05, 0x74, \r
-0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x90, 0x83, 0x61, 0x12, 0x42, 0x31, 0x90, 0x00, 0x04, 0x12, \r
-0x1F, 0xBD, 0xFD, 0x7F, 0x02, 0x12, 0x4B, 0x33, 0x90, 0x83, 0x61, 0x12, 0x42, 0x31, 0xD1, 0xF5, \r
-0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0xF0, 0x90, 0x81, 0x3E, 0xE0, 0x90, 0x01, \r
-0xBA, 0xF0, 0x90, 0x81, 0x40, 0xE0, 0x90, 0x01, 0xBB, 0xF0, 0x90, 0x81, 0x3C, 0xE0, 0x54, 0x0F, \r
-0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0x83, 0x64, 0x12, 0x42, 0x3A, 0xF1, 0x56, 0x90, 0x81, 0x3E, \r
-0xE0, 0xFF, 0x12, 0x4F, 0x31, 0x90, 0x81, 0x3E, 0xE0, 0x60, 0x19, 0x90, 0x83, 0x64, 0x12, 0x42, \r
-0x31, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x54, 0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, \r
-0xFD, 0x12, 0x73, 0x1E, 0x22, 0x22, 0x22, 0x12, 0x1F, 0xA4, 0x90, 0x81, 0x48, 0xF0, 0x22, 0x12, \r
-0x1F, 0xA4, 0x90, 0x81, 0x7C, 0xF0, 0x22, 0x12, 0x1F, 0xA4, 0x54, 0x01, 0xFF, 0x90, 0x83, 0x51, \r
-0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x12, 0x1F, 0xA4, 0xFE, 0xEF, \r
-0x2E, 0x90, 0x83, 0x3E, 0xF0, 0x22, 0x90, 0x81, 0x3A, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x81, \r
-0x47, 0xF0, 0x90, 0x81, 0x42, 0xF0, 0x22, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, \r
-0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0x90, 0x02, 0x09, 0xE0, 0x90, \r
-0x83, 0x61, 0xF0, 0x12, 0x1F, 0xA4, 0x90, 0x83, 0x2E, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, \r
-0x90, 0x83, 0x2F, 0xF0, 0x22, 0xF1, 0x67, 0x7E, 0x00, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, \r
-0x75, 0x13, 0x01, 0xF5, 0x14, 0x89, 0x15, 0x75, 0x16, 0x08, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x48, \r
-0x02, 0x2B, 0xED, 0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x83, 0x40, 0xE0, 0x54, 0xFE, \r
-0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xF0, 0x12, 0x1F, 0xA4, 0xC3, \r
-0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x90, 0x83, 0x41, 0xF0, 0x22, 0xE4, \r
-0x90, 0x83, 0x58, 0xF0, 0x90, 0x83, 0x58, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xDF, 0x90, 0x01, 0xC4, \r
-0xF0, 0x74, 0x5F, 0xA3, 0xF0, 0x90, 0x81, 0x3E, 0xE0, 0x60, 0x0F, 0x90, 0x81, 0x41, 0xE0, 0xFF, \r
-0x90, 0x81, 0x40, 0xE0, 0x6F, 0x60, 0x03, 0x12, 0x51, 0x9D, 0xC2, 0xAF, 0x31, 0x1C, 0xBF, 0x01, \r
-0x02, 0x11, 0x1C, 0xD2, 0xAF, 0x11, 0xFE, 0x12, 0x44, 0x60, 0x80, 0xC8, 0x90, 0x81, 0x3A, 0xE0, \r
-0x30, 0xE0, 0x02, 0x11, 0x26, 0x22, 0x90, 0x81, 0x41, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x0D, \r
-0x31, 0x4D, 0xBF, 0x01, 0x08, 0x11, 0x3E, 0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, 0x22, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x11, 0xB9, 0x11, 0x4E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x11, 0xFF, \r
-0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x32, 0x1E, 0xE4, 0xFF, 0x90, 0x83, \r
-0x59, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, \r
-0x02, 0x7F, 0x01, 0x90, 0x83, 0x59, 0xE0, 0x6F, 0x60, 0x3E, 0xC3, 0x90, 0x83, 0x5B, 0xE0, 0x94, \r
-0x88, 0x90, 0x83, 0x5A, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, \r
-0x22, 0x90, 0x83, 0x5A, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x41, 0xF6, 0x7F, 0x14, 0x7E, 0x00, 0x12, \r
-0x32, 0xAA, 0xD3, 0x90, 0x83, 0x5B, 0xE0, 0x94, 0x32, 0x90, 0x83, 0x5A, 0xE0, 0x94, 0x00, 0x40, \r
-0xB7, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB0, 0x22, 0x90, 0x81, 0x48, 0xE0, 0xFD, 0x7F, 0x93, \r
-0x12, 0x32, 0x1E, 0x90, 0x81, 0x3F, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, \r
-0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x90, 0x00, 0x08, 0xE0, 0x44, \r
-0x10, 0xFD, 0x7F, 0x08, 0x12, 0x32, 0x1E, 0x7F, 0x01, 0x11, 0x5E, 0x90, 0x00, 0x90, 0xE0, 0x44, \r
-0x01, 0xFD, 0x7F, 0x90, 0x12, 0x32, 0x1E, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x32, 0xAA, 0x22, 0x90, \r
-0x01, 0xC4, 0x74, 0xFF, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x90, 0x00, 0x90, 0xE0, 0x20, 0xE0, 0xF9, \r
-0x74, 0xFF, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, \r
-0xC4, 0x74, 0x1C, 0xF0, 0x74, 0x61, 0xA3, 0xF0, 0x90, 0x83, 0x3F, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, \r
-0x50, 0x18, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x0B, 0x90, 0x01, 0xB8, 0x74, \r
-0x08, 0xF0, 0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xDE, 0x7F, 0x01, 0x22, 0x90, 0x02, 0x87, \r
-0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x49, 0x90, 0x81, 0x7D, 0xE0, 0x30, \r
-0xE0, 0x0E, 0x90, 0x02, 0x82, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x34, \r
-0x90, 0x81, 0x85, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x25, 0x90, \r
-0x02, 0x86, 0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x16, 0x90, 0x04, \r
-0x1D, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x40, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, \r
-0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x7F, 0x00, 0x22, 0xE4, 0xFB, 0xFA, \r
-0xFD, 0x7F, 0x01, 0x12, 0x46, 0x61, 0x90, 0x83, 0x5C, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x80, 0x01, \r
-0xE0, 0xFF, 0x60, 0xE9, 0xC2, 0xAF, 0x30, 0xE1, 0x06, 0x54, 0xFD, 0xF0, 0x12, 0x5B, 0xBE, 0xD2, \r
-0xAF, 0xC2, 0xAF, 0x90, 0x80, 0x01, 0xE0, 0xFF, 0x30, 0xE2, 0x05, 0x54, 0xFB, 0xF0, 0x31, 0xFB, \r
-0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x80, 0x01, 0xE0, 0xFF, 0x30, 0xE4, 0x0B, 0x54, 0xEF, 0xF0, 0x51, \r
-0xB6, 0xBF, 0x01, 0x03, 0x12, 0x53, 0xD8, 0xD2, 0xAF, 0x80, 0xC2, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
-0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x80, 0xF6, 0xE0, 0xFE, 0x90, 0x80, 0xF5, 0xE0, 0xFD, 0xB5, 0x06, \r
-0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x32, 0x90, 0x01, 0xAF, 0xE0, \r
-0x70, 0x13, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x5F, 0xF9, 0x74, 0x80, 0x35, 0xF0, 0xFA, 0x7B, \r
-0x01, 0x51, 0x53, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, 0x80, 0xF5, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, \r
-0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x80, 0xF5, 0xF0, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x83, 0x5D, 0x12, 0x42, 0x3A, \r
-0x90, 0x83, 0xF2, 0xE0, 0xFF, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x1F, 0xFC, 0x7F, 0xAF, \r
-0x7E, 0x01, 0x51, 0xF3, 0xEF, 0x60, 0x3A, 0x90, 0x83, 0x5D, 0x12, 0x42, 0x31, 0x8B, 0x13, 0x8A, \r
-0x14, 0x89, 0x15, 0x90, 0x00, 0x0E, 0x12, 0x1F, 0xBD, 0x24, 0x02, 0xF5, 0x16, 0x7B, 0x01, 0x7A, \r
-0x01, 0x79, 0xA0, 0x12, 0x2B, 0xED, 0x90, 0x83, 0x5D, 0x12, 0x42, 0x31, 0x90, 0x00, 0x0E, 0x12, \r
-0x1F, 0xBD, 0x90, 0x01, 0xAE, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, \r
-0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x83, 0xFB, 0xF0, 0xA3, 0xF0, 0x90, 0x02, 0x86, \r
-0xE0, 0x20, 0xE1, 0x2C, 0xC3, 0x90, 0x83, 0xFC, 0xE0, 0x94, 0xD0, 0x90, 0x83, 0xFB, 0xE0, 0x94, \r
-0x07, 0x40, 0x0A, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x83, 0xFB, \r
-0xE4, 0x75, 0xF0, 0x01, 0x12, 0x41, 0xF6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0x80, 0xCD, \r
-0x7F, 0x01, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x83, 0xDA, 0xEE, 0xF0, 0xA3, \r
-0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x83, 0xDA, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, \r
-0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0x83, 0xDD, 0xE0, 0x94, 0xE8, 0x90, 0x83, 0xDC, 0xE0, \r
-0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, \r
-0x83, 0xDC, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x41, 0xF6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x32, 0xAA, \r
-0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x83, 0x9A, 0xEF, 0xF0, 0xA3, 0xED, \r
-0xF0, 0xA3, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x90, 0x83, 0xA8, 0xF0, 0x7F, 0x24, \r
-0x7E, 0x08, 0x12, 0x2D, 0x5C, 0x90, 0x83, 0xA0, 0x12, 0x20, 0xCE, 0x90, 0x83, 0x9A, 0xE0, 0xFB, \r
-0x70, 0x08, 0x90, 0x83, 0xA0, 0x12, 0x42, 0x19, 0x80, 0x16, 0xEB, 0x75, 0xF0, 0x08, 0xA4, 0x24, \r
-0x62, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x2D, 0x5C, \r
-0x90, 0x83, 0xA4, 0x12, 0x20, 0xCE, 0x90, 0x83, 0x9B, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, \r
-0x17, 0x12, 0x20, 0xBB, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x83, 0xA4, 0x12, \r
-0x42, 0x19, 0xED, 0x54, 0x7F, 0xFD, 0xEC, 0x54, 0x80, 0xFC, 0x12, 0x42, 0x0C, 0xEC, 0x44, 0x80, \r
-0xFC, 0x90, 0x83, 0xA4, 0x12, 0x20, 0xCE, 0x90, 0x83, 0xA0, 0x12, 0x42, 0x19, 0xEC, 0x54, 0x7F, \r
-0xFC, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xCE, 0x7F, 0x24, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x83, \r
-0x9A, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, \r
-0xFE, 0xA3, 0xE0, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x83, 0xA4, 0x12, 0x42, 0x19, 0x90, 0x85, \r
-0xBB, 0x12, 0x20, 0xCE, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x2E, 0xA2, 0x90, 0x83, 0xA0, 0x12, 0x42, \r
-0x19, 0xEC, 0x44, 0x80, 0xFC, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xCE, 0x7F, 0x24, 0x7E, 0x08, 0x12, \r
-0x2E, 0xA2, 0x90, 0x83, 0x9A, 0xE0, 0x70, 0x04, 0x7F, 0x20, 0x80, 0x09, 0x90, 0x83, 0x9A, 0xE0, \r
+0x80, 0x63, 0x90, 0x84, 0x30, 0xE0, 0x24, 0xF8, 0xF0, 0xE0, 0x24, 0x04, 0x51, 0x54, 0x80, 0x02, \r
+0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x43, 0xE0, 0x5F, 0xFD, 0x7F, 0x43, 0x51, 0x4D, \r
+0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xFF, 0x90, 0x00, 0x43, 0xE0, 0x4F, 0xFD, 0x7F, 0x43, 0x12, \r
+0x7A, 0x24, 0x60, 0x19, 0x90, 0x84, 0x30, 0xE0, 0x24, 0x04, 0x51, 0x54, 0x80, 0x02, 0xC3, 0x33, \r
+0xD8, 0xFC, 0xFF, 0x90, 0x00, 0x42, 0xE0, 0x4F, 0xFD, 0x7F, 0x42, 0x80, 0x18, 0x90, 0x84, 0x30, \r
+0xE0, 0x24, 0x04, 0x51, 0x54, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0xFF, 0x90, 0x00, 0x42, \r
+0xE0, 0x5F, 0xFD, 0x7F, 0x42, 0x12, 0x32, 0x1E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x32, 0x1E, \r
+0x90, 0x84, 0x30, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x22, 0xAD, 0x07, 0x90, 0x81, 0xB8, \r
+0xE0, 0x75, 0xF0, 0x40, 0xA4, 0xFF, 0x90, 0x84, 0x23, 0xE5, 0xF0, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, \r
+0xA3, 0xF0, 0x90, 0x81, 0xB9, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x84, 0x26, 0xF0, 0xED, 0x64, \r
+0x01, 0x70, 0x6B, 0x90, 0x84, 0x23, 0xE0, 0x70, 0x02, 0xA3, 0xE0, 0x60, 0x0B, 0x90, 0x84, 0x23, \r
+0x74, 0xFF, 0x75, 0xF0, 0xD0, 0x12, 0x41, 0xF6, 0x51, 0xFA, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, \r
+0x02, 0x7D, 0x01, 0x31, 0x80, 0x51, 0xFA, 0x54, 0x01, 0xFD, 0x31, 0x80, 0x90, 0x81, 0xB9, 0xE0, \r
+0x30, 0xE0, 0x3B, 0x51, 0xEF, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x31, 0x80, \r
+0xE4, 0x90, 0x84, 0x25, 0xF0, 0x90, 0x84, 0x26, 0xE0, 0xFF, 0x90, 0x84, 0x25, 0xE0, 0xC3, 0x9F, \r
+0x50, 0x1C, 0x51, 0xEF, 0x54, 0x01, 0xFD, 0x31, 0x80, 0x51, 0xEF, 0x54, 0x07, 0x7D, 0x00, 0x20, \r
+0xE0, 0x02, 0x7D, 0x01, 0x31, 0x80, 0x90, 0x84, 0x25, 0xE0, 0x04, 0xF0, 0x80, 0xD7, 0x22, 0x90, \r
+0x84, 0x23, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x32, 0xAA, 0x90, 0x81, 0xB7, 0xE0, 0x54, 0x7F, \r
+0xFF, 0x90, 0x81, 0xB6, 0xE0, 0xFE, 0xC4, 0x13, 0x22, 0xF0, 0x90, 0x00, 0x01, 0x02, 0x1F, 0xBD, \r
+0x4D, 0xFF, 0x90, 0x81, 0xB6, 0xF0, 0xEE, 0x22, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, \r
+0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x1F, 0xA4, 0xFE, 0x22, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0xA5, 0x90, 0x81, 0xB3, 0x71, 0x18, 0x54, 0x04, 0xFD, 0xEF, 0x54, \r
+0xFB, 0x71, 0x96, 0xF1, 0xE4, 0x71, 0x26, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x71, 0x96, 0xF1, \r
+0xEC, 0x71, 0x26, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x71, 0x96, 0xF1, 0xF4, 0xB1, 0x87, 0x54, \r
+0x01, 0xFF, 0x90, 0x81, 0xB5, 0xE0, 0x54, 0xFE, 0x4F, 0x71, 0x09, 0x54, 0x01, 0xFF, 0x90, 0x81, \r
+0xB4, 0xE0, 0x54, 0xFE, 0x4F, 0x12, 0x66, 0x3B, 0x12, 0x7A, 0x04, 0x90, 0x81, 0xB3, 0xE0, 0xC3, \r
+0x13, 0x54, 0x01, 0xFF, 0x12, 0x79, 0x98, 0x90, 0x81, 0xB3, 0xE0, 0x54, 0x01, 0xFF, 0x12, 0x5A, \r
+0x3F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x4D, 0xFF, 0x90, 0x81, 0xB3, 0xF0, 0xEE, 0x22, 0x90, 0x83, \r
+0xE2, 0xF1, 0xB0, 0x90, 0x83, 0xE7, 0x71, 0x09, 0x90, 0x83, 0xE8, 0xD1, 0x46, 0x90, 0x83, 0xE9, \r
+0xF1, 0x12, 0x90, 0x83, 0xEA, 0x91, 0x65, 0x90, 0x83, 0xEB, 0xF0, 0x90, 0x00, 0x07, 0x12, 0x1F, \r
+0xBD, 0x90, 0x83, 0xEC, 0xB1, 0xC9, 0x90, 0x83, 0xEF, 0xF0, 0xED, 0x70, 0x19, 0xFF, 0x91, 0x6C, \r
+0xE0, 0xB4, 0xFF, 0x06, 0x91, 0x6C, 0xE4, 0xF0, 0x80, 0x07, 0x91, 0x6C, 0xE0, 0x04, 0xF0, 0x80, \r
+0x05, 0x0F, 0xEF, 0xB4, 0x06, 0xE8, 0x90, 0x83, 0xE6, 0xE0, 0xFF, 0xB4, 0x04, 0x19, 0xA3, 0xE0, \r
+0xFE, 0x91, 0x5F, 0xEE, 0x12, 0x7A, 0x0C, 0xFE, 0x91, 0x5F, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x1F, \r
+0xFC, 0x90, 0x00, 0x02, 0xE4, 0x80, 0x1D, 0xEF, 0xB4, 0x02, 0x1C, 0x90, 0x83, 0xE8, 0x91, 0x5D, \r
+0xEF, 0x12, 0x7A, 0x0C, 0x44, 0x20, 0x54, 0x7F, 0x91, 0x5E, 0x12, 0x6D, 0xC9, 0x90, 0x83, 0xE7, \r
+0xE0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xFC, 0x91, 0x5F, 0xE9, 0x24, 0x03, 0xF1, 0xD5, 0x44, 0x20, \r
+0x12, 0x1F, 0xEA, 0x90, 0x83, 0xE9, 0x91, 0x5D, 0x90, 0x00, 0x04, 0xEF, 0x12, 0x1F, 0xFC, 0x90, \r
+0x83, 0xEA, 0xE0, 0x90, 0x00, 0x05, 0x12, 0x1F, 0xFC, 0x90, 0x83, 0xEB, 0xE0, 0x90, 0x00, 0x06, \r
+0x12, 0x1F, 0xFC, 0x90, 0x83, 0xEC, 0xE0, 0x90, 0x00, 0x07, 0x02, 0x1F, 0xFC, 0xE0, 0xFF, 0x90, \r
+0x83, 0xE2, 0x02, 0x42, 0x31, 0xF0, 0x90, 0x00, 0x06, 0x02, 0x1F, 0xBD, 0x74, 0xE7, 0x2F, 0xF5, \r
+0x82, 0xE4, 0x34, 0x83, 0xF5, 0x83, 0x22, 0x90, 0x83, 0x97, 0x12, 0x42, 0x3A, 0x90, 0x83, 0x96, \r
+0xEF, 0xF0, 0x12, 0x42, 0x43, 0x54, 0xB9, 0x00, 0x54, 0xC1, 0x01, 0x54, 0xCA, 0x02, 0x54, 0xD3, \r
+0x03, 0x54, 0xDB, 0x04, 0x54, 0xE3, 0x14, 0x54, 0xEC, 0x20, 0x54, 0xF4, 0x21, 0x54, 0xFC, 0x23, \r
+0x55, 0x05, 0x25, 0x55, 0x16, 0x80, 0x55, 0x0E, 0x81, 0x55, 0x1E, 0x82, 0x55, 0x27, 0x83, 0x55, \r
+0x2F, 0x84, 0x55, 0x37, 0x88, 0x00, 0x00, 0x55, 0x40, 0x90, 0x83, 0x97, 0x12, 0x42, 0x31, 0xA1, \r
+0x8E, 0x90, 0x83, 0x97, 0x12, 0x42, 0x31, 0x02, 0x59, 0xDF, 0x90, 0x83, 0x97, 0x12, 0x42, 0x31, \r
+0x02, 0x70, 0xA8, 0x90, 0x83, 0x97, 0x12, 0x42, 0x31, 0xE1, 0xB6, 0x90, 0x83, 0x97, 0x12, 0x42, \r
+0x31, 0x80, 0x6D, 0x90, 0x83, 0x97, 0x12, 0x42, 0x31, 0x02, 0x70, 0xE5, 0x90, 0x83, 0x97, 0x12, \r
+0x42, 0x31, 0x01, 0x06, 0x90, 0x83, 0x97, 0x12, 0x42, 0x31, 0xC1, 0x4D, 0x90, 0x83, 0x97, 0x12, \r
+0x42, 0x31, 0x02, 0x70, 0xF4, 0x90, 0x83, 0x97, 0x12, 0x42, 0x31, 0x02, 0x70, 0xFC, 0x90, 0x83, \r
+0x97, 0x12, 0x42, 0x31, 0x61, 0x2D, 0x90, 0x83, 0x97, 0x12, 0x42, 0x31, 0x01, 0xB8, 0x90, 0x83, \r
+0x97, 0x12, 0x42, 0x31, 0x02, 0x79, 0x3E, 0x90, 0x83, 0x97, 0x12, 0x42, 0x31, 0xA1, 0xD0, 0x90, \r
+0x83, 0x97, 0x12, 0x42, 0x31, 0xC1, 0x0B, 0x90, 0x83, 0x97, 0x12, 0x42, 0x31, 0x02, 0x79, 0x54, \r
+0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x83, 0x96, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, \r
+0x90, 0x83, 0x9A, 0x12, 0x42, 0x3A, 0x12, 0x79, 0xA4, 0x11, 0xB2, 0xF1, 0xA5, 0x12, 0x5E, 0x91, \r
+0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x1D, 0x71, 0x0A, 0x90, 0x83, 0x7C, 0xB1, 0x87, 0x90, \r
+0x83, 0x7D, 0xF0, 0x12, 0x1F, 0xA4, 0x54, 0x04, 0xFF, 0x90, 0x83, 0x7B, 0xE0, 0x54, 0xFB, 0xB1, \r
+0xC8, 0x90, 0x83, 0x7E, 0xF0, 0x22, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x02, 0x1F, 0xBD, 0x90, 0x02, \r
+0x09, 0xE0, 0xF5, 0x1A, 0x12, 0x1F, 0xA4, 0x25, 0x1A, 0x90, 0x80, 0x07, 0x71, 0x09, 0x25, 0x1A, \r
+0x90, 0x80, 0x08, 0xB1, 0x87, 0x25, 0x1A, 0x90, 0x80, 0x09, 0xB1, 0xC9, 0x25, 0x1A, 0x90, 0x80, \r
+0x0A, 0xD1, 0x46, 0x25, 0x1A, 0x90, 0x80, 0x0B, 0xF1, 0x12, 0x25, 0x1A, 0x90, 0x80, 0x0C, 0x91, \r
+0x65, 0x25, 0x1A, 0x90, 0x80, 0x0D, 0xF0, 0x22, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x02, 0x1F, 0xBD, \r
+0x12, 0x79, 0xBE, 0x2E, 0x90, 0x83, 0x67, 0x71, 0x09, 0xFF, 0xED, 0x2F, 0x90, 0x83, 0x68, 0xB1, \r
+0x87, 0xFF, 0xED, 0x2F, 0x90, 0x83, 0x69, 0xB1, 0xC9, 0xFF, 0xED, 0x2F, 0x90, 0x83, 0x6A, 0xD1, \r
+0x46, 0xFF, 0xED, 0x2F, 0x90, 0x83, 0x6B, 0xF1, 0x12, 0xFF, 0xED, 0x2F, 0x90, 0x83, 0x6C, 0x91, \r
+0x65, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x83, 0x6D, 0xF0, 0x22, 0x12, 0x79, 0xBE, 0x2E, 0x90, \r
+0x83, 0x6E, 0x71, 0x09, 0xFF, 0xED, 0x2F, 0x90, 0x83, 0x6F, 0xB1, 0x87, 0xFF, 0xED, 0x2F, 0x90, \r
+0x83, 0x70, 0xB1, 0xC9, 0xFF, 0xED, 0x2F, 0x90, 0x83, 0x71, 0xD1, 0x46, 0xFF, 0xED, 0x2F, 0x90, \r
+0x83, 0x72, 0xF1, 0x12, 0xFF, 0xED, 0x2F, 0x90, 0x83, 0x73, 0x91, 0x65, 0xFF, 0xAE, 0x05, 0xED, \r
+0x2F, 0x90, 0x83, 0x74, 0xF0, 0x22, 0xF0, 0x90, 0x00, 0x04, 0x02, 0x1F, 0xBD, 0xB1, 0x88, 0xFF, \r
+0x30, 0xE0, 0x1B, 0x12, 0x1F, 0xA4, 0x90, 0x81, 0xAC, 0x71, 0x09, 0x90, 0x81, 0xAD, 0xF0, 0xEF, \r
+0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0xB1, 0xC8, 0x90, 0x81, 0xAF, 0xF0, 0x22, 0x90, 0x81, \r
+0xAC, 0x74, 0x05, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x1E, 0xF0, 0xA3, \r
+0x74, 0x05, 0xF0, 0x22, 0x90, 0x84, 0x0B, 0xED, 0xF0, 0x90, 0x84, 0x08, 0x12, 0x42, 0x3A, 0xE4, \r
+0x90, 0x84, 0x0C, 0xF0, 0xA3, 0xF0, 0x12, 0x1F, 0xA4, 0xFF, 0x71, 0x0A, 0xFD, 0xD1, 0x47, 0xFB, \r
+0x12, 0x79, 0x1E, 0x90, 0x84, 0x0C, 0xEF, 0xF0, 0x90, 0x84, 0x08, 0x12, 0x42, 0x31, 0xD1, 0x47, \r
+0xFF, 0x12, 0x78, 0xB9, 0x90, 0x84, 0x0D, 0xEF, 0xF0, 0x90, 0x82, 0x88, 0xE0, 0x24, 0xFE, 0x60, \r
+0x15, 0x24, 0xFE, 0x60, 0x11, 0x14, 0x60, 0x07, 0x14, 0x60, 0x04, 0x24, 0x05, 0x70, 0x42, 0x12, \r
+0x79, 0xD8, 0xF1, 0x42, 0x80, 0x0D, 0x12, 0x79, 0xD8, 0x90, 0x82, 0x88, 0xE0, 0x90, 0x83, 0xE6, \r
+0xF0, 0x71, 0x9E, 0x90, 0x84, 0x0D, 0xE0, 0xFF, 0x90, 0x84, 0x08, 0x12, 0x42, 0x31, 0x90, 0x84, \r
+0x0C, 0xE0, 0x7C, 0x00, 0x29, 0xF9, 0xEC, 0x3A, 0xFA, 0xC3, 0xE9, 0x9F, 0xF9, 0xEA, 0x94, 0x00, \r
+0xFA, 0x75, 0x13, 0x01, 0x75, 0x14, 0x82, 0x75, 0x15, 0x7F, 0xA3, 0xE0, 0xF5, 0x16, 0x12, 0x2B, \r
+0xED, 0x22, 0xF0, 0x90, 0x00, 0x05, 0x02, 0x1F, 0xBD, 0x90, 0x83, 0x9D, 0x12, 0x42, 0x3A, 0x12, \r
+0x58, 0x9D, 0x90, 0x81, 0x08, 0xE0, 0xFF, 0x12, 0x59, 0x17, 0x90, 0x81, 0x08, 0xE0, 0x60, 0x11, \r
+0x90, 0x83, 0x9D, 0x12, 0x42, 0x31, 0x71, 0x0A, 0x54, 0x0F, 0xFF, 0xB1, 0x88, 0xFD, 0x12, 0x77, \r
+0xA9, 0x22, 0x90, 0x83, 0xFD, 0xED, 0xF0, 0x90, 0x83, 0xFA, 0x12, 0x42, 0x3A, 0xB1, 0xCA, 0x90, \r
+0x84, 0x01, 0xF0, 0x90, 0x83, 0xFA, 0x12, 0x4F, 0xEA, 0x75, 0x16, 0x03, 0x7B, 0x01, 0x7A, 0x83, \r
+0x79, 0xFE, 0x12, 0x2B, 0xED, 0x90, 0x83, 0xFD, 0xE0, 0x70, 0x2E, 0xFF, 0xF1, 0x9A, 0xE0, 0xB4, \r
+0xFF, 0x06, 0xF1, 0x9A, 0xE4, 0xF0, 0x80, 0x07, 0xF1, 0x9A, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0x0F, \r
+0xEF, 0xB4, 0x03, 0xE8, 0x75, 0x13, 0x01, 0x75, 0x14, 0x83, 0x75, 0x15, 0xFE, 0x75, 0x16, 0x03, \r
+0x90, 0x83, 0xFA, 0x12, 0x42, 0x31, 0x12, 0x2B, 0xED, 0x22, 0x74, 0xFE, 0x2F, 0xF5, 0x82, 0xE4, \r
+0x34, 0x83, 0xF5, 0x83, 0x22, 0x12, 0x1F, 0xA4, 0xFF, 0x54, 0x01, 0xFE, 0x22, 0x90, 0x83, 0x9A, \r
+0x12, 0x42, 0x3A, 0x02, 0x1F, 0xA4, 0xF1, 0xA5, 0x90, 0x83, 0x77, 0x12, 0x79, 0xFC, 0x54, 0x04, \r
+0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xF0, 0x12, 0x1F, 0xA4, 0xC3, 0x13, 0x30, 0xE0, 0x06, 0x71, 0x0A, \r
+0x90, 0x83, 0x78, 0xF0, 0x22, 0xF9, 0xE4, 0x3A, 0xFA, 0x02, 0x1F, 0xA4, 0xF0, 0x90, 0x81, 0x06, \r
+0xE0, 0x54, 0x0F, 0x22, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0x22, 0x54, 0x20, 0xFE, 0xEF, \r
+0x54, 0xDF, 0x4E, 0x22, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 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
+0x57, 0xA3, 0xF0, 0x12, 0x72, 0x0F, 0xE5, 0x49, 0x30, 0xE1, 0x02, 0x11, 0x81, 0xE5, 0x49, 0x30, \r
+0xE2, 0x02, 0x31, 0x70, 0xE5, 0x4A, 0x30, 0xE0, 0x03, 0x12, 0x6E, 0xC7, 0xE5, 0x4C, 0x30, 0xE1, \r
+0x05, 0x7F, 0x04, 0x12, 0x6D, 0xBA, 0xE5, 0x4C, 0x30, 0xE4, 0x02, 0x11, 0x8A, 0xE5, 0x4C, 0x30, \r
+0xE5, 0x02, 0xB1, 0xA6, 0xE5, 0x4C, 0x30, 0xE6, 0x02, 0xD1, 0x13, 0x74, 0xFC, 0x04, 0x90, 0x01, \r
+0xC4, 0xF0, 0x74, 0x57, 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, 0x90, 0x81, 0x08, 0xE0, 0x60, 0x02, 0x91, 0xF0, 0x22, 0x12, 0x74, 0xF7, 0x7D, 0x02, 0x7F, \r
+0x02, 0x74, 0x3D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x80, 0x34, 0x90, 0x81, 0x04, \r
+0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x81, 0x11, 0xF0, 0xA3, 0xF0, 0x90, 0x81, 0x0C, 0xF0, 0x90, \r
+0x81, 0x05, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x7D, 0x01, 0x7F, 0x02, 0x11, 0x91, 0x7D, \r
+0x02, 0x7F, 0x02, 0x11, 0x91, 0x7D, 0x10, 0x7F, 0x03, 0x74, 0x45, 0xB1, 0x8B, 0xFE, 0xF6, 0x74, \r
+0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, \r
+0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0x11, 0x91, 0x7D, 0x02, 0x7F, 0x03, 0x11, \r
+0x91, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0x12, 0x76, 0x62, 0xF0, 0xE4, 0xFF, 0x12, 0x4C, 0x65, \r
+0xBF, 0x01, 0x10, 0xB1, 0x57, 0x90, 0x81, 0x0B, 0xE0, 0x20, 0xE2, 0x0A, 0x7D, 0x01, 0x7F, 0x04, \r
+0x02, 0x49, 0x0F, 0x12, 0x76, 0x49, 0x22, 0xEF, 0x70, 0x2F, 0x7D, 0x78, 0x7F, 0x02, 0x31, 0x4F, \r
+0x7D, 0x02, 0x7F, 0x03, 0x31, 0x4F, 0x7D, 0xC8, 0x7F, 0x02, 0x11, 0xC9, 0x12, 0x76, 0x6C, 0x12, \r
+0x4C, 0x5E, 0x70, 0x0A, 0x31, 0x59, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01, \r
+0x7F, 0x0C, 0x12, 0x49, 0x0F, 0x31, 0x5D, 0xE1, 0xDE, 0x80, 0x91, 0x7D, 0x02, 0x7F, 0x02, 0x74, \r
+0x3D, 0xB1, 0x8B, 0xFE, 0xF6, 0x74, 0x30, 0x01, 0xD1, 0x31, 0x85, 0x31, 0x65, 0x90, 0x81, 0x04, \r
+0xE0, 0x54, 0xF7, 0xF0, 0x22, 0xF1, 0xD6, 0x51, 0xCD, 0x7D, 0x0C, 0x7F, 0x01, 0x02, 0x4B, 0x2A, \r
+0x90, 0x81, 0x08, 0xE0, 0x60, 0x0E, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x03, 0x02, 0x70, 0x4E, \r
+0x31, 0x5D, 0xB1, 0x9C, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0x01, 0xE0, \r
+0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, \r
+0x06, 0xB4, 0x74, 0x86, 0xF0, 0xB1, 0x93, 0x54, 0x7F, 0xFC, 0x90, 0x84, 0x1B, 0x12, 0x20, 0xCE, \r
+0x90, 0x84, 0x1B, 0x71, 0x64, 0x7F, 0x7C, 0x51, 0xD5, 0x12, 0x20, 0xDA, 0xCC, 0xC0, 0x00, 0xC0, \r
+0x51, 0xD3, 0x12, 0x20, 0xDA, 0x00, 0xC0, 0x00, 0x14, 0xB1, 0x84, 0x90, 0x84, 0x04, 0x12, 0x20, \r
+0xDA, 0x00, 0x03, 0x3E, 0x60, 0xE4, 0xFD, 0xFF, 0x91, 0x78, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8B, \r
+0x1A, 0x8A, 0x1B, 0x89, 0x1C, 0x12, 0x53, 0x0A, 0xFF, 0xF5, 0x1E, 0x12, 0x1F, 0xA4, 0xFE, 0xC3, \r
+0x13, 0x30, 0xE0, 0x07, 0x12, 0x55, 0x88, 0xF5, 0x1F, 0x80, 0x02, 0x8F, 0x1F, 0x85, 0x1E, 0x1D, \r
+0xE5, 0x1D, 0xD3, 0x95, 0x1F, 0x50, 0x24, 0xAB, 0x1A, 0xAA, 0x1B, 0xA9, 0x1C, 0x12, 0x1F, 0xA4, \r
+0x54, 0x01, 0xFD, 0xAF, 0x1D, 0xF1, 0x46, 0xAF, 0x1D, 0x12, 0x4C, 0x65, 0xEF, 0xAF, 0x1D, 0x70, \r
+0x04, 0xF1, 0xC6, 0x80, 0x02, 0xF1, 0xC5, 0x05, 0x1D, 0x80, 0xD5, 0xE5, 0x1E, 0x70, 0x0F, 0xFF, \r
+0x12, 0x4C, 0x65, 0xEF, 0x70, 0x08, 0x31, 0x59, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0xEF, \r
+0x60, 0x41, 0x90, 0x04, 0xEC, 0xE0, 0x54, 0xDD, 0xF0, 0x90, 0x83, 0x67, 0xE0, 0xFF, 0x60, 0x03, \r
+0x12, 0x78, 0x63, 0x90, 0x01, 0xC7, 0xE4, 0x12, 0x66, 0x3B, 0x12, 0x7A, 0x04, 0x90, 0x06, 0x09, \r
+0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x35, 0x71, 0x03, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0xD1, \r
+0x98, 0xF1, 0xC7, 0x51, 0xCB, 0x12, 0x79, 0x64, 0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0xFD, 0xE4, \r
+0xFF, 0x01, 0x91, 0x90, 0x04, 0xEC, 0xE0, 0x44, 0x22, 0xF0, 0x7D, 0x08, 0xE4, 0xFF, 0x31, 0x4F, \r
+0x90, 0x06, 0x90, 0xE0, 0x54, 0xF0, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x54, 0xFB, 0xF0, 0x51, 0xDE, \r
+0xF1, 0xC8, 0x7E, 0x00, 0x7F, 0x20, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xB3, 0x12, 0x44, \r
+0x13, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x20, 0xF0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, \r
+0xFD, 0x7F, 0x8F, 0x12, 0x32, 0x1E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x31, 0x85, 0xE4, 0xFD, 0xFF, \r
+0x02, 0x4B, 0x1B, 0x7F, 0x8C, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x85, 0xBB, 0x22, 0x51, 0xB8, \r
+0xF1, 0xA5, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x80, 0x06, 0xE0, 0xFF, 0xB4, 0x01, 0x07, \r
+0x90, 0xFD, 0x00, 0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, 0x54, \r
+0xFB, 0xF0, 0x22, 0x7F, 0xFF, 0x12, 0x4B, 0x1B, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, \r
+0x6F, 0x83, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xDA, 0xCC, 0xF0, 0x00, 0xC0, 0x51, 0xD3, 0x12, 0x20, \r
+0xDA, 0x00, 0x00, 0x00, 0x14, 0xB1, 0x84, 0x90, 0x84, 0x04, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, \r
+0x00, 0xE4, 0xFD, 0xFF, 0x91, 0x78, 0xB1, 0x93, 0x44, 0x80, 0xFC, 0x90, 0x84, 0x1F, 0x12, 0x20, \r
+0xCE, 0x90, 0x84, 0x1F, 0x71, 0x64, 0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2E, 0xA2, 0x90, 0x01, 0x00, \r
+0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0x12, 0x42, 0x19, 0x90, 0x85, 0xBB, 0x02, 0x20, 0xCE, 0x90, 0x83, 0xD3, \r
+0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x90, 0x83, \r
+0xE1, 0xF0, 0x7F, 0x24, 0x7E, 0x08, 0x12, 0x2D, 0x5C, 0x90, 0x83, 0xD9, 0x12, 0x20, 0xCE, 0x90, \r
+0x83, 0xD3, 0xE0, 0xFB, 0x70, 0x04, 0x91, 0x54, 0x80, 0x07, 0xEB, 0x91, 0x5A, 0xFF, 0x12, 0x2D, \r
+0x5C, 0x90, 0x83, 0xDD, 0x12, 0x20, 0xCE, 0x90, 0x83, 0xD4, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, \r
+0x78, 0x17, 0xF1, 0x0B, 0x90, 0x83, 0xDD, 0x12, 0x42, 0x19, 0xED, 0x54, 0x7F, 0xFD, 0xEC, 0x54, \r
+0x80, 0xFC, 0x12, 0x42, 0x0C, 0xEC, 0x44, 0x80, 0xFC, 0x90, 0x83, 0xDD, 0x12, 0x20, 0xCE, 0x91, \r
+0x54, 0xEC, 0x54, 0x7F, 0xFC, 0x71, 0x67, 0x91, 0x6C, 0x91, 0x5A, 0xFF, 0xC0, 0x06, 0xC0, 0x07, \r
+0x90, 0x83, 0xDD, 0x71, 0x64, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x2E, 0xA2, 0x91, 0x54, 0xEC, 0x44, \r
+0x80, 0xFC, 0x71, 0x67, 0x91, 0x6C, 0x70, 0x04, 0x7F, 0x20, 0x80, 0x09, 0x90, 0x83, 0xD3, 0xE0, \r
 0xB4, 0x01, 0x16, 0x7F, 0x28, 0x7E, 0x08, 0x12, 0x2D, 0x5C, 0x78, 0x08, 0x12, 0x20, 0xA8, 0xEF, \r
-0x54, 0x01, 0xFF, 0xE4, 0x90, 0x83, 0xA8, 0xEF, 0xF0, 0x90, 0x83, 0xA8, 0xE0, 0x90, 0x83, 0x9A\r
+0x54, 0x01, 0xFF, 0xE4, 0x90, 0x83, 0xE1, 0xEF, 0xF0, 0x90, 0x83, 0xE1, 0xE0, 0x90, 0x83, 0xD3\r
 0x60, 0x0E, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0x80, 0x0C, \r
-0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, \r
-0xA3, 0xE0, 0xFF, 0x12, 0x2D, 0x5C, 0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x90, 0x83, 0x9C, 0x12, \r
-0x20, 0xCE, 0x90, 0x83, 0x9C, 0x02, 0x42, 0x19, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x71, \r
-0x49, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x83, 0xB7, 0xEF, 0xF0, 0xAB, 0x05, 0x90, 0x83, 0xBD, \r
-0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x03, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x14, 0x12, \r
-0x20, 0xBB, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x83, 0xB9, 0x12, 0x42, 0x19, \r
-0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x12, 0x42, 0x0C, 0xEC, 0x54, 0x0F, 0xFC, 0x90, 0x83, 0xBD, \r
-0x12, 0x20, 0xCE, 0x90, 0x83, 0xB7, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x60, 0xF5, 0x82, 0xE4, \r
-0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x83, 0xBD, \r
-0x12, 0x42, 0x19, 0x90, 0x85, 0xBB, 0x12, 0x20, 0xCE, 0xD0, 0x07, 0xD0, 0x06, 0x02, 0x2E, 0xA2, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, 0x07, 0xC0, 0x05, 0x90, 0x83, 0xCB, 0x12, 0x42, \r
-0x19, 0x90, 0x83, 0xB9, 0x12, 0x20, 0xCE, 0xD0, 0x05, 0xD0, 0x07, 0x91, 0x96, 0xD0, 0xD0, 0x92, \r
-0xAF, 0x22, 0x90, 0x83, 0xFD, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x46, 0x3A, 0x90, 0x80, 0x01, 0xE0, \r
-0xFF, 0x90, 0x83, 0xFD, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x80, 0x01, 0xF0, 0x22, 0x90, 0x83, 0xFE, \r
-0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x46, 0x3A, 0x90, 0x80, 0x02, 0xE0, 0xFF, 0x90, 0x83, 0xFE, 0xE0, \r
-0xFE, 0xEF, 0x4E, 0x90, 0x80, 0x02, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x1A, 0x12, 0x1F, \r
-0xA4, 0x25, 0x1A, 0x90, 0x80, 0x07, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x25, 0x1A, 0x90, \r
-0x80, 0x08, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0x25, 0x1A, 0x90, 0x80, 0x09, 0xF0, 0x90, \r
-0x00, 0x03, 0x12, 0x1F, 0xBD, 0x25, 0x1A, 0x90, 0x80, 0x0A, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, \r
-0xBD, 0x25, 0x1A, 0x90, 0x80, 0x0B, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x1F, 0xBD, 0x25, 0x1A, 0x90, \r
-0x80, 0x0C, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x1A, 0x8A, 0x1B, 0x89, \r
-0x1C, 0x12, 0x1F, 0xA4, 0xFF, 0x90, 0x81, 0x39, 0xF0, 0xBF, 0x01, 0x10, 0x90, 0x00, 0x01, 0x12, \r
-0x1F, 0xBD, 0x64, 0x01, 0x60, 0x1C, 0x7D, 0x13, 0x7F, 0x6F, 0x80, 0x13, 0xAB, 0x1A, 0xAA, 0x1B, \r
-0xA9, 0x1C, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x64, 0x01, 0x60, 0x06, 0xE4, 0xFD, 0xFF, 0x12, \r
-0x4A, 0xED, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0xFF, 0x30, 0xE0, \r
-0x26, 0x12, 0x1F, 0xA4, 0x90, 0x81, 0x76, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x90, 0x81, \r
-0x77, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, \r
-0x1F, 0xBD, 0x90, 0x81, 0x79, 0xF0, 0x22, 0x90, 0x81, 0x76, 0x74, 0x05, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, \r
-0x0F, 0x90, 0x83, 0xF3, 0xF0, 0x90, 0x83, 0xF3, 0xE0, 0xFD, 0x70, 0x02, 0xE1, 0x7A, 0x90, 0x80, \r
-0x5D, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x80, \r
-0x5E, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, \r
-0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x83, 0xF1, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, \r
-0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, \r
-0xE1, 0x57, 0xE4, 0x90, 0x83, 0xF4, 0xF0, 0x90, 0x83, 0xF4, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, \r
-0x73, 0x90, 0x83, 0xF1, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, \r
-0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, \r
-0x90, 0x80, 0x5E, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x80, 0x0D, 0x12, 0x42, 0x25, 0xE5, 0x82, 0x29, \r
-0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x83, 0xF1, 0xE0, 0x75, 0xF0, 0x04, \r
-0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, \r
-0x83, 0xE0, 0xFF, 0x90, 0x80, 0x5E, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x80, 0x11, 0x12, 0x42, 0x25, \r
-0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x83, 0xF4, 0xE0, \r
-0x04, 0xF0, 0x80, 0x83, 0x90, 0x83, 0xF3, 0xE0, 0xFF, 0x90, 0x83, 0xF1, 0xE0, 0xFE, 0x74, 0x01, \r
-0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x83, 0xF3, 0xF0, 0x90, \r
-0x83, 0xF1, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, \r
-0x01, 0xCC, 0xF0, 0x90, 0x83, 0xF1, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x80, 0x5E, \r
-0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0xC1, 0x35, \r
-0xE4, 0x90, 0x80, 0x5E, 0xF0, 0xC1, 0x35, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x83, \r
-0xF1, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0xF0, 0x90, 0x83, 0xF1, 0xE0, 0x75, 0xF0, 0x04, 0x90, \r
-0x01, 0xD0, 0x12, 0x42, 0x25, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
-0xC0, 0xD0, 0x90, 0x80, 0xF5, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, \r
-0x14, 0xFF, 0x90, 0x80, 0xF6, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, \r
-0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01, 0x90, 0x80, 0xF6, \r
-0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x5F, 0xF9, 0x74, 0x80, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, \r
-0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x41, 0xD0, 0x90, 0x80, 0xF6, 0xE0, 0x04, 0xF0, \r
-0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x80, 0xF6, 0xF0, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x54, 0xE0, 0x55, 0x35, 0xF5, 0x39, 0xA3, 0xE0, 0x55, \r
-0x36, 0xF5, 0x3A, 0xA3, 0xE0, 0x55, 0x37, 0xF5, 0x3B, 0xA3, 0xE0, 0x55, 0x38, 0xF5, 0x3C, 0xAD, \r
-0x39, 0x7F, 0x54, 0x12, 0x32, 0x1E, 0xAD, 0x3A, 0x7F, 0x55, 0x12, 0x32, 0x1E, 0xAD, 0x3B, 0x7F, \r
-0x56, 0x12, 0x32, 0x1E, 0xAD, 0x3C, 0x7F, 0x57, 0x12, 0x32, 0x1E, 0x53, 0x91, 0xEF, 0x22, 0x90, \r
-0x01, 0x34, 0xE0, 0x55, 0x3D, 0xF5, 0x41, 0xA3, 0xE0, 0x55, 0x3E, 0xF5, 0x42, 0xA3, 0xE0, 0x55, \r
-0x3F, 0xF5, 0x43, 0xA3, 0xE0, 0x55, 0x40, 0xF5, 0x44, 0x90, 0x01, 0x34, 0xE5, 0x41, 0xF0, 0xA3, \r
-0xE5, 0x42, 0xF0, 0xA3, 0xE5, 0x43, 0xF0, 0xA3, 0xE5, 0x44, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, \r
-0x55, 0x45, 0xF5, 0x49, 0xA3, 0xE0, 0x55, 0x46, 0xF5, 0x4A, 0xA3, 0xE0, 0x55, 0x47, 0xF5, 0x4B, \r
-0xA3, 0xE0, 0x55, 0x48, 0xF5, 0x4C, 0x90, 0x01, 0x3C, 0xE5, 0x49, 0xF0, 0xA3, 0xE5, 0x4A, 0xF0, \r
-0xA3, 0xE5, 0x4B, 0xF0, 0xA3, 0xE5, 0x4C, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0x81, 0x3E, 0xE0, \r
-0x60, 0x45, 0x90, 0x81, 0x3B, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x12, 0x90, \r
-0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0x11, 0xD1, 0x90, 0x81, 0x44, 0xE0, 0x14, 0x90, 0x05, 0x73, \r
-0xF0, 0x90, 0x83, 0xF5, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x41, 0xF6, 0xC3, 0x90, 0x83, 0xF6, 0xE0, \r
-0x94, 0x80, 0x90, 0x83, 0xF5, 0xE0, 0x64, 0x80, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, \r
-0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xF1, 0x5E, 0x31, 0xE6, 0xE4, 0x90, 0x83, 0x43, 0xF0, \r
-0x22, 0x7D, 0x02, 0x7F, 0x02, 0x11, 0xDB, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x3D, 0x2F, 0xF8, 0xE6, \r
-0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, \r
-0xEE, 0xF0, 0x22, 0x90, 0x83, 0x4A, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x41, 0xE0, 0x64, 0x02, 0x60, \r
-0x28, 0x31, 0x2A, 0x90, 0x81, 0x3B, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x14, 0x90, \r
-0x81, 0x44, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x0A, 0x31, 0xC2, 0x11, 0xD1, 0x90, 0x81, 0x45, \r
-0xE0, 0x14, 0xF0, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x80, 0xF9, 0xE0, 0x64, 0x01, \r
-0x60, 0x02, 0x21, 0xC1, 0x90, 0x81, 0x3E, 0xE0, 0x70, 0x02, 0x21, 0xC1, 0x90, 0x81, 0x3C, 0xE0, \r
-0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x26, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x81, 0x45, 0xF0, 0x90, \r
-0x06, 0xAA, 0xE0, 0x04, 0x90, 0x81, 0x44, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x81, 0x44, \r
-0xE0, 0xFE, 0xFF, 0x80, 0x03, 0xEF, 0x04, 0xFF, 0x90, 0x81, 0x45, 0xEF, 0xF0, 0x90, 0x81, 0x3B, \r
-0xE0, 0x44, 0x04, 0xF0, 0xE4, 0x90, 0x81, 0x47, 0xF0, 0x90, 0x81, 0x49, 0xA3, 0xE0, 0x90, 0x05, \r
-0x58, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x81, 0x42, \r
-0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, 0xF0, 0x90, 0x81, 0x3C, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, \r
-0xFD, 0x50, 0x02, 0x80, 0x02, 0x51, 0x4A, 0x90, 0x81, 0x3B, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
-0x30, 0xE0, 0x0E, 0x90, 0x81, 0x44, 0xE0, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x04, 0x31, 0xC2, 0x11, \r
-0xD7, 0x22, 0xEF, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, \r
-0x03, 0x74, 0x45, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
-0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x83, 0x40, 0xE0, 0x30, 0xE0, 0x37, 0x90, 0x80, 0xF9, \r
-0xE0, 0x64, 0x01, 0x70, 0x2F, 0x90, 0x84, 0x04, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, \r
-0x83, 0x42, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x84, 0x04, 0xF0, 0x90, 0x83, 0x42, 0xE0, 0xFF, 0x90, \r
-0x83, 0x41, 0xE0, 0xD3, 0x9F, 0x50, 0x0D, 0x90, 0x83, 0x43, 0xE0, 0x70, 0x07, 0xE4, 0x90, 0x83, \r
-0x42, 0xF0, 0x51, 0x25, 0x22, 0x90, 0x83, 0x40, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, \r
-0x16, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x00, 0x90, 0x83, 0x8B, 0x12, 0x42, 0x3A, 0xE4, 0x90, 0x83, \r
-0x8E, 0xF0, 0xA3, 0x04, 0xF0, 0x61, 0x64, 0x02, 0x4C, 0x25, 0xE4, 0xF5, 0x19, 0x90, 0x06, 0xA9, \r
-0xE0, 0xF5, 0x19, 0x54, 0xC0, 0x70, 0x0D, 0x90, 0x81, 0x42, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, \r
-0xF0, 0x02, 0x51, 0x9D, 0xE5, 0x19, 0x30, 0xE6, 0x22, 0x90, 0x81, 0x3E, 0xE0, 0x64, 0x01, 0x70, \r
-0x21, 0x90, 0x81, 0x42, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x81, 0x3C, 0xE0, 0x54, 0x0F, 0x64, 0x02, \r
-0x60, 0x04, 0x51, 0xAD, 0x80, 0x0C, 0x12, 0x4C, 0xE4, 0x80, 0x07, 0x90, 0x81, 0x42, 0xE0, 0x54, \r
-0xFE, 0xF0, 0xE5, 0x19, 0x90, 0x81, 0x42, 0x30, 0xE7, 0x0E, 0xE0, 0x44, 0x02, 0x12, 0x57, 0xEF, \r
-0x90, 0x81, 0x3A, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x04, 0x1D, \r
-0xE0, 0x70, 0x19, 0x90, 0x80, 0x08, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x51, 0xCD, 0x90, 0x83, \r
-0x52, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0xD3, 0x10, 0xAF, \r
-0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x83, 0xDF, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x83, 0xDE, 0xEF, \r
-0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0x5F, 0x67, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0x83, 0xDE, 0xE0, 0x90, \r
-0x04, 0x25, 0xF0, 0x90, 0x83, 0xDF, 0xE0, 0x60, 0x0E, 0x74, 0x0F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
-0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x08, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
-0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x09, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
-0x54, 0xF0, 0xF0, 0xAF, 0x05, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
-0x54, 0x01, 0xFE, 0x90, 0x83, 0xE0, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, \r
-0xFE, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x21, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x83, 0x88, 0x12, 0x42, \r
-0x3A, 0x78, 0x94, 0x7C, 0x83, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0xCE, 0x7E, 0x00, 0x7F, \r
-0x06, 0x12, 0x41, 0xD0, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x83, 0x93, 0xF0, 0x90, 0x04, 0x1D, 0xE0, \r
-0x60, 0x0A, 0x7D, 0x33, 0x12, 0x4D, 0x6E, 0xBF, 0x01, 0x15, 0x80, 0x00, 0x90, 0x83, 0x31, 0xE0, \r
-0xFF, 0x7B, 0x18, 0x7D, 0x01, 0x51, 0xCD, 0x90, 0x83, 0x90, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, \r
-0x83, 0x90, 0x12, 0x56, 0xFD, 0x90, 0x83, 0x92, 0xEF, 0xF0, 0x90, 0x83, 0x90, 0xA3, 0xE0, 0x24, \r
-0x20, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x83, 0x8E, 0xE0, 0xFD, 0x91, 0xE8, 0x90, \r
-0x83, 0x8F, 0xE0, 0x60, 0x02, 0x81, 0x5E, 0xA3, 0xA3, 0xE0, 0x24, 0x30, 0xF9, 0xE4, 0x34, 0xFC, \r
-0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x83, 0x8B, 0x12, 0x42, 0x31, 0x8B, \r
-0x13, 0x8A, 0x14, 0x89, 0x15, 0x75, 0x16, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x2B, \r
-0xED, 0x90, 0x83, 0x90, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x3A, 0xF9, 0xE4, 0x34, 0xFC, \r
-0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x83, 0x8B, 0x12, 0x42, 0x31, 0x8B, \r
-0x13, 0x8A, 0x14, 0x89, 0x15, 0x75, 0x16, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x2B, \r
-0xED, 0x90, 0x83, 0x90, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x40, 0xF9, 0xE4, 0x34, 0xFC, \r
-0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x83, 0x88, 0x12, 0x42, 0x31, 0x8B, \r
-0x13, 0x8A, 0x14, 0x89, 0x15, 0x75, 0x16, 0x04, 0xD0, 0x01, 0xD0, 0x02, 0x80, 0x69, 0x90, 0x83, \r
-0x8F, 0xE0, 0x64, 0x01, 0x70, 0x66, 0xA3, 0xA3, 0xE0, 0x24, 0x30, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, \r
-0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x13, 0x75, 0x14, 0x81, 0x75, 0x15, 0x9C, 0x75, 0x16, 0x06, 0xD0, \r
-0x03, 0x12, 0x2B, 0xED, 0x90, 0x83, 0x90, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x3A, 0xF9, \r
-0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x13, 0x75, 0x14, 0x81, 0x75, 0x15, 0xA6, \r
-0x75, 0x16, 0x06, 0xD0, 0x03, 0x12, 0x2B, 0xED, 0x90, 0x83, 0x90, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, \r
-0x2F, 0x24, 0x40, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x13, 0x75, 0x14, \r
-0x81, 0x75, 0x15, 0xAC, 0x75, 0x16, 0x04, 0xD0, 0x03, 0x12, 0x2B, 0xED, 0x90, 0x06, 0x30, 0xE0, \r
-0x44, 0x10, 0xF0, 0x90, 0x83, 0x93, 0xE0, 0xFF, 0x7D, 0x34, 0x12, 0x4A, 0xED, 0x90, 0x04, 0x1F, \r
-0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x83, 0xD2, 0xED, 0xF0, 0x90, 0x83, 0xCF, \r
-0x12, 0x42, 0x3A, 0xE4, 0x90, 0x83, 0xD3, 0xF0, 0xA3, 0xF0, 0x12, 0x1F, 0xA4, 0xFF, 0x90, 0x00, \r
-0x01, 0x12, 0x1F, 0xBD, 0xFD, 0x90, 0x00, 0x04, 0x12, 0x1F, 0xBD, 0xFB, 0x12, 0x57, 0x23, 0x90, \r
-0x83, 0xD3, 0xEF, 0xF0, 0x90, 0x83, 0xCF, 0x12, 0x42, 0x31, 0x90, 0x00, 0x04, 0x12, 0x1F, 0xBD, \r
-0xFF, 0xD1, 0xA5, 0x90, 0x83, 0xD4, 0xEF, 0xF0, 0x90, 0x82, 0x51, 0xE0, 0x24, 0xFE, 0x60, 0x1D, \r
-0x24, 0xFE, 0x60, 0x19, 0x14, 0x60, 0x07, 0x14, 0x60, 0x04, 0x24, 0x05, 0x70, 0x53, 0x7B, 0x01, \r
-0x7A, 0x82, 0x79, 0x48, 0x90, 0x83, 0xD2, 0xE0, 0xFD, 0xD1, 0xE4, 0x80, 0x16, 0x7B, 0x01, 0x7A, \r
-0x82, 0x79, 0x48, 0x90, 0x83, 0xD2, 0xE0, 0xFD, 0x90, 0x82, 0x51, 0xE0, 0x90, 0x83, 0xAD, 0xF0, \r
-0x12, 0x7C, 0x06, 0x90, 0x83, 0xD4, 0xE0, 0xFF, 0x90, 0x83, 0xCF, 0x12, 0x42, 0x31, 0x90, 0x83, \r
-0xD3, 0xE0, 0x7C, 0x00, 0x29, 0xF9, 0xEC, 0x3A, 0xFA, 0xC3, 0xE9, 0x9F, 0xF9, 0xEA, 0x94, 0x00, \r
-0xFA, 0x75, 0x13, 0x01, 0x75, 0x14, 0x82, 0x75, 0x15, 0x48, 0xA3, 0xE0, 0xF5, 0x16, 0x12, 0x2B, \r
-0xED, 0x22, 0x90, 0x80, 0x09, 0xE0, 0xFF, 0x90, 0x83, 0xD6, 0xE0, 0xFB, 0x7D, 0x01, 0x51, 0xCD, \r
-0x90, 0x83, 0xD7, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x83, 0xD5, 0xE0, 0xFF, 0xD1, \r
-0x3D, 0x90, 0x83, 0xD7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x04, 0x80, 0xE0, 0x54, 0x0F, 0xFD, \r
-0xAC, 0x07, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, \r
-0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, \r
-0x74, 0x16, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x15, \r
-0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, \r
-0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0F, 0xF0, 0x90, 0x04, 0x53, 0xE4, \r
-0xF0, 0x90, 0x04, 0x52, 0xF0, 0x90, 0x04, 0x51, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0x50, 0x74, 0xFD, \r
-0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, \r
-0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0x74, 0x1F, 0x2D, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x1D, 0x74, 0x21, \r
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x1F, 0x2D, 0xF5, \r
-0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x74, 0x21, 0x2D, 0xF5, 0x82, \r
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x1F, 0x2D, 0xF5, 0x82, 0xE4, 0x34, \r
-0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0x80, 0xF9, 0xE0, 0xB4, 0x01, 0x15, 0x90, \r
-0x81, 0x3E, 0xE0, 0x60, 0x0F, 0x90, 0x81, 0x3C, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x02, 0x41, \r
-0xAD, 0x12, 0x4C, 0xE4, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x20, 0xE0, 0x05, \r
-0x90, 0x83, 0x2E, 0x80, 0x03, 0x90, 0x83, 0x2F, 0xE0, 0x90, 0x82, 0x51, 0xF0, 0x90, 0x82, 0x51, \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, 0x90, 0x83, 0xC4, 0xED, 0xF0, 0x90, 0x83, 0xC1, 0x12, 0x42, 0x3A, 0x90, \r
-0x00, 0x03, 0x12, 0x1F, 0xBD, 0x90, 0x83, 0xC8, 0xF0, 0x90, 0x83, 0xC1, 0x12, 0x42, 0x31, 0x8B, \r
-0x13, 0x8A, 0x14, 0x89, 0x15, 0x75, 0x16, 0x03, 0x7B, 0x01, 0x7A, 0x83, 0x79, 0xC5, 0x12, 0x2B, \r
-0xED, 0x90, 0x83, 0xC4, 0xE0, 0x70, 0x46, 0xFF, 0x74, 0xC5, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x83, \r
-0xF5, 0x83, 0xE0, 0xB4, 0xFF, 0x0E, 0x74, 0xC5, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x83, 0xF5, 0x83, \r
-0xE4, 0xF0, 0x80, 0x0F, 0x74, 0xC5, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x83, 0xF5, 0x83, 0xE0, 0x04, \r
-0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x03, 0xD0, 0x75, 0x13, 0x01, 0x75, 0x14, 0x83, 0x75, 0x15, \r
-0xC5, 0x75, 0x16, 0x03, 0x90, 0x83, 0xC1, 0x12, 0x42, 0x31, 0x12, 0x2B, 0xED, 0x22, 0x90, 0x83, \r
-0x44, 0xE0, 0x30, 0xE0, 0x72, 0x90, 0x83, 0x48, 0xE0, 0x04, 0xF0, 0x90, 0x83, 0x4B, 0xE0, 0x64, \r
-0x01, 0x70, 0x27, 0x90, 0x83, 0x44, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1C, 0x90, 0x83, \r
-0x4A, 0xE0, 0x70, 0x16, 0x90, 0x83, 0x47, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x40, 0x0B, 0x12, \r
-0x51, 0xA7, 0x90, 0x83, 0x44, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0x83, 0x48, 0xE0, 0xFF, 0x90, \r
-0x83, 0x45, 0xE0, 0xD3, 0x9F, 0x50, 0x30, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x1A, 0x90, 0x83, \r
-0x4A, 0xE0, 0x70, 0x14, 0x7D, 0x08, 0xFF, 0x12, 0x4C, 0x29, 0x90, 0x83, 0x49, 0xE0, 0x04, 0xF0, \r
-0x90, 0x83, 0x43, 0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, \r
-0x83, 0x48, 0xF0, 0x90, 0x83, 0x4A, 0xF0, 0x22, 0x90, 0x80, 0xF9, 0xE0, 0x64, 0x01, 0x70, 0x13, \r
-0x90, 0x81, 0x3E, 0xE0, 0x60, 0x0D, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, \r
-0x12, 0x57, 0xEF, 0x22, 0x90, 0x80, 0xF9, 0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, 0x81, 0x3E, 0xE0, \r
-0x60, 0x20, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x81, 0x3A, \r
-0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x81, 0x42, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, \r
-0x51, 0x9D, 0x22, 0x90, 0x80, 0xF9, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0x81, 0x3E, 0xE0, 0x60, 0x0E, \r
-0x90, 0x81, 0x42, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x51, 0x9D, 0x22, 0x11, \r
-0xB2, 0x90, 0x83, 0x54, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, \r
-0xFF, 0x12, 0x4B, 0x33, 0x90, 0x83, 0x54, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, \r
-0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90, 0x81, 0x3A, 0xE0, \r
-0x30, 0xE0, 0x25, 0x90, 0x81, 0x75, 0xE0, 0x24, 0x07, 0xFF, 0x90, 0x81, 0x50, 0xE0, 0xFE, 0xC3, \r
-0xEF, 0x9E, 0xFF, 0x90, 0x81, 0x53, 0xF0, 0x90, 0x81, 0x49, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, \r
-0x04, 0xEC, 0xE0, 0x54, 0xDD, 0xF0, 0x80, 0x10, 0x90, 0x81, 0x49, 0xE4, 0xF0, 0xA3, 0x74, 0x02, \r
-0xF0, 0x90, 0x04, 0xEC, 0xE0, 0x44, 0x22, 0xF0, 0x90, 0x81, 0x49, 0xA3, 0xE0, 0x90, 0x05, 0x58, \r
-0xF0, 0x22, 0xE4, 0x90, 0x83, 0x55, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0x90, \r
-0x83, 0x55, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xFE, 0x90, 0x83, 0x55, 0xE0, 0xFF, 0xB5, 0x06, 0x01, \r
-0x22, 0xC3, 0x90, 0x83, 0x57, 0xE0, 0x94, 0x64, 0x90, 0x83, 0x56, 0xE0, 0x94, 0x00, 0x40, 0x0D, \r
-0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x83, 0x55, 0xE0, 0xFF, 0x22, 0x90, 0x83, 0x56, \r
-0xE4, 0x75, 0xF0, 0x01, 0x12, 0x41, 0xF6, 0x80, 0xC2, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, \r
-0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, \r
-0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, 0x0D, 0xED, 0x13, \r
-0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x1E, 0x90, 0xFD, \r
-0x11, 0xE0, 0xB5, 0x05, 0x14, 0x90, 0x01, 0x17, 0xE0, 0xB5, 0x05, 0x07, 0x90, 0xFD, 0x11, 0xE4, \r
-0xF0, 0x80, 0x06, 0xED, 0x04, 0x90, 0xFD, 0x11, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0x74, 0x45, 0x2F, \r
-0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, \r
-0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xE4, 0x90, 0x81, 0x3E, 0xF0, 0xA3, 0xF0, 0x90, 0x81, 0x3C, 0xE0, \r
-0x54, 0x0F, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0x81, 0x3C, 0xE0, 0x54, 0xF0, 0xF0, 0x90, 0x81, \r
-0x3A, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0x81, 0x44, 0x74, 0x01, \r
-0xF0, 0xA3, 0xF0, 0x90, 0x81, 0x3A, 0xE0, 0x54, 0xFB, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, \r
-0x90, 0x81, 0x47, 0xF0, 0x90, 0x81, 0x46, 0x74, 0x08, 0xF0, 0x90, 0x81, 0x49, 0xE4, 0xF0, 0xA3, \r
-0x74, 0x02, 0xF0, 0xE4, 0x90, 0x81, 0x42, 0xF0, 0x90, 0x81, 0x3A, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, \r
-0xFD, 0xFF, 0x12, 0x4B, 0x33, 0x7D, 0x0C, 0x7F, 0x02, 0x12, 0x4B, 0x33, 0x12, 0x4B, 0x2F, 0x90, \r
-0x81, 0x3A, 0xE0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, \r
-0xF0, 0x54, 0xF7, 0xF0, 0x90, 0x81, 0x4B, 0x12, 0x20, 0xDA, 0x54, 0x33, 0x77, 0x70, 0xE4, 0x90, \r
-0x81, 0x75, 0xF0, 0x90, 0x81, 0x4F, 0xF0, 0x90, 0x80, 0x06, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x81, \r
-0x48, 0x74, 0x99, 0xF0, 0x80, 0x12, 0x90, 0x80, 0x06, 0xE0, 0x90, 0x81, 0x48, 0xB4, 0x03, 0x05, \r
-0x74, 0x90, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x90, 0x81, 0x76, 0x74, 0x05, 0xF0, 0xA3, 0xF0, \r
-0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x81, 0x50, 0xF0, \r
-0x90, 0x81, 0x75, 0xE0, 0x24, 0x07, 0x90, 0x81, 0x53, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xE4, 0xA3, \r
-0xF0, 0x90, 0x81, 0x7A, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, \r
-0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, \r
-0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x4A, 0xED, \r
-0xE4, 0x90, 0x81, 0x7C, 0xF0, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, \r
-0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x51, \r
-0x86, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x80, 0x67, 0x90, 0x81, \r
-0x42, 0xE0, 0xFF, 0x54, 0x03, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x80, 0x56, 0x90, \r
-0x81, 0x40, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, \r
-0x44, 0xEF, 0x30, 0xE2, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x80, 0x38, 0x90, 0x81, 0x42, \r
-0xE0, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, 0x29, 0x90, 0x81, 0x3B, 0xE0, \r
-0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x20, 0xF0, 0x80, 0x16, 0x90, \r
-0x81, 0x7C, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x80, 0xF0, 0x80, 0x08, 0x90, 0x01, 0xB8, \r
-0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0xEF, 0x24, \r
-0xFE, 0x60, 0x0B, 0x04, 0x70, 0x27, 0x90, 0x81, 0x44, 0x74, 0x02, 0xF0, 0x80, 0x16, 0xED, 0x70, \r
-0x0A, 0x90, 0x81, 0x79, 0xE0, 0x90, 0x81, 0x44, 0xF0, 0x80, 0x05, 0x90, 0x81, 0x44, 0xED, 0xF0, \r
-0x90, 0x81, 0x44, 0xE0, 0xA3, 0xF0, 0x90, 0x81, 0x3B, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xAC, 0x07, \r
-0x90, 0x81, 0x3A, 0xE0, 0x30, 0xE0, 0x32, 0x90, 0x81, 0x50, 0xE0, 0xD3, 0x94, 0x03, 0x50, 0x07, \r
-0x90, 0x81, 0x46, 0xEB, 0xF0, 0x80, 0x0A, 0xED, 0x24, 0xFD, 0x2B, 0x90, 0x81, 0x46, 0xF0, 0x7D, \r
-0x03, 0x90, 0x81, 0x75, 0xE0, 0x24, 0x07, 0xC3, 0x9D, 0x2C, 0xFF, 0x90, 0x81, 0x53, 0xF0, 0x90, \r
-0x81, 0x49, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0E, 0x90, 0x81, 0x49, 0xE4, 0xF0, 0xA3, 0x74, \r
-0x02, 0xF0, 0x90, 0x81, 0x46, 0xEB, 0xF0, 0x90, 0x81, 0x49, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, \r
-0x22, 0xFD, 0x90, 0x83, 0x6F, 0xE0, 0x34, 0x00, 0xFC, 0x7E, 0x00, 0xED, 0x2F, 0xFF, 0xEE, 0x3C, \r
-0xFE, 0xE4, 0xFD, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0x90, 0x80, \r
-0xF8, 0xE0, 0x9B, 0x90, 0x80, 0xF7, 0xE0, 0x9A, 0x50, 0x13, 0xA3, 0xE0, 0x24, 0x01, 0xFF, 0x90, \r
-0x80, 0xF7, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, 0x90, 0xFD, \r
-0x11, 0xF0, 0xAF, 0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, \r
-0x22, 0x90, 0x83, 0x6F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x78, 0x78, 0x7C, 0x83, \r
-0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0xC0, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x41, 0xD0, 0x78, \r
-0x7E, 0x7C, 0x83, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0xC6, 0x7E, 0x00, 0x7F, 0x04, 0x12, \r
-0x41, 0xD0, 0x78, 0x82, 0x7C, 0x83, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0xCA, 0x7E, 0x00, \r
-0x7F, 0x04, 0x12, 0x41, 0xD0, 0xE4, 0x90, 0x83, 0x87, 0xF0, 0x90, 0x83, 0x71, 0xE0, 0xFF, 0x90, \r
-0x83, 0x70, 0xE0, 0x2F, 0xFF, 0x90, 0x83, 0x6F, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x06, 0xCF, 0x34, \r
-0x00, 0xFE, 0xE4, 0xFD, 0x71, 0xB3, 0xEF, 0x64, 0x08, 0x60, 0x02, 0xA1, 0xDD, 0x90, 0x83, 0x71, \r
-0xE0, 0xFF, 0x90, 0x83, 0x70, 0xE0, 0x2F, 0xFF, 0x90, 0x83, 0x6F, 0xE0, 0x34, 0x00, 0xCF, 0x24, \r
-0x07, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0xB3, 0xEF, 0x64, 0x06, 0x60, 0x02, 0xA1, 0xDD, \r
-0x90, 0x83, 0x87, 0x04, 0xF0, 0xE4, 0x90, 0x83, 0x86, 0xF0, 0x90, 0x83, 0x86, 0xE0, 0xFF, 0xC3, \r
-0x94, 0x06, 0x50, 0x1F, 0x90, 0x83, 0x70, 0xE0, 0x24, 0x0A, 0x71, 0xA1, 0x90, 0x83, 0x86, 0xE0, \r
-0x24, 0x72, 0xF5, 0x82, 0xE4, 0x34, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x83, 0x86, 0xE0, 0x04, \r
-0xF0, 0x80, 0xD7, 0x78, 0x72, 0x7C, 0x83, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0x8C, 0x7E, \r
-0x00, 0x7F, 0x06, 0x12, 0x43, 0xEF, 0xEF, 0x60, 0x02, 0xA1, 0xDD, 0x90, 0x83, 0x86, 0xF0, 0x90, \r
-0x83, 0x86, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x2E, 0x90, 0x83, 0x71, 0xE0, 0xFD, 0x90, 0x83, \r
-0x70, 0xE0, 0x2D, 0xFD, 0x90, 0x83, 0x6F, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x20, 0xCD, 0x71, 0xA6, \r
-0x90, 0x83, 0x86, 0xE0, 0x24, 0x82, 0xF5, 0x82, 0xE4, 0x34, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, \r
-0x83, 0x86, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0x78, 0x82, 0x7C, 0x83, 0x7D, 0x01, 0x7B, 0x01, 0x7A, \r
-0x81, 0x79, 0xA2, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x43, 0xEF, 0xEF, 0x60, 0x02, 0xA1, 0xD4, 0x90, \r
-0x06, 0x30, 0xE0, 0x44, 0x01, 0x54, 0xDF, 0xF0, 0x90, 0x81, 0x7F, 0xE0, 0x30, 0xE0, 0x0F, 0x90, \r
-0x01, 0xC7, 0x74, 0x09, 0xF0, 0x90, 0x81, 0x85, 0xE0, 0x44, 0x01, 0xF0, 0xA1, 0xDD, 0xE4, 0x90, \r
-0x83, 0x86, 0xF0, 0x90, 0x83, 0x86, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x2E, 0x90, 0x83, 0x71, \r
-0xE0, 0xFD, 0x90, 0x83, 0x70, 0xE0, 0x2D, 0xFD, 0x90, 0x83, 0x6F, 0xE0, 0x34, 0x00, 0xCD, 0x24, \r
-0x10, 0xCD, 0x71, 0xA6, 0x90, 0x83, 0x86, 0xE0, 0x24, 0x78, 0xF5, 0x82, 0xE4, 0x34, 0x83, 0xF5, \r
-0x83, 0xEF, 0xF0, 0x90, 0x83, 0x86, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0xE4, 0x90, 0x83, 0x86, 0xF0, \r
-0x90, 0x83, 0x86, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x2E, 0x90, 0x83, 0x71, 0xE0, 0xFD, 0x90, \r
-0x83, 0x70, 0xE0, 0x2D, 0xFD, 0x90, 0x83, 0x6F, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x16, 0xCD, 0x71, \r
-0xA6, 0x90, 0x83, 0x86, 0xE0, 0x24, 0x7E, 0xF5, 0x82, 0xE4, 0x34, 0x83, 0xF5, 0x83, 0xEF, 0xF0, \r
-0x90, 0x83, 0x86, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0x7B, 0x01, 0x7A, 0x83, 0x79, 0x78, 0x90, 0x83, \r
-0x8B, 0x12, 0x42, 0x3A, 0xE4, 0x90, 0x83, 0x8E, 0xF0, 0xA3, 0xF0, 0x7A, 0x83, 0x79, 0x7E, 0x12, \r
-0x6B, 0x64, 0x80, 0x09, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x21, 0x54, 0xEF, 0xF0, 0x90, 0x83, 0x87, \r
-0xE0, 0xFF, 0x22, 0x90, 0x83, 0x71, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x83, 0x6F, 0xEE, 0xF0, \r
-0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x83, 0x74, 0xF0, 0xFD, 0x71, 0xB3, 0xEF, 0x54, 0x0C, 0x64, 0x08, \r
-0x70, 0x74, 0x90, 0x83, 0x6F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x24, 0x06, 0xFD, 0x71, \r
-0xB3, 0xEF, 0x64, 0x88, 0x70, 0x60, 0x90, 0x83, 0x6F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, \r
-0x24, 0x07, 0xFD, 0x71, 0xB3, 0xEF, 0x64, 0x8E, 0x70, 0x4C, 0x90, 0x83, 0x74, 0x04, 0xF0, 0x90, \r
-0x83, 0x6F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x83, 0x72, 0xE0, 0xFD, 0x90, 0x83, 0x71, 0xE0, \r
-0x2D, 0x04, 0xFD, 0x71, 0xB3, 0xEF, 0x64, 0x03, 0x70, 0x2C, 0x90, 0x83, 0x6F, 0xE0, 0xFE, 0xA3, \r
-0xE0, 0xFF, 0x90, 0x83, 0x72, 0xE0, 0xFD, 0x90, 0x83, 0x71, 0xE0, 0x2D, 0x24, 0x06, 0xFD, 0x71, \r
-0xB3, 0xEF, 0x90, 0x01, 0xC7, 0x30, 0xE3, 0x04, 0x74, 0x01, 0x80, 0x02, 0x74, 0x02, 0xF0, 0x90, \r
-0x81, 0x85, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x83, 0x74, 0xE0, 0xFF, 0x22, 0x90, 0x83, 0x7F, 0xEE, \r
-0xF0, 0xA3, 0xEF, 0xF0, 0x7D, 0x09, 0x71, 0xB3, 0xEF, 0x64, 0x06, 0x70, 0x36, 0x90, 0x83, 0x7F, \r
-0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x14, 0x71, 0xB3, 0xEF, 0x70, 0x27, 0x90, 0x83, 0x7F, 0xE0, \r
-0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x15, 0x71, 0xB3, 0xEF, 0x64, 0x50, 0x70, 0x16, 0x90, 0x83, 0x7F, \r
-0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x21, 0x71, 0xB3, 0xEF, 0x20, 0xE0, 0x03, 0x30, 0xE2, 0x03, \r
-0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x83, 0x6F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, \r
-0xF0, 0x78, 0x72, 0x7C, 0x83, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0xD4, 0x7E, 0x00, 0x7F, \r
-0x06, 0x12, 0x41, 0xD0, 0x78, 0x79, 0x7C, 0x83, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0xDA, \r
-0x7E, 0x00, 0x7F, 0x04, 0x12, 0x41, 0xD0, 0xE4, 0x90, 0x83, 0x78, 0xF0, 0x90, 0x83, 0x78, 0xE0, \r
-0xFF, 0xC3, 0x94, 0x06, 0x50, 0x1F, 0x90, 0x83, 0x70, 0xE0, 0x24, 0x04, 0x71, 0xA1, 0x90, 0x83, \r
-0x78, 0xE0, 0x24, 0x72, 0xF5, 0x82, 0xE4, 0x34, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x83, 0x78, \r
-0xE0, 0x04, 0xF0, 0x80, 0xD7, 0x78, 0x72, 0x7C, 0x83, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x81, 0x79, \r
-0x86, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x43, 0xEF, 0xEF, 0x60, 0x02, 0xE1, 0xE5, 0x90, 0x83, 0x71, \r
-0xE0, 0xFF, 0x90, 0x83, 0x70, 0xE0, 0x2F, 0xFF, 0x90, 0x83, 0x6F, 0xE0, 0x34, 0x00, 0xFE, 0x90, \r
-0x83, 0x7D, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x06, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0xFD, 0x71, 0xB3, \r
-0xEF, 0x64, 0x08, 0x60, 0x02, 0xE1, 0xE5, 0x90, 0x83, 0x7E, 0xE0, 0x24, 0x07, 0xFF, 0x90, 0x83, \r
-0x7D, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0xB3, 0xEF, 0x70, 0x69, 0x90, 0x83, 0x78, 0xF0, \r
-0x90, 0x83, 0x78, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x23, 0x90, 0x83, 0x7E, 0xE0, 0x24, 0x18, \r
-0xFD, 0x90, 0x83, 0x7D, 0x71, 0xA5, 0x90, 0x83, 0x78, 0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, \r
-0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x83, 0x78, 0xE0, 0x04, 0xF0, 0x80, 0xD3, 0x78, 0x79, 0x7C, \r
-0x83, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xA2, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x43, 0xEF, \r
-0xEF, 0x70, 0x22, 0x90, 0x83, 0x7E, 0xE0, 0x24, 0x08, 0xFF, 0x90, 0x83, 0x7D, 0xE0, 0x34, 0x00, \r
-0xFE, 0xD1, 0x7C, 0xEF, 0x64, 0x01, 0x60, 0x0D, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF0, 0x90, 0x81, \r
-0x85, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x7D, 0x7F, 0xEF, 0x5D, 0xC3, 0x60, 0x14, 0x74, 0xFF, 0x9D, \r
-0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, 0x24, 0x80, 0xFF, 0xE4, 0x3E, 0xFE, 0x80, \r
-0x0D, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, 0xFF, 0x22, 0x90, \r
-0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, \r
-0x83, 0x61, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x87, 0xE0, 0x90, 0x83, 0x65, 0xF0, 0x90, 0x81, \r
-0x7D, 0xE0, 0x20, 0xE0, 0x02, 0x21, 0x08, 0x90, 0x83, 0x65, 0xE0, 0xFF, 0xEC, 0xC3, 0x9F, 0x40, \r
-0x02, 0x21, 0x08, 0x90, 0x83, 0x61, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xEA, 0x90, 0xFD, 0x11, 0xF0, \r
-0xAF, 0x03, 0xAD, 0x07, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, \r
-0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xF9, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, \r
-0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x7A, 0x00, \r
-0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0x90, 0x83, 0x63, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x03, \r
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xFF, 0x7E, 0x00, 0xAD, 0x01, \r
-0xED, 0x24, 0x18, 0xFB, 0xEA, 0x33, 0xCB, 0x2F, 0xFF, 0xEE, 0x3B, 0x90, 0x83, 0x63, 0x8F, 0xF0, \r
-0x12, 0x41, 0xF6, 0x90, 0x83, 0x63, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x77, 0xE6, 0x90, 0x83, \r
-0x63, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x83, 0x61, 0xEE, 0x8F, 0xF0, 0x12, 0x41, 0xF6, 0x90, \r
-0x80, 0xF7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x83, 0x62, 0xE0, 0x9F, 0x90, 0x83, 0x61, \r
-0xE0, 0x9E, 0x40, 0x1B, 0x90, 0x80, 0xF8, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x80, 0xF7, 0xE0, 0x34, \r
-0x00, 0xFE, 0xC3, 0x90, 0x83, 0x62, 0xE0, 0x9F, 0xF0, 0x90, 0x83, 0x61, 0xE0, 0x9E, 0xF0, 0x90, \r
-0x83, 0x61, 0x12, 0x57, 0xAF, 0x0C, 0x01, 0x37, 0x22, 0x12, 0x57, 0xC2, 0xAD, 0x07, 0x90, 0x01, \r
-0xC4, 0x74, 0x09, 0xF0, 0x74, 0x79, 0xA3, 0xF0, 0xED, 0x64, 0x01, 0x60, 0x22, 0x90, 0x81, 0x85, \r
-0xE0, 0x44, 0x01, 0xF0, 0xED, 0xB4, 0x02, 0x08, 0x90, 0x01, 0xC7, 0x74, 0x40, 0xF0, 0x80, 0x0A, \r
-0xED, 0xB4, 0x04, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x41, 0xF0, 0x7F, 0x01, 0x02, 0x51, 0xAF, 0x11, \r
-0x0F, 0x90, 0x02, 0x87, 0xE0, 0x70, 0xF8, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x09, \r
-0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x79, 0xA3, 0xF0, 0x22, 0x12, 0x4E, 0x4C, 0x31, 0x80, 0x90, \r
-0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x80, 0x06, 0xE0, 0xFF, 0xB4, 0x01, 0x07, 0x90, 0xFD, 0x00, \r
-0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, 0x54, 0xFB, 0xF0, 0x22, \r
-0xE4, 0xFF, 0x74, 0x48, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0xA4, \r
-0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x08, 0xE3, 0x90, \r
-0x82, 0x50, 0xE0, 0x90, 0x04, 0x4C, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
-0x83, 0x61, 0x12, 0x42, 0x3A, 0x12, 0x1F, 0xA4, 0x20, 0xE0, 0x04, 0x31, 0x5A, 0x41, 0xDF, 0x90, \r
-0x82, 0x50, 0x74, 0x05, 0xF0, 0x90, 0x83, 0x61, 0x12, 0x42, 0x31, 0x12, 0x1F, 0xA4, 0xFF, 0x54, \r
-0x01, 0xFE, 0x90, 0x81, 0x80, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, \r
-0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x1F, 0xA4, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, \r
-0xFF, 0x90, 0x81, 0x80, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, \r
-0x1F, 0xA4, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x81, 0x80, 0xF0, 0xEE, \r
-0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12, 0x1F, 0xA4, 0xFE, 0x54, 0x40, 0xFD, \r
-0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0x90, 0x81, 0x80, 0xF0, 0xEE, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, \r
-0x4E, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x54, 0x80, 0xFF, 0x90, 0x81, 0x81, 0xE0, 0x54, \r
-0x7F, 0x4F, 0xF0, 0x12, 0x1F, 0xA4, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, \r
-0xE0, 0x44, 0x04, 0xF0, 0x90, 0x83, 0x61, 0x12, 0x42, 0x31, 0x12, 0x1F, 0xA4, 0x13, 0x13, 0x13, \r
-0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x80, 0x06, 0xE0, \r
-0xB4, 0x02, 0x0D, 0x90, 0x81, 0x81, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x51, \r
-0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x54, 0x7F, 0xFF, 0x90, 0x81, 0x81, 0xE0, 0x54, 0x80, 0x4F, \r
-0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0x90, 0x81, 0x82, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, \r
-0xBD, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x81, 0x83, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, \r
-0xFE, 0xFF, 0xEE, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x81, 0x81, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x81, \r
-0x80, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x12, 0x52, \r
-0xCC, 0x90, 0x80, 0x06, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0x90, 0x81, 0x85, 0xE0, 0xFF, 0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, \r
-0x30, 0xE2, 0x14, 0xEF, 0x44, 0x01, 0x90, 0x81, 0x85, 0xF0, 0x90, 0x81, 0x80, 0xE0, 0xC4, 0x54, \r
-0x0F, 0x20, 0xE0, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, \r
-0x1F, 0xA4, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x83, 0x30, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, \r
-0xBD, 0xFF, 0xED, 0x2F, 0x90, 0x83, 0x31, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, 0xFF, 0xED, \r
-0x2F, 0x90, 0x83, 0x32, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0xBD, 0xFF, 0xED, 0x2F, 0x90, 0x83, \r
-0x33, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0xBD, 0xFF, 0xED, 0x2F, 0x90, 0x83, 0x34, 0xF0, 0x90, \r
-0x00, 0x05, 0x12, 0x1F, 0xBD, 0xFF, 0xED, 0x2F, 0x90, 0x83, 0x35, 0xF0, 0x90, 0x00, 0x06, 0x12, \r
-0x1F, 0xBD, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x83, 0x36, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, \r
-0xFD, 0x12, 0x1F, 0xA4, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x83, 0x37, 0xF0, 0x90, 0x00, 0x01, \r
-0x12, 0x1F, 0xBD, 0xFF, 0xED, 0x2F, 0x90, 0x83, 0x38, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x1F, 0xBD, \r
-0xFF, 0xED, 0x2F, 0x90, 0x83, 0x39, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0xBD, 0xFF, 0xED, 0x2F, \r
-0x90, 0x83, 0x3A, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x1F, 0xBD, 0xFF, 0xED, 0x2F, 0x90, 0x83, 0x3B, \r
-0xF0, 0x90, 0x00, 0x05, 0x12, 0x1F, 0xBD, 0xFF, 0xED, 0x2F, 0x90, 0x83, 0x3C, 0xF0, 0x90, 0x00, \r
-0x06, 0x12, 0x1F, 0xBD, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x83, 0x3D, 0xF0, 0x22, 0xE4, 0xFF, \r
-0x74, 0x18, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x8C, 0x2F, 0xF5, \r
-0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x10, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x06, \r
-0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x86, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEE, 0xF0, \r
-0x0F, 0xEF, 0xB4, 0x06, 0xCB, 0x22, 0x90, 0x83, 0xA9, 0x12, 0x42, 0x3A, 0x12, 0x1F, 0xA4, 0x90, \r
-0x83, 0xAE, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x1F, 0xBD, 0x90, 0x83, 0xAF, 0xF0, 0x90, 0x00, 0x04, \r
-0x12, 0x1F, 0xBD, 0x90, 0x83, 0xB0, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x1F, 0xBD, 0x90, 0x83, 0xB1, \r
-0xF0, 0x90, 0x00, 0x06, 0x12, 0x1F, 0xBD, 0x90, 0x83, 0xB2, 0xF0, 0x90, 0x00, 0x07, 0x12, 0x1F, \r
-0xBD, 0x90, 0x83, 0xB3, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x1F, 0xBD, 0x90, 0x83, 0xB6, 0xF0, 0xED, \r
-0x70, 0x31, 0xFF, 0x74, 0xAE, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x83, 0xF5, 0x83, 0xE0, 0xB4, 0xFF, \r
-0x0E, 0x74, 0xAE, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x0F, 0x74, \r
-0xAE, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x83, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, \r
-0xB4, 0x06, 0xD0, 0x90, 0x83, 0xAD, 0xE0, 0xFF, 0xB4, 0x04, 0x25, 0xA3, 0xE0, 0xFE, 0x90, 0x83, \r
-0xA9, 0x12, 0x42, 0x31, 0xEE, 0x12, 0x1F, 0xEA, 0x90, 0x83, 0xAF, 0xE0, 0xFE, 0x90, 0x83, 0xA9, \r
-0x12, 0x42, 0x31, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x1F, 0xFC, 0x90, 0x00, 0x02, 0xE4, 0x80, 0x30, \r
-0xEF, 0xB4, 0x02, 0x2F, 0x90, 0x83, 0xAF, 0xE0, 0xFF, 0x90, 0x83, 0xA9, 0x12, 0x42, 0x31, 0xEF, \r
-0x12, 0x1F, 0xEA, 0x90, 0x83, 0xAF, 0xE0, 0x44, 0x20, 0x54, 0x7F, 0xFF, 0x90, 0x83, 0xA9, 0x12, \r
-0x42, 0x31, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x1F, 0xFC, 0x90, 0x83, 0xAE, 0xE0, 0x90, 0x00, 0x02, \r
-0x12, 0x1F, 0xFC, 0x90, 0x83, 0xA9, 0x12, 0x42, 0x31, 0xE9, 0x24, 0x03, 0xF9, 0xE4, 0x3A, 0xFA, \r
-0x12, 0x1F, 0xA4, 0x44, 0x20, 0x12, 0x1F, 0xEA, 0x90, 0x83, 0xB0, 0xE0, 0xFF, 0x90, 0x83, 0xA9, \r
-0x12, 0x42, 0x31, 0x90, 0x00, 0x04, 0xEF, 0x12, 0x1F, 0xFC, 0x90, 0x83, 0xB1, 0xE0, 0x90, 0x00, \r
-0x05, 0x12, 0x1F, 0xFC, 0x90, 0x83, 0xB2, 0xE0, 0x90, 0x00, 0x06, 0x12, 0x1F, 0xFC, 0x90, 0x83, \r
-0xB3, 0xE0, 0x90, 0x00, 0x07, 0x02, 0x1F, 0xFC, 0x66, 0x67, \r
+0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x64, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0x91, 0x65, 0xFF, 0x12, \r
+0x2D, 0x5C, 0xED, 0x54, 0x0F, 0xFD, 0xE4, 0xFC, 0x90, 0x83, 0xD5, 0x12, 0x20, 0xCE, 0x90, 0x83, \r
+0xD5, 0x02, 0x42, 0x19, 0x90, 0x83, 0xD9, 0x02, 0x42, 0x19, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x62, \r
+0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x22, 0x7F, 0x24, 0x7E, 0x08, \r
+0x12, 0x2E, 0xA2, 0x90, 0x83, 0xD3, 0xE0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xC0, \r
+0x07, 0xC0, 0x05, 0x90, 0x84, 0x04, 0x12, 0x42, 0x19, 0x90, 0x83, 0xF2, 0x12, 0x20, 0xCE, 0xD0, \r
+0x05, 0xD0, 0x07, 0x91, 0x9A, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x83, 0xF0, 0xEF, 0xF0, 0xAB, \r
+0x05, 0x90, 0x83, 0xF6, 0x12, 0x20, 0xDA, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x03, 0xE4, 0xFC, 0xFD, \r
+0xFE, 0x78, 0x14, 0xF1, 0x0B, 0x90, 0x83, 0xF2, 0x12, 0x42, 0x19, 0xED, 0x54, 0x0F, 0xFD, 0xE4, \r
+0xFC, 0x12, 0x42, 0x0C, 0xEC, 0x54, 0x0F, 0xFC, 0x90, 0x83, 0xF6, 0x12, 0x20, 0xCE, 0x90, 0x83, \r
+0xF0, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x60, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0x91, 0x65, 0xFF, \r
+0xC0, 0x06, 0xC0, 0x07, 0x90, 0x83, 0xF6, 0x71, 0x64, 0xD0, 0x07, 0xD0, 0x06, 0x02, 0x2E, 0xA2, \r
+0x12, 0x73, 0x10, 0x30, 0xE0, 0x0B, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x31, \r
+0x4B, 0x90, 0x81, 0x04, 0xF1, 0xC9, 0x30, 0xE0, 0x0A, 0xEF, 0x12, 0x76, 0x77, 0x54, 0x07, 0x70, \r
+0x45, 0x80, 0x41, 0x90, 0x81, 0x11, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x0C, 0xE0, 0x54, 0xEF, 0xF0, \r
+0xD1, 0xFF, 0x40, 0x30, 0x12, 0x4C, 0x5F, 0x64, 0x01, 0x70, 0x2B, 0x12, 0x57, 0xDD, 0x70, 0x04, \r
+0xB1, 0x5F, 0x80, 0x23, 0xB1, 0x5F, 0x90, 0x81, 0x12, 0xE0, 0x04, 0xF0, 0xE0, 0xD3, 0x94, 0x02, \r
+0x40, 0x09, 0xB1, 0x57, 0xE4, 0x90, 0x81, 0x12, 0xF0, 0x80, 0x03, 0x12, 0x4C, 0x89, 0xE4, 0x90, \r
+0x81, 0x11, 0xF0, 0x22, 0xB1, 0x9C, 0x22, 0x90, 0x81, 0x05, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0xD1, \r
+0xFF, 0x40, 0x20, 0x90, 0x81, 0x22, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x94, 0x04, 0x50, 0x14, 0x90, \r
+0x81, 0x1A, 0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0x81, 0x21, 0xF0, 0xFB, 0x12, 0x6F, 0x7A, \r
+0x12, 0x6F, 0x0F, 0x22, 0x7F, 0x70, 0x7E, 0x0E, 0x02, 0x2E, 0xA2, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, \r
+0xF4, 0x5E, 0x22, 0x7F, 0x7C, 0x7E, 0x08, 0x12, 0x2D, 0x5C, 0xEC, 0x22, 0x90, 0x81, 0x0A, 0xE0, \r
+0xFF, 0x7D, 0x01, 0x02, 0x49, 0x0F, 0x90, 0x81, 0x04, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, \r
+0x30, 0xE0, 0x19, 0xEF, 0x54, 0xBF, 0xD1, 0xED, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, \r
+0x09, 0xE0, 0x54, 0xFE, 0x12, 0x4F, 0xFB, 0x74, 0x04, 0xF0, 0xB1, 0x9C, 0xE4, 0xFF, 0x90, 0x83, \r
+0x7B, 0xE0, 0x30, 0xE0, 0x3D, 0x90, 0x83, 0x80, 0xE0, 0xFD, 0x60, 0x36, 0x12, 0x6D, 0xD2, 0x80, \r
+0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, 0xE0, 0xE0, 0xFB, 0xEF, 0x5B, \r
+0x60, 0x0B, 0xE4, 0x90, 0x83, 0x80, 0xF0, 0x90, 0x83, 0x82, 0x04, 0xF0, 0x22, 0x90, 0x83, 0x7D, \r
+0xE0, 0xD3, 0x9D, 0x50, 0x04, 0xD1, 0x87, 0xF0, 0x22, 0x12, 0x4C, 0x0B, 0x90, 0x83, 0x80, 0xE0, \r
+0x04, 0xF0, 0x22, 0x90, 0x81, 0x04, 0xD1, 0x7E, 0x30, 0xE0, 0x1E, 0xEF, 0x54, 0x7F, 0xD1, 0xED, \r
+0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x08, 0xE0, 0x54, 0xFD, 0x12, 0x4F, 0xFB, 0x04, \r
+0xF0, 0x90, 0x81, 0x08, 0xE0, 0x60, 0x02, 0xB1, 0x9C, 0x7F, 0x01, 0x80, 0x91, 0x90, 0x84, 0x3B, \r
+0xEF, 0xF0, 0x90, 0x80, 0x06, 0xE0, 0x64, 0x02, 0x70, 0x21, 0x90, 0x84, 0x3B, 0xE0, 0xFD, 0x64, \r
+0x01, 0x70, 0x27, 0xD1, 0xE5, 0x90, 0x81, 0xB7, 0xE0, 0xD1, 0x80, 0x30, 0xE0, 0x09, 0x90, 0x01, \r
+0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x80, 0x13, 0xAF, 0x05, 0x80, 0x0C, 0x90, 0x06, 0x90, 0xE0, 0x44, \r
+0x01, 0xF0, 0x90, 0x84, 0x3B, 0xE0, 0xFF, 0x12, 0x52, 0x5B, 0xD1, 0x91, 0xF0, 0x22, 0xE0, 0xFF, \r
+0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x22, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0x7F, 0x01, 0xD1, \r
+0x3D, 0x90, 0x83, 0x7B, 0xE0, 0x54, 0xFE, 0x22, 0x12, 0x78, 0x7D, 0xAD, 0x07, 0x90, 0x01, 0xC4, \r
+0x74, 0x98, 0xF0, 0x74, 0x5E, 0xA3, 0xF0, 0xED, 0x64, 0x01, 0x60, 0x1C, 0xD1, 0xE5, 0xED, 0xB4, \r
+0x02, 0x08, 0x90, 0x01, 0xC7, 0x74, 0x40, 0xF0, 0x80, 0x0A, 0xED, 0xB4, 0x04, 0x06, 0x90, 0x01, \r
+0xC7, 0x74, 0x41, 0xF0, 0x7F, 0x01, 0xC1, 0x3D, 0x12, 0x66, 0x4D, 0x90, 0x02, 0x87, 0xE0, 0x70, \r
+0xF7, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x98, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, \r
+0x5E, 0xA3, 0xF0, 0x22, 0xF0, 0x90, 0x81, 0xBC, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xF0, 0x90, 0x04, \r
+0xE0, 0xE0, 0x90, 0x81, 0x05, 0x22, 0x51, 0xCB, 0x7D, 0x0C, 0x7F, 0x01, 0x02, 0x4B, 0x2A, 0x90, \r
+0x81, 0xAC, 0xE0, 0xFF, 0x90, 0x81, 0x11, 0xE0, 0xD3, 0x9F, 0x22, 0x12, 0x20, 0xBB, 0xA8, 0x04, \r
+0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x22, 0xF1, 0x43, 0x12, 0x71, 0x04, 0x12, 0x75, 0x9F, 0x51, \r
+0xA2, 0xF1, 0x8E, 0x12, 0x79, 0xA4, 0x90, 0x83, 0x83, 0xE0, 0x54, 0x7F, 0xF0, 0x54, 0xBF, 0xF0, \r
+0x54, 0xDF, 0xF0, 0x54, 0xF0, 0xF0, 0xE4, 0x90, 0x83, 0x85, 0xF0, 0x90, 0x83, 0x83, 0xE0, 0x54, \r
+0xEF, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x12, 0x79, 0xF0, 0xED, 0x70, 0x12, 0xF1, 0x83, 0xC0, 0x83, \r
+0xC0, 0x82, 0xF1, 0x7B, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5E, 0x80, 0x0F, 0xF1, 0x83, \r
+0xC0, 0x83, 0xC0, 0x82, 0xF1, 0x7B, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4E, 0xD0, 0x82, 0xD0, \r
+0x83, 0xF0, 0x12, 0x71, 0x12, 0x90, 0x81, 0x02, 0xEF, 0xF0, 0x22, 0xE0, 0xFE, 0x74, 0x01, 0xA8, \r
+0x07, 0x08, 0x22, 0x74, 0xFA, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0x22, 0x90, 0x83, \r
+0x77, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xFB, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xE4, \r
+0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xE4, 0xFF, 0x74, 0x7F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, \r
+0x83, 0xE0, 0xFE, 0x74, 0xA4, 0x11, 0xD1, 0x0F, 0xEF, 0xB4, 0x08, 0xEB, 0x90, 0x82, 0x87, 0xE0, \r
+0x90, 0x04, 0x4C, 0xF0, 0x22, 0x22, 0x22, 0x22, 0x22, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x22, \r
+0x7D, 0x01, 0x7F, 0x02, 0x21, 0x4F, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x22, 0x90, 0x06, \r
+0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x00, 0xF7, 0xE0, 0x20, 0xE7, 0x09, 0xE0, 0x7F, 0x01, \r
+0x20, 0xE6, 0x0C, 0x7F, 0x02, 0x22, 0x90, 0x00, 0xF7, 0xE0, 0x30, 0xE6, 0x02, 0x7F, 0x03, 0x22, \r
+0x12, 0x5F, 0xE6, 0x90, 0x80, 0x06, 0xEF, 0xF0, 0x11, 0x21, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, \r
+0x90, 0x00, 0x12, 0xE0, 0x54, 0xC7, 0x44, 0x20, 0xFD, 0x7F, 0x12, 0x12, 0x32, 0x1E, 0x02, 0x2D, \r
+0xA7, 0x11, 0x51, 0x11, 0x7F, 0x12, 0x71, 0x6A, 0x12, 0x71, 0x89, 0xE4, 0xF5, 0x35, 0xF5, 0x36, \r
+0xF5, 0x37, 0x75, 0x38, 0x80, 0xAD, 0x35, 0x7F, 0x50, 0x12, 0x32, 0x1E, 0xAD, 0x36, 0x7F, 0x51, \r
+0x12, 0x32, 0x1E, 0xAD, 0x37, 0x7F, 0x52, 0x12, 0x32, 0x1E, 0xAD, 0x38, 0x7F, 0x53, 0x02, 0x32, \r
+0x1E, 0x90, 0x01, 0x30, 0xE4, 0x11, 0x77, 0x90, 0x01, 0x38, 0x11, 0x77, 0xFD, 0x7F, 0x50, 0x12, \r
+0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x32, 0x1E, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x32, 0x1E, \r
+0xE4, 0xFD, 0x7F, 0x53, 0x02, 0x32, 0x1E, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, \r
+0x01, 0x34, 0x74, 0xFF, 0x11, 0x77, 0x90, 0x01, 0x3C, 0x11, 0x77, 0xFD, 0x7F, 0x54, 0x12, 0x32, \r
+0x1E, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x32, 0x1E, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x32, 0x1E, 0x7D, \r
+0xFF, 0x7F, 0x57, 0x02, 0x32, 0x1E, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x83, 0x9E, \r
+0x74, 0x08, 0xF0, 0xE4, 0xA3, 0x11, 0x77, 0x90, 0x83, 0xA5, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xF1, \r
+0x52, 0xD1, 0x44, 0xD1, 0x15, 0x90, 0x02, 0x82, 0xE0, 0x90, 0x83, 0x9D, 0xF0, 0x90, 0x81, 0xB3, \r
+0xE0, 0x20, 0xE0, 0x02, 0x41, 0xB0, 0x90, 0x81, 0xBC, 0xE0, 0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, \r
+0xE0, 0x30, 0xE2, 0x1A, 0x90, 0x80, 0x06, 0xE0, 0xB4, 0x01, 0x0E, 0x90, 0xFD, 0x01, 0xE0, 0x20, \r
+0xE6, 0x07, 0x90, 0xFD, 0x00, 0xE0, 0x44, 0x10, 0xF0, 0x7F, 0x01, 0x12, 0x5E, 0x3D, 0xE4, 0x90, \r
+0x83, 0x9C, 0xF0, 0x90, 0x83, 0x9D, 0xE0, 0xFF, 0x90, 0x83, 0x9C, 0xE0, 0xC3, 0x9F, 0x40, 0x02, \r
+0x41, 0xB0, 0xD1, 0x1D, 0xFD, 0xEC, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0xAE, 0x05, 0xAA, 0x06, 0x90, \r
+0x83, 0xA0, 0xEF, 0xF0, 0x74, 0x02, 0x2A, 0xF1, 0x80, 0xFF, 0x74, 0x03, 0x2A, 0xF1, 0x49, 0x54, \r
+0x03, 0xFE, 0xEF, 0x24, 0x18, 0x2E, 0x90, 0x83, 0xA5, 0xF0, 0xE0, 0xFF, 0x2A, 0x90, 0x83, 0x98, \r
+0xF0, 0x7E, 0x00, 0xD1, 0x1D, 0x2F, 0xFF, 0xEE, 0x3C, 0x90, 0x83, 0x99, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0x90, 0x83, 0x98, 0xE0, 0xFD, 0x24, 0x00, 0xB1, 0xB1, 0xE0, 0xFE, 0x54, 0xFC, 0x90, 0x83, 0x9B, \r
+0xF0, 0xAF, 0x06, 0xD1, 0x2F, 0xFD, 0x90, 0x83, 0x98, 0xE0, 0xF1, 0x39, 0x12, 0x79, 0x1A, 0x90, \r
+0x83, 0x9F, 0xEF, 0xF0, 0x74, 0x01, 0x2A, 0xD1, 0x32, 0xFE, 0x74, 0x00, 0x2A, 0xB1, 0xB1, 0xD1, \r
+0x44, 0x54, 0x3F, 0xFE, 0x90, 0x83, 0xA1, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x83, 0xA5, 0xE0, 0x2F, \r
+0xFF, 0xEC, 0x3E, 0xFE, 0xF1, 0x10, 0x74, 0x0F, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, \r
+0xE0, 0xFD, 0x90, 0x83, 0x96, 0xF1, 0x71, 0x90, 0x83, 0x96, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9F, \r
+0xEA, 0x9E, 0x40, 0x1D, 0x90, 0x83, 0x96, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x80, 0xF8, 0xE0, \r
+0xFA, 0xA3, 0xE0, 0x24, 0x01, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0xEF, 0x9B, 0xFF, 0xEE, 0x9A, 0xD1, \r
+0x15, 0xED, 0x30, 0xE7, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x21, 0xF0, 0xED, 0x30, 0xE6, 0x06, 0x90, \r
+0x01, 0xC7, 0x74, 0x22, 0xF0, 0xED, 0x30, 0xE5, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x23, 0xF0, 0x90, \r
+0x83, 0x9B, 0xE0, 0x24, 0x40, 0x60, 0x04, 0x24, 0x20, 0x70, 0x16, 0x90, 0x81, 0xB6, 0x12, 0x5E, \r
+0x7E, 0x30, 0xE0, 0x54, 0xB1, 0xC8, 0x60, 0x50, 0x90, 0x83, 0x9B, 0xE0, 0xFF, 0xF1, 0xCA, 0x80, \r
+0x47, 0xB1, 0xC8, 0x60, 0x1A, 0x51, 0xB5, 0x90, 0x83, 0x9E, 0xE0, 0xFB, 0x90, 0x83, 0xA0, 0xE0, \r
+0x90, 0x83, 0xAC, 0xF0, 0x51, 0xC3, 0xEF, 0x60, 0x06, 0x90, 0x83, 0xA7, 0x74, 0x01, 0xF0, 0x90, \r
+0x81, 0xB3, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x0D, 0x51, 0xB5, 0x71, 0x63, 0xEF, 0x60, 0x06, 0x90, \r
+0x83, 0xA7, 0x74, 0x01, 0xF0, 0x90, 0x81, 0xB3, 0x12, 0x5E, 0x7E, 0x30, 0xE0, 0x0A, 0x90, 0x83, \r
+0xA7, 0xE0, 0x70, 0x04, 0x51, 0xB5, 0x91, 0xFA, 0x90, 0x81, 0xBC, 0xE0, 0x20, 0xE0, 0x07, 0x90, \r
+0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x5E, 0x3D, 0x12, 0x78, 0x93, 0xEF, 0x64, \r
+0x01, 0x70, 0x3D, 0x12, 0x78, 0x7D, 0x90, 0x83, 0xA6, 0xEF, 0xF0, 0x64, 0x01, 0x60, 0x24, 0x12, \r
+0x5E, 0xE5, 0x90, 0x83, 0xA6, 0xE0, 0xFF, 0xB4, 0x02, 0x08, 0x90, 0x01, 0xC7, 0x74, 0x42, 0xF0, \r
+0x80, 0x0A, 0xEF, 0xB4, 0x04, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x43, 0xF0, 0x7F, 0x01, 0x12, 0x5E, \r
+0x3D, 0x80, 0x0D, 0x90, 0x83, 0x96, 0xF1, 0xA1, 0x90, 0x83, 0x9C, 0xE0, 0x04, 0xF0, 0x21, 0x03, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x83, 0x99, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x83, 0x9F, \r
+0xE0, 0xFD, 0x22, 0x90, 0x83, 0xAA, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0xD1, 0x0D, 0xF0, 0xE4, 0x90, \r
+0x83, 0xAD, 0xF0, 0xFD, 0x71, 0x39, 0xEF, 0x54, 0x0C, 0x64, 0x08, 0x70, 0x48, 0xD1, 0x25, 0xE0, \r
+0xB1, 0xC1, 0x64, 0x88, 0x70, 0x3F, 0xD1, 0x25, 0xE0, 0x24, 0x07, 0xFD, 0x71, 0x39, 0xEF, 0x64, \r
+0x8E, 0x70, 0x32, 0x90, 0x83, 0xAD, 0x04, 0xF0, 0xD1, 0xFD, 0x04, 0xFD, 0x71, 0x39, 0xEF, 0x64, \r
+0x03, 0x70, 0x22, 0xD1, 0xFD, 0xB1, 0xC1, 0x30, 0xE3, 0x07, 0x90, 0x01, 0xC7, 0x74, 0x01, 0x80, \r
+0x11, 0x90, 0x81, 0xB6, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x08, 0x90, 0x01, 0xC7, \r
+0x74, 0x02, 0x12, 0x5E, 0xE4, 0x90, 0x83, 0xAD, 0xE0, 0xFF, 0x22, 0xCD, 0x34, 0x00, 0xFC, 0x7E, \r
+0x00, 0xED, 0x2F, 0xFF, 0xEE, 0x3C, 0xFE, 0xE4, 0xFD, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, \r
+0xE4, 0x3A, 0xFA, 0xC3, 0x90, 0x80, 0xF9, 0xE0, 0x9B, 0x90, 0x80, 0xF8, 0xE0, 0x9A, 0x50, 0x09, \r
+0xA3, 0xF1, 0x64, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xF1, 0x41, 0x74, 0x00, 0x2F, 0xB1, 0xB1, \r
+0xE0, 0xFF, 0x22, 0xD1, 0x0D, 0xF0, 0xA3, 0xED, 0xF0, 0x78, 0xB1, 0x7C, 0x83, 0x7D, 0x01, 0x7B, \r
+0xFF, 0x7A, 0x40, 0x79, 0xC0, 0xF1, 0x32, 0x78, 0xB7, 0x7C, 0x83, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, \r
+0x40, 0x79, 0xC6, 0xB1, 0xAA, 0x78, 0xBB, 0x7C, 0x83, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, \r
+0xCA, 0xB1, 0xAA, 0xE4, 0x90, 0x83, 0xC0, 0xF0, 0x91, 0x9B, 0xCF, 0x24, 0x06, 0xB1, 0xA0, 0x64, \r
+0x08, 0x60, 0x02, 0x81, 0x95, 0x91, 0x9B, 0xCF, 0x24, 0x07, 0xB1, 0xA0, 0x64, 0x06, 0x60, 0x02, \r
+0x81, 0x95, 0x90, 0x83, 0xC0, 0x04, 0xF0, 0xE4, 0x90, 0x83, 0xBF, 0xF0, 0x91, 0xAD, 0x94, 0x06, \r
+0x50, 0x1C, 0x90, 0x83, 0xA9, 0xE0, 0x24, 0x0A, 0xFD, 0x90, 0x83, 0xA8, 0xE0, 0x71, 0x2C, 0x90, \r
+0x83, 0xBF, 0xE0, 0x24, 0xAB, 0xF5, 0x82, 0xE4, 0x34, 0x83, 0x91, 0xB4, 0x80, 0xDE, 0x78, 0xAB, \r
+0x7C, 0x83, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xC3, 0xF1, 0x5B, 0x60, 0x02, 0x81, 0x95, \r
+0x90, 0x83, 0xBF, 0xF0, 0x91, 0xAD, 0x94, 0x04, 0x50, 0x18, 0xD1, 0x01, 0x91, 0xA6, 0xCD, 0x24, \r
+0x20, 0x71, 0x2B, 0x90, 0x83, 0xBF, 0xE0, 0x24, 0xBB, 0xF5, 0x82, 0xE4, 0x34, 0x83, 0x91, 0xB4, \r
+0x80, 0xE2, 0x78, 0xBB, 0x7C, 0x83, 0xF1, 0x90, 0x70, 0x72, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x01, \r
+0x54, 0xDF, 0xF0, 0x90, 0x81, 0xB5, 0xE0, 0x30, 0xE0, 0x0A, 0x90, 0x01, 0xC7, 0x74, 0x09, 0x12, \r
+0x5E, 0xE4, 0x80, 0x61, 0xE4, 0x90, 0x83, 0xBF, 0xF0, 0x91, 0xAD, 0x94, 0x06, 0x50, 0x18, 0xD1, \r
+0x01, 0x91, 0xA6, 0xCD, 0x24, 0x10, 0x71, 0x2B, 0x90, 0x83, 0xBF, 0xE0, 0x24, 0xB1, 0xF5, 0x82, \r
+0xE4, 0x34, 0x83, 0x91, 0xB4, 0x80, 0xE2, 0xE4, 0x90, 0x83, 0xBF, 0xF0, 0x91, 0xAD, 0x94, 0x04, \r
+0x50, 0x18, 0xD1, 0x01, 0x91, 0xA6, 0xCD, 0x24, 0x16, 0x71, 0x2B, 0x90, 0x83, 0xBF, 0xE0, 0x24, \r
+0xB7, 0xF5, 0x82, 0xE4, 0x34, 0x83, 0x91, 0xB4, 0x80, 0xE2, 0x7B, 0x01, 0x7A, 0x83, 0x79, 0xB1, \r
+0xF1, 0xBD, 0xF0, 0x7A, 0x83, 0x79, 0xB7, 0x12, 0x4E, 0x13, 0x80, 0x09, 0x90, 0x06, 0x30, 0xE0, \r
+0x44, 0x21, 0x54, 0xEF, 0xF0, 0x90, 0x83, 0xC0, 0xE0, 0xFF, 0x22, 0x90, 0x83, 0xAA, 0xE0, 0xFF, \r
+0x90, 0x83, 0xA9, 0xE0, 0x2F, 0xFF, 0x90, 0x83, 0xA8, 0xE0, 0x34, 0x00, 0x22, 0x90, 0x83, 0xBF, \r
+0xE0, 0xFF, 0xC3, 0x22, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x83, 0xBF, 0xE0, 0x04, 0xF0, 0x22, 0x90, \r
+0x83, 0xB8, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7D, 0x09, 0x71, 0x39, 0xEF, 0x64, 0x06, 0x70, 0x27, \r
+0xB1, 0xB9, 0xFF, 0x7D, 0x14, 0x71, 0x39, 0xEF, 0x70, 0x1D, 0xB1, 0xB9, 0xFF, 0x7D, 0x15, 0x71, \r
+0x39, 0xEF, 0x64, 0x50, 0x70, 0x11, 0xB1, 0xB9, 0xFF, 0x7D, 0x21, 0x71, 0x39, 0xEF, 0x20, 0xE0, \r
+0x03, 0x30, 0xE2, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xD1, 0x0D, 0xF0, 0xA3, 0xED, 0xF0, \r
+0x78, 0xAB, 0x7C, 0x83, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0xD4, 0xF1, 0x32, 0x78, 0xB2, \r
+0x7C, 0x83, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0xDA, 0xB1, 0xAA, 0x90, 0x83, 0xA8, 0xA3, \r
+0xB1, 0xCB, 0x60, 0x7B, 0x91, 0x9B, 0xFE, 0x90, 0x83, 0xB6, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x06, \r
+0xFF, 0xE4, 0x3E, 0xB1, 0xA3, 0x64, 0x08, 0x70, 0x66, 0x90, 0x83, 0xB7, 0xE0, 0x24, 0x07, 0xFF, \r
+0x90, 0x83, 0xB6, 0xE0, 0xB1, 0xA1, 0x70, 0x57, 0x90, 0x83, 0xB1, 0xF0, 0x90, 0x83, 0xB1, 0xE0, \r
+0xFF, 0xC3, 0x94, 0x04, 0x50, 0x24, 0x90, 0x83, 0xB7, 0xE0, 0x24, 0x18, 0xFD, 0x90, 0x83, 0xB6, \r
+0xE0, 0x71, 0x2C, 0x90, 0x83, 0xB1, 0xE0, 0x24, 0xB2, 0xF5, 0x82, 0xE4, 0x34, 0x83, 0xF5, 0x83, \r
+0xEF, 0xF0, 0x90, 0x83, 0xB1, 0xE0, 0x04, 0xF0, 0x80, 0xD2, 0x78, 0xB2, 0x7C, 0x83, 0xF1, 0x90, \r
+0x70, 0x1D, 0x90, 0x83, 0xB7, 0xE0, 0x24, 0x08, 0xFF, 0x90, 0x83, 0xB6, 0xE0, 0x34, 0x00, 0xFE, \r
+0x91, 0xBF, 0xEF, 0x64, 0x01, 0x60, 0x08, 0x90, 0x01, 0xC7, 0x74, 0x22, 0x12, 0x5E, 0xE4, 0x22, \r
+0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x39, 0xEF, 0x22, 0x7E, 0x00, 0x7F, 0x04, 0x02, 0x41, \r
+0xD0, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0x22, 0x90, 0x83, 0xB8, 0xE0, 0xFE, 0xA3, 0xE0, \r
+0x22, 0x24, 0x06, 0xFD, 0x71, 0x39, 0xEF, 0x22, 0x90, 0x83, 0x98, 0xE0, 0xFF, 0xB1, 0xD1, 0xEF, \r
+0x22, 0xE4, 0xFE, 0xEF, 0x2E, 0xF1, 0x39, 0xF5, 0x83, 0xE0, 0xFD, 0x74, 0xB8, 0x2E, 0xF5, 0x82, \r
+0xE4, 0x34, 0x83, 0xF5, 0x83, 0xED, 0xF0, 0x0E, 0xEE, 0xB4, 0x06, 0xE7, 0x78, 0xBD, 0x7C, 0x81, \r
+0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x83, 0x79, 0xB8, 0xF1, 0x5B, 0x7F, 0x00, 0x70, 0x02, 0x7F, 0x01, \r
+0x22, 0x90, 0x83, 0xAA, 0xE0, 0xFD, 0x90, 0x83, 0xA9, 0xE0, 0x2D, 0xFD, 0x22, 0x90, 0x83, 0xA8, \r
+0xEE, 0xF0, 0xA3, 0xEF, 0x22, 0x90, 0x83, 0x96, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x90, 0x83, 0x96, \r
+0xE0, 0xFC, 0xA3, 0xE0, 0x22, 0x90, 0x83, 0xA8, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0x22, 0x74, \r
+0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x22, 0xF0, 0x90, 0x01, 0x17, 0xE0, \r
+0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x22, 0xF1, 0x52, 0xD1, \r
+0x44, 0x90, 0x83, 0x9A, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x87, 0xE0, 0x90, 0x83, 0x9E, 0xF0, \r
+0x90, 0x81, 0xB3, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0xFC, 0x90, 0x83, 0x9E, 0xE0, 0xFF, 0xEC, 0xC3, \r
+0x9F, 0x40, 0x02, 0xC1, 0xFC, 0x90, 0x83, 0x9A, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xF1, 0x41, 0xAD, \r
+0x07, 0x74, 0x02, 0x2D, 0xF1, 0x80, 0xF9, 0xD1, 0x2F, 0xFE, 0x74, 0x00, 0x2D, 0xB1, 0xB1, 0xE0, \r
+0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0x90, 0x83, 0x9C, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0x74, 0x03, 0x2D, 0xF1, 0x49, 0x54, 0x03, 0xFF, 0x7E, 0x00, 0xAD, 0x01, 0xED, 0x24, 0x18, 0xFB, \r
+0xEA, 0x33, 0xCB, 0x2F, 0xFF, 0xEE, 0x3B, 0x90, 0x83, 0x9C, 0x8F, 0xF0, 0x12, 0x41, 0xF6, 0x90, \r
+0x83, 0x9C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xF1, 0x10, 0x90, 0x83, 0x9C, 0xEE, 0xF0, 0xA3, 0xEF, \r
+0xF0, 0x90, 0x83, 0x9A, 0xF1, 0x71, 0xD3, 0x90, 0x83, 0x9B, 0xE0, 0x9F, 0x90, 0x83, 0x9A, 0xE0, \r
+0x9E, 0x40, 0x11, 0x90, 0x80, 0xF9, 0xF1, 0x64, 0x90, 0x83, 0x9B, 0xE0, 0x9F, 0xF0, 0x90, 0x83, \r
+0x9A, 0xE0, 0x9E, 0xF0, 0x90, 0x83, 0x9A, 0xF1, 0xA1, 0x0C, 0xC1, 0x69, 0x22, 0x90, 0x83, 0xA8, \r
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x83, 0xAB, 0xE0, 0xFD, 0x90, 0x83, 0xAA, 0xE0, 0x2D, 0x22, \r
+0x7D, 0x7F, 0xEF, 0x5D, 0xC3, 0x60, 0x0A, 0xF1, 0x25, 0x24, 0x80, 0xFF, 0xE4, 0x3E, 0xFE, 0x80, \r
+0x03, 0xF1, 0x25, 0xFF, 0x22, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, \r
+0x5F, 0x22, 0x7E, 0x00, 0x7F, 0x06, 0x02, 0x41, 0xD0, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0xFB, \r
+0x22, 0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, 0x03, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, \r
+0xE0, 0x22, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0x22, 0x7E, 0x00, 0x7F, 0x06, 0x12, \r
+0x43, 0xEF, 0xEF, 0x22, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x80, 0xF8, 0xE0, 0x34, 0x00, 0xFE, 0xC3, \r
+0x22, 0xEE, 0x8F, 0xF0, 0x12, 0x41, 0xF6, 0x90, 0x80, 0xF8, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0x22, \r
+0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xD9, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x43, 0xEF, 0xEF, \r
+0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x02, 0x84, 0xEF, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xE0, \r
+0x44, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x80, 0x01, 0x11, 0x77, 0xA3, 0xF0, 0x22, 0x90, 0x83, 0xC4, \r
+0x12, 0x42, 0x3A, 0xE4, 0x90, 0x83, 0xC7, 0xF0, 0xA3, 0x22, 0xEF, 0x90, 0x01, 0xC7, 0xB4, 0xA0, \r
+0x05, 0x74, 0x04, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x02, 0x5E, 0xE5, 0x75, 0xE8, 0x03, 0x75, \r
+0xA8, 0x84, 0x22, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x32, 0x1E, 0x90, \r
+0xFD, 0x00, 0xE0, 0x54, 0xBF, 0xF0, 0x12, 0x68, 0x4A, 0x12, 0x32, 0x77, 0x12, 0x68, 0x38, 0x12, \r
+0x67, 0xB4, 0x7F, 0x01, 0x12, 0x45, 0x54, 0x90, 0x83, 0x76, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x45, \r
+0x54, 0x90, 0x83, 0x76, 0xE0, 0x04, 0xF0, 0x12, 0x60, 0x00, 0x12, 0x5F, 0x17, 0x90, 0x00, 0x80, \r
+0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x32, 0x1E, 0x75, 0x20, 0xFF, 0x12, 0x67, 0xDC, 0x11, \r
+0x39, 0x11, 0x40, 0xE4, 0xFF, 0x02, 0x45, 0xDD, 0x22, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, \r
+0x90, 0x01, 0xE4, 0x74, 0x14, 0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, \r
+0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0x83, 0x91, 0xF0, 0x90, 0x83, 0x91, 0xE0, \r
+0x64, 0x01, 0xF0, 0x24, 0x57, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x90, 0x81, 0x08, \r
+0xE0, 0x60, 0x0F, 0x90, 0x81, 0x0B, 0xE0, 0xFF, 0x90, 0x81, 0x0A, 0xE0, 0x6F, 0x60, 0x03, 0x12, \r
+0x5D, 0x9C, 0xC2, 0xAF, 0x11, 0xE0, 0xBF, 0x01, 0x02, 0x11, 0x94, 0xD2, 0xAF, 0x51, 0x8F, 0x12, \r
+0x44, 0x8C, 0x80, 0xC8, 0x90, 0x81, 0x04, 0xE0, 0x30, 0xE0, 0x02, 0x11, 0x9E, 0x22, 0x90, 0x81, \r
+0x0B, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x0D, 0x31, 0xB7, 0xBF, 0x01, 0x08, 0x11, 0xB6, 0x90, \r
+0x01, 0xE5, 0xE0, 0x04, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x31, 0x18, 0x11, \r
+0xC6, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD1, 0x68, 0x90, 0x00, 0x08, 0xE0, 0x54, 0xEF, 0xFD, 0x7F, \r
+0x08, 0x12, 0x32, 0x1E, 0xE4, 0xFF, 0x31, 0x64, 0x90, 0x81, 0x05, 0xE0, 0x54, 0xEF, 0xF0, 0x22, \r
+0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0xE0, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x90, 0x83, 0x76, 0xE0, \r
+0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x14, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x07, \r
+0x51, 0x05, 0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE2, 0x74, 0xE0, 0x04, 0x90, 0x01, 0xC4, \r
+0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x81, 0x05, 0xE0, 0x44, 0x10, 0xF0, 0x90, \r
+0x81, 0x13, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x32, 0x1E, 0x90, 0x81, 0x09, 0xE0, 0x60, 0x12, 0x90, \r
+0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, \r
+0xF0, 0x90, 0x00, 0x08, 0xE0, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, 0x32, 0x1E, 0x7F, 0x01, 0x31, \r
+0x64, 0x90, 0x00, 0x90, 0xE0, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x32, 0x1E, 0x7F, 0x14, 0x7E, \r
+0x00, 0x02, 0x32, 0xAA, 0x90, 0x83, 0x92, 0xEF, 0x12, 0x5F, 0x9E, 0x90, 0x01, 0x09, 0xE0, 0x7F, \r
+0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0x83, 0x92, 0xE0, 0x6F, 0x60, 0x39, 0xC3, 0x90, 0x83, \r
+0x94, 0xE0, 0x94, 0x88, 0x90, 0x83, 0x93, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, \r
+0x44, 0x10, 0xF0, 0x22, 0x90, 0x83, 0x93, 0x51, 0x90, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x32, 0xAA, \r
+0xD3, 0x90, 0x83, 0x94, 0xE0, 0x94, 0x32, 0x90, 0x83, 0x93, 0xE0, 0x94, 0x00, 0x40, 0xBC, 0x90, \r
+0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB5, 0x22, 0x90, 0x02, 0x87, 0xE0, 0x60, 0x04, 0x51, 0x80, 0x80, \r
+0x3B, 0x90, 0x81, 0xB3, 0xE0, 0x30, 0xE0, 0x0A, 0x90, 0x02, 0x82, 0xE0, 0x60, 0x04, 0x51, 0x79, \r
+0x80, 0x2A, 0x90, 0x81, 0xBC, 0xE0, 0x30, 0xE0, 0x04, 0x51, 0x05, 0x80, 0x1F, 0x90, 0x02, 0x86, \r
+0xE0, 0x20, 0xE1, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x04, 0xF0, 0x80, 0x10, 0x90, 0x04, 0x1D, 0xE0, \r
+0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x40, 0xF0, 0x80, 0x02, 0x41, 0x87, 0x90, 0x01, 0xB9, 0x74, \r
+0x08, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0x22, 0xD1, 0x4F, 0xEF, 0x64, \r
+0x01, 0x60, 0x04, 0x51, 0x80, 0x80, 0x59, 0x90, 0x81, 0x0C, 0xE0, 0xFF, 0x54, 0x03, 0x60, 0x04, \r
+0x51, 0x79, 0x80, 0x4C, 0x90, 0x81, 0x0A, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x50, 0x08, 0x90, 0x01, \r
+0xB8, 0x74, 0x04, 0xF0, 0x80, 0x3A, 0xEF, 0x30, 0xE2, 0x04, 0x51, 0x05, 0x80, 0x32, 0x90, 0x81, \r
+0x0C, 0xE0, 0x30, 0xE4, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x10, 0xF0, 0x80, 0x23, 0x90, 0x81, 0x05, \r
+0xE0, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x20, 0xF0, 0x80, 0x10, \r
+0x90, 0x81, 0xB2, 0xE0, 0x60, 0x08, 0x90, 0x01, 0xB8, 0x74, 0x80, 0xF0, 0x80, 0x02, 0x80, 0x17, \r
+0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x01, 0xB8, 0x74, 0x02, 0xF0, 0x22, \r
+0x90, 0x01, 0xB8, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x22, \r
+0xE4, 0x75, 0xF0, 0x01, 0x02, 0x41, 0xF6, 0xE4, 0x90, 0x84, 0x32, 0xF0, 0xA3, 0xF0, 0x90, 0x02, \r
+0x86, 0xE0, 0x20, 0xE1, 0x22, 0xC3, 0x90, 0x84, 0x33, 0xE0, 0x94, 0xD0, 0x90, 0x84, 0x32, 0xE0, \r
+0x94, 0x07, 0x40, 0x0A, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x84, \r
+0x32, 0x51, 0x90, 0x71, 0x13, 0x80, 0xD7, 0x7F, 0x01, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x90, 0x84, 0x13, 0xEE, 0xF0, 0xA3, 0xEF, 0x12, 0x5F, 0x9E, 0x90, 0x84, 0x13, 0xE0, 0xFE, \r
+0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x23, 0xC3, 0x90, 0x84, 0x16, 0xE0, 0x94, 0xE8, \r
+0x90, 0x84, 0x15, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, \r
+0x00, 0x80, 0x0B, 0x90, 0x84, 0x15, 0x51, 0x90, 0x71, 0x13, 0x80, 0xCF, 0x7F, 0x01, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0x7F, 0x0A, 0x7E, 0x00, 0x02, 0x32, 0xAA, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, \r
+0x12, 0x46, 0x8D, 0x90, 0x83, 0x95, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x80, 0x01, 0xE0, 0xFF, 0x70, \r
+0x04, 0xA3, 0xE0, 0x60, 0xE5, 0xC2, 0xAF, 0xEF, 0x30, 0xE1, 0x09, 0x90, 0x80, 0x01, 0xE0, 0x54, \r
+0xFD, 0xF0, 0x91, 0x2B, 0x71, 0x62, 0x30, 0xE2, 0x05, 0x54, 0xFB, 0xF0, 0x71, 0xC4, 0x71, 0x62, \r
+0x30, 0xE4, 0x0B, 0x54, 0xEF, 0xF0, 0x51, 0x97, 0xBF, 0x01, 0x03, 0x12, 0x60, 0xA6, 0xD2, 0xAF, \r
+0x80, 0xC8, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x80, 0x01, 0xE0, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0x90, 0x83, 0x96, 0x12, 0x42, 0x3A, 0x90, 0x84, 0x2B, 0xE0, 0xFF, 0x04, 0xF0, \r
+0xB1, 0xC9, 0x7F, 0xAF, 0x7E, 0x01, 0x51, 0xCA, 0xEF, 0x60, 0x34, 0x90, 0x83, 0x96, 0x12, 0x4F, \r
+0xEA, 0x90, 0x00, 0x0E, 0x12, 0x1F, 0xBD, 0x24, 0x02, 0xF5, 0x16, 0x7B, 0x01, 0x7A, 0x01, 0x79, \r
+0xA0, 0x12, 0x2B, 0xED, 0x90, 0x83, 0x96, 0x12, 0x42, 0x31, 0x90, 0x00, 0x0E, 0x12, 0x1F, 0xBD, \r
+0x90, 0x01, 0xAE, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x01, 0xCB, 0xE0, 0x64, 0x80, 0xF0, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x80, 0xF7, \r
+0xE0, 0xFE, 0x90, 0x80, 0xF6, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, \r
+0xEE, 0x64, 0x01, 0x60, 0x41, 0x90, 0x01, 0xAF, 0xE0, 0x70, 0x0A, 0xED, 0xB1, 0xDA, 0xFA, 0x7B, \r
+0x01, 0x71, 0x6C, 0x7F, 0x01, 0xEF, 0x60, 0x2E, 0x90, 0x80, 0xF6, 0xB1, 0x8D, 0xB4, 0x0A, 0x02, \r
+0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x80, 0xF6, 0xF0, 0x90, 0x80, 0xF7, 0xE0, 0xFF, 0x90, \r
+0x80, 0xF6, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x07, 0x90, \r
+0x80, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
+0xC0, 0xD0, 0x90, 0x80, 0x5F, 0xE0, 0xFF, 0x90, 0x80, 0x5E, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, \r
+0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x3F, 0x90, 0x80, 0x5E, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, \r
+0x80, 0x0E, 0x12, 0x42, 0x25, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x0F, 0xF9, 0x74, \r
+0x80, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x54, 0x77, 0x90, 0x80, 0x5E, 0xB1, 0x8D, \r
+0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x80, 0x5E, 0xF0, 0x91, 0x8B, 0x90, \r
+0x80, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, \r
+0x0F, 0x90, 0x84, 0x2C, 0xF0, 0x90, 0x84, 0x2C, 0xE0, 0xFD, 0x70, 0x02, 0xA1, 0x84, 0x90, 0x80, \r
+0x5E, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x80, \r
+0x5F, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, \r
+0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x84, 0x2A, 0xB1, 0xD0, 0x80, 0x05, 0xC3, 0x33, 0xCE, \r
+0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0xA1, 0x66, 0xE4, 0x90, 0x84, 0x2D, 0xF0, \r
+0x90, 0x84, 0x2D, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x31, 0xB1, 0x85, 0xA4, 0xFF, 0xE9, 0xFD, \r
+0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0xB1, 0xA4, 0x90, 0x80, 0x0E, 0xB1, \r
+0x94, 0xB1, 0x85, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xF0, 0xB1, 0xA4, 0x90, 0x80, \r
+0x12, 0xB1, 0x94, 0x90, 0x84, 0x2D, 0xE0, 0x04, 0xF0, 0x80, 0xC5, 0x90, 0x84, 0x2C, 0xE0, 0xFF, \r
+0x90, 0x84, 0x2A, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, \r
+0xF4, 0x5F, 0x90, 0x84, 0x2C, 0xF0, 0x90, 0x84, 0x2A, 0x12, 0x52, 0x53, 0x80, 0x02, 0xC3, 0x33, \r
+0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x84, 0x2A, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, \r
+0x90, 0x80, 0x5F, 0xB1, 0x8D, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x81, 0x95, 0xE4, \r
+0x90, 0x80, 0x5F, 0xF0, 0x81, 0x95, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x84, 0x2A, \r
+0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0xF0, 0xB1, 0x85, 0x90, 0x01, 0xD0, 0x12, 0x42, 0x25, 0xE0, \r
+0x90, 0x01, 0xC3, 0xF0, 0x22, 0x90, 0x84, 0x2A, 0xE0, 0x75, 0xF0, 0x04, 0x22, 0xE0, 0x04, 0xF0, \r
+0xE0, 0x7F, 0x00, 0x22, 0x12, 0x42, 0x25, 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, 0x80, \r
+0x5F, 0xE0, 0x75, 0xF0, 0x08, 0x22, 0x91, 0x8B, 0x7F, 0x02, 0x8F, 0x0D, 0x7F, 0x02, 0x12, 0x46, \r
+0x66, 0x90, 0x80, 0x01, 0xE0, 0x45, 0x0D, 0xF0, 0x22, 0x90, 0x00, 0x01, 0xEF, 0x02, 0x1F, 0xFC, \r
+0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x22, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x60, \r
+0xF9, 0x74, 0x80, 0x35, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x80, 0xF6, \r
+0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x80, 0xF7, \r
+0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, \r
+0xE0, 0x44, 0x02, 0xF0, 0x80, 0x28, 0xC0, 0x01, 0x90, 0x80, 0xF7, 0xE0, 0xB1, 0xDA, 0xA8, 0x01, \r
+0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x41, 0xD0, 0x90, 0x80, 0xF7, 0xB1, \r
+0x8D, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x80, 0xF7, 0xF0, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0x90, 0x81, 0xB3, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x10, 0xB1, 0xBA, 0x22, 0x90, \r
+0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, \r
+0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0x01, 0xC4, 0x74, 0x68, 0xF0, 0x74, 0x6E, \r
+0xA3, 0xF0, 0x90, 0x00, 0x90, 0xE0, 0x20, 0xE0, 0xF9, 0x74, 0x68, 0x04, 0x90, 0x01, 0xC4, 0xF0, \r
+0x74, 0x6E, 0xA3, 0xF0, 0x22, 0xE4, 0x90, 0x83, 0x8E, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x00, \r
+0x83, 0xE0, 0x90, 0x83, 0x8E, 0xF0, 0x90, 0x00, 0x83, 0xE0, 0xFE, 0x90, 0x83, 0x8E, 0xE0, 0xFF, \r
+0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x83, 0x90, 0xE0, 0x94, 0x64, 0x90, 0x83, 0x8F, 0xE0, 0x94, \r
+0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x83, 0x8E, 0xE0, 0xFF, 0x22, \r
+0x90, 0x83, 0x8F, 0x51, 0x90, 0x80, 0xC7, 0xD1, 0x85, 0x90, 0x83, 0x8D, 0xEF, 0xF0, 0x30, 0xE0, \r
+0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x4B, 0x2A, 0x90, 0x83, 0x8D, 0xE0, \r
+0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, \r
+0x2F, 0x74, 0x80, 0xF0, 0x90, 0x81, 0x04, 0xE0, 0x90, 0x04, 0xEC, 0x30, 0xE0, 0x06, 0xE0, 0x54, \r
+0xDD, 0xF0, 0x80, 0x04, 0xE0, 0x44, 0x22, 0xF0, 0xF1, 0x7A, 0x90, 0x81, 0x21, 0xE0, 0xFB, 0xAC, \r
+0x07, 0x90, 0x81, 0x04, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x81, 0x3E, 0xE0, 0x24, 0x04, 0x90, 0x81, \r
+0x1D, 0xF0, 0x90, 0x81, 0x3E, 0xE0, 0x24, 0x03, 0x90, 0x81, 0x1C, 0xF0, 0x80, 0x0B, 0x90, 0x81, \r
+0x1D, 0x74, 0x02, 0xF0, 0x90, 0x81, 0x1C, 0x14, 0xF0, 0x90, 0x81, 0x1C, 0xE0, 0xFA, 0x90, 0x81, \r
+0x1B, 0xE0, 0xD3, 0x9A, 0x50, 0x09, 0x90, 0x81, 0x10, 0xEB, 0xF1, 0x72, 0x2C, 0x80, 0x0B, 0xAD, \r
+0x02, 0xC3, 0xED, 0x9D, 0x2B, 0x90, 0x81, 0x10, 0xF1, 0x72, 0x90, 0x81, 0x20, 0xF0, 0x90, 0x81, \r
+0x20, 0xE0, 0xFF, 0x7E, 0x00, 0x90, 0x81, 0x14, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x05, 0x58, \r
+0xF0, 0x22, 0xF0, 0x90, 0x81, 0x1D, 0xE0, 0xC3, 0x9D, 0x22, 0x90, 0x81, 0x1A, 0xE0, 0xFF, 0xA3, \r
+0xE0, 0xFD, 0x22, 0xE4, 0x90, 0x84, 0x2E, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, \r
+0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, \r
+0x90, 0x84, 0x2F, 0xE0, 0x94, 0xE8, 0x90, 0x84, 0x2E, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, \r
+0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x32, 0xAA, 0x90, \r
+0x84, 0x2E, 0x51, 0x90, 0x80, 0xC4, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x5B, 0x6D, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF0, 0xE4, 0xF5, 0x52, 0x90, 0x81, 0xAD, 0xE0, 0xF5, 0x53, 0xE4, \r
+0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8E, 0x4E, 0x8F, \r
+0x4F, 0xE5, 0x53, 0x12, 0x70, 0x3F, 0x85, 0x4E, 0x83, 0x85, 0x4F, 0x82, 0xF0, 0xE5, 0x52, 0x11, \r
+0x3F, 0xFF, 0xE5, 0x53, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x4F, 0xA3, 0xF0, 0xEB, 0x11, 0x3F, 0xFF, \r
+0xE5, 0x52, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x4F, 0x11, 0x46, 0xA3, 0xF0, 0xBD, 0x01, 0x0D, 0x85, \r
+0x4F, 0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0x74, 0x03, 0xF0, 0x80, 0x07, 0x11, 0x46, 0xA3, 0xA3, \r
+0x74, 0x01, 0xF0, 0x11, 0x46, 0xA3, 0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x54, \r
+0x07, 0xC4, 0x33, 0x54, 0xE0, 0x22, 0x85, 0x4F, 0x82, 0x85, 0x4E, 0x83, 0xA3, 0x22, 0x11, 0x83, \r
+0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x01, \r
+0x3C, 0x74, 0x04, 0xF0, 0xE4, 0xF5, 0x52, 0x90, 0x81, 0xAE, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0xF5, \r
+0x53, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x6F, 0xE6, 0x90, 0x81, 0x04, 0xE0, 0x44, \r
+0x08, 0xF0, 0x22, 0x90, 0x81, 0x04, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, 0x90, 0x84, 0x34, \r
+0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x46, 0x66, 0x90, 0x80, 0x01, 0xE0, 0xFF, 0x90, 0x84, 0x34, 0xE0, \r
+0xFE, 0xEF, 0x4E, 0x90, 0x80, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, \r
+0x1A, 0x8A, 0x1B, 0x89, 0x1C, 0x12, 0x1F, 0xA4, 0xFF, 0x90, 0x81, 0x03, 0xF0, 0xBF, 0x01, 0x0D, \r
+0x12, 0x53, 0x0A, 0x64, 0x01, 0x60, 0x19, 0x7D, 0x13, 0x7F, 0x6F, 0x80, 0x10, 0xAB, 0x1A, 0xAA, \r
+0x1B, 0xA9, 0x1C, 0x12, 0x53, 0x0A, 0x64, 0x01, 0x60, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x4B, 0x1B, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x1F, 0xA4, 0x54, 0x01, 0xFF, 0x90, 0x83, 0x88, 0xE0, 0x54, \r
+0xFE, 0x4F, 0xF0, 0x22, 0x12, 0x1F, 0xA4, 0x90, 0x81, 0x13, 0xF0, 0x22, 0x12, 0x1F, 0xA4, 0x90, \r
+0x81, 0xB2, 0xF0, 0x22, 0xE4, 0x90, 0x80, 0xF6, 0xF0, 0xA3, 0xF0, 0x90, 0x80, 0x5E, 0xF0, 0xA3, \r
+0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7D, 0x08, 0xED, 0x14, 0xF9, 0x24, 0xFA, \r
+0x12, 0x5F, 0x86, 0xE0, 0x60, 0x3B, 0x7C, 0x08, 0xEC, 0x14, 0x90, 0x84, 0x35, 0xF0, 0x74, 0xFA, \r
+0x29, 0x12, 0x5F, 0x86, 0xE0, 0xFB, 0x7A, 0x00, 0x90, 0x84, 0x35, 0x12, 0x6D, 0xD0, 0x80, 0x05, \r
+0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5A, 0xFE, 0xEF, 0x5B, 0x4E, 0x60, 0x0F, \r
+0xE9, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, 0x84, 0x35, 0xE0, 0x2F, 0x04, 0xFF, 0x80, 0x06, 0xDC, \r
+0xC7, 0xDD, 0xB8, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0x3D, 0x10, 0xE4, 0xF5, 0x3E, \r
+0x75, 0x3F, 0x07, 0x75, 0x40, 0x02, 0x90, 0x01, 0x30, 0xE5, 0x3D, 0xF0, 0xA3, 0xE5, 0x3E, 0xF0, \r
+0xA3, 0xE5, 0x3F, 0xF0, 0xA3, 0xE5, 0x40, 0xF0, 0x22, 0x75, 0x45, 0x06, 0x75, 0x46, 0x01, 0x75, \r
+0x47, 0x03, 0x75, 0x48, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x45, 0xF0, 0xA3, 0xE5, 0x46, 0xF0, 0xA3, \r
+0xE5, 0x47, 0xF0, 0xA3, 0xE5, 0x48, 0xF0, 0x22, 0x90, 0x00, 0x54, 0xE0, 0x55, 0x35, 0xF5, 0x39, \r
+0xA3, 0xE0, 0x55, 0x36, 0xF5, 0x3A, 0xA3, 0xE0, 0x55, 0x37, 0xF5, 0x3B, 0xA3, 0xE0, 0x55, 0x38, \r
+0xF5, 0x3C, 0xAD, 0x39, 0x7F, 0x54, 0x12, 0x32, 0x1E, 0xAD, 0x3A, 0x7F, 0x55, 0x12, 0x32, 0x1E, \r
+0xAD, 0x3B, 0x7F, 0x56, 0x12, 0x32, 0x1E, 0xAD, 0x3C, 0x7F, 0x57, 0x12, 0x32, 0x1E, 0x53, 0x91, \r
+0xEF, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x3D, 0xF5, 0x41, 0xA3, 0xE0, 0x55, 0x3E, 0xF5, 0x42, \r
+0xA3, 0xE0, 0x55, 0x3F, 0xF5, 0x43, 0xA3, 0xE0, 0x55, 0x40, 0xF5, 0x44, 0x90, 0x01, 0x34, 0xE5, \r
+0x41, 0xF0, 0xA3, 0xE5, 0x42, 0xF0, 0xA3, 0xE5, 0x43, 0xF0, 0xA3, 0xE5, 0x44, 0xF0, 0x22, 0x90, \r
+0x01, 0x3C, 0xE0, 0x55, 0x45, 0xF5, 0x49, 0xA3, 0xE0, 0x55, 0x46, 0xF5, 0x4A, 0xA3, 0xE0, 0x55, \r
+0x47, 0xF5, 0x4B, 0xA3, 0xE0, 0x55, 0x48, 0xF5, 0x4C, 0x90, 0x01, 0x3C, 0xE5, 0x49, 0xF0, 0xA3, \r
+0xE5, 0x4A, 0xF0, 0xA3, 0xE5, 0x4B, 0xF0, 0xA3, 0xE5, 0x4C, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, \r
+0x01, 0xCF, 0xE0, 0x90, 0x84, 0x37, 0xF0, 0xE0, 0xFF, 0x30, 0xE0, 0x07, 0x90, 0x01, 0xCF, 0xE0, \r
+0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x23, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, \r
+0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x12, 0x60, 0x51, 0x90, 0x00, 0x03, 0xE0, \r
+0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x32, 0x1E, 0x80, 0xFE, 0x22, 0x90, 0x81, 0x08, 0xE0, 0x60, \r
+0x47, 0x90, 0x81, 0x04, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0x81, 0x1F, 0xE0, 0x04, 0x91, 0xBF, 0xCE, \r
+0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x81, 0x3F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x71, \r
+0x10, 0x30, 0xE0, 0x0D, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x06, 0x12, 0x59, 0x4B, 0x12, 0x5F, \r
+0xD0, 0x90, 0x84, 0x36, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, \r
+0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xD1, 0xF5, 0x51, 0xD2, 0xE4, 0x90, 0x83, 0x7A, \r
+0xF0, 0x22, 0x90, 0x83, 0x77, 0xE0, 0x30, 0xE0, 0x36, 0x12, 0x4C, 0x5F, 0x64, 0x01, 0x70, 0x2F, \r
+0x90, 0x84, 0x3C, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x83, 0x79, 0xE0, 0x04, 0xF0, \r
+0xE4, 0x90, 0x84, 0x3C, 0xF0, 0x90, 0x83, 0x79, 0xE0, 0xFF, 0x90, 0x83, 0x78, 0xE0, 0xD3, 0x9F, \r
+0x50, 0x0D, 0x90, 0x83, 0x7A, 0xE0, 0x70, 0x07, 0xE4, 0x90, 0x83, 0x79, 0xF0, 0xD1, 0xBD, 0x22, \r
+0x90, 0x81, 0x05, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x22, 0x91, 0xC0, 0xCE, 0xC3, 0x13, \r
+0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x83, 0x89, 0xEE, 0xF0, 0xA3, 0xEF, 0x12, 0x4C, 0x5E, 0x64, \r
+0x01, 0x60, 0x02, 0x61, 0xB8, 0x90, 0x81, 0x08, 0xE0, 0x60, 0x7D, 0x71, 0xB9, 0x64, 0x01, 0x70, \r
+0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x81, 0x0F, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x81, 0x0E, \r
+0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x81, 0x0E, 0xE0, 0xFE, 0xFF, 0x80, 0x00, 0x90, 0x81, \r
+0x0F, 0xEF, 0xF0, 0x71, 0xC2, 0xD1, 0x49, 0xE4, 0x90, 0x81, 0x11, 0xD1, 0x62, 0xF0, 0xD1, 0x6C, \r
+0xD1, 0x79, 0x54, 0xEF, 0xF0, 0x71, 0xB9, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x02, 0xB1, 0x42, 0x71, \r
+0x10, 0x30, 0xE0, 0x34, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x2B, 0x90, 0x81, 0x0E, \r
+0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x21, 0x90, 0x81, 0x05, 0xE0, 0x44, 0x40, 0xF0, 0xB1, 0x3A, \r
+0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0xD1, 0x59, 0x12, 0x5F, 0xD0, 0x12, \r
+0x59, 0x4B, 0x90, 0x81, 0x0F, 0xE0, 0x14, 0xF0, 0x22, 0x90, 0x81, 0x06, 0xE0, 0xFF, 0xC4, 0x54, \r
+0x0F, 0x22, 0xE4, 0xFD, 0xF9, 0xFC, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFB, \r
+0xEB, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xEE, 0x54, 0x3F, 0x90, 0x81, \r
+0x41, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x41, 0xE0, 0xFA, \r
+0xA3, 0xE0, 0xFB, 0xC3, 0x9F, 0xEA, 0x9E, 0x40, 0x21, 0xEB, 0x9F, 0xFF, 0x90, 0x81, 0x20, 0xE0, \r
+0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F, 0xF9, 0xC3, 0x94, 0x19, 0x50, 0x0E, 0x74, 0x25, 0x29, 0x91, \r
+0xAF, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x1E, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x1E, 0xE0, 0xC3, 0x94, \r
+0x64, 0x50, 0x02, 0x81, 0xAB, 0xE4, 0xFC, 0xFD, 0x91, 0xAC, 0xE0, 0x2C, 0xFC, 0xD3, 0x94, 0x05, \r
+0x40, 0x07, 0x90, 0x83, 0x8B, 0xED, 0xF0, 0x80, 0x05, 0x0D, 0xED, 0xB4, 0x19, 0xEA, 0xE4, 0xFC, \r
+0xFD, 0x91, 0xAC, 0xE0, 0x2C, 0xFC, 0xD3, 0x94, 0x5F, 0x40, 0x07, 0x90, 0x83, 0x8C, 0xED, 0xF0, \r
+0x80, 0x05, 0x0D, 0xED, 0xB4, 0x19, 0xEA, 0x90, 0x83, 0x8B, 0xE0, 0x90, 0x81, 0x23, 0xF0, 0x90, \r
+0x83, 0x8C, 0xE0, 0x90, 0x81, 0x24, 0x91, 0xB7, 0x94, 0x0B, 0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, \r
+0x81, 0x1B, 0xF0, 0xE4, 0x80, 0x09, 0xE4, 0x90, 0x81, 0x1B, 0x91, 0xB7, 0x74, 0x0A, 0x9F, 0x90, \r
+0x81, 0x1A, 0xF0, 0x90, 0x81, 0x23, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x90, 0x81, 0x21, 0xF0, \r
+0xC3, 0x94, 0x08, 0x50, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x81, 0x1B, 0xE0, 0xFD, 0x90, 0x81, 0x21, \r
+0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x6F, 0x0F, 0xE4, 0xFF, 0x91, 0xCE, 0x22, 0x74, 0x25, 0x2D, 0xF5, \r
+0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, 0xF0, 0x90, 0x81, 0x23, 0xE0, 0xFF, 0xC3, 0x22, 0xF0, \r
+0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, 0x22, 0xE4, 0xFE, \r
+0x74, 0x25, 0x2E, 0x91, 0xAF, 0xE4, 0xF0, 0x0E, 0xEE, 0xB4, 0x19, 0xF4, 0xE4, 0x90, 0x81, 0x1E, \r
+0xF0, 0x90, 0x81, 0x22, 0xF0, 0x90, 0x81, 0x1A, 0xF0, 0xEF, 0xB4, 0x01, 0x09, 0x90, 0x81, 0x23, \r
+0x74, 0x19, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0xE4, 0x90, 0x83, 0x8D, 0xF0, 0x90, 0x81, 0x08, 0xE0, \r
+0x60, 0x37, 0x12, 0x4C, 0x5F, 0x64, 0x01, 0x70, 0x30, 0xB1, 0x3A, 0x91, 0xBF, 0xCE, 0xC3, 0x13, \r
+0xCE, 0x13, 0xD8, 0xF9, 0xD1, 0x82, 0x90, 0x83, 0x8D, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x81, 0x0F, \r
+0xF0, 0x04, 0x60, 0x15, 0xD1, 0x51, 0xE4, 0xF5, 0x52, 0x90, 0x81, 0x10, 0x12, 0x6F, 0xDC, 0x90, \r
+0x81, 0x0B, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x49, 0x0B, 0x22, 0x90, 0x81, 0x0E, 0xE0, 0x90, 0x05, \r
+0x73, 0x22, 0xE4, 0xF5, 0x19, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x19, 0x54, 0xC0, 0x70, 0x08, 0xB1, \r
+0x97, 0x54, 0xFD, 0xF0, 0x02, 0x5D, 0x9C, 0xE5, 0x19, 0x30, 0xE6, 0x1E, 0x90, 0x81, 0x08, 0xE0, \r
+0x64, 0x01, 0x70, 0x18, 0x90, 0x81, 0x0C, 0xE0, 0x44, 0x01, 0x12, 0x57, 0xDC, 0x64, 0x02, 0x60, \r
+0x04, 0xD1, 0xD7, 0x80, 0x07, 0x12, 0x4C, 0x89, 0x80, 0x02, 0xB1, 0x97, 0xE5, 0x19, 0x90, 0x81, \r
+0x0C, 0x30, 0xE7, 0x0E, 0xE0, 0x44, 0x02, 0x12, 0x6F, 0xD5, 0x90, 0x81, 0x04, 0xE0, 0x44, 0x04, \r
+0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x81, 0x0C, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x7E, \r
+0x00, 0x7F, 0xA8, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0x04, 0x12, 0x44, 0x13, 0x90, 0x81, \r
+0x07, 0x74, 0x02, 0xF0, 0x90, 0x81, 0x0E, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, \r
+0x81, 0x14, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xD1, 0x3A, 0xE4, 0xFD, 0xFF, 0x12, 0x4B, 0x2A, \r
+0x7D, 0x0C, 0x7F, 0x02, 0x12, 0x4B, 0x2A, 0x12, 0x4B, 0x26, 0x90, 0x80, 0x06, 0xE0, 0xFF, 0xB4, \r
+0x01, 0x08, 0x90, 0x81, 0x13, 0x74, 0x99, 0xF0, 0x80, 0x29, 0xEF, 0xB4, 0x03, 0x08, 0x90, 0x81, \r
+0x13, 0x74, 0x90, 0xF0, 0x80, 0x1D, 0x90, 0x81, 0x13, 0x74, 0x40, 0xF0, 0x90, 0x00, 0x2C, 0xE0, \r
+0x54, 0x0F, 0xFF, 0xBF, 0x05, 0x08, 0x90, 0x81, 0x3E, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, \r
+0x81, 0x3E, 0xF0, 0x12, 0x56, 0x6E, 0xD1, 0x3A, 0x7F, 0x01, 0x91, 0xCE, 0x7E, 0x00, 0x7F, 0x02, \r
+0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x81, 0x79, 0xB0, 0x12, 0x44, 0x13, 0x12, 0x5F, 0xD6, 0x12, 0x5F, \r
+0xDE, 0x12, 0x5A, 0xCD, 0xE4, 0x90, 0x81, 0xB2, 0xF0, 0x22, 0x90, 0x81, 0x3E, 0xE0, 0x24, 0x04, \r
+0x90, 0x81, 0x20, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x22, 0x90, 0x81, 0x05, 0xE0, 0x44, 0x04, 0xF0, \r
+0x22, 0x90, 0x81, 0x0C, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x74, 0x45, 0x2F, 0xF8, 0xE6, 0x4D, 0x02, \r
+0x58, 0xCD, 0xF0, 0x90, 0x81, 0x14, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0x22, 0x90, 0x01, 0x57, 0xE4, \r
+0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0x22, 0x54, 0xFB, 0xF0, 0x90, 0x81, 0x0C, 0xE0, 0x54, 0xFD, \r
+0xF0, 0x22, 0xFF, 0xEE, 0x54, 0x3F, 0x90, 0x81, 0x43, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x90, 0x83, \r
+0x81, 0xE0, 0x04, 0xF0, 0x90, 0x81, 0x0B, 0xE0, 0x64, 0x02, 0x60, 0x08, 0x71, 0x1B, 0x90, 0x01, \r
+0xE6, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0xFF, 0x12, 0x4C, 0x65, 0xBF, 0x01, 0x0F, 0x90, 0x81, 0x08, \r
+0xE0, 0x60, 0x09, 0xB1, 0x97, 0x54, 0x07, 0x70, 0x03, 0x12, 0x5D, 0x9C, 0x22, 0x90, 0x83, 0x77, \r
+0x12, 0x5F, 0xC9, 0x30, 0xE0, 0x0E, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x00, 0x12, 0x67, 0xBD, 0x04, \r
+0xF0, 0x02, 0x4E, 0x13, 0x02, 0x4C, 0x0B, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x17, 0x90, 0x80, 0x08, \r
+0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x12, 0x4D, 0x91, 0x90, 0x83, 0x8B, 0xEE, 0xF0, 0xA3, 0xEF, \r
+0xF0, 0x12, 0x4F, 0xF4, 0x22, 0x90, 0x83, 0x7B, 0xE0, 0x30, 0xE0, 0x6C, 0x90, 0x83, 0x7F, 0xE0, \r
+0x04, 0xF0, 0x90, 0x83, 0x82, 0xE0, 0x64, 0x01, 0x70, 0x21, 0x90, 0x83, 0x7B, 0xE0, 0x13, 0x13, \r
+0x54, 0x3F, 0x30, 0xE0, 0x16, 0x90, 0x83, 0x81, 0xE0, 0x70, 0x10, 0x90, 0x83, 0x7E, 0xE0, 0xFF, \r
+0xA3, 0xE0, 0xC3, 0x9F, 0x40, 0x05, 0x12, 0x5E, 0x87, 0xF0, 0x22, 0x90, 0x83, 0x7F, 0xE0, 0xFF, \r
+0x90, 0x83, 0x7C, 0xE0, 0xD3, 0x9F, 0x50, 0x30, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x1A, 0x90, \r
+0x83, 0x81, 0xE0, 0x70, 0x14, 0x7D, 0x08, 0xFF, 0x12, 0x4C, 0x0F, 0x90, 0x83, 0x80, 0xE0, 0x04, \r
+0xF0, 0x90, 0x83, 0x7A, 0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, \r
+0x90, 0x83, 0x7F, 0xF0, 0x90, 0x83, 0x81, 0xF0, 0x22, 0x90, 0x81, 0x08, 0xE0, 0x60, 0x03, 0x12, \r
+0x4B, 0x9D, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, 0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, \r
+0xE4, 0x2F, 0xFF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x1E, 0x90, 0xFD, 0x11, 0xE0, 0xB5, 0x05, \r
+0x14, 0x90, 0x01, 0x17, 0xE0, 0xB5, 0x05, 0x07, 0x90, 0xFD, 0x11, 0xE4, 0xF0, 0x80, 0x06, 0xED, \r
+0x04, 0x90, 0xFD, 0x11, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0B, 0x04, 0x70, \r
+0x24, 0x90, 0x81, 0x0E, 0x74, 0x02, 0xF0, 0x80, 0x13, 0xED, 0x70, 0x06, 0x90, 0x81, 0xAF, 0xE0, \r
+0x80, 0x02, 0xED, 0x14, 0x90, 0x81, 0x0E, 0xF0, 0x90, 0x81, 0x0E, 0xE0, 0xA3, 0xF0, 0x90, 0x81, \r
+0x05, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x7D, 0x2E, 0x7F, 0x6F, 0x12, 0x4B, 0x1B, 0x7D, 0x02, 0x7F, \r
+0x01, 0x02, 0x4B, 0x2A, 0x90, 0x84, 0x0E, 0xE0, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0x90, 0x84, 0x3A, 0xEF, 0xF0, 0x90, 0x80, 0x09, 0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70, \r
+0x3D, 0x90, 0x81, 0x0B, 0xE0, 0x64, 0x0E, 0x70, 0x15, 0x90, 0x84, 0x3A, 0xE0, 0x70, 0x2F, 0x90, \r
+0x81, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x12, 0x5F, 0xD6, 0x12, 0x4B, 0x26, 0x80, 0x1D, 0x90, 0x81, \r
+0x0B, 0xE0, 0x64, 0x06, 0x70, 0x18, 0x90, 0x84, 0x3A, 0xE0, 0x60, 0x12, 0x90, 0x81, 0x04, 0xE0, \r
+0x54, 0xBF, 0xF0, 0x11, 0x43, 0x90, 0x81, 0x0B, 0x74, 0x04, 0xF0, 0x12, 0x5A, 0xCD, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0xE4, \r
+0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, \r
+0xAF, 0x06, 0x22, 0x11, 0x4F, 0x7E, 0x00, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0x12, 0x4F, \r
+0x9D, 0x75, 0x16, 0x08, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x7F, 0x02, 0x2B, 0xED, 0x90, 0x02, 0x86, \r
+0xE0, 0x20, 0xE2, 0x03, 0x7F, 0x04, 0x22, 0x90, 0x02, 0x86, 0xE0, 0x7F, 0x01, 0x20, 0xE1, 0x02, \r
+0x7F, 0x02, 0x22, 0x90, 0x81, 0xBC, 0xE0, 0xFF, 0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, \r
+0xE2, 0x14, 0xEF, 0x44, 0x01, 0x90, 0x81, 0xBC, 0xF0, 0x90, 0x81, 0xB6, 0xE0, 0xC4, 0x54, 0x0F, \r
+0x20, 0xE0, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0xEF, 0x20, 0xE0, 0x05, 0x90, 0x83, 0x65, 0x80, 0x03, 0x90, 0x83, 0x66, 0xE0, 0x90, 0x82, 0x88, \r
+0xF0, 0x90, 0x82, 0x88, 0xE0, 0x14, 0x60, 0x13, 0x14, 0x60, 0x14, 0x24, 0xFE, 0x60, 0x10, 0x14, \r
+0x60, 0x09, 0x14, 0x60, 0x06, 0x24, 0x06, 0xE4, 0xFE, 0x80, 0x06, 0x7E, 0x04, 0x80, 0x02, 0x7E, \r
+0x08, 0xAF, 0x06, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xA3, 0xE0, 0xFE, 0x24, 0x20, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x21, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
+0xE0, 0xFD, 0x74, 0x24, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFE, \r
+0xEF, 0x30, 0xE7, 0x04, 0x7C, 0x02, 0x80, 0x02, 0xE4, 0xFC, 0xED, 0x30, 0xE6, 0x08, 0xAF, 0x03, \r
+0x11, 0xB9, 0xAE, 0x07, 0x80, 0x02, 0xE4, 0xFE, 0xEC, 0x24, 0x18, 0x2E, 0xFF, 0x22, 0x90, 0x02, \r
+0x09, 0xE0, 0x90, 0x83, 0x9A, 0xF0, 0x12, 0x1F, 0xA4, 0x90, 0x83, 0x65, 0x12, 0x53, 0x09, 0x90, \r
+0x83, 0x66, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x12, 0x1F, 0xA4, 0xFE, 0xEF, 0x2E, 0x90, \r
+0x83, 0x75, 0xF0, 0x22, 0xE4, 0xFF, 0x74, 0x18, 0x31, 0x8E, 0xFE, 0x74, 0xC3, 0x2F, 0xF5, 0x82, \r
+0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x10, 0x31, 0x8E, 0xFE, 0x74, 0xBD, 0x2F, 0xF5, \r
+0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x06, 0xD9, 0x22, 0x2F, 0xF5, \r
+0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0x22, 0xEF, 0x60, 0x08, 0x90, 0x83, 0x68, 0xE0, 0xFF, \r
+0x12, 0x4F, 0x3D, 0x22, 0x7E, 0x00, 0x7F, 0x08, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x83, 0x79, 0x7B, \r
+0x12, 0x44, 0x13, 0x90, 0x83, 0x7C, 0x74, 0x08, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x02, \r
+0x09, 0xE0, 0xFD, 0x12, 0x1F, 0xA4, 0xFE, 0xAF, 0x05, 0xED, 0x22, 0xE0, 0x90, 0x01, 0xBA, 0xF0, \r
+0x90, 0x81, 0x0A, 0xE0, 0x90, 0x01, 0xBB, 0x22, 0x7B, 0x01, 0x7A, 0x82, 0x79, 0x7F, 0x90, 0x84, \r
+0x0B, 0xE0, 0xFD, 0x22, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, \r
+0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFE, 0xEF, 0x54, 0x07, 0xFF, 0x22, 0xE0, 0x54, 0xFE, 0x4E, \r
+0xFE, 0xF0, 0xEF, 0x22, 0x90, 0x80, 0xF8, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x12, 0x1F, 0xEA, 0x90, \r
+0x83, 0xE8, 0xE0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xE4, 0xF5, 0x52, 0x90, \r
+0x81, 0x11, 0xE0, 0x22, 0x12, 0x32, 0x1E, 0x90, 0x84, 0x31, 0xE0, 0x22, 0xA2, 0xB9, \r
 };\r
-u4Byte ArrayLength_MP_8188E_FW_WoWLAN_T = 15690;\r
+u4Byte ArrayLength_MP_8188E_FW_WoWLAN = 14926;\r
 \r
 \r
 void\r
-ODM_ReadFirmware_MP_8188E_FW_WoWLAN_T(\r
+ODM_ReadFirmware_MP_8188E_FW_WoWLAN(\r
      IN   PDM_ODM_T    pDM_Odm,\r
      OUT  u1Byte       *pFirmware,\r
      OUT  u4Byte       *pFirmwareSize\r
 )\r
 {\r
-#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))\r
-       *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8188E_FW_WoWLAN_T;\r
+ #if (DM_ODM_SUPPORT_TYPE & (ODM_CE))\r
+     *((SIZE_PTR*)pFirmware) = (SIZE_PTR)Array_MP_8188E_FW_WoWLAN;\r
 #else\r
-       ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8188E_FW_WoWLAN_T, ArrayLength_MP_8188E_FW_WoWLAN_T);\r
+     ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8188E_FW_WoWLAN, ArrayLength_MP_8188E_FW_WoWLAN);\r
 #endif\r
-       *pFirmwareSize = ArrayLength_MP_8188E_FW_WoWLAN_T;\r
+     *pFirmwareSize = ArrayLength_MP_8188E_FW_WoWLAN;\r
+\r
 }\r
 \r
 \r
index e43c8861877c6b06f36678d461d5d6c877a7313a..54422388c5c1b09ff2ac784d0b4697783421cfa4 100644 (file)
@@ -1,21 +1,21 @@
-/******************************************************************************\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
+* 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
 #if (RTL8188E_SUPPORT == 1)\r
@@ -35,44 +35,33 @@ ODM_ReadFirmware_MP_8188E_FW_AP(
 );\r
 \r
 /******************************************************************************\r
-*                           FW_NIC_S.TXT\r
-******************************************************************************/\r
-\r
-void\r
-ODM_ReadFirmware_MP_8188E_FW_NIC_S(\r
-     IN   PDM_ODM_T    pDM_Odm,\r
-     OUT  u1Byte       *pFirmware,\r
-     OUT  u4Byte       *pFirmwareSize\r
-);\r
-\r
-/******************************************************************************\r
-*                           FW_NIC_T.TXT\r
+*                           FW_NIC.TXT\r
 ******************************************************************************/\r
 \r
 void\r
-ODM_ReadFirmware_MP_8188E_FW_NIC_T(\r
+ODM_ReadFirmware_MP_8188E_FW_NIC(\r
      IN   PDM_ODM_T    pDM_Odm,\r
      OUT  u1Byte       *pFirmware,\r
      OUT  u4Byte       *pFirmwareSize\r
 );\r
 \r
 /******************************************************************************\r
-*                           FW_WoWLAN_S.TXT\r
+*                           FW_NIC_89EM.TXT\r
 ******************************************************************************/\r
 \r
 void\r
-ODM_ReadFirmware_MP_8188E_FW_WoWLAN_S(\r
+ODM_ReadFirmware_MP_8188E_FW_NIC_89EM(\r
      IN   PDM_ODM_T    pDM_Odm,\r
      OUT  u1Byte       *pFirmware,\r
      OUT  u4Byte       *pFirmwareSize\r
 );\r
 \r
 /******************************************************************************\r
-*                           FW_WoWLAN_T.TXT\r
+*                           FW_WoWLAN.TXT\r
 ******************************************************************************/\r
 \r
 void\r
-ODM_ReadFirmware_MP_8188E_FW_WoWLAN_T(\r
+ODM_ReadFirmware_MP_8188E_FW_WoWLAN(\r
      IN   PDM_ODM_T    pDM_Odm,\r
      OUT  u1Byte       *pFirmware,\r
      OUT  u4Byte       *pFirmwareSize\r
index 2c7509176e7e4957db7775a6c7090e6fa32205a5..9af9245bead28e71f64448fde591b1c5ba790102 100644 (file)
 * \r
 ******************************************************************************/\r
 \r
+#include "Mp_Precomp.h"\r
+#include "../phydm_precomp.h"\r
 \r
-#include "../odm_precomp.h"\r
-#ifdef CONFIG_IOL_IOREG_CFG\r
-#include <rtw_iol.h>\r
-#endif\r
 #if (RTL8188E_SUPPORT == 1)\r
 static BOOLEAN\r
-CheckCondition(\r
-    const u4Byte  Condition,\r
-    const u4Byte  Hex\r
+CheckPositive(\r
+    IN  PDM_ODM_T     pDM_Odm,\r
+    IN  const u4Byte  Condition1,\r
+    IN  const u4Byte  Condition2\r
     )\r
 {\r
-    u4Byte _board     = (Hex & 0x000000FF);\r
-    u4Byte _interface = (Hex & 0x0000FF00) >> 8;\r
-    u4Byte _platform  = (Hex & 0x00FF0000) >> 16;\r
-    u4Byte cond = Condition;\r
-\r
-    if ( Condition == 0xCDCDCDCD )\r
-        return TRUE;\r
-\r
-    cond = Condition & 0x000000FF;\r
-    if ( (_board != cond) && (cond != 0xFF) )\r
-        return FALSE;\r
-\r
-    cond = Condition & 0x0000FF00;\r
-    cond = cond >> 8;\r
-    if ( ((_interface & cond) == 0) && (cond != 0x07) )\r
-        return FALSE;\r
-\r
-    cond = Condition & 0x00FF0000;\r
-    cond = cond >> 16;\r
-    if ( ((_platform & cond) == 0) && (cond != 0x0F) )\r
+    u1Byte    _BoardType = ((pDM_Odm->BoardType & BIT4) >> 4) << 0 | // _GLNA\r
+                           ((pDM_Odm->BoardType & BIT3) >> 3) << 1 | // _GPA \r
+                           ((pDM_Odm->BoardType & BIT7) >> 7) << 2 | // _ALNA\r
+                           ((pDM_Odm->BoardType & BIT6) >> 6) << 3 | // _APA \r
+                           ((pDM_Odm->BoardType & BIT2) >> 2) << 4;  // _BT  \r
+\r
+       u4Byte    cond1   = Condition1, cond2 = Condition2;\r
+       u4Byte    driver1 = pDM_Odm->CutVersion       << 24 |  \r
+                               pDM_Odm->SupportPlatform  << 16 | \r
+                               pDM_Odm->PackageType      << 12 | \r
+                               pDM_Odm->SupportInterface << 8  |\r
+                               _BoardType;\r
+\r
+       u4Byte    driver2 = pDM_Odm->TypeGLNA <<  0 |  \r
+                               pDM_Odm->TypeGPA  <<  8 | \r
+                               pDM_Odm->TypeALNA << 16 | \r
+                               pDM_Odm->TypeAPA  << 24; \r
+\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n", cond1, cond2));\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n", driver1, driver2));\r
+\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("     (Platform, Interface) = (0x%X, 0x%X)\n", pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface));\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("     (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->BoardType, pDM_Odm->PackageType));\r
+\r
+\r
+       //============== Value Defined Check ===============//\r
+       //QFN Type [15:12] and Cut Version [27:24] need to do value check\r
+       \r
+       if(((cond1 & 0x0000F000) != 0) &&((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))\r
+               return FALSE;\r
+       if(((cond1 & 0x0F000000) != 0) &&((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))\r
+               return FALSE;           \r
+\r
+       //=============== Bit Defined Check ================//\r
+    // We don't care [31:28] and [23:20]\r
+    //\r
+       cond1   &= 0x000F0FFF; \r
+       driver1 &= 0x000F0FFF; \r
+\r
+    if ((cond1 & driver1) == cond1) \r
+    {\r
+        u4Byte bitMask = 0;\r
+        if ((cond1 & 0x0F) == 0) // BoardType is DONTCARE\r
+            return TRUE;\r
+\r
+        if ((cond1 & BIT0) != 0) //GLNA\r
+            bitMask |= 0x000000FF;\r
+        if ((cond1 & BIT1) != 0) //GPA\r
+            bitMask |= 0x0000FF00;\r
+        if ((cond1 & BIT2) != 0) //ALNA\r
+            bitMask |= 0x00FF0000;\r
+        if ((cond1 & BIT3) != 0) //APA\r
+            bitMask |= 0xFF000000;\r
+\r
+        if ((cond2 & bitMask) == (driver2 & bitMask)) // BoardType of each RF path is matched\r
+            return TRUE;\r
+        else\r
+            return FALSE;\r
+    }\r
+    else \r
+    {\r
         return FALSE;\r
+    }\r
+}\r
+static BOOLEAN\r
+CheckNegative(\r
+    IN  PDM_ODM_T     pDM_Odm,\r
+    IN  const u4Byte  Condition1,\r
+    IN  const u4Byte  Condition2\r
+    )\r
+{\r
     return TRUE;\r
 }\r
 \r
-\r
 /******************************************************************************\r
 *                           MAC_REG.TXT\r
 ******************************************************************************/\r
@@ -62,11 +114,13 @@ CheckCondition(
 u4Byte Array_MP_8188E_MAC_REG[] = { \r
                0x026, 0x00000041,\r
                0x027, 0x00000035,\r
-       0xFF0F0718, 0xABCD,\r
+       0x80000003,0x00000000,0x40000000,0x00000000,\r
+               0x040, 0x0000000C,\r
+       0x90000001,0x00000000,0x40000000,0x00000000,\r
                0x040, 0x0000000C,\r
-       0xCDCDCDCD, 0xCDCD,\r
+       0xA0000000,0x00000000,\r
                0x040, 0x00000000,\r
-       0xFF0F0718, 0xDEAD,\r
+       0xB0000000,0x00000000,\r
                0x428, 0x0000000A,\r
                0x429, 0x00000010,\r
                0x430, 0x00000000,\r
@@ -158,450 +212,75 @@ u4Byte Array_MP_8188E_MAC_REG[] = {
 \r
 };\r
 \r
-HAL_STATUS\r
+void\r
 ODM_ReadAndConfig_MP_8188E_MAC_REG(\r
        IN   PDM_ODM_T  pDM_Odm\r
        )\r
 {\r
-       #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)\r
-\r
-       u4Byte     hex         = 0;\r
-       u4Byte     i           = 0;\r
-       u2Byte     count       = 0;\r
-       pu4Byte    ptr_array   = NULL;\r
-       u1Byte     platform    = pDM_Odm->SupportPlatform;\r
-       u1Byte     _interface   = pDM_Odm->SupportInterface;\r
-       u1Byte     board       = pDM_Odm->BoardType;  \r
-       u4Byte     ArrayLen    = sizeof(Array_MP_8188E_MAC_REG)/sizeof(u4Byte);\r
-       pu4Byte    Array       = Array_MP_8188E_MAC_REG;\r
-       BOOLEAN         biol = FALSE;   \r
+    u4Byte     i         = 0;\r
+    u1Byte     cCond;\r
+    BOOLEAN bMatched = TRUE, bSkipped = FALSE;\r
+//ask by Luke.Lee\r
+    u4Byte     ArrayLen    = sizeof(Array_MP_8188E_MAC_REG)/sizeof(u4Byte);\r
+    pu4Byte    Array       = Array_MP_8188E_MAC_REG;\r
        \r
-#ifdef CONFIG_IOL_IOREG_CFG \r
-       PADAPTER        Adapter =  pDM_Odm->Adapter;    \r
-       struct xmit_frame       *pxmit_frame;   \r
-       u8 bndy_cnt = 1;\r
-       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-       struct cmd_cmp cmpdata[ArrayLen];\r
-       u4Byte  cmpdata_idx=0;\r
-       #endif\r
-#endif //CONFIG_IOL_IOREG_CFG\r
-       HAL_STATUS rst =HAL_STATUS_SUCCESS;\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8188E_MAC_REG\n"));\r
 \r
-       hex += board;\r
-       hex += _interface << 8;\r
-       hex += platform << 16;\r
-       hex += 0xFF000000;\r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8188E_MAC_REG, hex = 0x%X\n", hex));\r
+       while(( i+1) < ArrayLen)\r
+       {\r
+               u4Byte v1 = Array[i];\r
+               u4Byte v2 = Array[i+1];\r
 \r
-#ifdef CONFIG_IOL_IOREG_CFG                    \r
-       biol = rtw_IOL_applied(Adapter);\r
-       \r
-       if(biol){               \r
-               if((pxmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL)\r
+               if(v1 & (BIT31|BIT30)) //positive & negative condition\r
                {\r
-                       printk("rtw_IOL_accquire_xmit_frame failed\n");\r
-                       return HAL_STATUS_FAILURE;\r
-               }\r
-       }\r
-       \r
-#endif //CONFIG_IOL_IOREG_CFG\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 meets the condition.\r
-           if ( v1 < 0xCDCDCDCD )\r
-           {\r
-                       #ifdef CONFIG_IOL_IOREG_CFG\r
-                               \r
-                       if(biol){       \r
-                                       \r
-                               if(rtw_IOL_cmd_boundary_handle(pxmit_frame))\r
-                                       bndy_cnt++;\r
-                               rtw_IOL_append_WB_cmd(pxmit_frame,(u2Byte)v1, (u1Byte)v2,0xFF);\r
-                               #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                                       cmpdata[cmpdata_idx].addr = v1;\r
-                                       cmpdata[cmpdata_idx].value= v2;\r
-                                       cmpdata_idx++;\r
-                               #endif                                  \r
-                       }\r
-                       else\r
-                       #endif  //endif CONFIG_IOL_IOREG_CFG\r
+                       if(v1 & BIT31) // positive condition\r
                        {\r
-                               odm_ConfigMAC_8188E(pDM_Odm, v1, (u1Byte)v2);\r
-                       }\r
-                   continue;\r
-               }\r
-               else\r
-               { // This line is the start line of branch.\r
-                   if ( !CheckCondition(Array[i], hex) )\r
-                   { // Discard the following (offset, data) pairs.\r
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\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
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\r
-                                       #ifdef CONFIG_IOL_IOREG_CFG \r
-                                       if(biol){       \r
-                                               if(rtw_IOL_cmd_boundary_handle(pxmit_frame))\r
-                                                       bndy_cnt++;\r
-                                               rtw_IOL_append_WB_cmd(pxmit_frame,(u2Byte)v1, (u1Byte)v2,0xFF);\r
-                                               #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                                                       cmpdata[cmpdata_idx].addr = v1;\r
-                                                       cmpdata[cmpdata_idx].value= v2;\r
-                                                       cmpdata_idx++;\r
-                                               #endif\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
-                                       #endif //#ifdef CONFIG_IOL_IOREG_CFG\r
                                        {\r
-                                               odm_ConfigMAC_8188E(pDM_Odm, v1, (u1Byte)v2);\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
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-\r
-                       while (v2 != 0xDEAD && i < ArrayLen -2)\r
-                       {\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-                       \r
-                   }\r
-               }       \r
-       }\r
-\r
-#ifdef CONFIG_IOL_IOREG_CFG \r
-       if(biol){\r
-               //printk("==> %s, pktlen = %d,bndy_cnt = %d\n",__FUNCTION__,pxmit_frame->attrib.pktlen+4+32,bndy_cnt);          \r
-               \r
-               if(rtw_IOL_exec_cmds_sync(pDM_Odm->Adapter, pxmit_frame, 1000, bndy_cnt))\r
-               {                       \r
-                       #ifdef CONFIG_IOL_IOREG_CFG_DBG                 \r
-                       printk("~~~ IOL Config MAC Success !!! \n");\r
-                       //compare writed data\r
-                       {\r
-                               u4Byte idx;\r
-                               u1Byte cdata;\r
-                               // HAL_STATUS_FAILURE;\r
-                               printk("  MAC data compare => array_len:%d \n",cmpdata_idx);\r
-                               for(idx=0;idx< cmpdata_idx;idx++)\r
-                               {\r
-                                       cdata = ODM_Read1Byte(pDM_Odm, cmpdata[idx].addr);\r
-                                       if(cdata != cmpdata[idx].value){\r
-                                               printk("### MAC data compared failed !! addr:0x%04x, data:(0x%02x : 0x%02x) ###\n",\r
-                                                       cmpdata[idx].addr,cmpdata[idx].value,cdata);\r
-                                               //rst = HAL_STATUS_FAILURE;\r
-                                       }                                       \r
-                               }       \r
-\r
-\r
-                               //dump data from TX packet buffer\r
-                               //if(rst == HAL_STATUS_FAILURE)\r
-                               {\r
-                                       rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);\r
-                               }       \r
-                               \r
+                               }\r
                        }\r
-                       #endif //CONFIG_IOL_IOREG_CFG_DBG\r
-               \r
-               }\r
-               else{\r
-                       printk("~~~ MAC IOL_exec_cmds Failed !!! \n");\r
-                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                       {\r
-                               //dump data from TX packet buffer                               \r
-                               rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);\r
+                       else if(v1 & BIT30){ //negative condition\r
+                       //do nothing\r
                        }\r
-                       #endif //CONFIG_IOL_IOREG_CFG_DBG\r
-                       rst = HAL_STATUS_FAILURE;                       \r
                }\r
-               \r
-       }\r
-#endif //#ifdef CONFIG_IOL_IOREG_CFG \r
-       return rst;\r
-}\r
-\r
-/******************************************************************************\r
-*                           MAC_REG_ICUT.TXT\r
-******************************************************************************/\r
-\r
-u4Byte Array_MP_8188E_MAC_REG_ICUT[] = { \r
-               0x026, 0x00000041,\r
-               0x027, 0x00000035,\r
-               0x428, 0x0000000A,\r
-               0x429, 0x00000010,\r
-               0x430, 0x00000000,\r
-               0x431, 0x00000001,\r
-               0x432, 0x00000002,\r
-               0x433, 0x00000004,\r
-               0x434, 0x00000005,\r
-               0x435, 0x00000006,\r
-               0x436, 0x00000007,\r
-               0x437, 0x00000008,\r
-               0x438, 0x00000000,\r
-               0x439, 0x00000000,\r
-               0x43A, 0x00000001,\r
-               0x43B, 0x00000002,\r
-               0x43C, 0x00000004,\r
-               0x43D, 0x00000005,\r
-               0x43E, 0x00000006,\r
-               0x43F, 0x00000007,\r
-               0x440, 0x0000005D,\r
-               0x441, 0x00000001,\r
-               0x442, 0x00000000,\r
-               0x444, 0x00000015,\r
-               0x445, 0x000000F0,\r
-               0x446, 0x0000000F,\r
-               0x447, 0x00000000,\r
-               0x458, 0x00000041,\r
-               0x459, 0x000000A8,\r
-               0x45A, 0x00000072,\r
-               0x45B, 0x000000B9,\r
-               0x460, 0x00000066,\r
-               0x461, 0x00000066,\r
-               0x480, 0x00000008,\r
-               0x4C8, 0x000000FF,\r
-               0x4C9, 0x00000008,\r
-               0x4CC, 0x000000FF,\r
-               0x4CD, 0x000000FF,\r
-               0x4CE, 0x00000001,\r
-               0x4D3, 0x00000001,\r
-               0x500, 0x00000026,\r
-               0x501, 0x000000A2,\r
-               0x502, 0x0000002F,\r
-               0x503, 0x00000000,\r
-               0x504, 0x00000028,\r
-               0x505, 0x000000A3,\r
-               0x506, 0x0000005E,\r
-               0x507, 0x00000000,\r
-               0x508, 0x0000002B,\r
-               0x509, 0x000000A4,\r
-               0x50A, 0x0000005E,\r
-               0x50B, 0x00000000,\r
-               0x50C, 0x0000004F,\r
-               0x50D, 0x000000A4,\r
-               0x50E, 0x00000000,\r
-               0x50F, 0x00000000,\r
-               0x512, 0x0000001C,\r
-               0x514, 0x0000000A,\r
-               0x516, 0x0000000A,\r
-               0x525, 0x0000004F,\r
-               0x550, 0x00000010,\r
-               0x551, 0x00000010,\r
-               0x559, 0x00000002,\r
-               0x55D, 0x000000FF,\r
-               0x605, 0x00000030,\r
-               0x608, 0x0000000E,\r
-               0x609, 0x0000002A,\r
-               0x620, 0x000000FF,\r
-               0x621, 0x000000FF,\r
-               0x622, 0x000000FF,\r
-               0x623, 0x000000FF,\r
-               0x624, 0x000000FF,\r
-               0x625, 0x000000FF,\r
-               0x626, 0x000000FF,\r
-               0x627, 0x000000FF,\r
-               0x652, 0x00000020,\r
-               0x63C, 0x0000000A,\r
-               0x63D, 0x0000000A,\r
-               0x63E, 0x0000000E,\r
-               0x63F, 0x0000000E,\r
-               0x640, 0x00000040,\r
-               0x66E, 0x00000005,\r
-               0x700, 0x00000021,\r
-               0x701, 0x00000043,\r
-               0x702, 0x00000065,\r
-               0x703, 0x00000087,\r
-               0x708, 0x00000021,\r
-               0x709, 0x00000043,\r
-               0x70A, 0x00000065,\r
-               0x70B, 0x00000087,\r
-\r
-};\r
-\r
-HAL_STATUS\r
-ODM_ReadAndConfig_MP_8188E_MAC_REG_ICUT(\r
-       IN   PDM_ODM_T  pDM_Odm\r
-       )\r
-{\r
-       #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)\r
-\r
-       u4Byte     hex         = 0;\r
-       u4Byte     i           = 0;\r
-       u2Byte     count       = 0;\r
-       pu4Byte    ptr_array   = NULL;\r
-       u1Byte     platform    = pDM_Odm->SupportPlatform;\r
-       u1Byte     _interface   = pDM_Odm->SupportInterface;\r
-       u1Byte     board       = pDM_Odm->BoardType;  \r
-       u4Byte     ArrayLen    = sizeof(Array_MP_8188E_MAC_REG_ICUT)/sizeof(u4Byte);\r
-       pu4Byte    Array       = Array_MP_8188E_MAC_REG_ICUT;\r
-       BOOLEAN         biol = FALSE;\r
-\r
-#ifdef CONFIG_IOL_IOREG_CFG \r
-       PADAPTER        Adapter =  pDM_Odm->Adapter;    \r
-       struct xmit_frame       *pxmit_frame;   \r
-       u8 bndy_cnt = 1;\r
-       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-       struct cmd_cmp cmpdata[ArrayLen];\r
-       u4Byte  cmpdata_idx=0;\r
-       #endif\r
-#endif //CONFIG_IOL_IOREG_CFG\r
-       HAL_STATUS rst =HAL_STATUS_SUCCESS;\r
-\r
-       hex += board;\r
-       hex += _interface << 8;\r
-       hex += platform << 16;\r
-       hex += 0xFF000000;\r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8188E_MAC_REG_ICUT, hex = 0x%X\n", hex));\r
-\r
-#ifdef CONFIG_IOL_IOREG_CFG                    \r
-       biol = rtw_IOL_applied(Adapter);\r
-       \r
-       if(biol){               \r
-               if((pxmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL)\r
+               else\r
                {\r
-                       printk("rtw_IOL_accquire_xmit_frame failed\n");\r
-                       return HAL_STATUS_FAILURE;\r
+                       if(bMatched)\r
+                       odm_ConfigMAC_8188E(pDM_Odm, v1, (u1Byte)v2);\r
                }\r
+       i = i + 2;\r
        }\r
-       \r
-#endif //CONFIG_IOL_IOREG_CFG\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 meets the condition.\r
-           if ( v1 < 0xCDCDCDCD )\r
-           {\r
-                       #ifdef CONFIG_IOL_IOREG_CFG\r
-                               \r
-                       if(biol){       \r
-                                       \r
-                               if(rtw_IOL_cmd_boundary_handle(pxmit_frame))\r
-                                       bndy_cnt++;\r
-                               rtw_IOL_append_WB_cmd(pxmit_frame,(u2Byte)v1, (u1Byte)v2,0xFF);\r
-                               #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                                       cmpdata[cmpdata_idx].addr = v1;\r
-                                       cmpdata[cmpdata_idx].value= v2;\r
-                                       cmpdata_idx++;\r
-                               #endif                                  \r
-                       }\r
-                       else\r
-                       #endif  //endif CONFIG_IOL_IOREG_CFG\r
-                       {\r
-                               odm_ConfigMAC_8188E(pDM_Odm, v1, (u1Byte)v2);\r
-                       }\r
-                   continue;\r
-               }\r
-               else\r
-               { // This line is the start line of branch.\r
-                   if ( !CheckCondition(Array[i], hex) )\r
-                   { // Discard the following (offset, data) pairs.\r
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\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
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\r
-                                       #ifdef CONFIG_IOL_IOREG_CFG \r
-                                       if(biol){       \r
-                                               if(rtw_IOL_cmd_boundary_handle(pxmit_frame))\r
-                                                       bndy_cnt++;\r
-                                               rtw_IOL_append_WB_cmd(pxmit_frame,(u2Byte)v1, (u1Byte)v2,0xFF);\r
-                                               #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                                                       cmpdata[cmpdata_idx].addr = v1;\r
-                                                       cmpdata[cmpdata_idx].value= v2;\r
-                                                       cmpdata_idx++;\r
-                                               #endif\r
-                                       }\r
-                                       else\r
-                                       #endif //#ifdef CONFIG_IOL_IOREG_CFG\r
-                                       {\r
-                                               odm_ConfigMAC_8188E(pDM_Odm, v1, (u1Byte)v2);\r
-                                       }\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-\r
-                       while (v2 != 0xDEAD && i < ArrayLen -2)\r
-                       {\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-                       \r
-                   }\r
-               }       \r
-       }\r
-\r
-#ifdef CONFIG_IOL_IOREG_CFG \r
-       if(biol){\r
-               //printk("==> %s, pktlen = %d,bndy_cnt = %d\n",__FUNCTION__,pxmit_frame->attrib.pktlen+4+32,bndy_cnt);          \r
-               \r
-               if(rtw_IOL_exec_cmds_sync(pDM_Odm->Adapter, pxmit_frame, 1000, bndy_cnt))\r
-               {                       \r
-                       #ifdef CONFIG_IOL_IOREG_CFG_DBG                 \r
-                       printk("~~~ IOL Config MAC Success !!! \n");\r
-                       //compare writed data\r
-                       {\r
-                               u4Byte idx;\r
-                               u1Byte cdata;\r
-                               // HAL_STATUS_FAILURE;\r
-                               printk("  MAC data compare => array_len:%d \n",cmpdata_idx);\r
-                               for(idx=0;idx< cmpdata_idx;idx++)\r
-                               {\r
-                                       cdata = ODM_Read1Byte(pDM_Odm, cmpdata[idx].addr);\r
-                                       if(cdata != cmpdata[idx].value){\r
-                                               printk("### MAC data compared failed !! addr:0x%04x, data:(0x%02x : 0x%02x) ###\n",\r
-                                                       cmpdata[idx].addr,cmpdata[idx].value,cdata);\r
-                                               //rst = HAL_STATUS_FAILURE;\r
-                                       }                                       \r
-                               }       \r
-\r
+}\r
 \r
-                               //dump data from TX packet buffer\r
-                               //if(rst == HAL_STATUS_FAILURE)\r
-                               {\r
-                                       rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);\r
-                               }       \r
-                               \r
-                       }\r
-                       #endif //CONFIG_IOL_IOREG_CFG_DBG\r
-               \r
-               }\r
-               else{\r
-                       printk("~~~ MAC IOL_exec_cmds Failed !!! \n");\r
-                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                       {\r
-                               //dump data from TX packet buffer                               \r
-                               rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);\r
-                       }\r
-                       #endif //CONFIG_IOL_IOREG_CFG_DBG\r
-                       rst = HAL_STATUS_FAILURE;                       \r
-               }\r
-               \r
-       }\r
-#endif //#ifdef CONFIG_IOL_IOREG_CFG \r
-       return rst;\r
+u4Byte\r
+ODM_GetVersion_MP_8188E_MAC_REG(void)\r
+{\r
+          return 53;\r
 }\r
 \r
 #endif // end of HWIMG_SUPPORT\r
index e6b6d8e6d3540db11d800b99640429dfab26f0db..a138ffd46e6ecf7ea1e75154a828390e1465f620 100644 (file)
 #ifndef __INC_MP_MAC_HW_IMG_8188E_H\r
 #define __INC_MP_MAC_HW_IMG_8188E_H\r
 \r
-//static BOOLEAN CheckCondition(const u4Byte Condition, const u4Byte Hex);\r
 \r
 /******************************************************************************\r
 *                           MAC_REG.TXT\r
 ******************************************************************************/\r
 \r
-HAL_STATUS\r
+void\r
 ODM_ReadAndConfig_MP_8188E_MAC_REG( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
-\r
-/******************************************************************************\r
-*                           MAC_REG_ICUT.TXT\r
-******************************************************************************/\r
-\r
-HAL_STATUS\r
-ODM_ReadAndConfig_MP_8188E_MAC_REG_ICUT( // TC: Test Chip, MP: MP Chip\r
-       IN   PDM_ODM_T  pDM_Odm\r
-);\r
+u4Byte ODM_GetVersion_MP_8188E_MAC_REG(void);\r
 \r
 #endif\r
 #endif // end of HWIMG_SUPPORT\r
index f4c32e5d7ba83a9d022f9417f18f6d0f83f673fd..72e8c551b8569f22e07832995804443c98c4ab04 100644 (file)
 * \r
 ******************************************************************************/\r
 \r
-\r
-#include "../odm_precomp.h"\r
-\r
-#ifdef CONFIG_IOL_IOREG_CFG\r
-#include <rtw_iol.h>\r
-#endif\r
+#include "Mp_Precomp.h"\r
+#include "../phydm_precomp.h"\r
 \r
 #if (RTL8188E_SUPPORT == 1)\r
 static BOOLEAN\r
-CheckCondition(\r
-    const u4Byte  Condition,\r
-    const u4Byte  Hex\r
+CheckPositive(\r
+    IN  PDM_ODM_T     pDM_Odm,\r
+    IN  const u4Byte  Condition1,\r
+    IN  const u4Byte  Condition2\r
     )\r
 {\r
-    u4Byte _board     = (Hex & 0x000000FF);\r
-    u4Byte _interface = (Hex & 0x0000FF00) >> 8;\r
-    u4Byte _platform  = (Hex & 0x00FF0000) >> 16;\r
-    u4Byte cond = Condition;\r
+    u1Byte    _BoardType = ((pDM_Odm->BoardType & BIT4) >> 4) << 0 | // _GLNA\r
+                           ((pDM_Odm->BoardType & BIT3) >> 3) << 1 | // _GPA \r
+                           ((pDM_Odm->BoardType & BIT7) >> 7) << 2 | // _ALNA\r
+                           ((pDM_Odm->BoardType & BIT6) >> 6) << 3 | // _APA \r
+                           ((pDM_Odm->BoardType & BIT2) >> 2) << 4;  // _BT  \r
 \r
-    if ( Condition == 0xCDCDCDCD )\r
-        return TRUE;\r
+       u4Byte    cond1   = Condition1, cond2 = Condition2;\r
+       u4Byte    driver1 = pDM_Odm->CutVersion       << 24 |  \r
+                               pDM_Odm->SupportPlatform  << 16 | \r
+                               pDM_Odm->PackageType      << 12 | \r
+                               pDM_Odm->SupportInterface << 8  |\r
+                               _BoardType;\r
 \r
-    cond = Condition & 0x000000FF;\r
-    if ( (_board != cond) && (cond != 0xFF) )\r
-        return FALSE;\r
+       u4Byte    driver2 = pDM_Odm->TypeGLNA <<  0 |  \r
+                               pDM_Odm->TypeGPA  <<  8 | \r
+                               pDM_Odm->TypeALNA << 16 | \r
+                               pDM_Odm->TypeAPA  << 24; \r
+\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n", cond1, cond2));\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n", driver1, driver2));\r
+\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("     (Platform, Interface) = (0x%X, 0x%X)\n", pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface));\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("     (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->BoardType, pDM_Odm->PackageType));\r
 \r
-    cond = Condition & 0x0000FF00;\r
-    cond = cond >> 8;\r
-    if ( ((_interface & cond) == 0) && (cond != 0x07) )\r
-        return FALSE;\r
 \r
-    cond = Condition & 0x00FF0000;\r
-    cond = cond >> 16;\r
-    if ( ((_platform & cond) == 0) && (cond != 0x0F) )\r
+       //============== Value Defined Check ===============//\r
+       //QFN Type [15:12] and Cut Version [27:24] need to do value check\r
+       \r
+       if(((cond1 & 0x0000F000) != 0) &&((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))\r
+               return FALSE;\r
+       if(((cond1 & 0x0F000000) != 0) &&((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))\r
+               return FALSE;           \r
+\r
+       //=============== Bit Defined Check ================//\r
+    // We don't care [31:28] and [23:20]\r
+    //\r
+       cond1   &= 0x000F0FFF; \r
+       driver1 &= 0x000F0FFF; \r
+\r
+    if ((cond1 & driver1) == cond1) \r
+    {\r
+        u4Byte bitMask = 0;\r
+        if ((cond1 & 0x0F) == 0) // BoardType is DONTCARE\r
+            return TRUE;\r
+\r
+        if ((cond1 & BIT0) != 0) //GLNA\r
+            bitMask |= 0x000000FF;\r
+        if ((cond1 & BIT1) != 0) //GPA\r
+            bitMask |= 0x0000FF00;\r
+        if ((cond1 & BIT2) != 0) //ALNA\r
+            bitMask |= 0x00FF0000;\r
+        if ((cond1 & BIT3) != 0) //APA\r
+            bitMask |= 0xFF000000;\r
+\r
+        if ((cond2 & bitMask) == (driver2 & bitMask)) // BoardType of each RF path is matched\r
+            return TRUE;\r
+        else\r
+            return FALSE;\r
+    }\r
+    else \r
+    {\r
         return FALSE;\r
+    }\r
+}\r
+static BOOLEAN\r
+CheckNegative(\r
+    IN  PDM_ODM_T     pDM_Odm,\r
+    IN  const u4Byte  Condition1,\r
+    IN  const u4Byte  Condition2\r
+    )\r
+{\r
     return TRUE;\r
 }\r
 \r
-\r
 /******************************************************************************\r
-*                           RadioA_1T.TXT\r
+*                           RadioA.TXT\r
 ******************************************************************************/\r
 \r
-u4Byte Array_MP_8188E_RadioA_1T[] = { \r
+u4Byte Array_MP_8188E_RadioA[] = { \r
                0x000, 0x00030000,\r
                0x008, 0x00084000,\r
                0x018, 0x00000407,\r
                0x019, 0x00000012,\r
+       0x88000003,0x00000000,0x40000000,0x00000000,\r
+               0x01B, 0x00000084,\r
+       0x98000001,0x00000000,0x40000000,0x00000000,\r
+               0x01B, 0x00000084,\r
+       0x98000400,0x00000000,0x40000000,0x00000000,\r
+               0x01B, 0x00000084,\r
+       0x90000003,0x00000000,0x40000000,0x00000000,\r
+       0x90000001,0x00000000,0x40000000,0x00000000,\r
+       0x98000000,0x00000000,0x40000000,0x00000000,\r
+               0x01B, 0x00000084,\r
+       0x90000400,0x00000000,0x40000000,0x00000000,\r
+       0xA0000000,0x00000000,\r
+       0xB0000000,0x00000000,\r
                0x01E, 0x00080009,\r
                0x01F, 0x00000880,\r
                0x02F, 0x0001A060,\r
+       0x88000003,0x00000000,0x40000000,0x00000000,\r
+               0x03F, 0x000C0000,\r
+       0x98000001,0x00000000,0x40000000,0x00000000,\r
+               0x03F, 0x000C0000,\r
+       0x98000400,0x00000000,0x40000000,0x00000000,\r
+               0x03F, 0x000C0000,\r
+       0x90000003,0x00000000,0x40000000,0x00000000,\r
+               0x03F, 0x00000000,\r
+       0x90000001,0x00000000,0x40000000,0x00000000,\r
+               0x03F, 0x00000000,\r
+       0x98000000,0x00000000,0x40000000,0x00000000,\r
+               0x03F, 0x000C0000,\r
+       0x90000400,0x00000000,0x40000000,0x00000000,\r
+               0x03F, 0x00000000,\r
+       0xA0000000,0x00000000,\r
                0x03F, 0x00000000,\r
+       0xB0000000,0x00000000,\r
                0x042, 0x000060C0,\r
                0x057, 0x000D0000,\r
                0x058, 0x000BE180,\r
@@ -98,11 +177,23 @@ u4Byte Array_MP_8188E_RadioA_1T[] = {
                0x0DF, 0x00000180,\r
                0x0EF, 0x000001A0,\r
                0x051, 0x0006B27D,\r
-       0xFF0F0400, 0xABCD,\r
+       0x88000003,0x00000000,0x40000000,0x00000000,\r
+               0x052, 0x0007E49D,\r
+       0x98000001,0x00000000,0x40000000,0x00000000,\r
+               0x052, 0x0007E49D,\r
+       0x98000400,0x00000000,0x40000000,0x00000000,\r
+               0x052, 0x0007E4DD,\r
+       0x90000003,0x00000000,0x40000000,0x00000000,\r
+               0x052, 0x0007E49D,\r
+       0x90000001,0x00000000,0x40000000,0x00000000,\r
+               0x052, 0x0007E49D,\r
+       0x98000000,0x00000000,0x40000000,0x00000000,\r
+               0x052, 0x0007E49D,\r
+       0x90000400,0x00000000,0x40000000,0x00000000,\r
                0x052, 0x0007E4DD,\r
-       0xCDCDCDCD, 0xCDCD,\r
+       0xA0000000,0x00000000,\r
                0x052, 0x0007E49D,\r
-       0xFF0F0400, 0xDEAD,\r
+       0xB0000000,0x00000000,\r
                0x053, 0x00000073,\r
                0x056, 0x00051FF3,\r
                0x035, 0x00000086,\r
@@ -116,7 +207,7 @@ u4Byte Array_MP_8188E_RadioA_1T[] = {
                0x018, 0x00000C07,\r
                0x05A, 0x0004BD00,\r
                0x019, 0x000739D0,\r
-       0xFF0F0718, 0xABCD,\r
+       0x88000003,0x00000000,0x40000000,0x00000000,\r
                0x034, 0x0000A093,\r
                0x034, 0x0000908F,\r
                0x034, 0x0000808C,\r
@@ -128,7 +219,19 @@ u4Byte Array_MP_8188E_RadioA_1T[] = {
                0x034, 0x00002006,\r
                0x034, 0x00001003,\r
                0x034, 0x00000000,\r
-       0xCDCDCDCD, 0xCDCD,\r
+       0x90000003,0x00000000,0x40000000,0x00000000,\r
+               0x034, 0x0000A093,\r
+               0x034, 0x0000908F,\r
+               0x034, 0x0000808C,\r
+               0x034, 0x0000704F,\r
+               0x034, 0x0000604C,\r
+               0x034, 0x00005049,\r
+               0x034, 0x0000400C,\r
+               0x034, 0x00003009,\r
+               0x034, 0x00002006,\r
+               0x034, 0x00001003,\r
+               0x034, 0x00000000,\r
+       0xA0000000,0x00000000,\r
                0x034, 0x0000ADF3,\r
                0x034, 0x00009DF0,\r
                0x034, 0x00008DED,\r
@@ -140,7 +243,7 @@ u4Byte Array_MP_8188E_RadioA_1T[] = {
                0x034, 0x0000246B,\r
                0x034, 0x00001468,\r
                0x034, 0x0000006D,\r
-       0xFF0F0718, 0xDEAD,\r
+       0xB0000000,0x00000000,\r
                0x000, 0x00030159,\r
                0x084, 0x00068200,\r
                0x086, 0x000000CE,\r
@@ -178,457 +281,82 @@ u4Byte Array_MP_8188E_RadioA_1T[] = {
 \r
 };\r
 \r
-HAL_STATUS\r
-ODM_ReadAndConfig_MP_8188E_RadioA_1T(\r
+void\r
+ODM_ReadAndConfig_MP_8188E_RadioA(\r
        IN   PDM_ODM_T  pDM_Odm\r
        )\r
 {\r
-       #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)\r
-\r
-       u4Byte     hex         = 0;\r
-       u4Byte     i           = 0;\r
-       u2Byte     count       = 0;\r
-       pu4Byte    ptr_array   = NULL;\r
-       u1Byte     platform    = pDM_Odm->SupportPlatform;\r
-       u1Byte     _interface   = pDM_Odm->SupportInterface;\r
-       u1Byte     board       = pDM_Odm->BoardType;  \r
-       u4Byte     ArrayLen    = sizeof(Array_MP_8188E_RadioA_1T)/sizeof(u4Byte);\r
-       pu4Byte    Array       = Array_MP_8188E_RadioA_1T;\r
-       BOOLEAN         biol = FALSE;\r
-#ifdef CONFIG_IOL_IOREG_CFG \r
-       PADAPTER        Adapter =  pDM_Odm->Adapter;    \r
-       struct xmit_frame       *pxmit_frame;   \r
-       u8 bndy_cnt = 1;\r
-       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-       struct cmd_cmp cmpdata[ArrayLen];\r
-       u4Byte  cmpdata_idx=0;\r
-       #endif\r
-#endif//#ifdef CONFIG_IOL_IOREG_CFG \r
-       HAL_STATUS rst =HAL_STATUS_SUCCESS;\r
-\r
-       hex += board;\r
-       hex += _interface << 8;\r
-       hex += platform << 16;\r
-       hex += 0xFF000000;\r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_8188E_RadioA_1T, hex = 0x%X\n", hex));\r
-#ifdef CONFIG_IOL_IOREG_CFG \r
-       biol = rtw_IOL_applied(Adapter);\r
+    u4Byte     i         = 0;\r
+    u1Byte     cCond;\r
+    BOOLEAN bMatched = TRUE, bSkipped = FALSE;\r
+//ask by Luke.Lee\r
+    u4Byte     ArrayLen    = sizeof(Array_MP_8188E_RadioA)/sizeof(u4Byte);\r
+    pu4Byte    Array       = Array_MP_8188E_RadioA;\r
        \r
-       if(biol){               \r
-               if((pxmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL)\r
-               {\r
-                       printk("rtw_IOL_accquire_xmit_frame failed\n");\r
-                       return HAL_STATUS_FAILURE;\r
-               }\r
-       }               \r
-#endif//#ifdef CONFIG_IOL_IOREG_CFG\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8188E_RadioA\n"));\r
 \r
-       for (i = 0; i < ArrayLen; i += 2 )\r
+       while(( i+1) < ArrayLen)\r
        {\r
-           u4Byte v1 = Array[i];\r
-           u4Byte v2 = Array[i+1];\r
-       \r
-           // This (offset, data) pair meets the condition.\r
-           if ( v1 < 0xCDCDCDCD )\r
-           {\r
-                       #ifdef CONFIG_IOL_IOREG_CFG     \r
-                       if(biol){       \r
-                               if(rtw_IOL_cmd_boundary_handle(pxmit_frame))\r
-                                       bndy_cnt++;     \r
-                               \r
-                               if(v1 == 0xffe)\r
-                               {                                       \r
-                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,50);                            \r
-                               }\r
-                               else if (v1 == 0xfd){\r
-                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,5);\r
-                               }\r
-                               else if (v1 == 0xfc){\r
-                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,1);\r
-                               }\r
-                               else if (v1 == 0xfb){\r
-                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,50);\r
-                               }\r
-                               else if (v1 == 0xfa){\r
-                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,5);\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 (v1 == 0xf9){\r
-                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,1);\r
+                               else if(cCond == COND_ELSE) //else\r
+                               {\r
+                                       bMatched = bSkipped?FALSE:TRUE;\r
                                }\r
-                               else{\r
-                                       rtw_IOL_append_WRF_cmd(pxmit_frame, ODM_RF_PATH_A,(u2Byte)v1, v2,bRFRegOffsetMask) ;\r
-                                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                                       cmpdata[cmpdata_idx].addr = v1;\r
-                                       cmpdata[cmpdata_idx].value= v2;\r
-                                       cmpdata_idx++;\r
-                                       #endif\r
-                               }                               \r
\r
-                       }\r
-                       else\r
-                       #endif  //#ifdef CONFIG_IOL_IOREG_CFG\r
-                       {\r
-                       odm_ConfigRF_RadioA_8188E(pDM_Odm, v1, v2);\r
-                       }\r
-                   continue;\r
-               }\r
-               else\r
-               { // This line is the start line of branch.\r
-                   if ( !CheckCondition(Array[i], hex) )\r
-                   { // Discard the following (offset, data) pairs.\r
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\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
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\r
-                                       #ifdef CONFIG_IOL_IOREG_CFG     \r
-                                       if(biol){       \r
-                                               if(rtw_IOL_cmd_boundary_handle(pxmit_frame))\r
-                                                       bndy_cnt++;     \r
-                                               \r
-                                               if(v1 == 0xffe)\r
-                                               {                                                       \r
-                                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,50);                                    \r
-                                               }\r
-                                               else if (v1 == 0xfd){\r
-                                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,5);\r
-                                               }\r
-                                               else if (v1 == 0xfc){\r
-                                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,1);\r
-                                               }\r
-                                               else if (v1 == 0xfb){\r
-                                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,50);\r
-                                               }\r
-                                               else if (v1 == 0xfa){\r
-                                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,5);\r
-                                               }\r
-                                               else if (v1 == 0xf9){\r
-                                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,1);\r
-                                               }\r
-                                               else{\r
-                                                       rtw_IOL_append_WRF_cmd(pxmit_frame, ODM_RF_PATH_A,(u2Byte)v1, v2,bRFRegOffsetMask) ;\r
-                                                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                                                       cmpdata[cmpdata_idx].addr = v1;\r
-                                                       cmpdata[cmpdata_idx].value= v2;\r
-                                                       cmpdata_idx++;\r
-                                                       #endif\r
-       \r
-                                               }\r
-                                       }\r
+                               else //if , else if\r
+                               {\r
+                                       if(bSkipped)\r
+                                               bMatched = FALSE;\r
                                        else\r
-                                       #endif  //#ifdef CONFIG_IOL_IOREG_CFG\r
                                        {\r
-                                               odm_ConfigRF_RadioA_8188E(pDM_Odm, v1, v2);\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
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-\r
-                       while (v2 != 0xDEAD && i < ArrayLen -2)\r
-                       {\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-                       \r
-                   }\r
-               }       \r
-       }\r
-#ifdef CONFIG_IOL_IOREG_CFG            \r
-       if(biol){\r
-               //printk("==> %s, pktlen = %d,bndy_cnt = %d\n",__FUNCTION__,pxmit_frame->attrib.pktlen+4+32,bndy_cnt);\r
-               if(rtw_IOL_exec_cmds_sync(pDM_Odm->Adapter, pxmit_frame, 1000, bndy_cnt))\r
-               {                       \r
-                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                       printk("~~~ %s Success !!! \n",__FUNCTION__);\r
-                       {\r
-                               u4Byte idx;\r
-                               u4Byte cdata;\r
-                               printk("  %s data compare => array_len:%d \n",__FUNCTION__,cmpdata_idx);\r
-                               printk("### %s data compared !!###\n",__FUNCTION__);\r
-                               for(idx=0;idx< cmpdata_idx;idx++)\r
-                               {\r
-                                       cdata = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A,cmpdata[idx].addr,bRFRegOffsetMask);\r
-                                       if(cdata != cmpdata[idx].value){\r
-                                               printk("addr:0x%04x, data:(0x%02x : 0x%02x) \n",\r
-                                                       cmpdata[idx].addr,cmpdata[idx].value,cdata);\r
-                                               rst = HAL_STATUS_FAILURE;\r
-                                       }                                       \r
-                               }       \r
-                               printk("### %s data compared !!###\n",__FUNCTION__);\r
-                               //if(rst == HAL_STATUS_FAILURE)\r
-                               {//dump data from TX packet buffer                              \r
-                                       rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);\r
                                }\r
                        }\r
-                       #endif //CONFIG_IOL_IOREG_CFG_DBG\r
-               \r
-               }\r
-               else{\r
-                       rst = HAL_STATUS_FAILURE;\r
-                       printk("~~~ IOL Config %s Failed !!! \n",__FUNCTION__);\r
-                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                       {\r
-                               //dump data from TX packet buffer                               \r
-                               rtw_IOL_cmd_tx_pkt_buf_dump(pDM_Odm->Adapter,pxmit_frame->attrib.pktlen+32);\r
+                       else if(v1 & BIT30){ //negative condition\r
+                       //do nothing\r
                        }\r
-                       #endif //CONFIG_IOL_IOREG_CFG_DBG\r
                }\r
+               else\r
+               {\r
+                       if(bMatched)\r
+                       odm_ConfigRF_RadioA_8188E(pDM_Odm, v1, v2);\r
+               }\r
+       i = i + 2;\r
        }\r
-\r
-        \r
-#endif //#ifdef CONFIG_IOL_IOREG_CFG \r
-       return rst;\r
 }\r
 \r
-/******************************************************************************\r
-*                           RadioA_1T_ICUT.TXT\r
-******************************************************************************/\r
-\r
-u4Byte Array_MP_8188E_RadioA_1T_ICUT[] = { \r
-               0x000, 0x00030000,\r
-               0x008, 0x00084000,\r
-               0x018, 0x00000407,\r
-               0x019, 0x00000012,\r
-               0x01E, 0x00080009,\r
-               0x01F, 0x00000880,\r
-               0x02F, 0x0001A060,\r
-               0x03F, 0x00000000,\r
-               0x042, 0x000060C0,\r
-               0x057, 0x000D0000,\r
-               0x058, 0x000BE180,\r
-               0x067, 0x00001552,\r
-               0x083, 0x00000000,\r
-               0x0B0, 0x000FF8FC,\r
-               0x0B1, 0x00054400,\r
-               0x0B2, 0x000CCC19,\r
-               0x0B4, 0x00043003,\r
-               0x0B6, 0x0004953E,\r
-               0x0B7, 0x0001C718,\r
-               0x0B8, 0x000060FF,\r
-               0x0B9, 0x00080001,\r
-               0x0BA, 0x00040000,\r
-               0x0BB, 0x00000400,\r
-               0x0BF, 0x000C0000,\r
-               0x0C2, 0x00002400,\r
-               0x0C3, 0x00000009,\r
-               0x0C4, 0x00040C91,\r
-               0x0C5, 0x00099999,\r
-               0x0C6, 0x000000A3,\r
-               0x0C7, 0x00088820,\r
-               0x0C8, 0x00076C06,\r
-               0x0C9, 0x00000000,\r
-               0x0CA, 0x00080000,\r
-               0x0DF, 0x00000180,\r
-               0x0EF, 0x000001A0,\r
-               0x051, 0x0006B27D,\r
-       0xFF0F0400, 0xABCD,\r
-               0x052, 0x0007E4DD,\r
-       0xCDCDCDCD, 0xCDCD,\r
-               0x052, 0x0007E49D,\r
-       0xFF0F0400, 0xDEAD,\r
-               0x053, 0x00000073,\r
-               0x056, 0x00051FF3,\r
-               0x035, 0x00000086,\r
-               0x035, 0x00000186,\r
-               0x035, 0x00000286,\r
-               0x036, 0x00001C25,\r
-               0x036, 0x00009C25,\r
-               0x036, 0x00011C25,\r
-               0x036, 0x00019C25,\r
-               0x0B6, 0x00048538,\r
-               0x018, 0x00000C07,\r
-               0x05A, 0x0004BD00,\r
-               0x019, 0x000739D0,\r
-               0x034, 0x0000ADF3,\r
-               0x034, 0x00009DF0,\r
-               0x034, 0x00008DED,\r
-               0x034, 0x00007DEA,\r
-               0x034, 0x00006DE7,\r
-               0x034, 0x000054EE,\r
-               0x034, 0x000044EB,\r
-               0x034, 0x000034E8,\r
-               0x034, 0x0000246B,\r
-               0x034, 0x00001468,\r
-               0x034, 0x0000006D,\r
-               0x000, 0x00030159,\r
-               0x084, 0x00068200,\r
-               0x086, 0x000000CE,\r
-               0x087, 0x00048A00,\r
-               0x08E, 0x00065540,\r
-               0x08F, 0x00088000,\r
-               0x0EF, 0x000020A0,\r
-               0x03B, 0x000F02B0,\r
-               0x03B, 0x000EF7B0,\r
-               0x03B, 0x000D4FB0,\r
-               0x03B, 0x000CF060,\r
-               0x03B, 0x000B0090,\r
-               0x03B, 0x000A0080,\r
-               0x03B, 0x00090080,\r
-               0x03B, 0x0008F780,\r
-               0x03B, 0x000722B0,\r
-               0x03B, 0x0006F7B0,\r
-               0x03B, 0x00054FB0,\r
-               0x03B, 0x0004F060,\r
-               0x03B, 0x00030090,\r
-               0x03B, 0x00020080,\r
-               0x03B, 0x00010080,\r
-               0x03B, 0x0000F780,\r
-               0x0EF, 0x000000A0,\r
-               0x000, 0x00010159,\r
-               0x018, 0x0000F407,\r
-               0xFFE, 0x00000000,\r
-               0xFFE, 0x00000000,\r
-               0x01F, 0x00080003,\r
-               0xFFE, 0x00000000,\r
-               0xFFE, 0x00000000,\r
-               0x01E, 0x00000001,\r
-               0x01F, 0x00080000,\r
-               0x000, 0x00033E60,\r
-\r
-};\r
-\r
-HAL_STATUS\r
-ODM_ReadAndConfig_MP_8188E_RadioA_1T_ICUT(\r
-       IN   PDM_ODM_T  pDM_Odm\r
-       )\r
+u4Byte\r
+ODM_GetVersion_MP_8188E_RadioA(void)\r
 {\r
-       #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)\r
-\r
-       u4Byte     hex         = 0;\r
-       u4Byte     i           = 0;\r
-       u2Byte     count       = 0;\r
-       pu4Byte    ptr_array   = NULL;\r
-       u1Byte     platform    = pDM_Odm->SupportPlatform;\r
-       u1Byte     _interface   = pDM_Odm->SupportInterface;\r
-       u1Byte     board       = pDM_Odm->BoardType;  \r
-       u4Byte     ArrayLen    = sizeof(Array_MP_8188E_RadioA_1T_ICUT)/sizeof(u4Byte);\r
-       pu4Byte    Array       = Array_MP_8188E_RadioA_1T_ICUT;\r
-       BOOLEAN         biol = FALSE;\r
-#ifdef CONFIG_IOL_IOREG_CFG \r
-       PADAPTER        Adapter =  pDM_Odm->Adapter;    \r
-       struct xmit_frame       *pxmit_frame;   \r
-       u8 bndy_cnt = 1;\r
-       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-       struct cmd_cmp cmpdata[ArrayLen];\r
-       u4Byte  cmpdata_idx=0;\r
-       #endif\r
-#endif//#ifdef CONFIG_IOL_IOREG_CFG \r
-       HAL_STATUS rst =HAL_STATUS_SUCCESS;\r
-\r
-       hex += board;\r
-       hex += _interface << 8;\r
-       hex += platform << 16;\r
-       hex += 0xFF000000;\r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8188E_RadioA_1T_ICUT, hex = 0x%X\n", hex));\r
-#ifdef CONFIG_IOL_IOREG_CFG \r
-       biol = rtw_IOL_applied(Adapter);\r
-       \r
-       if(biol){               \r
-               if((pxmit_frame=rtw_IOL_accquire_xmit_frame(Adapter)) == NULL)\r
-               {\r
-                       printk("rtw_IOL_accquire_xmit_frame failed\n");\r
-                       return HAL_STATUS_FAILURE;\r
-               }\r
-       }               \r
-#endif//#ifdef CONFIG_IOL_IOREG_CFG\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 meets the condition.\r
-           if ( v1 < 0xCDCDCDCD )\r
-           {\r
-                       #ifdef CONFIG_IOL_IOREG_CFG     \r
-                       if(biol){       \r
-                               if(rtw_IOL_cmd_boundary_handle(pxmit_frame))\r
-                                       bndy_cnt++;     \r
-                               \r
-                               if(v1 == 0xffe)\r
-                               {                                       \r
-                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,50);                            \r
-                               }\r
-                               else if (v1 == 0xfd){\r
-                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,5);\r
-                               }\r
-                               else if (v1 == 0xfc){\r
-                                       rtw_IOL_append_DELAY_MS_cmd(pxmit_frame,1);\r
-                               }\r
-                               else if (v1 == 0xfb){\r
-                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,50);\r
-                               }\r
-                               else if (v1 == 0xfa){\r
-                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,5);\r
-                               }\r
-                               else if (v1 == 0xf9){\r
-                                       rtw_IOL_append_DELAY_US_cmd(pxmit_frame,1);\r
-                               }\r
-                               else{\r
-                                       rtw_IOL_append_WRF_cmd(pxmit_frame, ODM_RF_PATH_A,(u2Byte)v1, v2,bRFRegOffsetMask) ;\r
-                                       #ifdef CONFIG_IOL_IOREG_CFG_DBG\r
-                                       cmpdata[cmpdata_idx].addr = v1;\r
-                                       cmpdata[cmpdata_idx].value= v2;\r
-                                       cmpdata_idx++;\r
-                                       #endif\r
-                               }                               \r
\r
-                       }\r
-                       else\r
-                       #endif  //#ifdef CONFIG_IOL_IOREG_CFG\r
-                       {\r
-                       odm_ConfigRF_RadioA_8188E(pDM_Odm, v1, v2);\r
-                       }\r
-                   continue;\r
-               }\r
-               else\r
-               { // This line is the start line of branch.\r
-                   if ( !CheckCondition(Array[i], hex) )\r
-                   { // Discard the following (offset, data) pairs.\r
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\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
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\r
-                               odm_ConfigRF_RadioA_8188E(pDM_Odm, v1, v2);\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-\r
-                       while (v2 != 0xDEAD && i < ArrayLen -2)\r
-                       {\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-                       \r
-                   }\r
-               }       \r
-       }\r
-       return rst;\r
+          return 53;\r
 }\r
 \r
 /******************************************************************************\r
 *                           TxPowerTrack_AP.TXT\r
 ******************************************************************************/\r
 \r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
 u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_AP_8188E[][DELTA_SWINGIDX_SIZE] = {\r
        {0, 1, 2, 3, 3, 5, 5, 6, 6, 7,  8,  9,  10,  11, 11, 12, 12, 13, 13, 14, 14, 15, 16, 17, 17, 17, 17, 18, 18, 18},\r
        {0, 1, 2, 3, 3, 5, 5, 6, 6, 7,  8,  9,  10,  11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 18, 18, 18},\r
@@ -657,15 +385,17 @@ u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_AP_8188E[] = {0, 1, 1, 1, 2,
 u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_AP_8188E[] = {0, 0, 1, 1, 2, 2, 2, 2, 3,  3,  3,  4,  4,  5,  5,  6,  6,  6,  7,  7,  7,  8,  8,  8,  9,  9,  9,  9,  9,  9};\r
 u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_AP_8188E[] = {0, 1, 1, 1, 2, 2, 2, 3, 3,  3,  4,  4,  5,  5,  5,  6,  6,  6,  7,  8,  8,  9,  9,  9, 10, 10, 10, 10, 11, 11};\r
 u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_AP_8188E[] = {0, 0, 1, 1, 2, 2, 2, 2, 3,  3,  3,  4,  4,  5,  5,  6,  6,  6,  7,  7,  7,  8,  8,  8,  9,  9,  9,  9,  9,  9};\r
+#endif\r
 \r
 void\r
 ODM_ReadAndConfig_MP_8188E_TxPowerTrack_AP(\r
        IN   PDM_ODM_T  pDM_Odm\r
        )\r
 {\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
        PODM_RF_CAL_T  pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\r
 \r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8188E\n"));\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_MP_8188E\n"));\r
 \r
 \r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_AP_8188E, DELTA_SWINGIDX_SIZE);\r
@@ -682,12 +412,14 @@ ODM_ReadAndConfig_MP_8188E_TxPowerTrack_AP(
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_AP_8188E, DELTA_SWINGIDX_SIZE*3);\r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_AP_8188E, DELTA_SWINGIDX_SIZE*3);\r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_AP_8188E, DELTA_SWINGIDX_SIZE*3);\r
+#endif\r
 }\r
 \r
 /******************************************************************************\r
 *                           TxPowerTrack_PCIE.TXT\r
 ******************************************************************************/\r
 \r
+#if DEV_BUS_TYPE == RT_PCI_INTERFACE\r
 u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_PCIE_8188E[][DELTA_SWINGIDX_SIZE] = {\r
        {0, 1, 2, 3, 3, 5, 5, 6, 6, 7,  8,  9,  10,  11, 11, 12, 12, 13, 13, 14, 14, 15, 16, 17, 17, 17, 17, 18, 18, 18},\r
        {0, 1, 2, 3, 3, 5, 5, 6, 6, 7,  8,  9,  10,  11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 18, 18, 18},\r
@@ -709,22 +441,24 @@ u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_PCIE_8188E[][DELTA_SWINGIDX_SIZ
        {0, 1, 2, 3, 4, 5, 6, 7, 8,  9, 10, 11, 12, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15},\r
 };\r
 u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_PCIE_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
-u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_PCIE_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
+u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_PCIE_8188E[]    = {0, 0, 0, 0, 1, 1, 2, 2, 3,  3,  4,  5,  6,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8};\r
 u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_PCIE_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
-u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_PCIE_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
+u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_PCIE_8188E[]    = {0, 0, 0, 0, 1, 1, 2, 2, 3,  3,  4,  5,  6,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8};\r
 u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_PCIE_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
 u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_PCIE_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
 u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_PCIE_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
 u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_PCIE_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
+#endif\r
 \r
 void\r
 ODM_ReadAndConfig_MP_8188E_TxPowerTrack_PCIE(\r
        IN   PDM_ODM_T  pDM_Odm\r
        )\r
 {\r
+#if DEV_BUS_TYPE == RT_PCI_INTERFACE\r
        PODM_RF_CAL_T  pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\r
 \r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8188E\n"));\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_MP_8188E\n"));\r
 \r
 \r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_PCIE_8188E, DELTA_SWINGIDX_SIZE);\r
@@ -741,12 +475,14 @@ ODM_ReadAndConfig_MP_8188E_TxPowerTrack_PCIE(
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_PCIE_8188E, DELTA_SWINGIDX_SIZE*3);\r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_PCIE_8188E, DELTA_SWINGIDX_SIZE*3);\r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_PCIE_8188E, DELTA_SWINGIDX_SIZE*3);\r
+#endif\r
 }\r
 \r
 /******************************************************************************\r
 *                           TxPowerTrack_USB.TXT\r
 ******************************************************************************/\r
 \r
+#if DEV_BUS_TYPE == RT_USB_INTERFACE\r
 u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_8188E[][DELTA_SWINGIDX_SIZE] = {\r
        {0, 1, 2, 3, 3, 5, 5, 6, 6, 7,  8,  9,  10,  11, 11, 12, 12, 13, 13, 14, 14, 15, 16, 17, 17, 17, 17, 18, 18, 18},\r
        {0, 1, 2, 3, 3, 5, 5, 6, 6, 7,  8,  9,  10,  11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 18, 18, 18},\r
@@ -768,22 +504,24 @@ u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_USB_8188E[][DELTA_SWINGIDX_SIZE
        {0, 1, 2, 3, 4, 5, 6, 7, 8,  9, 10, 11, 12, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15},\r
 };\r
 u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_USB_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
-u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_USB_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
+u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_USB_8188E[]    = {0, 0, 0, 0, 1, 1, 2, 2, 3,  3,  4,  5,  6,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8};\r
 u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_USB_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
-u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_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
+u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_8188E[]    = {0, 0, 0, 0, 1, 1, 2, 2, 3,  3,  4,  5,  6,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8};\r
 u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_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
 u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_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
 u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_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
 u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_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
+#endif\r
 \r
 void\r
 ODM_ReadAndConfig_MP_8188E_TxPowerTrack_USB(\r
        IN   PDM_ODM_T  pDM_Odm\r
        )\r
 {\r
+#if DEV_BUS_TYPE == RT_USB_INTERFACE\r
        PODM_RF_CAL_T  pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\r
 \r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8188E\n"));\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_MP_8188E\n"));\r
 \r
 \r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_8188E, DELTA_SWINGIDX_SIZE);\r
@@ -800,6 +538,7 @@ ODM_ReadAndConfig_MP_8188E_TxPowerTrack_USB(
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_USB_8188E, DELTA_SWINGIDX_SIZE*3);\r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_USB_8188E, DELTA_SWINGIDX_SIZE*3);\r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_8188E, DELTA_SWINGIDX_SIZE*3);\r
+#endif\r
 }\r
 \r
 /******************************************************************************\r
@@ -1382,8 +1121,7 @@ ODM_ReadAndConfig_MP_8188E_TXPWR_LMT(
        u4Byte     ArrayLen    = sizeof(Array_MP_8188E_TXPWR_LMT)/sizeof(pu1Byte);\r
        pu1Byte    *Array      = Array_MP_8188E_TXPWR_LMT;\r
 \r
-\r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8188E_TXPWR_LMT\n"));\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8188E_TXPWR_LMT\n"));\r
 \r
        for (i = 0; i < ArrayLen; i += 7 )\r
        {\r
index eb59afd755a8cb24947dcfdb005893611becfbbb..859396678f649603d7f9cb646ba0c6dd844d1be3 100644 (file)
 #ifndef __INC_MP_RF_HW_IMG_8188E_H\r
 #define __INC_MP_RF_HW_IMG_8188E_H\r
 \r
-//static BOOLEAN CheckCondition(const u4Byte Condition, const u4Byte Hex);\r
 \r
 /******************************************************************************\r
-*                           RadioA_1T.TXT\r
+*                           RadioA.TXT\r
 ******************************************************************************/\r
 \r
-HAL_STATUS\r
-ODM_ReadAndConfig_MP_8188E_RadioA_1T( // TC: Test Chip, MP: MP Chip\r
-       IN   PDM_ODM_T  pDM_Odm\r
-);\r
-\r
-/******************************************************************************\r
-*                           RadioA_1T_ICUT.TXT\r
-******************************************************************************/\r
-\r
-HAL_STATUS\r
-ODM_ReadAndConfig_MP_8188E_RadioA_1T_ICUT( // TC: Test Chip, MP: MP Chip\r
+void\r
+ODM_ReadAndConfig_MP_8188E_RadioA( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8188E_RadioA(void);\r
 \r
 /******************************************************************************\r
 *                           TxPowerTrack_AP.TXT\r
@@ -50,6 +41,7 @@ void
 ODM_ReadAndConfig_MP_8188E_TxPowerTrack_AP( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8188E_TxPowerTrack_AP(void);\r
 \r
 /******************************************************************************\r
 *                           TxPowerTrack_PCIE.TXT\r
@@ -59,6 +51,7 @@ void
 ODM_ReadAndConfig_MP_8188E_TxPowerTrack_PCIE( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8188E_TxPowerTrack_PCIE(void);\r
 \r
 /******************************************************************************\r
 *                           TxPowerTrack_USB.TXT\r
@@ -68,6 +61,7 @@ void
 ODM_ReadAndConfig_MP_8188E_TxPowerTrack_USB( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8188E_TxPowerTrack_USB(void);\r
 \r
 /******************************************************************************\r
 *                           TXPWR_LMT.TXT\r
@@ -77,6 +71,7 @@ void
 ODM_ReadAndConfig_MP_8188E_TXPWR_LMT( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8188E_TXPWR_LMT(void);\r
 \r
 #endif\r
 #endif // end of HWIMG_SUPPORT\r
index 2f3779b773f9659b44faddecbe90d879c0e026a8..4308d7e1883851caf6caf628c1004c3c9f8385cb 100644 (file)
@@ -18,8 +18,8 @@
  *\r
  ******************************************************************************/\r
 \r
-\r
-#include "../odm_precomp.h"\r
+#include "Mp_Precomp.h"\r
+#include "../phydm_precomp.h"\r
 \r
 \r
 \r
@@ -195,8 +195,7 @@ ODM_TxPwrTrackSetPwr88E(
        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
@@ -208,7 +207,6 @@ ODM_TxPwrTrackSetPwr88E(
 #endif\r
        }\r
        else\r
-#endif\r
        {\r
                u2Byte  rate     = *(pDM_Odm->pForcedDataRate);\r
        \r
@@ -264,14 +262,13 @@ ODM_TxPwrTrackSetPwr88E(
 \r
 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE ))\r
 \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[ODM_RF_PATH_A];\r
                        PHY_SetBBReg(Adapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, pwr);\r
                        TxAGC = (pwr<<16)|(pwr<<8)|(pwr);\r
-                       PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, TxAGC);\r
+                       PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskH3Bytes, TxAGC);\r
                        //RT_DISP(FPHY, PHY_TXPWR, ("ODM_TxPwrTrackSetPwr88E: CCK Tx-rf(A) Power = 0x%x\n", TxAGC));            \r
 \r
                        pwr = PHY_QueryBBReg(Adapter, rTxAGC_A_Rate18_06, 0xFF);\r
@@ -286,7 +283,6 @@ ODM_TxPwrTrackSetPwr88E(
                        //RT_DISP(FPHY, PHY_TXPWR, ("ODM_TxPwrTrackSetPwr88E: OFDM Tx-rf(A) Power = 0x%x\n", TxAGC));           \r
                }\r
                else\r
-       #endif\r
                {\r
                        //PHY_SetTxPowerLevel8188E(pDM_Odm->Adapter, *pDM_Odm->pChannel);\r
                        pDM_Odm->Modify_TxAGC_Flag_PathA = TRUE;\r
@@ -315,12 +311,12 @@ ODM_TxPwrTrackSetPwr88E(
                \r
                if (Final_OFDM_Swing_Index >= PwrTrackingLimit_OFDM)\r
                        Final_OFDM_Swing_Index = PwrTrackingLimit_OFDM;\r
-               else if (Final_OFDM_Swing_Index < 0)\r
+               else if (Final_OFDM_Swing_Index <= 0)\r
                        Final_OFDM_Swing_Index = 0;\r
 \r
                if (Final_CCK_Swing_Index >= CCK_TABLE_SIZE)\r
                        Final_CCK_Swing_Index = CCK_TABLE_SIZE-1;\r
-               else if (pDM_Odm->BbSwingIdxCck < 0)\r
+               else if (pDM_Odm->BbSwingIdxCck <= 0)\r
                        Final_CCK_Swing_Index = 0;\r
 \r
                // Adjust BB swing by OFDM IQ matrix\r
@@ -376,7 +372,7 @@ ODM_TxPwrTrackSetPwr88E(
 \r
                        ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Path_A Over BBSwing Limit , PwrTrackingLimit = %d , Remnant TxAGC Value = %d \n", PwrTrackingLimit_OFDM, pDM_Odm->Remnant_OFDMSwingIdx[RFPath]));\r
                }\r
-               else if (Final_OFDM_Swing_Index < 0)\r
+               else if (Final_OFDM_Swing_Index <= 0)\r
                {\r
                        pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index ;     \r
 \r
@@ -448,7 +444,7 @@ ODM_TxPwrTrackSetPwr88E(
                        PHY_SetTxPowerIndexByRateSection(Adapter, ODM_RF_PATH_A, pHalData->CurrentChannel, CCK );\r
                        \r
                }\r
-               else if(Final_CCK_Swing_Index < 0)    // Lowest CCK Index = 0\r
+               else if(Final_CCK_Swing_Index <= 0)    // Lowest CCK Index = 0\r
                {\r
                        pDM_Odm->Remnant_CCKSwingIdx = Final_CCK_Swing_Index;\r
 \r
@@ -663,12 +659,12 @@ phy_PathA_RxIQK(
        //1 Get TXIMR setting\r
        //modify RXIQK mode table\r
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path-A Rx IQK modify RXIQK mode table!\n"));\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);      \r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);              \r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, bRFRegOffsetMask, 0x800a0 );\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x30000 );\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0000f );\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xf117B );\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);\r
        \r
        //IQK setting\r
        ODM_SetBBReg(pDM_Odm, rTx_IQK, bMaskDWord, 0x01007c00);\r
@@ -718,12 +714,12 @@ phy_PathA_RxIQK(
        //1 RX IQK\r
        //modify RXIQK mode table\r
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path-A Rx IQK modify RXIQK mode table 2!\n"));\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);              \r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);                      \r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, bRFRegOffsetMask, 0x800a0 );\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x30000 );\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0000f );\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xf7ffa );\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);\r
 \r
        //IQK setting\r
        ODM_SetBBReg(pDM_Odm, rRx_IQK, bMaskDWord, 0x01004800);\r
@@ -1235,9 +1231,9 @@ _PHY_PathAStandBy(
 #endif \r
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("Path-A standby mode!\n"));\r
 \r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x0);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x0);\r
        ODM_SetBBReg(pDM_Odm, 0x840, bMaskDWord, 0x00010000);\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);\r
 }\r
 \r
 VOID\r
@@ -1408,7 +1404,7 @@ phy_IQCalibrate_8188E(
 \r
        u4Byte  retryCount = 2;\r
 \r
-       if ( *(pDM_Odm->mp_mode) == 1)\r
+       if (pDM_Odm->mp_mode == TRUE)\r
                retryCount = 9;\r
 \r
        // Note: IQ calibration must be performed after loading \r
@@ -1505,7 +1501,7 @@ phy_IQCalibrate_8188E(
 \r
        // IQ calibration setting\r
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK setting!\n"));           \r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);\r
        ODM_SetBBReg(pDM_Odm, rTx_IQK, bMaskDWord, 0x01007c00);\r
        ODM_SetBBReg(pDM_Odm, rRx_IQK, bMaskDWord, 0x81004800);\r
 \r
@@ -1599,7 +1595,7 @@ phy_IQCalibrate_8188E(
 \r
        //Back to BB mode, load original value\r
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK:Back to BB mode, load original value!\n"));\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0);\r
 \r
        if(t!=0)\r
        {\r
@@ -1848,7 +1844,7 @@ phy_APCalibrate_8188E(
        PMPT_CONTEXT    pMptCtx = &(pAdapter->MptCtx);  \r
 #endif\r
 \r
-       if ( *(pDM_Odm->mp_mode) == 1)\r
+       if (pDM_Odm->mp_mode == TRUE)\r
        {\r
                pMptCtx->APK_bound[0] = 45;\r
                pMptCtx->APK_bound[1] = 52;             \r
@@ -1867,7 +1863,7 @@ phy_APCalibrate_8188E(
 // will disappear after disable/enable card many times on 88CU. RF SD and DD have not find the\r
 // root cause, so we remove these actions temporarily. Added by tynli and SD3 Allen. 2010.05.31.\r
 //#if MP_DRIVER != 1\r
-       if (*(pDM_Odm->mp_mode) != 1)\r
+       if (pDM_Odm->mp_mode == FALSE)\r
                return;\r
 //#endif\r
        //settings adjust for normal chip\r
@@ -1941,7 +1937,7 @@ phy_APCalibrate_8188E(
                        }       \r
                        \r
                        //page-B1\r
-                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);\r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);\r
                \r
                        //path A\r
                        offset = rPdp_AntA;\r
@@ -1952,7 +1948,7 @@ phy_APCalibrate_8188E(
                                \r
                                offset += 0x04;\r
                        }                               \r
-                       ODM_SetBBReg(pDM_Odm,  rFPGA0_IQK, bMaskDWord, 0x00000000);                                                     \r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);                                                              \r
                }\r
                else if(path == ODM_RF_PATH_B)\r
                {\r
@@ -1985,7 +1981,7 @@ phy_APCalibrate_8188E(
                        }       \r
                        \r
                        //page-B1\r
-                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);\r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);\r
                        \r
                        //path B\r
                        offset = 0xb60;\r
@@ -1996,7 +1992,7 @@ phy_APCalibrate_8188E(
                                \r
                                offset += 0x04;\r
                        }                               \r
-                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0);                                                       \r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0);                                                     \r
                }\r
        \r
                //save RF default value\r
@@ -2118,7 +2114,7 @@ phy_APCalibrate_8188E(
                        i = 0;\r
                        do\r
                        {\r
-                               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000);\r
+                               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x800000);\r
                                {\r
                                        ODM_SetBBReg(pDM_Odm, APK_offset[path], bMaskDWord, APK_value[0]);              \r
                                        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8188E() offset 0x%x value 0x%x\n", APK_offset[path], ODM_GetBBReg(pDM_Odm, APK_offset[path], bMaskDWord)));\r
@@ -2128,7 +2124,7 @@ phy_APCalibrate_8188E(
 \r
                                        ODM_delay_ms(20);\r
                                }\r
-                               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\r
+                               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      \r
 \r
                                if(path == ODM_RF_PATH_A)\r
                                        tmpReg = ODM_GetBBReg(pDM_Odm, rAPK, 0x03E00000);\r
@@ -2294,7 +2290,7 @@ PHY_IQCalibrate_8188E(
 #endif         \r
 \r
 #if MP_DRIVER == 1     \r
-       if (*(pDM_Odm->mp_mode) == 1)\r
+       if (pDM_Odm->mp_mode == TRUE)\r
        {\r
                bStartContTx = pMptCtx->bStartContTx;\r
                bSingleTone = pMptCtx->bSingleTone;\r
@@ -2538,7 +2534,7 @@ PHY_LCCalibrate_8188E(
 #endif \r
 \r
 #if MP_DRIVER == 1     \r
-       if (*(pDM_Odm->mp_mode) == 1)\r
+       if (pDM_Odm->mp_mode == TRUE)\r
        {\r
                bStartContTx = pMptCtx->bStartContTx;\r
                bSingleTone = pMptCtx->bSingleTone;\r
@@ -2580,6 +2576,7 @@ PHY_LCCalibrate_8188E(
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("LCK ProgressingTime = %d\n", ProgressingTime));\r
 }\r
 \r
+#if 0\r
 VOID\r
 PHY_APCalibrate_8188E(\r
 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
@@ -2603,7 +2600,7 @@ PHY_APCalibrate_8188E(
        return;\r
 #endif\r
 \r
-       return;\r
+#if 0\r
 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
        if(!(pDM_Odm->SupportAbility & ODM_RF_CALIBRATION))\r
        {\r
@@ -2630,7 +2627,10 @@ PHY_APCalibrate_8188E(
                phy_APCalibrate_8188E(pDM_Odm, delta, FALSE);\r
 #endif\r
        }\r
+#endif\r
 }\r
+#endif\r
+\r
 VOID phy_SetRFPathSwitch_8188E(\r
 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
        IN PDM_ODM_T            pDM_Odm,\r
@@ -2875,9 +2875,9 @@ phy_DigitalPredistortion(
        // PA gain = 11 & PAD2 => tx_agc 10~0e\r
        // PA gain = 01 => tx_agc 0b~0d\r
        // PA gain = 00 => tx_agc 0a~00\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);      \r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);      \r
        ODM_SetBBReg(pDM_Odm, 0xbc0, bMaskDWord, 0x0005361f);           \r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);      \r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);              \r
 \r
        //do inner loopback DPK 3 times \r
        for(i = 0; i < 3; i++)\r
@@ -2948,8 +2948,8 @@ phy_DigitalPredistortion(
                {\r
                        ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x02017098);\r
                \r
-                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000);\r
-                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x800000);\r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      \r
                        ODM_delay_ms(1);\r
                        ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x800477c0);\r
                        ODM_delay_ms(1);                        \r
@@ -2975,7 +2975,7 @@ phy_DigitalPredistortion(
                ODM_SetBBReg(pDM_Odm, rPdp_AntA_4, bMaskDWord, 0x776d9f84);\r
                ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x0004ab87);\r
                ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x00880000);\r
-               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);\r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);\r
 \r
                for(i=rPdp_AntA; i<=0xb3c; i+=4)\r
                {\r
@@ -2995,7 +2995,7 @@ phy_DigitalPredistortion(
 \r
                //TX_AGC boundary\r
                ODM_SetBBReg(pDM_Odm, 0xbc0, bMaskDWord, 0x0005361f);   \r
-               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);                                      \r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);                                              \r
        }\r
        else\r
        {\r
@@ -3014,9 +3014,9 @@ phy_DigitalPredistortion(
                // PA gain = 11 & PAD2, => tx_agc 10 ~0e\r
                // PA gain = 01 => tx_agc 0b ~0d\r
                // PA gain = 00 => tx_agc 0a ~00\r
-               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);      \r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);      \r
                ODM_SetBBReg(pDM_Odm, 0xbc4, bMaskDWord, 0x0005361f);           \r
-               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);      \r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);              \r
 \r
                //do inner loopback DPK 3 times \r
                for(i = 0; i < 3; i++)\r
@@ -3087,8 +3087,8 @@ phy_DigitalPredistortion(
                        {\r
                                ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x02017098);               \r
                        \r
-                               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000);\r
-                               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\r
+                               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x800000);\r
+                               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      \r
                                ODM_delay_ms(1);\r
                                ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x800477c0);               \r
                                ODM_delay_ms(1);        \r
@@ -3115,7 +3115,7 @@ phy_DigitalPredistortion(
                        ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x0004ab87);\r
                        ODM_SetBBReg(pDM_Odm, rConfig_AntB, bMaskDWord, 0x00880000);\r
                        \r
-                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);\r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);\r
                        for(i=0xb60; i<=0xb9c; i+=4)\r
                        {\r
                                ODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x40004000);       \r
@@ -3134,7 +3134,7 @@ phy_DigitalPredistortion(
                        \r
                        // tx_agc boundary\r
                        ODM_SetBBReg(pDM_Odm, 0xbc4, bMaskDWord, 0x0005361f);   \r
-                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);                      \r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);                              \r
                        \r
                }\r
                else\r
index 204e1566357c5557d2b501bbdd816baa6cd49149..04e2f17c14ceff26b34a6da2fff12fd371399c59 100644 (file)
@@ -75,7 +75,7 @@ void
 PHY_LCCalibrate_8188E(\r
        IN PDM_ODM_T            pDM_Odm\r
 );\r
-\r
+#if 0\r
 //\r
 // AP calibrate\r
 //\r
@@ -86,7 +86,9 @@ PHY_APCalibrate_8188E(
 #else\r
        IN      PADAPTER        pAdapter,\r
 #endif\r
-                                                       IN      s1Byte          delta);\r
+       IN      s1Byte          delta);\r
+#endif\r
+\r
 void   \r
 PHY_DigitalPredistortion_8188E(                IN      PADAPTER        pAdapter);\r
 \r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/Mp_Precomp.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/Mp_Precomp.h
new file mode 100644 (file)
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/rtl8189es/hal/OUTSRC/rtl8188e/odm_RTL8188E.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/odm_RTL8188E.c
deleted file mode 100644 (file)
index 9ad4641..0000000
+++ /dev/null
@@ -1,459 +0,0 @@
-/******************************************************************************\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 "../odm_precomp.h"\r
-\r
-#if (RTL8188E_SUPPORT == 1)\r
-\r
-VOID\r
-ODM_DIG_LowerBound_88E(\r
-       IN              PDM_ODM_T               pDM_Odm\r
-)\r
-{\r
-       pDIG_T          pDM_DigTable = &pDM_Odm->DM_DigTable;\r
-\r
-       if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)\r
-       {\r
-               pDM_DigTable->rx_gain_range_min = (u1Byte) pDM_DigTable->AntDiv_RSSI_max;\r
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_DIG_LowerBound_88E(): pDM_DigTable->AntDiv_RSSI_max=%d \n",pDM_DigTable->AntDiv_RSSI_max));\r
-       }\r
-       //If only one Entry connected\r
-}\r
-\r
-\r
-//3============================================================\r
-//3 Dynamic Primary CCA\r
-//3============================================================\r
-\r
-VOID\r
-odm_PrimaryCCA_Init(\r
-       IN              PDM_ODM_T               pDM_Odm)\r
-{\r
-       pPri_CCA_T              PrimaryCCA = &(pDM_Odm->DM_PriCCA);  \r
-       PrimaryCCA->DupRTS_flag = 0;\r
-       PrimaryCCA->intf_flag = 0;\r
-       PrimaryCCA->intf_type = 0;\r
-       PrimaryCCA->Monitor_flag = 0;\r
-       PrimaryCCA->PriCCA_flag = 0;\r
-}\r
-\r
-BOOLEAN\r
-ODM_DynamicPrimaryCCA_DupRTS(\r
-       IN              PDM_ODM_T               pDM_Odm\r
-       )\r
-{\r
-       pPri_CCA_T              PrimaryCCA = &(pDM_Odm->DM_PriCCA);  \r
-       \r
-       return  PrimaryCCA->DupRTS_flag;\r
-}\r
-\r
-VOID\r
-odm_DynamicPrimaryCCA(\r
-       IN              PDM_ODM_T               pDM_Odm\r
-       )\r
-{\r
-       PADAPTER        Adapter =  pDM_Odm->Adapter;    // for NIC\r
-\r
-#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))  \r
-       PRT_WLAN_STA    pEntry;\r
-#endif \r
-\r
-       PFALSE_ALARM_STATISTICS         FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);\r
-       pPri_CCA_T              PrimaryCCA = &(pDM_Odm->DM_PriCCA);  \r
-       \r
-       BOOLEAN         Is40MHz;\r
-       BOOLEAN         Client_40MHz = FALSE, Client_tmp = FALSE;      // connected client BW  \r
-       BOOLEAN         bConnected = FALSE;             // connected or not\r
-       static u1Byte   Client_40MHz_pre = 0;\r
-       static u8Byte   lastTxOkCnt = 0;\r
-       static u8Byte   lastRxOkCnt = 0;\r
-       static u4Byte   Counter = 0;\r
-       static u1Byte   Delay = 1;\r
-       u8Byte          curTxOkCnt;\r
-       u8Byte          curRxOkCnt;\r
-       u1Byte          SecCHOffset;\r
-       u1Byte          i;\r
-       \r
-#if((DM_ODM_SUPPORT_TYPE==ODM_ADSL) ||( DM_ODM_SUPPORT_TYPE==ODM_CE))\r
-       return;\r
-#endif\r
-\r
-       if(pDM_Odm->SupportICType != ODM_RTL8188E) \r
-               return;\r
-\r
-       Is40MHz = *(pDM_Odm->pBandWidth);\r
-       SecCHOffset = *(pDM_Odm->pSecChOffset);\r
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Second CH Offset = %d\n", SecCHOffset));\r
-       \r
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
-       if(Is40MHz==1)\r
-               SecCHOffset = SecCHOffset%2+1;     // NIC's definition is reverse to AP   1:secondary below,  2: secondary above\r
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Second CH Offset = %d\n", SecCHOffset));\r
-       //3 Check Current WLAN Traffic\r
-       curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - lastTxOkCnt;\r
-       curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - lastRxOkCnt;\r
-       lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;\r
-       lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;       \r
-#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
-       //3 Check Current WLAN Traffic\r
-       curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast)-lastTxOkCnt;\r
-       curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast)-lastRxOkCnt;\r
-       lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);\r
-       lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);\r
-#endif\r
-\r
-       //==================Debug Message====================\r
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("TP = %llu\n", curTxOkCnt+curRxOkCnt));\r
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Is40MHz = %d\n", Is40MHz));\r
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("BW_LSC = %d\n", FalseAlmCnt->Cnt_BW_LSC));\r
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("BW_USC = %d\n", FalseAlmCnt->Cnt_BW_USC));\r
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("CCA OFDM = %d\n", FalseAlmCnt->Cnt_OFDM_CCA));\r
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("CCA CCK = %d\n", FalseAlmCnt->Cnt_CCK_CCA));\r
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("OFDM FA = %d\n", FalseAlmCnt->Cnt_Ofdm_fail));\r
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("CCK FA = %d\n", FalseAlmCnt->Cnt_Cck_fail));\r
-       //================================================\r
-       \r
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
-       if (ACTING_AS_AP(Adapter))   // primary cca process only do at AP mode\r
-#endif\r
-       {\r
-               \r
-       #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("ACTING as AP mode=%d\n", ACTING_AS_AP(Adapter)));\r
-               //3 To get entry's connection and BW infomation status. \r
-               for(i=0;i<ASSOCIATE_ENTRY_NUM;i++)\r
-               {\r
-                       if(IsAPModeExist(Adapter)&&GetFirstExtAdapter(Adapter)!=NULL)\r
-                               pEntry=AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);\r
-                       else\r
-                               pEntry=AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);\r
-                       if(pEntry!=NULL)\r
-                       {\r
-                               Client_tmp = pEntry->BandWidth;   // client BW\r
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Client_BW=%d\n", Client_tmp));\r
-                               if(Client_tmp>Client_40MHz)\r
-                                       Client_40MHz = Client_tmp;     // 40M/20M coexist => 40M priority is High\r
-                               \r
-                               if(pEntry->bAssociated)\r
-                               {\r
-                                       bConnected=TRUE;    // client is connected or not\r
-                                       break;\r
-                               }\r
-                       }\r
-                       else\r
-                       {\r
-                               break;\r
-                       }\r
-               }\r
-#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
-               //3 To get entry's connection and BW infomation status. \r
-\r
-               PSTA_INFO_T pstat;\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
-                               Client_tmp = pstat->tx_bw;  \r
-                               if(Client_tmp>Client_40MHz)\r
-                                       Client_40MHz = Client_tmp;     // 40M/20M coexist => 40M priority is High\r
-                               \r
-                               bConnected = TRUE;\r
-                       }\r
-               }\r
-#endif\r
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("bConnected=%d\n", bConnected));\r
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Is Client 40MHz=%d\n", Client_40MHz));\r
-               //1 Monitor whether the interference exists or not \r
-               if(PrimaryCCA->Monitor_flag == 1)\r
-               {\r
-                       if(SecCHOffset == 1)       // secondary channel is below the primary channel\r
-                       {\r
-                               if((FalseAlmCnt->Cnt_OFDM_CCA > 500)&&(FalseAlmCnt->Cnt_BW_LSC > FalseAlmCnt->Cnt_BW_USC+500))\r
-                               {\r
-                                       if(FalseAlmCnt->Cnt_Ofdm_fail > FalseAlmCnt->Cnt_OFDM_CCA>>1)\r
-                                       {\r
-                                               PrimaryCCA->intf_type = 1;\r
-                                               PrimaryCCA->PriCCA_flag = 1;\r
-                                               ODM_SetBBReg(pDM_Odm, 0xc6c, BIT8|BIT7, 2);   // USC MF\r
-                                               if(PrimaryCCA->DupRTS_flag == 1)\r
-                                                       PrimaryCCA->DupRTS_flag = 0;\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               PrimaryCCA->intf_type = 2;\r
-                                               if(PrimaryCCA->DupRTS_flag == 0)\r
-                                                       PrimaryCCA->DupRTS_flag = 1;\r
-                                       }\r
-                               \r
-                               }\r
-                               else   // interferecne disappear\r
-                               {\r
-                                       PrimaryCCA->DupRTS_flag = 0;\r
-                                       PrimaryCCA->intf_flag = 0;\r
-                                       PrimaryCCA->intf_type = 0;\r
-                               }\r
-                       }\r
-                       else if(SecCHOffset == 2)  // secondary channel is above the primary channel\r
-                       {\r
-                               if((FalseAlmCnt->Cnt_OFDM_CCA > 500)&&(FalseAlmCnt->Cnt_BW_USC > FalseAlmCnt->Cnt_BW_LSC+500))\r
-                               {\r
-                                       if(FalseAlmCnt->Cnt_Ofdm_fail > FalseAlmCnt->Cnt_OFDM_CCA>>1)\r
-                                       {\r
-                                               PrimaryCCA->intf_type = 1;\r
-                                               PrimaryCCA->PriCCA_flag = 1;\r
-                                               ODM_SetBBReg(pDM_Odm, 0xc6c, BIT8|BIT7, 1);  // LSC MF\r
-                                               if(PrimaryCCA->DupRTS_flag == 1)\r
-                                                       PrimaryCCA->DupRTS_flag = 0;\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               PrimaryCCA->intf_type = 2;\r
-                                               if(PrimaryCCA->DupRTS_flag == 0)\r
-                                                       PrimaryCCA->DupRTS_flag = 1;\r
-                                       }\r
-                               \r
-                               }\r
-                               else   // interferecne disappear\r
-                               {\r
-                                       PrimaryCCA->DupRTS_flag = 0;\r
-                                       PrimaryCCA->intf_flag = 0;\r
-                                       PrimaryCCA->intf_type = 0;\r
-                               }\r
-\r
-\r
-                       }\r
-                       PrimaryCCA->Monitor_flag = 0;\r
-               }\r
-\r
-               //1 Dynamic Primary CCA Main Function\r
-               if(PrimaryCCA->Monitor_flag == 0)\r
-               {\r
-                       if(Is40MHz)             // if RFBW==40M mode which require to process primary cca\r
-                       {\r
-                               //2 STA is NOT Connected\r
-                               if(!bConnected)\r
-                               {\r
-                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("STA NOT Connected!!!!\n"));\r
-                       \r
-                                       if(PrimaryCCA->PriCCA_flag == 1)                // reset primary cca when STA is disconnected\r
-                                       {\r
-                                               PrimaryCCA->PriCCA_flag = 0;\r
-                                               ODM_SetBBReg(pDM_Odm, 0xc6c, BIT8|BIT7, 0);\r
-                                       }\r
-                                       if(PrimaryCCA->DupRTS_flag == 1)                // reset Duplicate RTS when STA is disconnected\r
-                                               PrimaryCCA->DupRTS_flag = 0;\r
-\r
-                                       if(SecCHOffset == 1)   // secondary channel is below the primary channel\r
-                                       {\r
-                                               if((FalseAlmCnt->Cnt_OFDM_CCA > 800)&&(FalseAlmCnt->Cnt_BW_LSC*5 > FalseAlmCnt->Cnt_BW_USC*9))\r
-                                               {\r
-                                                       PrimaryCCA->intf_flag = 1;    // secondary channel interference is detected!!!\r
-                                                       if(FalseAlmCnt->Cnt_Ofdm_fail > FalseAlmCnt->Cnt_OFDM_CCA>>1)\r
-                                                               PrimaryCCA->intf_type = 1;      // interference is shift\r
-                                                       else\r
-                                                               PrimaryCCA->intf_type = 2;      // interference is in-band\r
-                                               }\r
-                                               else    \r
-                                               {\r
-                                                       PrimaryCCA->intf_flag = 0;\r
-                                                       PrimaryCCA->intf_type = 0;  \r
-                                               }\r
-                                       }\r
-                                       else if(SecCHOffset == 2)    // secondary channel is above the primary channel\r
-                                       {\r
-                                               if((FalseAlmCnt->Cnt_OFDM_CCA > 800)&&(FalseAlmCnt->Cnt_BW_USC*5 > FalseAlmCnt->Cnt_BW_LSC*9))\r
-                                               {\r
-                                                       PrimaryCCA->intf_flag = 1;    // secondary channel interference is detected!!!\r
-                                                       if(FalseAlmCnt->Cnt_Ofdm_fail > FalseAlmCnt->Cnt_OFDM_CCA>>1)\r
-                                                               PrimaryCCA->intf_type = 1;      // interference is shift\r
-                                                       else\r
-                                                               PrimaryCCA->intf_type = 2;      // interference is in-band\r
-                                               }\r
-                                               else    \r
-                                               {\r
-                                                       PrimaryCCA->intf_flag = 0;\r
-                                                       PrimaryCCA->intf_type = 0;  \r
-                                               }\r
-                                       }\r
-                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("PrimaryCCA=%d\n",PrimaryCCA->PriCCA_flag));\r
-                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Intf_Type=%d\n", PrimaryCCA->intf_type));\r
-                               }\r
-                               //2 STA is Connected\r
-                               else\r
-                               {\r
-                                       if(Client_40MHz == 0)           //3 // client BW = 20MHz\r
-                                       {\r
-                                               if(PrimaryCCA->PriCCA_flag == 0)\r
-                                               {\r
-                                                       PrimaryCCA->PriCCA_flag = 1;\r
-                                                       if(SecCHOffset==1)\r
-                                                               ODM_SetBBReg(pDM_Odm, 0xc6c, BIT8|BIT7, 2);\r
-                                                       else if(SecCHOffset==2)\r
-                                                               ODM_SetBBReg(pDM_Odm, 0xc6c, BIT8|BIT7, 1);\r
-                                               }\r
-                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("STA Connected 20M!!! PrimaryCCA=%d\n", PrimaryCCA->PriCCA_flag));\r
-                                       }\r
-                                       else            //3 // client BW = 40MHz\r
-                                       {\r
-                                               if(PrimaryCCA->intf_flag == 1)    // interference is detected!!\r
-                                               {\r
-                                                       if(PrimaryCCA->intf_type == 1)\r
-                                                       {\r
-                                                               if(PrimaryCCA->PriCCA_flag!=1)\r
-                                                               {\r
-                                                                       PrimaryCCA->PriCCA_flag = 1;\r
-                                                                       if(SecCHOffset==1)\r
-                                                                               ODM_SetBBReg(pDM_Odm, 0xc6c, BIT8|BIT7, 2);\r
-                                                                       else if(SecCHOffset==2)\r
-                                                                               ODM_SetBBReg(pDM_Odm, 0xc6c, BIT8|BIT7, 1);\r
-                                                               }\r
-                                                       }\r
-                                                       else if(PrimaryCCA->intf_type == 2)\r
-                                                       {\r
-                                                               if(PrimaryCCA->DupRTS_flag!=1)\r
-                                                                       PrimaryCCA->DupRTS_flag = 1;\r
-                                                       }\r
-                                               }\r
-                                               else   // if intf_flag==0\r
-                                               {\r
-                                                       if((curTxOkCnt+curRxOkCnt)<10000)   //idle mode or TP traffic is very low\r
-                                                       {\r
-                                                               if(SecCHOffset == 1)\r
-                                                               {\r
-                                                                       if((FalseAlmCnt->Cnt_OFDM_CCA > 800)&&(FalseAlmCnt->Cnt_BW_LSC*5 > FalseAlmCnt->Cnt_BW_USC*9))\r
-                                                                       {\r
-                                                                               PrimaryCCA->intf_flag = 1;\r
-                                                                               if(FalseAlmCnt->Cnt_Ofdm_fail > FalseAlmCnt->Cnt_OFDM_CCA>>1)           \r
-                                                                                       PrimaryCCA->intf_type = 1;      // interference is shift\r
-                                                                               else\r
-                                                                                       PrimaryCCA->intf_type = 2;      // interference is in-band\r
-                                                                       }\r
-                                                               }\r
-                                                               else if(SecCHOffset == 2)\r
-                                                               {\r
-                                                                       if((FalseAlmCnt->Cnt_OFDM_CCA > 800)&&(FalseAlmCnt->Cnt_BW_USC*5 > FalseAlmCnt->Cnt_BW_LSC*9))\r
-                                                                       {\r
-                                                                               PrimaryCCA->intf_flag = 1;\r
-                                                                               if(FalseAlmCnt->Cnt_Ofdm_fail > FalseAlmCnt->Cnt_OFDM_CCA>>1)           \r
-                                                                                       PrimaryCCA->intf_type = 1;      // interference is shift\r
-                                                                               else\r
-                                                                                       PrimaryCCA->intf_type = 2;      // interference is in-band\r
-                                                                       }\r
-\r
-                                                               }\r
-                                                       }\r
-                                                       else     // TP Traffic is High\r
-                                                       {\r
-                                                               if(SecCHOffset == 1)\r
-                                                               {\r
-                                                                       if(FalseAlmCnt->Cnt_BW_LSC > (FalseAlmCnt->Cnt_BW_USC+500))\r
-                                                                       {       \r
-                                                                               if(Delay == 0)    // add delay to avoid interference occurring abruptly, jump one time\r
-                                                                               {\r
-                                                                                       PrimaryCCA->intf_flag = 1;\r
-                                                                                       if(FalseAlmCnt->Cnt_Ofdm_fail > FalseAlmCnt->Cnt_OFDM_CCA>>1)\r
-                                                                                               PrimaryCCA->intf_type = 1;      // interference is shift\r
-                                                                                       else\r
-                                                                                               PrimaryCCA->intf_type = 2;      // interference is in-band\r
-                                                                                       Delay = 1;\r
-                                                                               }\r
-                                                                               else\r
-                                                                                       Delay = 0;\r
-                                                                       }       \r
-                                                               }       \r
-                                                               else if(SecCHOffset == 2)\r
-                                                               {\r
-                                                                       if(FalseAlmCnt->Cnt_BW_USC > (FalseAlmCnt->Cnt_BW_LSC+500))\r
-                                                                       {       \r
-                                                                               if(Delay == 0)    // add delay to avoid interference occurring abruptly\r
-                                                                               {\r
-                                                                                       PrimaryCCA->intf_flag = 1;\r
-                                                                                       if(FalseAlmCnt->Cnt_Ofdm_fail > FalseAlmCnt->Cnt_OFDM_CCA>>1)\r
-                                                                                               PrimaryCCA->intf_type = 1;      // interference is shift\r
-                                                                                       else\r
-                                                                                               PrimaryCCA->intf_type = 2;      // interference is in-band\r
-                                                                                       Delay = 1;\r
-                                                                               }\r
-                                                                               else\r
-                                                                                       Delay = 0;\r
-                                                                       }       \r
-                                                               }\r
-                                                       }\r
-                                               }\r
-                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Primary CCA=%d\n", PrimaryCCA->PriCCA_flag));\r
-                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Duplicate RTS=%d\n", PrimaryCCA->DupRTS_flag));\r
-                                       }\r
-\r
-                               }// end of connected\r
-                       }\r
-               }\r
-               //1 Dynamic Primary CCA Monitor Counter\r
-               if((PrimaryCCA->PriCCA_flag == 1)||(PrimaryCCA->DupRTS_flag == 1))\r
-               {\r
-                       if(Client_40MHz == 0)     // client=20M no need to monitor primary cca flag  \r
-                       {\r
-                               Client_40MHz_pre = Client_40MHz;\r
-                               return;\r
-                       }\r
-                       Counter++;\r
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Counter=%d\n", Counter));\r
-                       if((Counter == 30)||((Client_40MHz -Client_40MHz_pre)==1))      // Every 60 sec to monitor one time\r
-                       {\r
-                               PrimaryCCA->Monitor_flag = 1;     // monitor flag is triggered!!!!!\r
-                               if(PrimaryCCA->PriCCA_flag == 1)\r
-                               {\r
-                                       PrimaryCCA->PriCCA_flag = 0;\r
-                                       ODM_SetBBReg(pDM_Odm, 0xc6c, BIT8|BIT7, 0);\r
-                               }\r
-                               Counter = 0;\r
-                       }\r
-               }\r
-       }\r
-\r
-       Client_40MHz_pre = Client_40MHz;\r
-}\r
-#else //#if (RTL8188E_SUPPORT == 1)\r
-\r
-VOID\r
-odm_PrimaryCCA_Init(\r
-       IN              PDM_ODM_T               pDM_Odm)\r
-{\r
-}\r
-VOID\r
-odm_DynamicPrimaryCCA(\r
-       IN              PDM_ODM_T               pDM_Odm\r
-       )\r
-{\r
-}\r
-BOOLEAN\r
-ODM_DynamicPrimaryCCA_DupRTS(\r
-       IN              PDM_ODM_T               pDM_Odm\r
-       )\r
-{\r
-       return FALSE;\r
-}\r
-#endif //#if (RTL8188E_SUPPORT == 1)\r
-\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/odm_RTL8188E.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/odm_RTL8188E.h
deleted file mode 100644 (file)
index 60406e6..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/******************************************************************************\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_RTL8188E_H__\r
-#define __ODM_RTL8188E_H__\r
-\r
-\r
-#define        MAIN_ANT_CG_TRX 1\r
-#define        AUX_ANT_CG_TRX  0\r
-#define        MAIN_ANT_CGCS_RX        0\r
-#define        AUX_ANT_CGCS_RX 1\r
-\r
-VOID\r
-ODM_DIG_LowerBound_88E(\r
-       IN              PDM_ODM_T               pDM_Odm\r
-);\r
-\r
-\r
-\r
-\r
-#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
-VOID\r
-ODM_SetTxAntByTxInfo_88E(\r
-       IN              PDM_ODM_T               pDM_Odm,\r
-       IN              pu1Byte                 pDesc,\r
-       IN              u1Byte                  macId   \r
-);\r
-#else// (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
-VOID\r
-ODM_SetTxAntByTxInfo_88E(\r
-       IN              PDM_ODM_T               pDM_Odm \r
-);\r
-#endif\r
-\r
-VOID\r
-odm_PrimaryCCA_Init(\r
-       IN              PDM_ODM_T               pDM_Odm);\r
-\r
-BOOLEAN\r
-ODM_DynamicPrimaryCCA_DupRTS(\r
-       IN              PDM_ODM_T               pDM_Odm);\r
-\r
-VOID\r
-odm_DynamicPrimaryCCA(\r
-       IN              PDM_ODM_T               pDM_Odm);\r
-\r
-#endif\r
-\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/odm_RegConfig8188E.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/odm_RegConfig8188E.c
deleted file mode 100644 (file)
index 25ad4b1..0000000
+++ /dev/null
@@ -1,234 +0,0 @@
-/******************************************************************************
- *
- * 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 "../odm_precomp.h"
-
-#if (RTL8188E_SUPPORT == 1)  
-
-void
-odm_ConfigRFReg_8188E(
-       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 == 0xffe)
-       {                                         
-               #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_SetRFReg(pDM_Odm, RF_PATH, RegAddr, bRFRegOffsetMask, Data);
-               // Add 1us delay between BB/RF register setting.
-               ODM_delay_us(1);
-       }       
-}
-
-
-void 
-odm_ConfigRF_RadioA_8188E(
-       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_8188E(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_8188E(
-       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_8188E(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_8188E(
-       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_8188E(
-    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_8188E(
-       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){
-               #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_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ConfigBBWithHeaderFile: [PHY_REG] %08X %08X %08X\n", Addr, Bitmask, Data));
-
-       #if     !(DM_ODM_SUPPORT_TYPE&ODM_AP)
-               PHY_StoreTxPowerByRate(pDM_Odm->Adapter, Band, RfPath, TxNum, Addr, Bitmask, Data);
-       #endif
-       }
-}
-
-void
-odm_ConfigBB_TXPWR_LMT_8188E(
-       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
-}
-
-void 
-odm_ConfigBB_PHY_8188E(
-       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 {
-               if (Addr == 0xa24)
-                       pDM_Odm->RFCalibrateInfo.RegA24 = 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: [PHY_REG] %08X %08X\n", Addr, Data));
-       }
-}
-#endif
-
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/odm_RegConfig8188E.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/odm_RegConfig8188E.h
deleted file mode 100644 (file)
index 999c772..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/******************************************************************************
- *
- * 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_8188E
-#define __INC_ODM_REGCONFIG_H_8188E
-#if (RTL8188E_SUPPORT == 1)
-
-void
-odm_ConfigRFReg_8188E(
-       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_8188E(
-       IN      PDM_ODM_T                               pDM_Odm,
-       IN      u4Byte                                  Addr,
-       IN      u4Byte                                  Data
-       );
-
-void 
-odm_ConfigRF_RadioB_8188E(
-       IN      PDM_ODM_T                               pDM_Odm,
-       IN      u4Byte                                  Addr,
-       IN      u4Byte                                  Data
-       );
-
-void 
-odm_ConfigMAC_8188E(
-       IN      PDM_ODM_T       pDM_Odm,
-       IN      u4Byte          Addr,
-       IN      u1Byte          Data
-       );
-
-void 
-odm_ConfigBB_AGC_8188E(
-    IN         PDM_ODM_T       pDM_Odm,
-    IN         u4Byte          Addr,
-    IN         u4Byte          Bitmask,
-    IN         u4Byte          Data
-    );
-
-void
-odm_ConfigBB_PHY_REG_PG_8188E(
-       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_8188E(
-       IN      PDM_ODM_T       pDM_Odm,
-    IN         u4Byte          Addr,
-    IN         u4Byte          Bitmask,
-    IN         u4Byte          Data
-    );
-
-void
-odm_ConfigBB_TXPWR_LMT_8188E(
-       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
-
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/phydm_RTL8188E.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/phydm_RTL8188E.c
new file mode 100644 (file)
index 0000000..c778076
--- /dev/null
@@ -0,0 +1,466 @@
+/******************************************************************************\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
+\r
+#include "../phydm_precomp.h"\r
+\r
+#if (RTL8188E_SUPPORT == 1)\r
+\r
+VOID\r
+ODM_DIG_LowerBound_88E(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+       pDIG_T          pDM_DigTable = &pDM_Odm->DM_DigTable;\r
+\r
+       if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)\r
+       {\r
+               pDM_DigTable->rx_gain_range_min = (u1Byte) pDM_DigTable->AntDiv_RSSI_max;\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_DIG_LowerBound_88E(): pDM_DigTable->AntDiv_RSSI_max=%d \n",pDM_DigTable->AntDiv_RSSI_max));\r
+       }\r
+       //If only one Entry connected\r
+}\r
+\r
+\r
+//3============================================================\r
+//3 Dynamic Primary CCA\r
+//3============================================================\r
+\r
+VOID\r
+odm_PrimaryCCA_Init(\r
+       IN              PDM_ODM_T               pDM_Odm)\r
+{\r
+       pPri_CCA_T              PrimaryCCA = &(pDM_Odm->DM_PriCCA);  \r
+       PrimaryCCA->DupRTS_flag = 0;\r
+       PrimaryCCA->intf_flag = 0;\r
+       PrimaryCCA->intf_type = 0;\r
+       PrimaryCCA->Monitor_flag = 0;\r
+       PrimaryCCA->PriCCA_flag = 0;\r
+}\r
+\r
+BOOLEAN\r
+ODM_DynamicPrimaryCCA_DupRTS(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+       pPri_CCA_T              PrimaryCCA = &(pDM_Odm->DM_PriCCA);  \r
+       \r
+       return  PrimaryCCA->DupRTS_flag;\r
+}\r
+\r
+VOID\r
+odm_DynamicPrimaryCCA(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+       PADAPTER        Adapter =  pDM_Odm->Adapter;    // for NIC\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))  \r
+       PRT_WLAN_STA    pEntry;\r
+#endif \r
+\r
+       PFALSE_ALARM_STATISTICS         FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm , PHYDM_FALSEALMCNT);\r
+       pPri_CCA_T              PrimaryCCA = &(pDM_Odm->DM_PriCCA);  \r
+       \r
+       BOOLEAN         Is40MHz;\r
+       BOOLEAN         Client_40MHz = FALSE, Client_tmp = FALSE;      // connected client BW  \r
+       BOOLEAN         bConnected = FALSE;             // connected or not\r
+       static u1Byte   Client_40MHz_pre = 0;\r
+       static u8Byte   lastTxOkCnt = 0;\r
+       static u8Byte   lastRxOkCnt = 0;\r
+       static u4Byte   Counter = 0;\r
+       static u1Byte   Delay = 1;\r
+       u8Byte          curTxOkCnt;\r
+       u8Byte          curRxOkCnt;\r
+       u1Byte          SecCHOffset;\r
+       u1Byte          i;\r
+       \r
+       if(!(pDM_Odm->SupportAbility & ODM_BB_PRIMARY_CCA))\r
+               return;\r
+       \r
+#if((DM_ODM_SUPPORT_TYPE==ODM_ADSL) ||( DM_ODM_SUPPORT_TYPE==ODM_CE))\r
+       return;\r
+#else\r
+\r
+       if(pDM_Odm->SupportICType != ODM_RTL8188E) \r
+               return;\r
+\r
+       Is40MHz = *(pDM_Odm->pBandWidth);\r
+       SecCHOffset = *(pDM_Odm->pSecChOffset);\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Second CH Offset = %d\n", SecCHOffset));\r
+       \r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       if(Is40MHz==1)\r
+               SecCHOffset = SecCHOffset%2+1;     // NIC's definition is reverse to AP   1:secondary below,  2: secondary above\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Second CH Offset = %d\n", SecCHOffset));\r
+       //3 Check Current WLAN Traffic\r
+       curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - lastTxOkCnt;\r
+       curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - lastRxOkCnt;\r
+       lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;\r
+       lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;       \r
+#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+       //3 Check Current WLAN Traffic\r
+       curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast)-lastTxOkCnt;\r
+       curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast)-lastRxOkCnt;\r
+       lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);\r
+       lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);\r
+#endif\r
+\r
+       //==================Debug Message====================\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("TP = %llu\n", curTxOkCnt+curRxOkCnt));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Is40MHz = %d\n", Is40MHz));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("BW_LSC = %d\n", FalseAlmCnt->Cnt_BW_LSC));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("BW_USC = %d\n", FalseAlmCnt->Cnt_BW_USC));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("CCA OFDM = %d\n", FalseAlmCnt->Cnt_OFDM_CCA));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("CCA CCK = %d\n", FalseAlmCnt->Cnt_CCK_CCA));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("OFDM FA = %d\n", FalseAlmCnt->Cnt_Ofdm_fail));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("CCK FA = %d\n", FalseAlmCnt->Cnt_Cck_fail));\r
+       //================================================\r
+       \r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       if (ACTING_AS_AP(Adapter))   // primary cca process only do at AP mode\r
+#endif\r
+       {\r
+               \r
+       #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("ACTING as AP mode=%d\n", ACTING_AS_AP(Adapter)));\r
+               //3 To get entry's connection and BW infomation status. \r
+               for(i=0;i<ASSOCIATE_ENTRY_NUM;i++)\r
+               {\r
+                       if(IsAPModeExist(Adapter)&&GetFirstExtAdapter(Adapter)!=NULL)\r
+                               pEntry=AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);\r
+                       else\r
+                               pEntry=AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);\r
+                       if(pEntry!=NULL)\r
+                       {\r
+                               Client_tmp = pEntry->BandWidth;   // client BW\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Client_BW=%d\n", Client_tmp));\r
+                               if(Client_tmp>Client_40MHz)\r
+                                       Client_40MHz = Client_tmp;     // 40M/20M coexist => 40M priority is High\r
+                               \r
+                               if(pEntry->bAssociated)\r
+                               {\r
+                                       bConnected=TRUE;    // client is connected or not\r
+                                       break;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               break;\r
+                       }\r
+               }\r
+#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+               //3 To get entry's connection and BW infomation status. \r
+\r
+               PSTA_INFO_T pstat;\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
+                               Client_tmp = pstat->tx_bw;  \r
+                               if(Client_tmp>Client_40MHz)\r
+                                       Client_40MHz = Client_tmp;     // 40M/20M coexist => 40M priority is High\r
+                               \r
+                               bConnected = TRUE;\r
+                       }\r
+               }\r
+#endif\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("bConnected=%d\n", bConnected));\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Is Client 40MHz=%d\n", Client_40MHz));\r
+               //1 Monitor whether the interference exists or not \r
+               if(PrimaryCCA->Monitor_flag == 1)\r
+               {\r
+                       if(SecCHOffset == 1)       // secondary channel is below the primary channel\r
+                       {\r
+                               if((FalseAlmCnt->Cnt_OFDM_CCA > 500)&&(FalseAlmCnt->Cnt_BW_LSC > FalseAlmCnt->Cnt_BW_USC+500))\r
+                               {\r
+                                       if(FalseAlmCnt->Cnt_Ofdm_fail > FalseAlmCnt->Cnt_OFDM_CCA>>1)\r
+                                       {\r
+                                               PrimaryCCA->intf_type = 1;\r
+                                               PrimaryCCA->PriCCA_flag = 1;\r
+                                               ODM_SetBBReg(pDM_Odm, 0xc6c, BIT8|BIT7, 2);   // USC MF\r
+                                               if(PrimaryCCA->DupRTS_flag == 1)\r
+                                                       PrimaryCCA->DupRTS_flag = 0;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               PrimaryCCA->intf_type = 2;\r
+                                               if(PrimaryCCA->DupRTS_flag == 0)\r
+                                                       PrimaryCCA->DupRTS_flag = 1;\r
+                                       }\r
+                               \r
+                               }\r
+                               else   // interferecne disappear\r
+                               {\r
+                                       PrimaryCCA->DupRTS_flag = 0;\r
+                                       PrimaryCCA->intf_flag = 0;\r
+                                       PrimaryCCA->intf_type = 0;\r
+                               }\r
+                       }\r
+                       else if(SecCHOffset == 2)  // secondary channel is above the primary channel\r
+                       {\r
+                               if((FalseAlmCnt->Cnt_OFDM_CCA > 500)&&(FalseAlmCnt->Cnt_BW_USC > FalseAlmCnt->Cnt_BW_LSC+500))\r
+                               {\r
+                                       if(FalseAlmCnt->Cnt_Ofdm_fail > FalseAlmCnt->Cnt_OFDM_CCA>>1)\r
+                                       {\r
+                                               PrimaryCCA->intf_type = 1;\r
+                                               PrimaryCCA->PriCCA_flag = 1;\r
+                                               ODM_SetBBReg(pDM_Odm, 0xc6c, BIT8|BIT7, 1);  // LSC MF\r
+                                               if(PrimaryCCA->DupRTS_flag == 1)\r
+                                                       PrimaryCCA->DupRTS_flag = 0;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               PrimaryCCA->intf_type = 2;\r
+                                               if(PrimaryCCA->DupRTS_flag == 0)\r
+                                                       PrimaryCCA->DupRTS_flag = 1;\r
+                                       }\r
+                               \r
+                               }\r
+                               else   // interferecne disappear\r
+                               {\r
+                                       PrimaryCCA->DupRTS_flag = 0;\r
+                                       PrimaryCCA->intf_flag = 0;\r
+                                       PrimaryCCA->intf_type = 0;\r
+                               }\r
+\r
+\r
+                       }\r
+                       PrimaryCCA->Monitor_flag = 0;\r
+               }\r
+\r
+               //1 Dynamic Primary CCA Main Function\r
+               if(PrimaryCCA->Monitor_flag == 0)\r
+               {\r
+                       if(Is40MHz)             // if RFBW==40M mode which require to process primary cca\r
+                       {\r
+                               //2 STA is NOT Connected\r
+                               if(!bConnected)\r
+                               {\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("STA NOT Connected!!!!\n"));\r
+                       \r
+                                       if(PrimaryCCA->PriCCA_flag == 1)                // reset primary cca when STA is disconnected\r
+                                       {\r
+                                               PrimaryCCA->PriCCA_flag = 0;\r
+                                               ODM_SetBBReg(pDM_Odm, 0xc6c, BIT8|BIT7, 0);\r
+                                       }\r
+                                       if(PrimaryCCA->DupRTS_flag == 1)                // reset Duplicate RTS when STA is disconnected\r
+                                               PrimaryCCA->DupRTS_flag = 0;\r
+\r
+                                       if(SecCHOffset == 1)   // secondary channel is below the primary channel\r
+                                       {\r
+                                               if((FalseAlmCnt->Cnt_OFDM_CCA > 800)&&(FalseAlmCnt->Cnt_BW_LSC*5 > FalseAlmCnt->Cnt_BW_USC*9))\r
+                                               {\r
+                                                       PrimaryCCA->intf_flag = 1;    // secondary channel interference is detected!!!\r
+                                                       if(FalseAlmCnt->Cnt_Ofdm_fail > FalseAlmCnt->Cnt_OFDM_CCA>>1)\r
+                                                               PrimaryCCA->intf_type = 1;      // interference is shift\r
+                                                       else\r
+                                                               PrimaryCCA->intf_type = 2;      // interference is in-band\r
+                                               }\r
+                                               else    \r
+                                               {\r
+                                                       PrimaryCCA->intf_flag = 0;\r
+                                                       PrimaryCCA->intf_type = 0;  \r
+                                               }\r
+                                       }\r
+                                       else if(SecCHOffset == 2)    // secondary channel is above the primary channel\r
+                                       {\r
+                                               if((FalseAlmCnt->Cnt_OFDM_CCA > 800)&&(FalseAlmCnt->Cnt_BW_USC*5 > FalseAlmCnt->Cnt_BW_LSC*9))\r
+                                               {\r
+                                                       PrimaryCCA->intf_flag = 1;    // secondary channel interference is detected!!!\r
+                                                       if(FalseAlmCnt->Cnt_Ofdm_fail > FalseAlmCnt->Cnt_OFDM_CCA>>1)\r
+                                                               PrimaryCCA->intf_type = 1;      // interference is shift\r
+                                                       else\r
+                                                               PrimaryCCA->intf_type = 2;      // interference is in-band\r
+                                               }\r
+                                               else    \r
+                                               {\r
+                                                       PrimaryCCA->intf_flag = 0;\r
+                                                       PrimaryCCA->intf_type = 0;  \r
+                                               }\r
+                                       }\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("PrimaryCCA=%d\n",PrimaryCCA->PriCCA_flag));\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Intf_Type=%d\n", PrimaryCCA->intf_type));\r
+                               }\r
+                               //2 STA is Connected\r
+                               else\r
+                               {\r
+                                       if(Client_40MHz == 0)           //3 // client BW = 20MHz\r
+                                       {\r
+                                               if(PrimaryCCA->PriCCA_flag == 0)\r
+                                               {\r
+                                                       PrimaryCCA->PriCCA_flag = 1;\r
+                                                       if(SecCHOffset==1)\r
+                                                               ODM_SetBBReg(pDM_Odm, 0xc6c, BIT8|BIT7, 2);\r
+                                                       else if(SecCHOffset==2)\r
+                                                               ODM_SetBBReg(pDM_Odm, 0xc6c, BIT8|BIT7, 1);\r
+                                               }\r
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("STA Connected 20M!!! PrimaryCCA=%d\n", PrimaryCCA->PriCCA_flag));\r
+                                       }\r
+                                       else            //3 // client BW = 40MHz\r
+                                       {\r
+                                               if(PrimaryCCA->intf_flag == 1)    // interference is detected!!\r
+                                               {\r
+                                                       if(PrimaryCCA->intf_type == 1)\r
+                                                       {\r
+                                                               if(PrimaryCCA->PriCCA_flag!=1)\r
+                                                               {\r
+                                                                       PrimaryCCA->PriCCA_flag = 1;\r
+                                                                       if(SecCHOffset==1)\r
+                                                                               ODM_SetBBReg(pDM_Odm, 0xc6c, BIT8|BIT7, 2);\r
+                                                                       else if(SecCHOffset==2)\r
+                                                                               ODM_SetBBReg(pDM_Odm, 0xc6c, BIT8|BIT7, 1);\r
+                                                               }\r
+                                                       }\r
+                                                       else if(PrimaryCCA->intf_type == 2)\r
+                                                       {\r
+                                                               if(PrimaryCCA->DupRTS_flag!=1)\r
+                                                                       PrimaryCCA->DupRTS_flag = 1;\r
+                                                       }\r
+                                               }\r
+                                               else   // if intf_flag==0\r
+                                               {\r
+                                                       if((curTxOkCnt+curRxOkCnt)<10000)   //idle mode or TP traffic is very low\r
+                                                       {\r
+                                                               if(SecCHOffset == 1)\r
+                                                               {\r
+                                                                       if((FalseAlmCnt->Cnt_OFDM_CCA > 800)&&(FalseAlmCnt->Cnt_BW_LSC*5 > FalseAlmCnt->Cnt_BW_USC*9))\r
+                                                                       {\r
+                                                                               PrimaryCCA->intf_flag = 1;\r
+                                                                               if(FalseAlmCnt->Cnt_Ofdm_fail > FalseAlmCnt->Cnt_OFDM_CCA>>1)           \r
+                                                                                       PrimaryCCA->intf_type = 1;      // interference is shift\r
+                                                                               else\r
+                                                                                       PrimaryCCA->intf_type = 2;      // interference is in-band\r
+                                                                       }\r
+                                                               }\r
+                                                               else if(SecCHOffset == 2)\r
+                                                               {\r
+                                                                       if((FalseAlmCnt->Cnt_OFDM_CCA > 800)&&(FalseAlmCnt->Cnt_BW_USC*5 > FalseAlmCnt->Cnt_BW_LSC*9))\r
+                                                                       {\r
+                                                                               PrimaryCCA->intf_flag = 1;\r
+                                                                               if(FalseAlmCnt->Cnt_Ofdm_fail > FalseAlmCnt->Cnt_OFDM_CCA>>1)           \r
+                                                                                       PrimaryCCA->intf_type = 1;      // interference is shift\r
+                                                                               else\r
+                                                                                       PrimaryCCA->intf_type = 2;      // interference is in-band\r
+                                                                       }\r
+\r
+                                                               }\r
+                                                       }\r
+                                                       else     // TP Traffic is High\r
+                                                       {\r
+                                                               if(SecCHOffset == 1)\r
+                                                               {\r
+                                                                       if(FalseAlmCnt->Cnt_BW_LSC > (FalseAlmCnt->Cnt_BW_USC+500))\r
+                                                                       {       \r
+                                                                               if(Delay == 0)    // add delay to avoid interference occurring abruptly, jump one time\r
+                                                                               {\r
+                                                                                       PrimaryCCA->intf_flag = 1;\r
+                                                                                       if(FalseAlmCnt->Cnt_Ofdm_fail > FalseAlmCnt->Cnt_OFDM_CCA>>1)\r
+                                                                                               PrimaryCCA->intf_type = 1;      // interference is shift\r
+                                                                                       else\r
+                                                                                               PrimaryCCA->intf_type = 2;      // interference is in-band\r
+                                                                                       Delay = 1;\r
+                                                                               }\r
+                                                                               else\r
+                                                                                       Delay = 0;\r
+                                                                       }       \r
+                                                               }       \r
+                                                               else if(SecCHOffset == 2)\r
+                                                               {\r
+                                                                       if(FalseAlmCnt->Cnt_BW_USC > (FalseAlmCnt->Cnt_BW_LSC+500))\r
+                                                                       {       \r
+                                                                               if(Delay == 0)    // add delay to avoid interference occurring abruptly\r
+                                                                               {\r
+                                                                                       PrimaryCCA->intf_flag = 1;\r
+                                                                                       if(FalseAlmCnt->Cnt_Ofdm_fail > FalseAlmCnt->Cnt_OFDM_CCA>>1)\r
+                                                                                               PrimaryCCA->intf_type = 1;      // interference is shift\r
+                                                                                       else\r
+                                                                                               PrimaryCCA->intf_type = 2;      // interference is in-band\r
+                                                                                       Delay = 1;\r
+                                                                               }\r
+                                                                               else\r
+                                                                                       Delay = 0;\r
+                                                                       }       \r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Primary CCA=%d\n", PrimaryCCA->PriCCA_flag));\r
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Duplicate RTS=%d\n", PrimaryCCA->DupRTS_flag));\r
+                                       }\r
+\r
+                               }// end of connected\r
+                       }\r
+               }\r
+               //1 Dynamic Primary CCA Monitor Counter\r
+               if((PrimaryCCA->PriCCA_flag == 1)||(PrimaryCCA->DupRTS_flag == 1))\r
+               {\r
+                       if(Client_40MHz == 0)     // client=20M no need to monitor primary cca flag  \r
+                       {\r
+                               Client_40MHz_pre = Client_40MHz;\r
+                               return;\r
+                       }\r
+                       Counter++;\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Counter=%d\n", Counter));\r
+                       if((Counter == 30)||((Client_40MHz -Client_40MHz_pre)==1))      // Every 60 sec to monitor one time\r
+                       {\r
+                               PrimaryCCA->Monitor_flag = 1;     // monitor flag is triggered!!!!!\r
+                               if(PrimaryCCA->PriCCA_flag == 1)\r
+                               {\r
+                                       PrimaryCCA->PriCCA_flag = 0;\r
+                                       ODM_SetBBReg(pDM_Odm, 0xc6c, BIT8|BIT7, 0);\r
+                               }\r
+                               Counter = 0;\r
+                       }\r
+               }\r
+       }\r
+\r
+       Client_40MHz_pre = Client_40MHz;\r
+\r
+#endif\r
+}\r
+#else //#if (RTL8188E_SUPPORT == 1)\r
+\r
+VOID\r
+odm_PrimaryCCA_Init(\r
+       IN              PDM_ODM_T               pDM_Odm)\r
+{\r
+}\r
+VOID\r
+odm_DynamicPrimaryCCA(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+}\r
+BOOLEAN\r
+ODM_DynamicPrimaryCCA_DupRTS(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+       return FALSE;\r
+}\r
+#endif //#if (RTL8188E_SUPPORT == 1)\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/phydm_RTL8188E.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/phydm_RTL8188E.h
new file mode 100644 (file)
index 0000000..60406e6
--- /dev/null
@@ -0,0 +1,64 @@
+/******************************************************************************\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_RTL8188E_H__\r
+#define __ODM_RTL8188E_H__\r
+\r
+\r
+#define        MAIN_ANT_CG_TRX 1\r
+#define        AUX_ANT_CG_TRX  0\r
+#define        MAIN_ANT_CGCS_RX        0\r
+#define        AUX_ANT_CGCS_RX 1\r
+\r
+VOID\r
+ODM_DIG_LowerBound_88E(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+);\r
+\r
+\r
+\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+VOID\r
+ODM_SetTxAntByTxInfo_88E(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              pu1Byte                 pDesc,\r
+       IN              u1Byte                  macId   \r
+);\r
+#else// (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+VOID\r
+ODM_SetTxAntByTxInfo_88E(\r
+       IN              PDM_ODM_T               pDM_Odm \r
+);\r
+#endif\r
+\r
+VOID\r
+odm_PrimaryCCA_Init(\r
+       IN              PDM_ODM_T               pDM_Odm);\r
+\r
+BOOLEAN\r
+ODM_DynamicPrimaryCCA_DupRTS(\r
+       IN              PDM_ODM_T               pDM_Odm);\r
+\r
+VOID\r
+odm_DynamicPrimaryCCA(\r
+       IN              PDM_ODM_T               pDM_Odm);\r
+\r
+#endif\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/phydm_RegConfig8188E.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/phydm_RegConfig8188E.c
new file mode 100644 (file)
index 0000000..6a515fc
--- /dev/null
@@ -0,0 +1,248 @@
+/******************************************************************************
+ *
+ * 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 (RTL8188E_SUPPORT == 1)  
+
+void
+odm_ConfigRFReg_8188E(
+       IN      PDM_ODM_T                               pDM_Odm,
+       IN      u4Byte                                  Addr,
+       IN      u4Byte                                  Data,
+       IN  ODM_RF_RADIO_PATH_E     RF_PATH,
+       IN      u4Byte                              RegAddr
+       )
+{
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
+#ifndef SMP_SYNC
+               unsigned long x;
+#endif
+               struct rtl8192cd_priv *priv = pDM_Odm->priv;
+#endif
+
+    if(Addr == 0xffe)
+       {                                         
+               #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
+       {
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
+               SAVE_INT_AND_CLI(x);    
+               ODM_SetRFReg(pDM_Odm, RF_PATH, RegAddr, bRFRegOffsetMask, Data);
+               RESTORE_INT(x);
+#else
+               ODM_SetRFReg(pDM_Odm, RF_PATH, RegAddr, bRFRegOffsetMask, Data);
+#endif         
+               // Add 1us delay between BB/RF register setting.
+               ODM_delay_us(1);
+       }       
+}
+
+
+void 
+odm_ConfigRF_RadioA_8188E(
+       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_8188E(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_8188E(
+       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_8188E(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_8188E(
+       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_8188E(
+    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_8188E(
+       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){
+               #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_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ConfigBBWithHeaderFile: [PHY_REG] %08X %08X %08X\n", Addr, Bitmask, Data));
+
+       #if     !(DM_ODM_SUPPORT_TYPE&ODM_AP)
+               PHY_StoreTxPowerByRate(pDM_Odm->Adapter, Band, RfPath, TxNum, Addr, Bitmask, Data);
+       #endif
+       }
+}
+
+void
+odm_ConfigBB_TXPWR_LMT_8188E(
+       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
+}
+
+void 
+odm_ConfigBB_PHY_8188E(
+       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 {
+               if (Addr == 0xa24)
+                       pDM_Odm->RFCalibrateInfo.RegA24 = 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: [PHY_REG] %08X %08X\n", Addr, Data));
+       }
+}
+#endif
+
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/phydm_RegConfig8188E.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/OUTSRC/rtl8188e/phydm_RegConfig8188E.h
new file mode 100644 (file)
index 0000000..999c772
--- /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_8188E
+#define __INC_ODM_REGCONFIG_H_8188E
+#if (RTL8188E_SUPPORT == 1)
+
+void
+odm_ConfigRFReg_8188E(
+       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_8188E(
+       IN      PDM_ODM_T                               pDM_Odm,
+       IN      u4Byte                                  Addr,
+       IN      u4Byte                                  Data
+       );
+
+void 
+odm_ConfigRF_RadioB_8188E(
+       IN      PDM_ODM_T                               pDM_Odm,
+       IN      u4Byte                                  Addr,
+       IN      u4Byte                                  Data
+       );
+
+void 
+odm_ConfigMAC_8188E(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      u4Byte          Addr,
+       IN      u1Byte          Data
+       );
+
+void 
+odm_ConfigBB_AGC_8188E(
+    IN         PDM_ODM_T       pDM_Odm,
+    IN         u4Byte          Addr,
+    IN         u4Byte          Bitmask,
+    IN         u4Byte          Data
+    );
+
+void
+odm_ConfigBB_PHY_REG_PG_8188E(
+       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_8188E(
+       IN      PDM_ODM_T       pDM_Odm,
+    IN         u4Byte          Addr,
+    IN         u4Byte          Bitmask,
+    IN         u4Byte          Data
+    );
+
+void
+odm_ConfigBB_TXPWR_LMT_8188E(
+       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 2d843d33924e543d47593afba5cd7062012ff128..211ba42be7a092f313d6cbfa9da3c2a0f7e728a6 100644 (file)
@@ -64,22 +64,39 @@ const char *const h2cStaString[] =
 
 const char *const ioStaString[] =
 {
-       "IO_STATUS_SUCCESS",
-       "IO_STATUS_FAIL_CANNOT_IO",
-       "IO_STATUS_FAIL_RF_OFF",
-       "IO_STATUS_FAIL_FW_READ_CLEAR_TIMEOUT",
-       "IO_STATUS_FAIL_WAIT_IO_EVENT_TIMEOUT",
-       "IO_STATUS_INVALID_LEN",
-       "IO_STATUS_IO_IDLE_QUEUE_EMPTY",
-       "IO_STATUS_IO_INSERT_WAIT_QUEUE_FAIL",
-       "IO_STATUS_UNKNOWN_FAIL",
-       "IO_STATUS_WRONG_LEVEL",
-       "IO_STATUS_H2C_STOPPED",
+       "success",
+       "can not IO",
+       "rf off",
+       "fw not read",
+       "wait io timeout",
+       "invalid len",
+       "idle Q empty",
+       "insert waitQ fail",
+       "unknown fail",
+       "wrong level",
+       "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;
 
 u32 GLBtcDbgType[BTC_MSG_MAX];
 u8 GLBtcDbgBuf[BT_TMP_BUF_SIZE];
@@ -167,9 +184,24 @@ static void halbtcoutsrc_DbgInit(void)
                        0;
 }
 
+static u8 halbtcoutsrc_IsCsrBtCoex(PBTC_COEXIST pBtCoexist)
+{
+       if (pBtCoexist->boardInfo.btChipType == BTC_CHIP_CSR_BC4
+               || pBtCoexist->boardInfo.btChipType == BTC_CHIP_CSR_BC8
+       ){
+               return _TRUE;
+       }
+       return _FALSE;
+}
+
 static u8 halbtcoutsrc_IsHwMailboxExist(PBTC_COEXIST pBtCoexist)
 {
-       if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))
+       if (pBtCoexist->boardInfo.btChipType == BTC_CHIP_CSR_BC4
+               || pBtCoexist->boardInfo.btChipType == BTC_CHIP_CSR_BC8
+       ){
+               return _FALSE;
+       }
+       else if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))
        {
                return _FALSE;
        }
@@ -296,16 +328,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)
                {
@@ -499,7 +556,7 @@ static u8 halbtcoutsrc_GetWifiScanAPNum(PADAPTER padapter)
        pmlmepriv = &padapter->mlmepriv;
        pmlmeext = &padapter->mlmeextpriv;
 
-       if (check_fwstate(pmlmepriv, WIFI_SITE_MONITOR) == _FALSE) {
+       if (GLBtcWiFiInScanState == _FALSE) {
                if (pmlmeext->sitesurvey_res.bss_cnt > 0xFF)
                        scan_AP_num = 0xFF;
                else
@@ -629,6 +686,17 @@ u8 halbtcoutsrc_Get(void *pBtcContext, u8 getType, void *pOutBuf)
                                *pu8 = _FALSE;
                        break;
 
+               case BTC_GET_BL_WIFI_IS_IN_MP_MODE:
+                       if (padapter->registrypriv.mp_mode == 0)
+                       {
+                               *pu8 = _FALSE;
+                       }
+                       else
+                       {
+                               *pu8 = _TRUE;
+                       }
+                       break;
+
                case BTC_GET_BL_EXT_SWITCH:
                        *pu8 = _FALSE;
                        break;
@@ -701,6 +769,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:
@@ -766,6 +837,15 @@ u8 halbtcoutsrc_Set(void *pBtcContext, u8 setType, void *pInBuf)
 
                case BTC_SET_BL_INC_SCAN_DEV_NUM:
                        pBtCoexist->btInfo.bIncreaseScanDevNum = *pu8;
+                       break;
+
+               case BTC_SET_BL_BT_TX_RX_MASK:
+                       pBtCoexist->btInfo.bBtTxRxMask = *pu8;
+                       break;
+
+               case BTC_SET_BL_MIRACAST_PLUS_BT:
+                       pBtCoexist->btInfo.bMiracastPlusBt = *pu8;
+                       break;
 
                // set some u8 type variables.
                case BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON:
@@ -835,15 +915,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:
@@ -877,7 +966,21 @@ u8 halbtcoutsrc_Set(void *pBtcContext, u8 setType, void *pInBuf)
                        ret = _FALSE;
 #endif
                        break;
-
+               case BTC_SET_ACT_CTRL_8723B_ANT:
+#if 0
+                       {
+                               u1Byte  dataLen=*pU1Tmp;
+                               u1Byte  tmpBuf[20];
+                               if(dataLen)
+                               {
+                                       PlatformMoveMemory(&tmpBuf[0], pU1Tmp+1, dataLen);
+                               }
+                               BT_Set8723bAnt(Adapter, dataLen, &tmpBuf[0]);
+                       }
+#else
+                       ret = _FALSE;
+#endif
+                       break;
                //=====================
                default:
                        ret = _FALSE;
@@ -887,6 +990,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
@@ -909,14 +1054,24 @@ void halbtcoutsrc_DisplayCoexStatistics(PBTC_COEXIST pBtCoexist)
                        CL_PRINTF(cliBuf);
                }
        }
-
+#else
+               for(i=0; i<IO_STATUS_MAX; i++)
+               {
+                       if(Adapter->ioComStr.ioH2cStatistics[i])
+                       {
+                               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s] = %d", "H2C statistics", \
+                                       ioStaString[i], Adapter->ioComStr.ioH2cStatistics[i]);
+                               CL_PRINTF(cliBuf);
+                       }
+               }
+#endif
+#if 0
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "lastHMEBoxNum", \
                pHalData->LastHMEBoxNum);
        CL_PRINTF(cliBuf);
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x / 0x%x", "LastSuccessFwEid/FirstfailedFwEid", \
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x / 0x%x", "LastOkH2c/FirstFailH2c(fwNotRead)", \
                pHalData->lastSuccessH2cEid, pHalData->firstFailedH2cEid);
        CL_PRINTF(cliBuf);
-#endif
 
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d/ %d", "c2hIsr/c2hIntr/clr1AF/noRdy/noBuf", \
                pHalData->InterruptLog.nIMR_C2HCMD, DBG_Var.c2hInterruptCnt, DBG_Var.c2hClrReadC2hCnt,
@@ -926,12 +1081,13 @@ void halbtcoutsrc_DisplayCoexStatistics(PBTC_COEXIST pBtCoexist)
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "c2hPacket", \
                DBG_Var.c2hPacketCnt);
        CL_PRINTF(cliBuf);
-
+#endif
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Periodical/ DbgCtrl", \
                pBtCoexist->statistics.cntPeriodical, pBtCoexist->statistics.cntDbgCtrl);
        CL_PRINTF(cliBuf);
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "InitHw/InitCoexDm/", \
-               pBtCoexist->statistics.cntInitHwConfig, pBtCoexist->statistics.cntInitCoexDm);
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", "PowerOn/InitHw/InitCoexDm/RfStatus", \
+               pBtCoexist->statistics.cntPowerOn, pBtCoexist->statistics.cntInitHwConfig, pBtCoexist->statistics.cntInitCoexDm,
+               pBtCoexist->statistics.cntRfStatusNotify);
        CL_PRINTF(cliBuf);
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d/ %d", "Ips/Lps/Scan/Connect/Mstatus", \
                pBtCoexist->statistics.cntIpsNotify, pBtCoexist->statistics.cntLpsNotify,
@@ -976,17 +1132,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;
+
+       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);
+
 
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x %02x ", "Power mode cmd ", \
+       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
 //====================================
@@ -1051,7 +1285,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);
 
@@ -1092,6 +1326,21 @@ void halbtcoutsrc_Write4Byte(void *pBtcContext, u32 RegAddr, u32 Data)
        rtw_write32(padapter, RegAddr, Data);
 }
 
+void halbtcoutsrc_WriteLocalReg1Byte(void *pBtcContext, u32 RegAddr, u8 Data)
+{
+       PBTC_COEXIST            pBtCoexist=(PBTC_COEXIST)pBtcContext;
+       PADAPTER                        Adapter=pBtCoexist->Adapter;
+
+       if(BTC_INTF_SDIO == pBtCoexist->chipInterface)
+       {
+               rtw_write8(Adapter, SDIO_LOCAL_BASE | RegAddr, Data);
+       }
+       else
+       {
+               rtw_write8(Adapter, RegAddr, Data);
+       }
+}
+
 void halbtcoutsrc_SetBbReg(void *pBtcContext, u32 RegAddr, u32 BitMask, u32 Data)
 {
        PBTC_COEXIST pBtCoexist;
@@ -1174,6 +1423,12 @@ void halbtcoutsrc_SetBtReg(void *pBtcContext, u8 RegType, u32 RegAddr, u32 Data)
        }
 }
 
+u32 halbtcoutsrc_GetBtReg(void *pBtcContext, u8 RegType, u32 RegAddr)
+{
+       /* To be implemented. Always return 0 temporarily */
+       return 0;
+}
+
 void halbtcoutsrc_FillH2cCmd(void *pBtcContext, u8 elementId, u32 cmdLen, u8 *pCmdBuffer)
 {
        PBTC_COEXIST pBtCoexist;
@@ -1186,76 +1441,51 @@ 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)
+//====================================
+//             Extern functions called by other module
+//====================================
+u8 EXhalbtcoutsrc_BindBtCoexWithAdapter(void *padapter)
 {
-       PADAPTER padapter;
-       struct pwrctrl_priv *pwrpriv;
-       u8 bMacPwrCtrlOn;
-
-       padapter = pBtCoexist->Adapter;
-       pwrpriv = &padapter->dvobj->pwrctl_priv;
-       bMacPwrCtrlOn = _FALSE;
+       PBTC_COEXIST            pBtCoexist=&GLBtCoexist;
+       u1Byte  antNum=2, chipType;
+       
+       if(pBtCoexist->bBinded)
+               return _FALSE;
+       else
+               pBtCoexist->bBinded = _TRUE;
 
-       if ((_TRUE == pwrpriv->bips_processing)
-               && (IPS_NONE != pwrpriv->ips_mode_req)
-               )
-       {
-               return _TRUE;
-       }
+       pBtCoexist->statistics.cntBind++;
+       
+       pBtCoexist->Adapter = padapter;
+       
+       pBtCoexist->stackInfo.bProfileNotified = _FALSE;
 
-       if (rf_off == pwrpriv->rf_pwrstate)
-       {
-               return _TRUE;
-       }
+       pBtCoexist->btInfo.bBtCtrlAggBufSize = _FALSE;
+       pBtCoexist->btInfo.aggBufSize = 5;
 
-       rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
-       if (_FALSE == bMacPwrCtrlOn)
-       {
-               return _TRUE;
-       }
+       pBtCoexist->btInfo.bIncreaseScanDevNum = _FALSE;
+       pBtCoexist->btInfo.bMiracastPlusBt = _FALSE;
 
-       return _FALSE;
+#if 0
+       chipType = HALBT_GetBtChipType(Adapter);
+       EXhalbtcoutsrc_SetChipType(chipType);
+       antNum = HALBT_GetPgAntNum(Adapter);
+       EXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_PG, antNum);
+#endif
+       // set default antenna position to main  port
+       pBtCoexist->boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;    
+       
+       return _TRUE;
 }
 
-//====================================
-//             Extern functions called by other module
-//====================================
 u8 EXhalbtcoutsrc_InitlizeVariables(void *padapter)
 {
        PBTC_COEXIST pBtCoexist = &GLBtCoexist;
 
-
-       pBtCoexist->statistics.cntBind++;
+       //pBtCoexist->statistics.cntBind++;
 
        halbtcoutsrc_DbgInit();
 
-       if (pBtCoexist->bBinded)
-               return _FALSE;
-       else
-               pBtCoexist->bBinded = _TRUE;
-
 #ifdef CONFIG_PCI_HCI
        pBtCoexist->chipInterface = BTC_INTF_PCI;
 #elif defined(CONFIG_USB_HCI)
@@ -1266,12 +1496,7 @@ u8 EXhalbtcoutsrc_InitlizeVariables(void *padapter)
        pBtCoexist->chipInterface = BTC_INTF_UNKNOWN;
 #endif
 
-       if (NULL == pBtCoexist->Adapter)
-       {
-               pBtCoexist->Adapter = padapter;
-       }
-
-       pBtCoexist->stackInfo.bProfileNotified = _FALSE;
+       EXhalbtcoutsrc_BindBtCoexWithAdapter(padapter);
 
        pBtCoexist->fBtcRead1Byte = halbtcoutsrc_Read1Byte;
        pBtCoexist->fBtcWrite1Byte = halbtcoutsrc_Write1Byte;
@@ -1280,6 +1505,7 @@ u8 EXhalbtcoutsrc_InitlizeVariables(void *padapter)
        pBtCoexist->fBtcWrite2Byte = halbtcoutsrc_Write2Byte;
        pBtCoexist->fBtcRead4Byte = halbtcoutsrc_Read4Byte;
        pBtCoexist->fBtcWrite4Byte = halbtcoutsrc_Write4Byte;
+       pBtCoexist->fBtcWriteLocalReg1Byte = halbtcoutsrc_WriteLocalReg1Byte;
 
        pBtCoexist->fBtcSetBbReg = halbtcoutsrc_SetBbReg;
        pBtCoexist->fBtcGetBbReg = halbtcoutsrc_GetBbReg;
@@ -1287,29 +1513,61 @@ u8 EXhalbtcoutsrc_InitlizeVariables(void *padapter)
        pBtCoexist->fBtcSetRfReg = halbtcoutsrc_SetRfReg;
        pBtCoexist->fBtcGetRfReg = halbtcoutsrc_GetRfReg;
 
-       pBtCoexist->fBtcSetBtReg = halbtcoutsrc_SetBtReg;
-
        pBtCoexist->fBtcFillH2c = halbtcoutsrc_FillH2cCmd;
        pBtCoexist->fBtcDispDbgMsg = halbtcoutsrc_DisplayDbgMsg;
 
        pBtCoexist->fBtcGet = halbtcoutsrc_Get;
        pBtCoexist->fBtcSet = halbtcoutsrc_Set;
+       pBtCoexist->fBtcGetBtReg = halbtcoutsrc_GetBtReg;
+       pBtCoexist->fBtcSetBtReg = halbtcoutsrc_SetBtReg;
 
-       pBtCoexist->cliBuf = GLBtcDbgBuf;
-
-       pBtCoexist->btInfo.bBtCtrlAggBufSize = _FALSE;
-       pBtCoexist->btInfo.aggBufSize = 5;
-
-       pBtCoexist->btInfo.bIncreaseScanDevNum = _FALSE;
+       pBtCoexist->cliBuf = &GLBtcDbgBuf[0];
 
+       pBtCoexist->boardInfo.singleAntPath = 0;
+       
        GLBtcWiFiInScanState = _FALSE;
 
        GLBtcWiFiInIQKState = _FALSE;
 
+       GLBtcWiFiInIPS = _FALSE;
+
+       GLBtcWiFiInLPS = _FALSE;
+
        return _TRUE;
 }
 
-void EXhalbtcoutsrc_InitHwConfig(PBTC_COEXIST pBtCoexist)
+void EXhalbtcoutsrc_PowerOnSetting(PBTC_COEXIST pBtCoexist)
+{
+       if (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))
+               return;
+
+       /* Power on setting function is only added in 8723B currently */
+       if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))
+       {
+               if (pBtCoexist->boardInfo.btdmAntNum == 2)
+                       EXhalbtc8723b2ant_PowerOnSetting(pBtCoexist);
+               else if (pBtCoexist->boardInfo.btdmAntNum == 1)
+                       EXhalbtc8723b1ant_PowerOnSetting(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))
                return;
@@ -1318,46 +1576,48 @@ void EXhalbtcoutsrc_InitHwConfig(PBTC_COEXIST pBtCoexist)
 
        if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
        {
-               if (pBtCoexist->boardInfo.btdmAntNum == 2)
-                       EXhalbtc8821a2ant_InitHwConfig(pBtCoexist);
+               if (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)
+                       EXhalbtc8821aCsr2ant_InitHwConfig(pBtCoexist, bWifiOnly);
+               else if (pBtCoexist->boardInfo.btdmAntNum == 2)
+                       EXhalbtc8821a2ant_InitHwConfig(pBtCoexist, bWifiOnly);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
-                       EXhalbtc8821a1ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8821a1ant_InitHwConfig(pBtCoexist, bWifiOnly);
        }
        else if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))
        {
                if (pBtCoexist->boardInfo.btdmAntNum == 2)
-                       EXhalbtc8723b2ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8723b2ant_InitHwConfig(pBtCoexist, bWifiOnly);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
-                       EXhalbtc8723b1ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8723b1ant_InitHwConfig(pBtCoexist, bWifiOnly);
        }
        else if (IS_HARDWARE_TYPE_8723A(pBtCoexist->Adapter))
        {
                if (pBtCoexist->boardInfo.btdmAntNum == 2)
-                       EXhalbtc8723a2ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8723a2ant_InitHwConfig(pBtCoexist, bWifiOnly);
        }
        else if (IS_HARDWARE_TYPE_8192C(pBtCoexist->Adapter))
        {
                if (pBtCoexist->boardInfo.btdmAntNum == 2)
-                       EXhalbtc8188c2ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8188c2ant_InitHwConfig(pBtCoexist, bWifiOnly);
        }
        else if (IS_HARDWARE_TYPE_8192D(pBtCoexist->Adapter))
        {
                if (pBtCoexist->boardInfo.btdmAntNum == 2)
-                       EXhalbtc8192d2ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8192d2ant_InitHwConfig(pBtCoexist, bWifiOnly);
        }
        else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))
        {
                if (pBtCoexist->boardInfo.btdmAntNum == 2)
-                       EXhalbtc8192e2ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8192e2ant_InitHwConfig(pBtCoexist, bWifiOnly);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
-                       EXhalbtc8192e1ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8192e1ant_InitHwConfig(pBtCoexist, bWifiOnly);
        }
        else if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))
        {
                if (pBtCoexist->boardInfo.btdmAntNum == 2)
-                       EXhalbtc8812a2ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8812a2ant_InitHwConfig(pBtCoexist, bWifiOnly);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
-                       EXhalbtc8812a1ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8812a1ant_InitHwConfig(pBtCoexist, bWifiOnly);
        }
 }
 
@@ -1370,7 +1630,9 @@ void EXhalbtcoutsrc_InitCoexDm(PBTC_COEXIST pBtCoexist)
 
        if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
        {
-               if (pBtCoexist->boardInfo.btdmAntNum == 2)
+               if (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)
+                       EXhalbtc8821aCsr2ant_InitCoexDm(pBtCoexist);
+               else if (pBtCoexist->boardInfo.btdmAntNum == 2)
                        EXhalbtc8821a2ant_InitCoexDm(pBtCoexist);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
                        EXhalbtc8821a1ant_InitCoexDm(pBtCoexist);
@@ -1427,16 +1689,24 @@ 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);
 
        if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
        {
-               if (pBtCoexist->boardInfo.btdmAntNum == 2)
+               if (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)
+                       EXhalbtc8821aCsr2ant_IpsNotify(pBtCoexist, ipsType);
+               else if (pBtCoexist->boardInfo.btdmAntNum == 2)
                        EXhalbtc8821a2ant_IpsNotify(pBtCoexist, ipsType);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
                        EXhalbtc8821a1ant_IpsNotify(pBtCoexist, ipsType);
@@ -1494,13 +1764,21 @@ 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 (pBtCoexist->boardInfo.btdmAntNum == 2)
+               if (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)
+                       EXhalbtc8821aCsr2ant_LpsNotify(pBtCoexist, lpsType);
+               else if (pBtCoexist->boardInfo.btdmAntNum == 2)
                        EXhalbtc8821a2ant_LpsNotify(pBtCoexist, lpsType);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
                        EXhalbtc8821a1ant_LpsNotify(pBtCoexist, lpsType);
@@ -1569,7 +1847,9 @@ void EXhalbtcoutsrc_ScanNotify(PBTC_COEXIST pBtCoexist, u8 type)
 
        if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
        {
-               if (pBtCoexist->boardInfo.btdmAntNum == 2)
+               if (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)
+                       EXhalbtc8821aCsr2ant_ScanNotify(pBtCoexist, scanType);
+               else if (pBtCoexist->boardInfo.btdmAntNum == 2)
                        EXhalbtc8821a2ant_ScanNotify(pBtCoexist, scanType);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
                        EXhalbtc8821a1ant_ScanNotify(pBtCoexist, scanType);
@@ -1634,7 +1914,9 @@ void EXhalbtcoutsrc_ConnectNotify(PBTC_COEXIST pBtCoexist, u8 action)
 
        if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
        {
-               if (pBtCoexist->boardInfo.btdmAntNum == 2)
+               if (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)
+                       EXhalbtc8821aCsr2ant_ConnectNotify(pBtCoexist, assoType);
+               else if (pBtCoexist->boardInfo.btdmAntNum == 2)
                        EXhalbtc8821a2ant_ConnectNotify(pBtCoexist, assoType);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
                        EXhalbtc8821a1ant_ConnectNotify(pBtCoexist, assoType);
@@ -1700,7 +1982,9 @@ void EXhalbtcoutsrc_MediaStatusNotify(PBTC_COEXIST pBtCoexist, RT_MEDIA_STATUS m
 
        if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
        {
-               if (pBtCoexist->boardInfo.btdmAntNum == 2)
+               if (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)
+                       EXhalbtc8821aCsr2ant_MediaStatusNotify(pBtCoexist, mStatus);
+               else if (pBtCoexist->boardInfo.btdmAntNum == 2)
                        EXhalbtc8821a2ant_MediaStatusNotify(pBtCoexist, mStatus);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
                        EXhalbtc8821a1ant_MediaStatusNotify(pBtCoexist, mStatus);
@@ -1772,7 +2056,9 @@ void EXhalbtcoutsrc_SpecialPacketNotify(PBTC_COEXIST pBtCoexist, u8 pktType)
 
        if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
        {
-               if (pBtCoexist->boardInfo.btdmAntNum == 2)
+               if (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)
+                       EXhalbtc8821aCsr2ant_SpecialPacketNotify(pBtCoexist, packetType);
+               else if (pBtCoexist->boardInfo.btdmAntNum == 2)
                        EXhalbtc8821a2ant_SpecialPacketNotify(pBtCoexist, packetType);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
                        EXhalbtc8821a1ant_SpecialPacketNotify(pBtCoexist, packetType);
@@ -1829,7 +2115,9 @@ void EXhalbtcoutsrc_BtInfoNotify(PBTC_COEXIST pBtCoexist, u8 *tmpBuf, u8 length)
 
        if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
        {
-               if (pBtCoexist->boardInfo.btdmAntNum == 2)
+               if (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)
+                       EXhalbtc8821aCsr2ant_BtInfoNotify(pBtCoexist, tmpBuf, length);
+               else if (pBtCoexist->boardInfo.btdmAntNum == 2)
                        EXhalbtc8821a2ant_BtInfoNotify(pBtCoexist, tmpBuf, length);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
                        EXhalbtc8821a1ant_BtInfoNotify(pBtCoexist, tmpBuf, length);
@@ -1874,6 +2162,32 @@ void EXhalbtcoutsrc_BtInfoNotify(PBTC_COEXIST pBtCoexist, u8 *tmpBuf, u8 length)
 //     halbtcoutsrc_NormalLowPower(pBtCoexist);
 }
 
+VOID
+EXhalbtcoutsrc_RfStatusNotify(
+       IN      PBTC_COEXIST            pBtCoexist,
+       IN      u1Byte                          type
+       )
+{
+       if(!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))
+               return;
+       pBtCoexist->statistics.cntRfStatusNotify++;
+       
+       if(IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
+       {
+       }
+       else if(IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))
+       {
+               if(pBtCoexist->boardInfo.btdmAntNum == 1)
+                       EXhalbtc8723b1ant_RfStatusNotify(pBtCoexist, type);
+       }       
+       else if(IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))
+       {
+       }
+       else if(IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))
+       {
+       }
+}
+
 void EXhalbtcoutsrc_StackOperationNotify(PBTC_COEXIST pBtCoexist, u8 type)
 {
 #if 0
@@ -1918,7 +2232,9 @@ void EXhalbtcoutsrc_HaltNotify(PBTC_COEXIST pBtCoexist)
 
        if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
        {
-               if (pBtCoexist->boardInfo.btdmAntNum == 2)
+               if (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)
+                       EXhalbtc8821aCsr2ant_HaltNotify(pBtCoexist);
+               else if (pBtCoexist->boardInfo.btdmAntNum == 2)
                        EXhalbtc8821a2ant_HaltNotify(pBtCoexist);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
                        EXhalbtc8821a1ant_HaltNotify(pBtCoexist);
@@ -1961,9 +2277,11 @@ void EXhalbtcoutsrc_HaltNotify(PBTC_COEXIST pBtCoexist)
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
                        EXhalbtc8812a1ant_HaltNotify(pBtCoexist);
        }
+
+       pBtCoexist->bBinded = FALSE;
 }
 
-void EXhalbtcoutsrc_SwitchGntBt(PBTC_COEXIST pBtCoexist)
+void EXhalbtcoutsrc_SwitchBtTRxMask(PBTC_COEXIST pBtCoexist)
 {
        if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))
        {
@@ -1992,11 +2310,17 @@ void EXhalbtcoutsrc_PnpNotify(PBTC_COEXIST pBtCoexist, u8 pnpState)
        {
                if (pBtCoexist->boardInfo.btdmAntNum == 1)
                        EXhalbtc8723b1ant_PnpNotify(pBtCoexist,pnpState);
+               else if(pBtCoexist->boardInfo.btdmAntNum == 2)
+                       EXhalbtc8723b2ant_PnpNotify(pBtCoexist,pnpState);
        }
        else if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
        {
-               if (pBtCoexist->boardInfo.btdmAntNum == 1)
+               if (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)
+                       EXhalbtc8821aCsr2ant_PnpNotify(pBtCoexist, pnpState);
+               else if (pBtCoexist->boardInfo.btdmAntNum == 1)
                        EXhalbtc8821a1ant_PnpNotify(pBtCoexist,pnpState);
+               else if(pBtCoexist->boardInfo.btdmAntNum == 2)
+                       EXhalbtc8821a2ant_PnpNotify(pBtCoexist,pnpState);
        }
        else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))
        {
@@ -2010,7 +2334,7 @@ void EXhalbtcoutsrc_PnpNotify(PBTC_COEXIST pBtCoexist, u8 pnpState)
        }
 }
 
-void EXhalbtcoutsrc_CoexDmSwitch(PBTC_COEXIST pBtCoexist, BOOLEAN antInverse)
+void EXhalbtcoutsrc_CoexDmSwitch(PBTC_COEXIST pBtCoexist)
 {
        if (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))
                return;
@@ -2024,8 +2348,8 @@ void EXhalbtcoutsrc_CoexDmSwitch(PBTC_COEXIST pBtCoexist, BOOLEAN antInverse)
                {
                        pBtCoexist->bStopCoexDm = TRUE;
                        EXhalbtc8723b1ant_CoexDmReset(pBtCoexist);
-                       EXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_DETECTED, 2, antInverse);
-                       EXhalbtc8723b2ant_InitHwConfig(pBtCoexist);
+                       EXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_DETECTED, 2);
+                       EXhalbtc8723b2ant_InitHwConfig(pBtCoexist, FALSE);
                        EXhalbtc8723b2ant_InitCoexDm(pBtCoexist);
                        pBtCoexist->bStopCoexDm = FALSE;
                }
@@ -2046,7 +2370,9 @@ void EXhalbtcoutsrc_Periodical(PBTC_COEXIST pBtCoexist)
 
        if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
        {
-               if (pBtCoexist->boardInfo.btdmAntNum == 2)
+               if (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)
+                       EXhalbtc8821aCsr2ant_Periodical(pBtCoexist);
+               else if (pBtCoexist->boardInfo.btdmAntNum == 2)
                        EXhalbtc8821a2ant_Periodical(pBtCoexist);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
                {
@@ -2219,11 +2545,12 @@ void EXhalbtcoutsrc_SetBtPatchVersion(u16 btHciVersion, u16 btPatchVersion)
        pBtCoexist->btInfo.btHciVer = btHciVersion;
 }
 
+#if 0
 void EXhalbtcoutsrc_SetBtExist(u8 bBtExist)
 {
        GLBtCoexist.boardInfo.bBtExist = bBtExist;
 }
-
+#endif
 void EXhalbtcoutsrc_SetChipType(u8 chipType)
 {
        switch(chipType)
@@ -2253,13 +2580,13 @@ void EXhalbtcoutsrc_SetChipType(u8 chipType)
        }
 }
 
-void EXhalbtcoutsrc_SetAntNum(u8 type, u8 antNum, BOOLEAN antInverse)
+void EXhalbtcoutsrc_SetAntNum(u8 type, u8 antNum)
 {
        if (BT_COEX_ANT_TYPE_PG == type)
        {
                GLBtCoexist.boardInfo.pgAntNum = antNum;
                GLBtCoexist.boardInfo.btdmAntNum = antNum;
-
+#if 0
                //The antenna position: Main (default) or Aux for pgAntNum=2 && btdmAntNum =1
                //The antenna position should be determined by auto-detect mechanism
                // The following is assumed to main, and those must be modified if y auto-detect mechanism is ready
@@ -2267,22 +2594,26 @@ void EXhalbtcoutsrc_SetAntNum(u8 type, u8 antNum, BOOLEAN antInverse)
                        GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
                else
                        GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
+#endif
        }
        else if (BT_COEX_ANT_TYPE_ANTDIV == type)
        {
                GLBtCoexist.boardInfo.btdmAntNum = antNum;
-               GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
+               //GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;  
        }
        else if (BT_COEX_ANT_TYPE_DETECTED == type)
        {
                GLBtCoexist.boardInfo.btdmAntNum = antNum;
-               GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
+               //GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
        }
+}
 
-       if (antInverse == _TRUE)
-       {
-               GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;
-       }
+//
+// Currently used by 8723b only, S0 or S1
+//
+void EXhalbtcoutsrc_SetSingleAntPath(u8 singleAntPath)
+{
+       GLBtCoexist.boardInfo.singleAntPath = singleAntPath;
 }
 
 void EXhalbtcoutsrc_DisplayBtCoexInfo(PBTC_COEXIST pBtCoexist)
@@ -2294,7 +2625,9 @@ void EXhalbtcoutsrc_DisplayBtCoexInfo(PBTC_COEXIST pBtCoexist)
 
        if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
        {
-               if (pBtCoexist->boardInfo.btdmAntNum == 2)
+               if (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)
+                       EXhalbtc8821aCsr2ant_DisplayCoexInfo(pBtCoexist);
+               else if (pBtCoexist->boardInfo.btdmAntNum == 2)
                        EXhalbtc8821a2ant_DisplayCoexInfo(pBtCoexist);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
                        EXhalbtc8821a1ant_DisplayCoexInfo(pBtCoexist);
@@ -2405,7 +2738,7 @@ void hal_btcoex_SetBTCoexist(PADAPTER padapter, u8 bBtExist)
        pHalData = GET_HAL_DATA(padapter);
        pHalData->bt_coexist.bBtExist = bBtExist;
 
-       EXhalbtcoutsrc_SetBtExist(bBtExist);
+       //EXhalbtcoutsrc_SetBtExist(bBtExist);
 }
 
 /*
@@ -2456,7 +2789,7 @@ u8 hal_btcoex_GetChipType(PADAPTER padapter)
        return pHalData->bt_coexist.btChipType;
 }
 
-void hal_btcoex_SetPgAntNum(PADAPTER padapter, u8 antNum, BOOLEAN antInverse)
+void hal_btcoex_SetPgAntNum(PADAPTER padapter, u8 antNum)
 {
        PHAL_DATA_TYPE  pHalData;
 
@@ -2464,7 +2797,7 @@ void hal_btcoex_SetPgAntNum(PADAPTER padapter, u8 antNum, BOOLEAN antInverse)
        pHalData = GET_HAL_DATA(padapter);
 
        pHalData->bt_coexist.btTotalAntNum = antNum;
-       EXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_PG, antNum, antInverse);
+       EXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_PG, antNum);
 }
 
 u8 hal_btcoex_GetPgAntNum(PADAPTER padapter)
@@ -2477,6 +2810,11 @@ u8 hal_btcoex_GetPgAntNum(PADAPTER padapter)
        return pHalData->bt_coexist.btTotalAntNum;
 }
 
+void hal_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath)
+{
+       EXhalbtcoutsrc_SetSingleAntPath(singleAntPath);
+}
+
 u8 hal_btcoex_Initialize(PADAPTER padapter)
 {
        u8 ret1;
@@ -2490,7 +2828,17 @@ u8 hal_btcoex_Initialize(PADAPTER padapter)
        return ret2;
 }
 
-void hal_btcoex_InitHwConfig(PADAPTER padapter)
+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))
                return;
@@ -2504,7 +2852,7 @@ void hal_btcoex_InitHwConfig(PADAPTER padapter)
                halbt_InitHwConfig92D(padapter);
        }
 
-       EXhalbtcoutsrc_InitHwConfig(&GLBtCoexist);
+       EXhalbtcoutsrc_InitHwConfig(&GLBtCoexist, bWifiOnly);
        EXhalbtcoutsrc_InitCoexDm(&GLBtCoexist);
 }
 
@@ -2566,9 +2914,9 @@ void hal_btcoex_HaltNotify(PADAPTER padapter)
        EXhalbtcoutsrc_HaltNotify(&GLBtCoexist);
 }
 
-void hal_btcoex_SwitchGntBt(PADAPTER padapter)
+void hal_btcoex_SwitchBtTRxMask(PADAPTER padapter)
 {
-       EXhalbtcoutsrc_SwitchGntBt(&GLBtCoexist);
+       EXhalbtcoutsrc_SwitchBtTRxMask(&GLBtCoexist);
 }
 
 void hal_btcoex_Hanlder(PADAPTER padapter)
@@ -2643,13 +2991,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;
 }
@@ -2831,5 +3181,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 655f0a3ebdf1433e87844428557a107b91d2f575..b8c87857f950eda2195ad50a0e8b005bd18868e6 100644 (file)
 #define _HAL_COM_C_
 
 #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))
+       {
+               padapter->hal_data_sz = sizeof(HAL_DATA_TYPE);
+               padapter->HalData = rtw_zvmalloc(padapter->hal_data_sz);
+               if(padapter->HalData == NULL){
+                       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->HalData) 
+               {
+                       #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
+                       phy_free_filebuf(padapter);                             
+                       #endif
+                       rtw_vmfree(padapter->HalData, padapter->hal_data_sz);
+                       padapter->HalData = NULL;
+                       padapter->hal_data_sz = 0;
+               }       
+       }
+}
 
 void dump_chip_info(HAL_VERSION        ChipVersion)
 {
@@ -436,7 +472,7 @@ _TwoOutPipeMapping(
                
                //      BK,     BE,     VI,     VO,     BCN,    CMD,MGT,HIGH,HCCA 
                //{  0,         1,      0,      1,      0,      0,      0,      0,              0       };
-               //0:H, 1:N 
+               //0:ep_0 num, 1:ep_1 num 
                
                pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[1];//VO
                pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];//VI
@@ -454,7 +490,7 @@ _TwoOutPipeMapping(
                
                //BK,   BE,     VI,     VO,     BCN,    CMD,MGT,HIGH,HCCA 
                //{  1,         1,      0,      0,      0,      0,      0,      0,              0       };                      
-               //0:H, 1:N 
+               //0:ep_0 num, 1:ep_1 num
                
                pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];//VO
                pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];//VI
@@ -1008,280 +1044,4283 @@ void hw_var_port_switch(_adapter *adapter)
 #endif /* CONFIG_CONCURRENT_MODE */
 }
 
-void SetHwReg(_adapter *adapter, u8 variable, u8 *val)
+void rtw_hal_set_FwRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc)
 {
-       HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
-       DM_ODM_T *odm = &(hal_data->odmpriv);
+       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;
+       }
+}
 
-_func_enter_;
+#ifdef CONFIG_GPIO_WAKEUP
+static void rtw_hal_set_output_gpio(_adapter* padapter, u8 index, u8 outputval)
+{
+       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 {
+               /* 88C Series: */
+               /* index: 11~8 transform to 3~0 */
+               /* 8723 Series: */
+               /* index: 12~8 transform to 4~0 */
+               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));
+               }
+       }
 
-       switch (variable) {
-       case HW_VAR_PORT_SWITCH:
-               hw_var_port_switch(adapter);
-               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;
+}
+#endif
 
-               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
+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;
+               }
        }
-               break;
-       case HW_VAR_SEC_DK_CFG:
+#ifdef CONFIG_PNO_SUPPORT
+       else
        {
-               struct security_priv *sec = &adapter->securitypriv;
-               u8 reg_scr = rtw_read8(adapter, REG_SECCFG);
 
-               if (val) /* Enable default key related setting */
-               {
-                       reg_scr |= SCR_TXBCUSEDK;
-                       if (sec->dot11AuthAlgrthm != dot11AuthAlgrthm_8021X)
-                               reg_scr |= (SCR_RxUseDK|SCR_TxUseDK);
+               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;
+                       }
                }
-               else /* Disable default key related setting */
-               {
-                       reg_scr &= ~(SCR_RXBCUSEDK|SCR_TXBCUSEDK|SCR_RxUseDK|SCR_TxUseDK);
+       }
+#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);
                }
 
-               rtw_write8(adapter, REG_SECCFG, reg_scr);
+               if (mstatus & BIT1)
+                       res = _FALSE;
+               else
+                       res = _TRUE;
        }
-               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);
+       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);
                }
-               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_MAX_AGGR_NUM:
-               DBG_871X("%s HW_VAR_MAX_AGGR_NUM: %04x\n", __func__, *((u16*)val));
-               rtw_write16(adapter, REG_MAX_AGGR_NUM, *((u16*)val));
-               break;
-       default:
-               if (0)
-               DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" variable(%d) not defined!\n",
-                       FUNC_ADPT_ARG(adapter), variable);
-               break;
+               if (res & BIT(7))
+                       ret = _TRUE;
+               else
+                       ret = _FALSE;
+               DBG_871X("cmd: 0x81 REG_PNO_STATUS: ret(%d)\n", ret);
        }
+       return ret;
+}
+#endif
 
-_func_exit_;
+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)));
 }
 
-void GetHwReg(_adapter *adapter, u8 variable, u8 *val)
+static void rtw_hal_disable_tx_report(_adapter* adapter)
 {
-       HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
-       DM_ODM_T *odm = &(hal_data->odmpriv);
+       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));
+}
 
-_func_enter_;
+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));
+}
 
-       switch (variable) {
-       case HW_VAR_BASIC_RATE:
-               *((u16*)val) = hal_data->BasicRateSet;
-               break;
-       case HW_VAR_DM_FLAG:
-               *((u32*)val) = odm->SupportAbility;
-               break;
-       case HW_VAR_RF_TYPE:
-               *((u8*)val) = hal_data->rf_type;
-               break;
-       default:
-               if (0)
-               DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" variable(%d) not defined!\n",
-                       FUNC_ADPT_ARG(adapter), variable);
-               break;
+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;
        }
 
-_func_exit_;
+       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");
 
-u8
-SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)
-{      
-       HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
-       DM_ODM_T *odm = &(hal_data->odmpriv);
-       u8 bResult = _SUCCESS;
+       tmp = SDIO_HIMR_CPWM2_MSK;
 
-       switch(variable) {
-       case HW_DEF_FA_CNT_DUMP:                
-               //ODM_COMP_COMMON
-               if(*((u8*)value))
-                       odm->DebugComponents |= (ODM_COMP_DIG |ODM_COMP_FA_CNT);
-               else
-                       odm->DebugComponents &= ~(ODM_COMP_DIG |ODM_COMP_FA_CNT);               
-               break;
-       case HAL_DEF_DBG_RX_INFO_DUMP:
-               {
-                       PFALSE_ALARM_STATISTICS FalseAlmCnt = &(odm->FalseAlmCnt);
-                       pDIG_T  pDM_DigTable = &odm->DM_DigTable;
+       res = sdio_local_write(adapter, SDIO_REG_HIMR, 4, (u8*)&tmp);
 
-                       DBG_871X("============ Rx Info dump ===================\n");
-                       DBG_871X("bLinked = %d, RSSI_Min = %d(%%), CurrentIGI = 0x%x \n",
-                               odm->bLinked, odm->RSSI_Min, pDM_DigTable->CurIGValue);
-                       DBG_871X("Cnt_Cck_fail = %d, Cnt_Ofdm_fail = %d, Total False Alarm = %d\n",     
-                               FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_all);
+       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;
+       }
 
-                       if(odm->bLinked){
-                               DBG_871X("RxRate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\n", 
-                                       HDATA_RATE(odm->RxRate), odm->RSSI_A, odm->RSSI_B);     
+       return ret;
+}
+#endif //CONFIG_SDIO_HCI, CONFIG_GSPI_HCI
 
-                               #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
-                               rtw_dump_raw_rssi_info(adapter);
-                               #endif
-                       }
-               }               
-               break;          
-       case HW_DEF_ODM_DBG_FLAG:
-               ODM_CmnInfoUpdate(odm, ODM_CMNINFO_DBG_COMP, *((u8Byte*)value));
-               break;
-       case HW_DEF_ODM_DBG_LEVEL:
-               ODM_CmnInfoUpdate(odm, ODM_CMNINFO_DBG_LEVEL, *((u4Byte*)value));
-               break;
-       case HAL_DEF_DBG_DM_FUNC:
-       {
-               u8 dm_func = *((u8*)value);
-               struct dm_priv *dm = &hal_data->dmpriv;
+#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;
+       }
 
-               if(dm_func == 0){ //disable all dynamic func
-                       odm->SupportAbility = DYNAMIC_FUNC_DISABLE;
-                       DBG_8192C("==> Disable all dynamic function...\n");
-               }
-               else if(dm_func == 1){//disable DIG
-                       odm->SupportAbility  &= (~DYNAMIC_BB_DIG);
-                       DBG_8192C("==> Disable DIG...\n");
-               }
-               else if(dm_func == 2){//disable High power
-                       odm->SupportAbility  &= (~DYNAMIC_BB_DYNAMIC_TXPWR);
-               }
-               else if(dm_func == 3){//disable tx power tracking
-                       odm->SupportAbility  &= (~DYNAMIC_RF_CALIBRATION);
-                       DBG_8192C("==> Disable tx power tracking...\n");
-               }
-               else if(dm_func == 4){//disable BT coexistence
-                       dm->DMFlag &= (~DYNAMIC_FUNC_BT);
-               }
-               else if(dm_func == 5){//disable antenna diversity
-                       odm->SupportAbility  &= (~DYNAMIC_BB_ANT_DIV);
-               }
-               else if(dm_func == 6){//turn on all dynamic func
-                       if(!(odm->SupportAbility  & DYNAMIC_BB_DIG)) {
-                               DIG_T   *pDigTable = &odm->DM_DigTable;
-                               pDigTable->CurIGValue= rtw_read8(adapter, 0xc50);
-                       }
-                       dm->DMFlag |= DYNAMIC_FUNC_BT;
-                       odm->SupportAbility = DYNAMIC_ALL_FUNC_ENABLE;
-                       DBG_8192C("==> Turn on all dynamic function...\n");
+       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);
                }
-       }
-               break;
-       case HAL_DEF_DBG_DUMP_RXPKT:
-               hal_data->bDumpRxPkt = *((u8*)value);
-               break;
-       case HAL_DEF_DBG_DUMP_TXPKT:
-               hal_data->bDumpTxPkt = *((u8*)value);
-               break;
-       case HAL_DEF_ANT_DETECT:
-               hal_data->AntDetection = *((u8 *)value);
-               break;
-       default:
-               DBG_871X_LEVEL(_drv_always_, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __FUNCTION__, variable);
-               bResult = _FAIL;
-               break;
-       }
+               index++;
+       }while(cam_id != -1);
 
-       return bResult;
+       rtw_write8(adapter, REG_SECCFG, 0xcc);
 }
 
-u8
-GetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)
+static void rtw_hal_update_gtk_offload_info(_adapter* adapter)
 {
-       HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
-       DM_ODM_T *odm = &(hal_data->odmpriv);
-       u8 bResult = _SUCCESS;
+       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;
+       }
 
-       switch(variable) {
-       case HW_DEF_ODM_DBG_FLAG:
-               *((u8Byte*)value) = odm->DebugComponents;
-               break;
-       case HW_DEF_ODM_DBG_LEVEL:
-               *((u4Byte*)value) = odm->DebugLevel;
-               break;
-       case HAL_DEF_DBG_DM_FUNC:
-               *(( u32*)value) =hal_data->odmpriv.SupportAbility;
-               break;
-       case HAL_DEF_DBG_DUMP_RXPKT:
-               *((u8*)value) = hal_data->bDumpRxPkt;
-               break;
-       case HAL_DEF_DBG_DUMP_TXPKT:
-               *((u8*)value) = hal_data->bDumpTxPkt;
-               break;
-       case HAL_DEF_ANT_DETECT:
-               *((u8 *)value) = hal_data->AntDetection;
-               break;
-       case HAL_DEF_MACID_SLEEP:
-               *(u8*)value = _FALSE;
-               break;
-       case HAL_DEF_TX_PAGE_SIZE:
-               *(( u32*)value) = PAGE_SIZE_128;
-               break;
-       default:
-               DBG_871X_LEVEL(_drv_always_, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __FUNCTION__, variable);
-               bResult = _FAIL;
-               break;
+       _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
 
-       return bResult;
+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);
 }
 
-BOOLEAN 
-eqNByte(
-       u8*     str1,
-       u8*     str2,
-       u32     num
-       )
+static u8 rtw_hal_set_keep_alive_cmd(_adapter *adapter, u8 enable, u8 pkt_type)
 {
-       if(num==0)
-               return _FALSE;
-       while(num>0)
-       {
-               num--;
-               if(str1[num]!=str2[num])
-                       return _FALSE;
+       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 _TRUE;
+
+       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;
+}
+
+static 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=100;
+       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;
+#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\n", __func__, enable);
+
+       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);
+       //SET_H2CCMD_WOWLAN_GPIO_PULSE_EN(u1H2CWoWlanCtrlParm, 1);
+#ifdef CONFIG_PLATFORM_ARM_RK3188
+       SET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(u1H2CWoWlanCtrlParm, 0x09);
+#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
+#endif //CONFIG_WOWLAN
+
+void rtw_hal_fill_fake_txdesc(_adapter* padapter, u8* pDesc, u32 BufferLen,
+               u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame)
+{
+       struct hal_ops *pHalFunc = &padapter->HalFunc;
+       if (pHalFunc->fill_fake_txdesc == NULL) {
+               DBG_871X_LEVEL(_drv_err_,
+                               "%s missing fill_fake_txdesc\n", __func__);
+               return;
+       } else {
+               pHalFunc->fill_fake_txdesc(padapter, pDesc, BufferLen,
+                               IsPsPoll, IsBTQosNull, bDataFrame);
+       }
+}
+
+//
+// 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__);
+               return;
+       }
+
+       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);
+
+                       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);
+
+                               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);
+
+                       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);
+
+                       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);
+
+                       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;
+
+               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);
+
+               //DBG_871X("%s(): HW_VAR_SET_TX_CMD: QOS NULL DATA %p %d\n", 
+               //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (PDRspLength+TxDescLen));
+
+               CurtPktPageNum = (u8)PageNum(TxDescLen + P2PPDRspLength, PageSize);
+
+               TotalPageNum += CurtPktPageNum;
+
+               BufIndex += (CurtPktPageNum*PageSize);
+
+               TotalPacketLen = BufIndex + P2PPDRspLength;
+       }
+#endif //CONFIG_P2P_WOWLAN
+
+       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
+       }
+
+       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);
+}
+
+void SetHwReg(_adapter *adapter, u8 variable, u8 *val)
+{
+       HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
+       DM_ODM_T *odm = &(hal_data->odmpriv);
+
+_func_enter_;
+
+       switch (variable) {
+               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)) {
+
+                               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);
+                       }
+               }
+                       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 */
+                       {
+                               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_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;
+               case HW_VAR_MAX_AGGR_NUM:
+                       DBG_871X("%s HW_VAR_MAX_AGGR_NUM: %04x\n", __func__, *((u16*)val));
+                       rtw_write16(adapter, REG_MAX_AGGR_NUM, *((u16*)val));
+               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");
+
+                               media_status_rpt = RT_MEDIA_CONNECT;
+                               rtw_hal_set_hwreg(adapter,
+                                               HW_VAR_H2C_FW_JOINBSSRPT,
+                                               (u8 *)&media_status_rpt);
+
+                               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
+                               DBG_871X_LEVEL(_drv_always_, "Set Wake GPIO to high for default.\n");
+                               rtw_hal_set_output_gpio(adapter, WAKEUP_GPIO_IDX, 1);
+#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);
+
+                                       media_status_rpt = RT_MEDIA_CONNECT;
+                                       rtw_hal_set_hwreg(adapter,
+                                               HW_VAR_H2C_FW_JOINBSSRPT,
+                                               (u8 *)&media_status_rpt);
+
+                                       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;
+#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_;
+}
+
+void GetHwReg(_adapter *adapter, u8 variable, u8 *val)
+{
+       HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
+       DM_ODM_T *odm = &(hal_data->odmpriv);
+
+_func_enter_;
+
+       switch (variable) {
+       case HW_VAR_BASIC_RATE:
+               *((u16*)val) = hal_data->BasicRateSet;
+               break;
+       case HW_VAR_DM_FLAG:
+               *((u32*)val) = odm->SupportAbility;
+               break;
+       case HW_VAR_RF_TYPE:
+               *((u8*)val) = hal_data->rf_type;
+               break;
+       default:
+               if (0)
+               DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" variable(%d) not defined!\n",
+                       FUNC_ADPT_ARG(adapter), variable);
+               break;
+       }
+
+_func_exit_;
+}
+
+
+
+
+u8
+SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)
+{      
+       HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
+       DM_ODM_T *odm = &(hal_data->odmpriv);
+       u8 bResult = _SUCCESS;
+
+       switch(variable) {
+       case HW_DEF_FA_CNT_DUMP:                
+               //ODM_COMP_COMMON
+               if(*((u8*)value))
+                       odm->DebugComponents |= (ODM_COMP_DIG |ODM_COMP_FA_CNT);
+               else
+                       odm->DebugComponents &= ~(ODM_COMP_DIG |ODM_COMP_FA_CNT);               
+               break;
+       case HAL_DEF_DBG_RX_INFO_DUMP:
+               {
+                       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");
+                       DBG_871X("bLinked = %d, RSSI_Min = %d(%%), CurrentIGI = 0x%x \n",
+                               odm->bLinked, odm->RSSI_Min, pDM_DigTable->CurIGValue);
+                       DBG_871X("Cnt_Cck_fail = %d, Cnt_Ofdm_fail = %d, Total False Alarm = %d\n",     
+                               FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_all);
+
+                       if(odm->bLinked){
+                               DBG_871X("RxRate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\n", 
+                                       HDATA_RATE(odm->RxRate), odm->RSSI_A, odm->RSSI_B);     
+
+                               #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
+                               rtw_dump_raw_rssi_info(adapter);
+                               #endif
+                       }
+               }               
+               break;          
+       case HW_DEF_ODM_DBG_FLAG:
+               ODM_CmnInfoUpdate(odm, ODM_CMNINFO_DBG_COMP, *((u8Byte*)value));
+               break;
+       case HW_DEF_ODM_DBG_LEVEL:
+               ODM_CmnInfoUpdate(odm, ODM_CMNINFO_DBG_LEVEL, *((u4Byte*)value));
+               break;
+       case HAL_DEF_DBG_DM_FUNC:
+       {
+               u8 dm_func = *((u8*)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
+                       odm->SupportAbility  &= (~DYNAMIC_BB_DYNAMIC_TXPWR);
+               }
+               else if(dm_func == 3){//disable tx power tracking
+                       odm->SupportAbility  &= (~DYNAMIC_RF_CALIBRATION);
+                       DBG_8192C("==> Disable tx power tracking...\n");
+               }
+               else if(dm_func == 4){//disable BT coexistence
+                       dm->DMFlag &= (~DYNAMIC_FUNC_BT);
+               }
+               else if(dm_func == 5){//disable antenna diversity
+                       odm->SupportAbility  &= (~DYNAMIC_BB_ANT_DIV);
+               }
+               else if(dm_func == 6){//turn on all dynamic func
+                       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");
+               }
+       }
+               break;
+       case HAL_DEF_DBG_DUMP_RXPKT:
+               hal_data->bDumpRxPkt = *((u8*)value);
+               break;
+       case HAL_DEF_DBG_DUMP_TXPKT:
+               hal_data->bDumpTxPkt = *((u8*)value);
+               break;
+       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;
+               break;
+       }
+
+       return bResult;
+}
+
+u8
+GetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)
+{
+       HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
+       DM_ODM_T *odm = &(hal_data->odmpriv);
+       u8 bResult = _SUCCESS;
+
+       switch(variable) {
+               case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
+                       {
+                               struct mlme_priv *pmlmepriv;
+                               struct sta_priv *pstapriv;
+                               struct sta_info *psta;
+
+                               pmlmepriv = &adapter->mlmepriv;
+                               pstapriv = &adapter->stapriv;
+                               psta = rtw_get_stainfo(pstapriv, pmlmepriv->cur_network.network.MacAddress);
+                               if (psta)
+                               {
+                                       *((int*)value) = psta->rssi_stat.UndecoratedSmoothedPWDB;     
+                               }
+                       }
+                       break;
+               case HW_DEF_ODM_DBG_FLAG:
+                       *((u8Byte*)value) = odm->DebugComponents;
+                       break;
+               case HW_DEF_ODM_DBG_LEVEL:
+                       *((u4Byte*)value) = odm->DebugLevel;
+                       break;
+               case HAL_DEF_DBG_DM_FUNC:
+                       *(( u32*)value) =hal_data->odmpriv.SupportAbility;
+                       break;
+               case HAL_DEF_DBG_DUMP_RXPKT:
+                       *((u8*)value) = hal_data->bDumpRxPkt;
+                       break;
+               case HAL_DEF_DBG_DUMP_TXPKT:
+                       *((u8*)value) = hal_data->bDumpTxPkt;
+                       break;
+               case HAL_DEF_ANT_DETECT:
+                       *((u8 *)value) = hal_data->AntDetection;
+                       break;
+               case HAL_DEF_MACID_SLEEP:
+                       *(u8*)value = _FALSE;
+                       break;
+               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;
+                       break;
+       }
+
+       return bResult;
+}
+
+void GetHalODMVar(     
+       PADAPTER                                Adapter,
+       HAL_ODM_VARIABLE                eVariable,
+       PVOID                                   pValue1,
+       PVOID                                   pValue2)
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T podmpriv = &pHalData->odmpriv;
+       switch(eVariable){
+#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+               case HAL_ODM_NOISE_MONITOR:
+                       {
+                               u8 chan = *(u8*)pValue1;
+                               *(s16 *)pValue2 = pHalData->noise[chan];
+                               #ifdef DBG_NOISE_MONITOR
+                               DBG_8192C("### Noise monitor chan(%d)-noise:%d (dBm) ###\n",
+                                       chan,pHalData->noise[chan]);
+                               #endif                  
+                                               
+                       }
+                       break;
+#endif//#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
+               default:
+                       break;
+       }
+}
+
+void SetHalODMVar(
+       PADAPTER                                Adapter,
+       HAL_ODM_VARIABLE                eVariable,
+       PVOID                                   pValue1,
+       BOOLEAN                                 bSet)
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T podmpriv = &pHalData->odmpriv;
+       //_irqL irqL;
+       switch(eVariable){
+               case HAL_ODM_STA_INFO:
+                       {       
+                               struct sta_info *psta = (struct sta_info *)pValue1;                             
+                               if(bSet){
+                                       DBG_8192C("### Set STA_(%d) info ###\n",psta->mac_id);
+                                       ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS,psta->mac_id,psta);
+                               }
+                               else{
+                                       DBG_8192C("### Clean STA_(%d) info ###\n",psta->mac_id);
+                                       //_enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL);
+                                       ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS,psta->mac_id,NULL);
+                                       
+                                       //_exit_critical_bh(&pHalData->odm_stainfo_lock, &irqL);
+                                   }
+                       }
+                       break;
+               case HAL_ODM_P2P_STATE:         
+                               ODM_CmnInfoUpdate(podmpriv,ODM_CMNINFO_WIFI_DIRECT,bSet);
+                       break;
+               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:
+                       {
+                               struct noise_info *pinfo = (struct noise_info *)pValue1;
+
+                               #ifdef DBG_NOISE_MONITOR
+                               DBG_8192C("### Noise monitor chan(%d)-bPauseDIG:%d,IGIValue:0x%02x,max_time:%d (ms) ###\n",
+                                       pinfo->chan,pinfo->bPauseDIG,pinfo->IGIValue,pinfo->max_time);
+                               #endif
+                               
+                               pHalData->noise[pinfo->chan] = ODM_InbandNoise_Monitor(podmpriv,pinfo->bPauseDIG,pinfo->IGIValue,pinfo->max_time);                              
+                               DBG_871X("chan_%d, noise = %d (dBm)\n",pinfo->chan,pHalData->noise[pinfo->chan]);
+                               #ifdef DBG_NOISE_MONITOR
+                               DBG_871X("noise_a = %d, noise_b = %d  noise_all:%d \n", 
+                                       podmpriv->noise_level.noise[ODM_RF_PATH_A], 
+                                       podmpriv->noise_level.noise[ODM_RF_PATH_B],
+                                       podmpriv->noise_level.noise_all);                                               
+                               #endif
+                       }
+                       break;
+               #endif//#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
+
+               default:
+                       break;
+       }
+}      
+
+
+BOOLEAN 
+eqNByte(
+       u8*     str1,
+       u8*     str2,
+       u32     num
+       )
+{
+       if(num==0)
+               return _FALSE;
+       while(num>0)
+       {
+               num--;
+               if(str1[num]!=str2[num])
+                       return _FALSE;
+       }
+       return _TRUE;
+}
+
+//
 //     Description:
 //             Return TRUE if chTmp is represent for hex digit and 
 //             FALSE otherwise.
@@ -1535,18 +5574,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)
        {
@@ -1583,7 +5621,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 ;     
@@ -1670,30 +5708,290 @@ void rtw_store_phy_info(_adapter *padapter, union recv_frame *prframe)
 }
 #endif
 
+#ifdef CONFIG_EFUSE_CONFIG_FILE
+int check_phy_efuse_tx_power_info_valid(PADAPTER padapter) {
+       EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
+       u8* pContent = pEEPROM->efuse_eeprom_data;
+       int index = 0;
+       u16 tx_index_offset = 0x0000;
+
+       switch(padapter->chip_type) {
+               case RTL8723B:
+                       tx_index_offset = EEPROM_TX_PWR_INX_8723B;
+               break;
+               case RTL8188E:
+                       tx_index_offset = EEPROM_TX_PWR_INX_88E;
+               break;
+               case RTL8192E:
+                       tx_index_offset = EEPROM_TX_PWR_INX_8192E;
+               break;
+               default:
+                       tx_index_offset = 0x0010;
+               break;
+       }
+       for (index = 0 ; index < 12 ; index++) {
+               if (pContent[tx_index_offset + index] == 0xFF) {
+                       return _FALSE;
+               } else {
+                       DBG_871X("0x%02x ,", pContent[EEPROM_TX_PWR_INX_88E+index]);
+               }
+       }
+       DBG_871X("\n");
+       return _TRUE;
+}
+
+int check_phy_efuse_macaddr_info_valid(PADAPTER padapter) {
+
+       u8 val = 0;
+       u16 addr_offset = 0x0000;
+
+       switch(padapter->chip_type) {
+               case RTL8723B:
+                       if (padapter->interface_type == RTW_USB) {
+                               addr_offset = EEPROM_MAC_ADDR_8723BU;
+                               DBG_871X("%s: interface is USB\n", __func__);
+                       } else if (padapter->interface_type == RTW_SDIO) {
+                               addr_offset = EEPROM_MAC_ADDR_8723BS;
+                               DBG_871X("%s: interface is SDIO\n", __func__);
+                       } else if (padapter->interface_type == RTW_PCIE) {
+                               addr_offset = EEPROM_MAC_ADDR_8723BE;
+                               DBG_871X("%s: interface is PCIE\n", __func__);
+                       } else if (padapter->interface_type == RTW_GSPI) {
+                               //addr_offset = EEPROM_MAC_ADDR_8723BS;
+                               DBG_871X("%s: interface is GSPI\n", __func__);
+                       }
+               break;
+               case RTL8188E:
+                       if (padapter->interface_type == RTW_USB) {
+                               addr_offset = EEPROM_MAC_ADDR_88EU;
+                               DBG_871X("%s: interface is USB\n", __func__);
+                       } else if (padapter->interface_type == RTW_SDIO) {
+                               addr_offset = EEPROM_MAC_ADDR_88ES;
+                               DBG_871X("%s: interface is SDIO\n", __func__);
+                       } else if (padapter->interface_type == RTW_PCIE) {
+                               addr_offset = EEPROM_MAC_ADDR_88EE;
+                               DBG_871X("%s: interface is PCIE\n", __func__);
+                       } else if (padapter->interface_type == RTW_GSPI) {
+                               //addr_offset = EEPROM_MAC_ADDR_8723BS;
+                               DBG_871X("%s: interface is GSPI\n", __func__);
+                       }
+               break;
+       }
+
+       if (addr_offset == 0x0000) {
+               DBG_871X("phy efuse MAC addr offset is 0!!\n");
+               return _FALSE;
+       } else {
+               rtw_efuse_map_read(padapter, addr_offset, 1, &val);
+       }
+
+       if (val == 0xFF) {
+               return _FALSE;
+       } else {
+               DBG_871X("phy efuse with valid MAC addr\n");
+               return _TRUE;
+       }
+}
+
+u32 Hal_readPGDataFromConfigFile(
+       PADAPTER        padapter,
+       struct file *fp)
+{
+       u32 i;
+       mm_segment_t fs;
+       u8 temp[3];
+       loff_t pos = 0;
+       EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
+       u8      *PROMContent = pEEPROM->efuse_eeprom_data;
+
+       temp[2] = 0; // add end of string '\0'
+
+       fs = get_fs();
+       set_fs(KERNEL_DS);
+
+       for (i = 0 ; i < HWSET_MAX_SIZE ; i++) {
+               vfs_read(fp, temp, 2, &pos);
+               PROMContent[i] = simple_strtoul(temp, NULL, 16);
+               if ((i % EFUSE_FILE_COLUMN_NUM) == (EFUSE_FILE_COLUMN_NUM - 1)) {
+                       //Filter the lates space char.
+                       vfs_read(fp, temp, 1, &pos);
+                       if (strchr(temp, ' ') == NULL) {
+                               pos--;
+                               vfs_read(fp, temp, 2, &pos);
+                       }
+               } else {
+                       pos += 1; // Filter the space character
+               }
+       }
+
+       set_fs(fs);
+       pEEPROM->bloadfile_fail_flag = _FALSE;
+
+#ifdef CONFIG_DEBUG
+       DBG_871X("Efuse configure file:\n");
+       for (i=0; i<HWSET_MAX_SIZE; i++)
+       {
+               if (i % 16 == 0)
+                       printk("\n");
+
+               printk("%02X ", PROMContent[i]);
+       }
+       printk("\n");
+#endif
+
+       return _SUCCESS;
+}
+
+void Hal_ReadMACAddrFromFile(
+       PADAPTER                padapter,
+       struct file *fp)
+{
+       u32 i;
+       mm_segment_t fs;
+       u8 source_addr[18];
+       loff_t pos = 0;
+       u32     curtime = rtw_get_current_time();
+       EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
+       u8 *head, *end;
+
+       _rtw_memset(source_addr, 0, 18);
+       _rtw_memset(pEEPROM->mac_addr, 0, ETH_ALEN);
+
+       fs = get_fs();
+       set_fs(KERNEL_DS);
+
+       DBG_871X("wifi mac address:\n");
+       vfs_read(fp, source_addr, 18, &pos);
+       source_addr[17] = ':';
+
+       head = end = source_addr;
+       for (i=0; i<ETH_ALEN; i++) {
+               while (end && (*end != ':') )
+                       end++;
+
+               if (end && (*end == ':') )
+                       *end = '\0';
+
+               pEEPROM->mac_addr[i] = simple_strtoul(head, NULL, 16 );
+
+               if (end) {
+                       end++;
+                       head = end;
+               }
+       }
+
+       set_fs(fs);
+       pEEPROM->bloadmac_fail_flag = _FALSE;
+
+       if (rtw_check_invalid_mac_address(pEEPROM->mac_addr) == _TRUE) {
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))
+               get_random_bytes(pEEPROM->mac_addr, ETH_ALEN);
+               pEEPROM->mac_addr[0] = 0x00;
+               pEEPROM->mac_addr[1] = 0xe0;
+               pEEPROM->mac_addr[2] = 0x4c;
+#else
+               pEEPROM->mac_addr[0] = 0x00;
+               pEEPROM->mac_addr[1] = 0xe0;
+               pEEPROM->mac_addr[2] = 0x4c;
+               pEEPROM->mac_addr[3] = (u8)(curtime & 0xff) ;
+               pEEPROM->mac_addr[4] = (u8)((curtime>>8) & 0xff) ;
+               pEEPROM->mac_addr[5] = (u8)((curtime>>16) & 0xff) ;
+#endif
+                DBG_871X("MAC Address from wifimac error is invalid, assign random MAC !!!\n");
+       }
+
+       DBG_871X("%s: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x\n",
+                       __func__, pEEPROM->mac_addr[0], pEEPROM->mac_addr[1],
+                       pEEPROM->mac_addr[2], pEEPROM->mac_addr[3],
+                       pEEPROM->mac_addr[4], pEEPROM->mac_addr[5]);
+}
+
+void Hal_GetPhyEfuseMACAddr(PADAPTER padapter, u8* mac_addr) {
+       int i = 0;
+       u16 addr_offset = 0x0000;
+
+       switch(padapter->chip_type) {
+               case RTL8723B:
+                       if (padapter->interface_type == RTW_USB) {
+                               addr_offset = EEPROM_MAC_ADDR_8723BU;
+                               DBG_871X("%s: interface is USB\n", __func__);
+                       } else if (padapter->interface_type == RTW_SDIO) {
+                               addr_offset = EEPROM_MAC_ADDR_8723BS;
+                               DBG_871X("%s: interface is SDIO\n", __func__);
+                       } else if (padapter->interface_type == RTW_PCIE) {
+                               addr_offset = EEPROM_MAC_ADDR_8723BE;
+                               DBG_871X("%s: interface is PCIE\n", __func__);
+                       } else if (padapter->interface_type == RTW_GSPI){
+                               //addr_offset = EEPROM_MAC_ADDR_8723BS;
+                               DBG_871X("%s: interface is GSPI\n", __func__);
+                       }
+               break;
+               case RTL8188E:
+                       if (padapter->interface_type == RTW_USB) {
+                               addr_offset = EEPROM_MAC_ADDR_88EU;
+                               DBG_871X("%s: interface is USB\n", __func__);
+                       } else if (padapter->interface_type == RTW_SDIO) {
+                               addr_offset = EEPROM_MAC_ADDR_88ES;
+                               DBG_871X("%s: interface is SDIO\n", __func__);
+                       } else if (padapter->interface_type == RTW_PCIE) {
+                               addr_offset = EEPROM_MAC_ADDR_88EE;
+                               DBG_871X("%s: interface is PCIE\n", __func__);
+                       } else if (padapter->interface_type == RTW_GSPI){
+                               //addr_offset = EEPROM_MAC_ADDR_8723BS;
+                               DBG_871X("%s: interface is GSPI\n", __func__);
+                       }
+               break;
+       }
+
+       rtw_efuse_map_read(padapter, addr_offset, ETH_ALEN, mac_addr);
+
+       if (rtw_check_invalid_mac_address(mac_addr) == _TRUE) {
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))
+               get_random_bytes(mac_addr, ETH_ALEN);
+               mac_addr[0] = 0x00;
+               mac_addr[1] = 0xe0;
+               mac_addr[2] = 0x4c;
+#else
+               mac_addr[0] = 0x00;
+               mac_addr[1] = 0xe0;
+               mac_addr[2] = 0x4c;
+               mac_addr[3] = (u8)(curtime & 0xff) ;
+               mac_addr[4] = (u8)((curtime>>8) & 0xff) ;
+               mac_addr[5] = (u8)((curtime>>16) & 0xff) ;
+#endif
+                DBG_871X("MAC Address from phy efuse error, assign random MAC !!!\n");
+       }
+
+       DBG_871X("%s: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x\n",
+                       __func__, mac_addr[0], mac_addr[1], mac_addr[2],
+                       mac_addr[3], mac_addr[4], mac_addr[5]);
+}
+#endif //CONFIG_EFUSE_CONFIG_FILE
+
 #ifdef CONFIG_RF_GAIN_OFFSET
 u32 Array_kfreemap[] = { 
-0xf8,0xe,
-0xf6,0xc,
-0xf4,0xa,
-0xf2,0x8,
-0xf0,0x6,
-0xf3,0x4,
-0xf5,0x2,
-0xf7,0x0,
-0xf9,0x0,
-0xfc,0x0,
+0x08,0xe,
+0x06,0xc,
+0x04,0xa,
+0x02,0x8,
+0x00,0x6,
+0x03,0x4,
+0x05,0x2,
+0x07,0x0,
+0x09,0x0,
+0x0c,0x0,
 };
 
 void rtw_bb_rf_gain_offset(_adapter *padapter)
 {
-       u8      value = padapter->eeprompriv.EEPROMRFGainOffset;
-       u8      tmp = 0x3e;
-       u32     res,i=0;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
+       u8              value = padapter->eeprompriv.EEPROMRFGainOffset;
+       u8              tmp = 0x3e;
+       u32     res,i=0;
        u4Byte     ArrayLen    = sizeof(Array_kfreemap)/sizeof(u32);
        pu4Byte    Array           = Array_kfreemap;
-       u4Byte v1=0,v2=0,target=0; 
-       DBG_871X("+%s EEPROMRFGainOffset(0x%02x): 0x%02x+\n",
-                       __func__, EEPROM_RF_GAIN_OFFSET, value);
+       u4Byte v1=0,v2=0,GainValue,target=0; 
+       //DBG_871X("+%s value: 0x%02x+\n", __func__, value);
 #if defined(CONFIG_RTL8723A)
        if (value & BIT0) {
                DBG_871X("Offset RF Gain.\n");
@@ -1728,32 +6026,39 @@ 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){
-                       res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
-                       res &= 0xfff87fff;
-                       DBG_871X("Offset RF Gain. before reg 0x7f=0x%08x\n",res);
-                       //res &= 0xfff87fff;
+
+                       if(pHalData->ant_path == ODM_RF_PATH_A) {
+                               GainValue=(padapter->eeprompriv.EEPROMRFGainVal & 0x0f);
+                               
+                       } 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 == padapter->eeprompriv.EEPROMRFGainVal )
-                                {
+                                if ( v1 == GainValue ) {
                                                DBG_871X("Offset RF Gain. got v1 =0x%x ,v2 =0x%x \n",v1,v2);
                                                target=v2;
                                                break;
                                 }
                        }        
                        DBG_871X("padapter->eeprompriv.EEPROMRFGainVal=0x%x ,Gain offset Target Value=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal,target);
-                       PHY_SetRFReg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, BIT18|BIT17|BIT16|BIT15, target);
 
-                       //res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15;
-                       //rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res);
                        res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
+                       DBG_871X("Offset RF Gain. before reg 0x7f=0x%08x\n",res);
+                       PHY_SetRFReg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, BIT18|BIT17|BIT16|BIT15, target);
+                       res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
+
                        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);
                }
        } else {
@@ -1797,9 +6102,33 @@ void rtw_bb_rf_gain_offset(_adapter *padapter)
                DBG_871X("Using the default RF gain.\n");
        }
 #endif
+       
 }
 #endif //CONFIG_RF_GAIN_OFFSET
 
+//To avoid RX affect TX throughput
+void dm_DynamicUsbTxAgg(_adapter *padapter, u8 from_timer)
+{
+       struct dvobj_priv       *pdvobjpriv = adapter_to_dvobj(padapter);
+       struct mlme_priv                *pmlmepriv = &(padapter->mlmepriv);
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
+#ifdef CONFIG_USB_RX_AGGREGATION       
+       if(IS_HARDWARE_TYPE_8821U(padapter) )//|| IS_HARDWARE_TYPE_8192EU(padapter))
+       {
+               //This AGG_PH_TH only for UsbRxAggMode == USB_RX_AGG_USB
+               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,0x1003);
+                       else
+                               rtw_write16(padapter, REG_RXDMA_AGG_PG_TH,0x2005); //dmc agg th 20K
+                       
+                       //DBG_871X("TX_TP=%u, RX_TP=%u \n", pdvobjpriv->traffic_stat.cur_tx_tp, pdvobjpriv->traffic_stat.cur_rx_tp);
+               }
+       }
+#endif
+}
+
 //bus-agg check for SoftAP mode
 inline u8 rtw_hal_busagg_qsel_check(_adapter *padapter,u8 pre_qsel,u8 next_qsel)
 {
@@ -1819,4 +6148,148 @@ inline u8 rtw_hal_busagg_qsel_check(_adapter *padapter,u8 pre_qsel,u8 next_qsel)
                        chk_rst = _FAIL;
                }
        return chk_rst;
-}
\ No newline at end of file
+}
+
+/*
+ * 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 8bb2747a478cd3f833e7592da3f242ba19beaf1e..4866324cc7ecce2befb8bb5669002af69c72be0a 100644 (file)
@@ -404,7 +404,7 @@ PHY_GetRateSectionIndexOfTxPowerByRate(
                        case rTxAGC_A_Rate54_24:         index = 1;             break;
                        case rTxAGC_A_CCK1_Mcs32:        index = 6;             break;
                        case rTxAGC_B_CCK11_A_CCK2_11:
-                               if ( BitMask == 0xffffff00 )
+                               if ( BitMask == bMaskH3Bytes )
                                        index = 7;
                                else if ( BitMask == 0x000000ff )
                                        index = 15;
@@ -2341,7 +2341,7 @@ PHY_GetTxPowerIndex(
        u8      txPower = 0x3E;
 
        if (IS_HARDWARE_TYPE_8813A(pAdapter)) {
-//#if (RTL8813A_SUPPORT==1)
+//#if (RTL8814A_SUPPORT==1)
 //             txPower = PHY_GetTxPowerIndex_8813A( pAdapter, PowerIndex, RFPath, Rate );
 //#endif
        }
@@ -2378,7 +2378,7 @@ PHY_SetTxPowerIndex(
        )
 {
        if (IS_HARDWARE_TYPE_8813A(pAdapter)) {
-//#if (RTL8813A_SUPPORT==1)
+//#if (RTL8814A_SUPPORT==1)
 //             PHY_SetTxPowerIndex_8813A( pAdapter, PowerIndex, RFPath, Rate );
 //#endif
        }
@@ -2410,7 +2410,9 @@ Hal_ChannelPlanToRegulation(
        IN      u16                             ChannelPlan
        )
 {
-       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+       HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+       DM_ODM_T *odm = &pHalData->odmpriv;
+
        pHalData->Regulation2_4G = TXPWR_LMT_WW;
        pHalData->Regulation5G = TXPWR_LMT_WW;
 
@@ -2570,15 +2572,13 @@ Hal_ChannelPlanToRegulation(
                default:
                        break;
        }
-}
 
-#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
+       DBG_871X("%s ChannelPlan:0x%02x,Regulation(2_4G/5G):0x%02x,0x%02x\n",
+               __FUNCTION__,ChannelPlan,pHalData->Regulation2_4G,pHalData->Regulation5G);
 
-extern char *rtw_phy_file_path;
-char   file_path[PATH_LENGTH_MAX];
-
-#define GetLineFromBuffer(buffer)       strsep(&buffer, "\n")
+}
 
+#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
 int
 phy_ConfigMACWithParaFile(
        IN      PADAPTER        Adapter,
@@ -2605,7 +2605,7 @@ phy_ConfigMACWithParaFile(
                        if (rlen > 0)
                        {
                                rtStatus = _SUCCESS;
-                               pHalData->mac_reg = rtw_zmalloc(rlen);
+                               pHalData->mac_reg = rtw_zvmalloc(rlen);
                                if(pHalData->mac_reg) {
                                        _rtw_memcpy(pHalData->mac_reg, pHalData->para_file_buf, rlen);
                                        pHalData->mac_reg_len = rlen;
@@ -2704,7 +2704,7 @@ phy_ConfigBBWithParaFile(
                        if (rlen > 0)
                        {
                                rtStatus = _SUCCESS;
-                               pBuf = rtw_zmalloc(rlen);
+                               pBuf = rtw_zvmalloc(rlen);
                                if(pBuf) {
                                        _rtw_memcpy(pBuf, pHalData->para_file_buf, rlen);
                                        *pBufLen = rlen;
@@ -3157,7 +3157,7 @@ phy_ConfigBBWithPgParaFile(
                        if (rlen > 0)
                        {
                                rtStatus = _SUCCESS;
-                               pHalData->bb_phy_reg_pg = rtw_zmalloc(rlen);
+                               pHalData->bb_phy_reg_pg = rtw_zvmalloc(rlen);
                                if(pHalData->bb_phy_reg_pg) {
                                        _rtw_memcpy(pHalData->bb_phy_reg_pg, pHalData->para_file_buf, rlen);
                                        pHalData->bb_phy_reg_pg_len = rlen;
@@ -3220,7 +3220,7 @@ phy_ConfigBBWithMpParaFile(
                        if (rlen > 0)
                        {
                                rtStatus = _SUCCESS;
-                               pHalData->bb_phy_reg_mp = rtw_zmalloc(rlen);
+                               pHalData->bb_phy_reg_mp = rtw_zvmalloc(rlen);
                                if(pHalData->bb_phy_reg_mp) {
                                        _rtw_memcpy(pHalData->bb_phy_reg_mp, pHalData->para_file_buf, rlen);
                                        pHalData->bb_phy_reg_mp_len = rlen;
@@ -3356,7 +3356,7 @@ PHY_ConfigRFWithParaFile(
                        if (rlen > 0)
                        {
                                rtStatus = _SUCCESS;
-                               pBuf = rtw_zmalloc(rlen);
+                               pBuf = rtw_zvmalloc(rlen);
                                if(pBuf) {
                                        _rtw_memcpy(pBuf, pHalData->para_file_buf, rlen);
                                        *pBufLen = rlen;
@@ -3634,7 +3634,7 @@ PHY_ConfigRFWithTxPwrTrackParaFile(
                        if (rlen > 0)
                        {
                                rtStatus = _SUCCESS;
-                               pHalData->rf_tx_pwr_track = rtw_zmalloc(rlen);
+                               pHalData->rf_tx_pwr_track = rtw_zvmalloc(rlen);
                                if(pHalData->rf_tx_pwr_track) {
                                        _rtw_memcpy(pHalData->rf_tx_pwr_track, pHalData->para_file_buf, rlen);
                                        pHalData->rf_tx_pwr_track_len = rlen;
@@ -4003,7 +4003,7 @@ PHY_ConfigRFWithPowerLimitTableParaFile(
                        if (rlen > 0)
                        {
                                rtStatus = _SUCCESS;
-                               pHalData->rf_tx_pwr_lmt = rtw_zmalloc(rlen);
+                               pHalData->rf_tx_pwr_lmt = rtw_zvmalloc(rlen);
                                if(pHalData->rf_tx_pwr_lmt) {
                                        _rtw_memcpy(pHalData->rf_tx_pwr_lmt, pHalData->para_file_buf, rlen);
                                        pHalData->rf_tx_pwr_lmt_len = rlen;
@@ -4037,6 +4037,30 @@ PHY_ConfigRFWithPowerLimitTableParaFile(
 
        return rtStatus;
 }
-#endif
 
+void phy_free_filebuf(_adapter *padapter)
+{
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(padapter);
+       
+       if(pHalData->mac_reg)
+               rtw_vmfree(pHalData->mac_reg, pHalData->mac_reg_len);
+       if(pHalData->bb_phy_reg)
+               rtw_vmfree(pHalData->bb_phy_reg, pHalData->bb_phy_reg_len);
+       if(pHalData->bb_agc_tab)
+               rtw_vmfree(pHalData->bb_agc_tab, pHalData->bb_agc_tab_len);
+       if(pHalData->bb_phy_reg_pg)
+               rtw_vmfree(pHalData->bb_phy_reg_pg, pHalData->bb_phy_reg_pg_len);
+       if(pHalData->bb_phy_reg_mp)
+               rtw_vmfree(pHalData->bb_phy_reg_mp, pHalData->bb_phy_reg_mp_len);
+       if(pHalData->rf_radio_a)
+               rtw_vmfree(pHalData->rf_radio_a, pHalData->rf_radio_a_len);
+       if(pHalData->rf_radio_b)
+               rtw_vmfree(pHalData->rf_radio_b, pHalData->rf_radio_b_len);
+       if(pHalData->rf_tx_pwr_track)
+               rtw_vmfree(pHalData->rf_tx_pwr_track, pHalData->rf_tx_pwr_track_len);
+       if(pHalData->rf_tx_pwr_lmt)
+               rtw_vmfree(pHalData->rf_tx_pwr_lmt, pHalData->rf_tx_pwr_lmt_len);       
+       
+}
 
+#endif
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/hal_dm.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/hal_dm.c
new file mode 100644 (file)
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/rtl8189es/hal/hal_dm.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/hal/hal_dm.h
new file mode 100644 (file)
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 ae83b7ec709d94b5b477bb6bd4f1b5d4a7b1f53d..811cc3dabcb3bbed96aeb36385c15516cd42c642 100644 (file)
@@ -43,28 +43,53 @@ 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)
 {
+       //free HAL Data         
+       rtw_hal_data_deinit(padapter);
+       
        if (is_primary_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)
 {
@@ -151,11 +176,8 @@ 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;
-
                        
                if (padapter->registrypriv.notch_filter == 1)
                        rtw_hal_notch_filter(padapter, 1);
@@ -164,12 +186,12 @@ uint       rtw_hal_init(_adapter *padapter)
 
                for (i = 0; i<dvobj->iface_nums; i++)
                        rtw_sec_restore_wep_key(dvobj->padapters[i]);
-               
-               rtw_sec_restore_wep_key(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);
@@ -179,7 +201,6 @@ uint         rtw_hal_init(_adapter *padapter)
        else{
                for (i = 0; i<dvobj->iface_nums; i++)
                        dvobj->padapters[i]->hw_init_completed = _FALSE;
-
                DBG_871X("rtw_hal_init: hal__init fail\n");
        }
 
@@ -253,10 +274,10 @@ void rtw_hal_set_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID p
        if(padapter->HalFunc.SetHalODMVarHandler)
                padapter->HalFunc.SetHalODMVarHandler(padapter,eVariable,pValue1,bSet);
 }
-void   rtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet)
+void   rtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,PVOID pValue2)
 {
        if(padapter->HalFunc.GetHalODMVarHandler)
-               padapter->HalFunc.GetHalODMVarHandler(padapter,eVariable,pValue1,bSet);
+               padapter->HalFunc.GetHalODMVarHandler(padapter,eVariable,pValue1,pValue2);
 }
 
 void rtw_hal_enable_interrupt(_adapter *padapter)
@@ -487,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)
@@ -711,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;
@@ -751,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 bdd5d50bdd817ce065ef7586bdcf2a85b1c190b1..845f3d79a919905a518b95dea3e6e8639abff3eb 100644 (file)
@@ -24,7 +24,6 @@
 #include "hal_com_h2c.h"
 
 #define CONFIG_H2C_EF
-//#define WOW_DEBUG
 
 #define RTL88E_MAX_H2C_BOX_NUMS        4
 #define RTL88E_MAX_CMD_LEN     7
@@ -46,7 +45,8 @@ static u8 _is_fw_read_cmd_down(_adapter* padapter, u8 msgbox_num)
                        read_down = _TRUE;
                }
 #ifdef CONFIG_WOWLAN
-               rtw_msleep_os(2);
+               else
+                       rtw_msleep_os(1);
 #endif
        }while( (!read_down) && (retry_cnts--));
 
@@ -65,13 +65,13 @@ static u8 _is_fw_read_cmd_down(_adapter* padapter, u8 msgbox_num)
 *|31 - 0         |
 *|ext_msg|
 ******************************************/
-static s32 FillH2CCmd_88E(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer)
+s32 FillH2CCmd_88E(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer)
 {
        struct dvobj_priv *dvobj =  adapter_to_dvobj(padapter);
        HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
        u8 h2c_box_num;
        u32     msgbox_addr;
-       u32 msgbox_ex_addr;
+       u32 msgbox_ex_addr = 0;
        u8 cmd_idx,ext_cmd_len;
        u32     h2c_cmd = 0;
        u32     h2c_cmd_ex = 0;
@@ -198,40 +198,79 @@ u8 rtl8188e_set_rssi_cmd(_adapter*padapter, u8 *param)
        HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
 _func_enter_;
 
-       if(pHalData->fw_ractrl == _TRUE){
-               #if 0
-       *((u32*) param ) = cpu_to_le32( *((u32*) param ) );
-
-               FillH2CCmd_88E(padapter, RSSI_SETTING_EID, 3, param);
-               #endif
-       }else{
+       if(pHalData->fw_ractrl == _FALSE){              
                DBG_8192C("==>%s fw dont support RA \n",__FUNCTION__);
-               res=_FAIL;
+               return _FAIL;
        }
+               
+       *((u32*) param ) = cpu_to_le32( *((u32*) param ) );
+       FillH2CCmd_88E(padapter, H2C_RSSI_REPORT, 3, param);    
 
 _func_exit_;
 
        return res;
 }
 
-u8 rtl8188e_set_raid_cmd(_adapter*padapter, u32 mask)
-{
-       u8      buf[3];
+u8 rtl8188e_set_raid_cmd(_adapter*padapter, u32 bitmap, u8* arg)
+{      
        u8      res=_SUCCESS;
        HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
-_func_enter_;
-       if(pHalData->fw_ractrl == _TRUE){
-               _rtw_memset(buf, 0, 3);
-               mask = cpu_to_le32( mask );
-               _rtw_memcpy(buf, &mask, 3);             
-
-               FillH2CCmd_88E(padapter, H2C_DM_MACID_CFG, 3, buf);
-       }else{
+       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       struct sta_info *psta ; 
+       u8 macid, init_rate, raid, shortGIrate=_FALSE;  
+       u8 H2CCommand[7]={0};
+               
+       if(pHalData->fw_ractrl == _FALSE){              
                DBG_8192C("==>%s fw dont support RA \n",__FUNCTION__);
-               res=_FAIL;
-       }       
+               return _FAIL;
+       }
 
-_func_exit_;
+       macid = arg[0];
+       raid = arg[1];
+       shortGIrate = arg[2];
+       init_rate = arg[3];     
+       
+       psta = pmlmeinfo->FW_sta_info[macid].psta;
+       if(psta == NULL){
+               DBG_8192C("==>psta==NULL ,%s failed\n",__FUNCTION__);   
+               return _FAIL;
+       }
+               
+       H2CCommand[0] = macid;
+       H2CCommand[1] = raid | (shortGIrate?0x80:0x00) ;        
+       H2CCommand[2] = psta->bw_mode & 0x03; //BW; 
+
+#ifdef CONFIG_INTEL_PROXIM
+       if(padapter->proximity.proxim_on ==_TRUE)
+               pHalData->bDisableTXPowerTraining = _FALSE;
+#endif
+
+       //DisableTXPowerTraining
+       if(pHalData->bDisableTXPowerTraining){
+               H2CCommand[2] |= BIT6;
+               DBG_871X("%s,Disable PWT by driver\n",__FUNCTION__);
+       }
+       else{
+               PDM_ODM_T       pDM_OutSrc = &pHalData->odmpriv;
+
+               if(pDM_OutSrc->bDisablePowerTraining){
+                       H2CCommand[2] |= BIT6;
+                       DBG_871X("%s,Disable PWT by DM\n",__FUNCTION__);        
+               }
+       }
+       
+       H2CCommand[3] = (u1Byte)(bitmap & 0x000000ff);
+       H2CCommand[4] = (u1Byte)((bitmap & 0x0000ff00) >>8);
+       H2CCommand[5] = (u1Byte)((bitmap & 0x00ff0000) >> 16);
+       H2CCommand[6] = (u1Byte)((bitmap & 0xff000000) >> 24);
+       
+       FillH2CCmd_88E(padapter, H2C_DM_MACID_CFG, 7, H2CCommand);
+
+       //The firmware Rate Adaption function is triggered by TBTT INT, so to
+       // enable the rate adaption, we need to enable the hardware Beacon function Reg 0x550[3]                
+       //SetBcnCtrlReg(padapter, BIT3, 0);             
+       rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT3);
 
        return res;
 
@@ -266,14 +305,21 @@ void rtl8188e_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8* arg, u8 rssi_level
 
 
 #if(RATE_ADAPTIVE_SUPPORT == 1)
-       ODM_RA_UpdateRateInfo_8188E(
-                       &(pHalData->odmpriv),
-                       macid,
-                       raid, 
-                       bitmap,
-                       shortGIrate
-                       );
-#endif 
+       if(!pHalData->fw_ractrl ){
+               ODM_RA_UpdateRateInfo_8188E(
+                               &(pHalData->odmpriv),
+                               macid,
+                               raid, 
+                               bitmap,
+                               shortGIrate
+                               );
+       }
+       else
+#endif
+       {
+                rtl8188e_set_raid_cmd(pAdapter,bitmap,arg);
+       }
+       
 
 }
 
@@ -303,7 +349,7 @@ _func_enter_;
                        break;
                case PS_MODE_DTIM:
                        RLBM = 2;
-                       H2CSetPwrMode.AwakeInterval = 2; //DTIM = 1
+                       H2CSetPwrMode.AwakeInterval = 3; //DTIM = 2
                        H2CSetPwrMode.Mode = 1;
                        break;
                case PS_MODE_UAPSD_WMM:
@@ -827,6 +873,26 @@ CheckFwRsvdPageContent(
        }
 }
 
+//
+// Description: Get the reserved page number in Tx packet buffer.
+// Retrun value: the page number.
+// 2012.08.09, by tynli.
+//
+u8
+GetTxBufferRsvdPageNum8188E(_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_8188E(padapter);
+
+       rtw_hal_get_def_var(padapter, HAL_DEF_TX_PAGE_BOUNDARY, (u8 *)&TxPageBndy);
+
+       RsvdPageNum = LAST_ENTRY_OF_TX_PKT_BUFFER_8188E(padapter) - TxPageBndy + 1;
+
+       return RsvdPageNum;
+}
+
 //
 // Description: Fill the reserved packets that FW will use to RSVD page.
 //                     Now we just send 4 types packet to rsvd page.
@@ -845,7 +911,6 @@ static void SetFwRsvdPagePkt(PADAPTER padapter, BOOLEAN bDLFinished)
        struct xmit_priv        *pxmitpriv;
        struct mlme_ext_priv    *pmlmeext;
        struct mlme_ext_info    *pmlmeinfo;
-       struct pwrctrl_priv *pwrctl;
        u32     BeaconLength, ProbeRspLength, PSPollLength;
        u32     NullDataLength, QosNullLength, BTQosNullLength;
        u8      *ReservedPagePacket;
@@ -859,7 +924,7 @@ static void SetFwRsvdPagePkt(PADAPTER padapter, BOOLEAN bDLFinished)
        struct security_priv *psecuritypriv = &padapter->securitypriv; //added by xx
        u8 currentip[4];
        u8 cur_dot11txpn[8];
-
+       struct pwrctrl_priv *pwrctl;
        pwrctl = adapter_to_pwrctl(padapter);
 #endif
 
@@ -907,8 +972,8 @@ static void SetFwRsvdPagePkt(PADAPTER padapter, BOOLEAN bDLFinished)
        RsvdPageLoc.LocPsPoll = PageNum;
        ConstructPSPoll(padapter, &ReservedPagePacket[BufIndex], &PSPollLength);
        rtl8188e_fill_fake_txdesc(padapter,
-                       &ReservedPagePacket[BufIndex-TxDescLen],
-                       PSPollLength, _TRUE, _FALSE, _FALSE);
+                       &ReservedPagePacket[BufIndex-TxDescLen], PSPollLength,
+                       _TRUE, _FALSE, _FALSE);
 
        PageNeed = (u8)PageNum_128(TxDescLen + PSPollLength);
        PageNum += PageNeed;
@@ -923,10 +988,9 @@ static void SetFwRsvdPagePkt(PADAPTER padapter, BOOLEAN bDLFinished)
                &NullDataLength,
                get_my_bssid(&pmlmeinfo->network),
                _FALSE, 0, 0, _FALSE);
-
        rtl8188e_fill_fake_txdesc(padapter,
-                       &ReservedPagePacket[BufIndex-TxDescLen],
-                       NullDataLength, _FALSE, _FALSE, _FALSE);
+                       &ReservedPagePacket[BufIndex-TxDescLen], NullDataLength,
+                       _FALSE, _FALSE, _FALSE);
 
        PageNeed = (u8)PageNum_128(TxDescLen + NullDataLength);
        PageNum += PageNeed;
@@ -941,49 +1005,34 @@ static void SetFwRsvdPagePkt(PADAPTER padapter, BOOLEAN bDLFinished)
                &QosNullLength,
                get_my_bssid(&pmlmeinfo->network),
                _TRUE, 0, 0, _FALSE);
-
        rtl8188e_fill_fake_txdesc(padapter,
-                       &ReservedPagePacket[BufIndex-TxDescLen],
-                       QosNullLength, _FALSE, _FALSE, _FALSE);
+                       &ReservedPagePacket[BufIndex-TxDescLen],QosNullLength,
+                       _FALSE, _FALSE, _FALSE);
 
        PageNeed = (u8)PageNum_128(TxDescLen + QosNullLength);
        PageNum += PageNeed;
 
        BufIndex += PageNeed * PageSize;
 
-/*
-       //3 (6) BT Qos null data
-       RsvdPageLoc.LocBTQosNull = PageNum;
-       ConstructNullFunctionData(
-               padapter, 
-               &ReservedPagePacket[BufIndex],
-               &BTQosNullLength,
-               get_my_bssid(&pmlmeinfo->network),
-               _TRUE, 0, 0, _FALSE);
-       rtl8188e_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], BTQosNullLength, _FALSE, _TRUE);
-
-       TotalPacketLen = BufIndex + BTQosNullLength;
-*/
-
 #ifdef CONFIG_WOWLAN
        if (pwrctl->wowlan_mode == _TRUE) {
                //3(7) ARP
                rtw_get_current_ip_address(padapter, currentip);
                RsvdPageLoc.LocArpRsp = PageNum;
-
+       
                ConstructARPResponse(
-                       padapter,
-                       &ReservedPagePacket[BufIndex],
-                       &ARPLegnth,
-                       currentip);
-
+                               padapter,
+                               &ReservedPagePacket[BufIndex],
+                               &ARPLegnth,
+                               currentip);
+       
                rtl8188e_fill_fake_txdesc(padapter,
                                &ReservedPagePacket[BufIndex-TxDescLen],
                                ARPLegnth, _FALSE, _FALSE, _TRUE);
-
+       
                PageNeed = (u8)PageNum_128(TxDescLen + ARPLegnth);
        } else {
-                PageNeed = (u8)PageNum_128(128);
+               PageNeed = (u8)PageNum_128(128);
        }
 
        PageNum += PageNeed;
@@ -1000,22 +1049,28 @@ static void SetFwRsvdPagePkt(PADAPTER padapter, BOOLEAN bDLFinished)
        TotalPacketLen = BufIndex + QosNullLength;
 #endif
 
-       pcmdframe = alloc_mgtxmitframe(pxmitpriv);
-       if (pcmdframe == NULL)
+       pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv);
+       if (pcmdframe == NULL) {
+               DBG_871X("%s: rtw_alloc_cmdxmitframe fail!\n", __FUNCTION__);
                goto exit;
+       }
 
        // update attribute
        pattrib = &pcmdframe->attrib;
        update_mgntframe_attrib(padapter, pattrib);
-       pattrib->qsel = 0x10;
+       pattrib->qsel = QSLT_BEACON;
        pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TXDESC_OFFSET;
 
        if (TotalPacketLen < MaxRsvdPageBufSize)
                _rtw_memcpy(pcmdframe->buf_addr, ReservedPagePacket, TotalPacketLen);
        else
                DBG_871X("%s: memory copy fail at Line:%d\n", __FUNCTION__, __LINE__);
-
-       rtw_hal_mgnt_xmit(padapter, pcmdframe);
+       
+#ifdef CONFIG_PCI_HCI
+       dump_mgntframe(padapter, pcmdframe);
+#else
+       dump_mgntframe_and_wait(padapter, pcmdframe, 100);
+#endif
 
        DBG_871X("%s: Set RSVD page location to Fw ,TotalPacketLen(%d)\n", __FUNCTION__,TotalPacketLen);
        rtl8188e_set_FwRsvdPage_cmd(padapter, &RsvdPageLoc);
@@ -1082,7 +1137,8 @@ _func_enter_;
                do
                {
                        // download rsvd page.
-                       SetFwRsvdPagePkt(padapter, _FALSE);
+                       //SetFwRsvdPagePkt(padapter, _FALSE);
+                       rtw_hal_set_fw_rsvd_page(padapter, _FALSE);
                        DLBcnCount++;
                        do
                        {
@@ -1183,7 +1239,8 @@ _func_enter_;
                        rtw_write8(padapter,  REG_CR+1, pHalData->RegCR_1);
                }
        }
-#ifdef CONFIG_WOWLAN
+#if 0
+//#ifdef CONFIG_WOWLAN
        if (adapter_to_pwrctl(padapter)->wowlan_mode){
                JoinBssRptParm.OpMode = mstatus;
                psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(pmlmepriv));
@@ -1533,7 +1590,7 @@ void rtl8188es_set_wowlan_ctrl_cmd(_adapter* padapter, u8 enable)
                pwowlan_parm.gpio_index=0x0;
 #endif //CONFIG_USB_HCI
 
-#ifdef CONFIG_SDIO_HCI
+#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) 
                pwowlan_parm.gpio_index = 0x80;
 #endif //CONFIG_SDIO_HCI
 
@@ -1547,12 +1604,6 @@ void rtl8188es_set_wowlan_ctrl_cmd(_adapter* padapter, u8 enable)
 #endif //CONFIG_GPIO_WAKEUP
        }
 
-       DBG_871X("before H2C 0x%02x, 0x284: 0x%08x\n",
-                       H2C_COM_WWLAN, rtw_read32(padapter, 0x284));
-       DBG_871X("before H2C 0x%02x, 0x11c: 0x%08x\n",
-                       H2C_COM_WWLAN, rtw_read32(padapter, 0x11c));
-       DBG_871X("before H2C 0x%02x, 0x690: 0x%08x\n",
-                       H2C_COM_WWLAN, rtw_read32(padapter, 0x690));
        FillH2CCmd_88E(padapter, H2C_COM_WWLAN, 2, (u8 *)&pwowlan_parm);
        rtw_msleep_os(5);
 #ifdef WOW_DEBUG
@@ -1607,127 +1658,13 @@ void rtl8188es_set_remote_wake_ctrl_cmd(_adapter* padapter, u8 enable)
        DBG_871X("TX_RPT-2:0x%02x\n", rtw_read8(padapter, REG_TX_RPT_CTRL));
 #endif
 }
-
 void rtl8188es_set_wowlan_cmd(_adapter* padapter, u8 enable)
 {
-       u8              res=_SUCCESS;
-       u32             test=0;
-       struct recv_priv        *precvpriv = &padapter->recvpriv;
-       SETWOWLAN_PARM          pwowlan_parm;
-       SETAOAC_GLOBAL_INFO     paoac_global_info_parm;
-       struct pwrctrl_priv     *pwrpriv = adapter_to_pwrctl(padapter);
-       struct security_priv *psecpriv = &padapter->securitypriv;
-#ifdef CONFIG_GPIO_WAKEUP
-       u8              gpio_wake_pin = WAKEUP_GPIO_IDX;
-       u8              gpio_high_active = 0;   //default low active
-#endif
-
-_func_enter_;
-               DBG_871X_LEVEL(_drv_always_, "+%s+\n", __func__);
-
-               pwowlan_parm.mode =0;
-               pwowlan_parm.gpio_index=0;
-               pwowlan_parm.gpio_duration=0;
-               pwowlan_parm.second_mode =0;
-               pwowlan_parm.reserve=0;
-
-               if(enable){
-
-                       pwowlan_parm.mode |=FW_WOWLAN_FUN_EN;
-                       pwrpriv->wowlan_magic =_TRUE;
-                       if (psecpriv->dot11PrivacyAlgrthm == _WEP40_ || psecpriv->dot11PrivacyAlgrthm == _WEP104_)
-                               pwrpriv->wowlan_unicast =_TRUE;
-
-                       if(pwrpriv->wowlan_pattern ==_TRUE){
-                               pwowlan_parm.mode |= FW_WOWLAN_PATTERN_MATCH;
-                               DBG_871X_LEVEL(_drv_info_, "%s 2.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode );
-                       }
-                       if(pwrpriv->wowlan_magic ==_TRUE){
-                               pwowlan_parm.mode |=FW_WOWLAN_MAGIC_PKT;
-                               DBG_871X_LEVEL(_drv_info_, "%s 3.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode );
-                       }
-                       if(pwrpriv->wowlan_unicast ==_TRUE){
-                               pwowlan_parm.mode |=FW_WOWLAN_UNICAST;
-                               DBG_871X_LEVEL(_drv_info_, "%s 4.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode );
-                       }
-
-                       pwowlan_parm.mode |=FW_WOWLAN_REKEY_WAKEUP;
-                       pwowlan_parm.mode |=FW_WOWLAN_DEAUTH_WAKEUP;
-
-                       //DataPinWakeUp
-#ifdef CONFIG_USB_HCI
-                       pwowlan_parm.gpio_index=0x0;
-#endif //CONFIG_USB_HCI
-
-#ifdef CONFIG_SDIO_HCI
-                       pwowlan_parm.gpio_index = 0x80;
-#endif //CONFIG_SDIO_HCI
-
-#ifdef CONFIG_GPIO_WAKEUP
-                       pwowlan_parm.gpio_index = gpio_wake_pin;
-
-                       //WOWLAN_GPIO_ACTIVE means GPIO high active
-                       //pwowlan_parm.mode |=FW_WOWLAN_GPIO_ACTIVE;
-                       if (gpio_high_active)
-                               pwowlan_parm.mode |=FW_WOWLAN_GPIO_ACTIVE;
-#endif //CONFIG_GPIO_WAKEUP
-
-                       DBG_871X("before H2C 0x80, 0x284: 0x%08x\n", rtw_read32(padapter, 0x284));
-                       DBG_871X("before H2C 0x80, 0x11c: 0x%08x\n", rtw_read32(padapter, 0x11c));
-                       DBG_871X("before H2C 0x80, 0x690: 0x%08x\n", rtw_read32(padapter, 0x690));
-
-                       DBG_871X_LEVEL(_drv_info_, "%s 5.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode);
-                       DBG_871X_LEVEL(_drv_info_, "%s 6.pwowlan_parm.index=0x%x \n",__FUNCTION__,pwowlan_parm.gpio_index);
-                       res = FillH2CCmd_88E(padapter, H2C_COM_WWLAN, 2, (u8 *)&pwowlan_parm);
-
-                       rtw_msleep_os(100);
-                       DBG_871X("after H2C 0x80, 0x284: 0x%08x\n", rtw_read32(padapter, 0x284));
-                       DBG_871X("after H2C 0x80, 0x11c: 0x%08x\n", rtw_read32(padapter, 0x11c));
-                       DBG_871X("after H2C 0x80, 0x690: 0x%08x\n", rtw_read32(padapter, 0x690));
-
-                       //disconnect decision
-                       pwowlan_parm.mode =1;
-                       pwowlan_parm.gpio_index=0;
-                       pwowlan_parm.gpio_duration=0;
-                       FillH2CCmd_88E(padapter, H2C_COM_DISCNT_DECISION, 3, (u8 *)&pwowlan_parm);
-
-                       //keep alive period = 10 * 10 BCN interval
-                       pwowlan_parm.mode = FW_WOWLAN_KEEP_ALIVE_EN | FW_ADOPT_USER | FW_WOWLAN_KEEP_ALIVE_PKT_TYPE;
-                       pwowlan_parm.gpio_index = 15;
-                       res = FillH2CCmd_88E(padapter, H2C_COM_KEEP_ALIVE, 2, (u8 *)&pwowlan_parm);
-
-                       rtw_msleep_os(2);
-                       //Configure STA security information for GTK rekey wakeup event.
-                       paoac_global_info_parm.pairwiseEncAlg =
-                                       padapter->securitypriv.dot11PrivacyAlgrthm;
-                       paoac_global_info_parm.groupEncAlg =
-                                       padapter->securitypriv.dot118021XGrpPrivacy;
-                       FillH2CCmd_88E(padapter, H2C_COM_AOAC_GLOBAL_INFO, 2, (u8 *)&paoac_global_info_parm);
-
-                       rtw_msleep_os(2);
-                       //enable Remote wake ctrl
-                       pwowlan_parm.mode = FW_REMOTE_WAKE_CTRL_EN | FW_WOW_FW_UNICAST_EN | FW_ARP_EN;
-                       if (psecpriv->dot11PrivacyAlgrthm == _AES_ || psecpriv->dot11PrivacyAlgrthm == _NO_PRIVACY_)
-                       {
-                               pwowlan_parm.gpio_duration=0;
-                       } else {
-                               pwowlan_parm.gpio_duration=1;
-                       }
-
-                       pwowlan_parm.gpio_index=0;
-
-                       res = FillH2CCmd_88E(padapter, H2C_COM_REMOTE_WAKE_CTRL, 3, (u8 *)&pwowlan_parm);
-               } else {
-                       pwrpriv->wowlan_magic =_FALSE;
-#ifdef CONFIG_GPIO_WAKEUP
-                       rtl8188es_set_output_gpio(padapter, gpio_wake_pin, !gpio_high_active);
-#endif //CONFIG_GPIO_WAKEUP
-                       res = FillH2CCmd_88E(padapter, H2C_COM_WWLAN, 2, (u8 *)&pwowlan_parm);
-                       rtw_msleep_os(2);
-                       res = FillH2CCmd_88E(padapter, H2C_COM_REMOTE_WAKE_CTRL, 3, (u8 *)&pwowlan_parm);
-               }
-_func_exit_;
-               DBG_871X_LEVEL(_drv_always_, "-%s res:%d-\n", __func__, res);
-               return ;
+       DBG_871X("%s, enable: %d\n", __func__, enable);
+       rtl8188es_set_wowlan_ctrl_cmd(padapter, enable);
+       rtl8188es_set_global_info_cmd(padapter, enable);
+       rtl8188es_set_keep_alive_cmd(padapter, enable);
+       rtl8188es_set_disconnect_decision_cmd(padapter, enable);
+       rtl8188es_set_remote_wake_ctrl_cmd(padapter, enable);
 }
 #endif  //CONFIG_WOWLAN
index dc966775a17f1b601435454b75030c9be68b01f9..3078cee14f9cd8f55cffe36a51091aa218b31b15 100644 (file)
@@ -255,63 +255,24 @@ dm_InitGPIOSetting(
 //============================================================\r
 static void Init_ODM_ComInfo_88E(PADAPTER      Adapter)\r
 {\r
-       EEPROM_EFUSE_PRIV       *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter);\r
        PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
        struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
        PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);\r
        u8      cut_ver,fab_ver;\r
-       \r
-       //\r
-       // Init Value\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
+       Init_ODM_ComInfo(Adapter);\r
+\r
        ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_IC_TYPE,ODM_RTL8188E);\r
 \r
        fab_ver = ODM_TSMC;\r
-       cut_ver = ODM_CUT_A;    \r
+       cut_ver = ODM_CUT_A;\r
 \r
-       if(IS_I_CUT(pHalData->VersionID) || IS_J_CUT(pHalData->VersionID) || IS_K_CUT(pHalData->VersionID))\r
+       if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter))\r
                cut_ver = ODM_CUT_I;\r
 \r
-       ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_FAB_VER,fab_ver);           \r
+       ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_FAB_VER,fab_ver);\r
        ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_CUT_VER,cut_ver);\r
 \r
-       ODM_CmnInfoInit(pDM_Odm,        ODM_CMNINFO_MP_TEST_CHIP,IS_NORMAL_CHIP(pHalData->VersionID));\r
-       \r
-#if 0  \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,pEEPROM->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
        ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_ANTENNA_TYPE, pHalData->TRxAntDivType);\r
        \r
        #ifdef CONFIG_DISABLE_ODM\r
@@ -329,9 +290,6 @@ static void Init_ODM_ComInfo_88E(PADAPTER   Adapter)
 }\r
 static void Update_ODM_ComInfo_88E(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
@@ -344,14 +302,18 @@ static void Update_ODM_ComInfo_88E(PADAPTER       Adapter)
                | ODM_BB_FA_CNT\r
                | ODM_BB_RSSI_MONITOR\r
                | ODM_BB_CCK_PD\r
-               | ODM_BB_PWR_SAVE               \r
+               | ODM_BB_PWR_SAVE       \r
+               | ODM_BB_CFO_TRACKING\r
                | ODM_RF_CALIBRATION\r
                | ODM_RF_TX_PWR_TRACK\r
-#ifdef CONFIG_ODM_ADAPTIVITY\r
-               | ODM_BB_ADAPTIVITY\r
-#endif\r
+               | ODM_BB_NHM_CNT\r
+               | ODM_BB_PRIMARY_CCA\r
+//             | ODM_BB_PWR_TRAIN\r
                ;\r
 \r
+       if (rtw_odm_adaptivity_needed(Adapter) == _TRUE)\r
+               pdmpriv->InitODMFlag |= ODM_BB_ADAPTIVITY;\r
+\r
        if (!Adapter->registrypriv.qos_opt_enable) {\r
                pdmpriv->InitODMFlag |= ODM_MAC_EDCA_TURBO;\r
        }\r
@@ -373,44 +335,8 @@ static void Update_ODM_ComInfo_88E(PADAPTER        Adapter)
 #endif//CONFIG_DISABLE_ODM\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_FORCED_IGI_LB,&(pHalData->u1ForcedIgiLb));\r
-       //================= only for 8192D   =================\r
-       \r
-       //pHalData->CurrentBandType92D hook fake band_type for power tracking\r
-       //ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BAND,&(pDM_Odm->u1Byte_temp));\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BAND,&(pHalData->CurrentBandType));\r
 \r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_FORCED_RATE,&(pHalData->ForcedDataRate));\r
-       \r
-       /*\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
-       \r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SCAN,&(pmlmepriv->bScanInProcess));\r
-       ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_POWER_SAVING,&(pwrctrlpriv->bpower_saving));\r
        ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_ANTENNA_TYPE, pHalData->TRxAntDivType);\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
@@ -543,11 +469,8 @@ void rtl8188e_init_dm_priv(IN PADAPTER Adapter)
        _rtw_memset(pdmpriv, 0, sizeof(struct dm_priv));\r
        //_rtw_spinlock_init(&(pHalData->odm_stainfo_lock));\r
        Init_ODM_ComInfo_88E(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
-       ODM_InitDebugSetting(podmpriv); \r
+       PHYDM_InitDebugSetting(podmpriv);       \r
 }\r
 \r
 void rtl8188e_deinit_dm_priv(IN PADAPTER Adapter)\r
@@ -556,10 +479,7 @@ void rtl8188e_deinit_dm_priv(IN PADAPTER Adapter)
        struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
        PDM_ODM_T               podmpriv = &pHalData->odmpriv;\r
        //_rtw_spinlock_free(&pHalData->odm_stainfo_lock);\r
-#ifdef CONFIG_SW_ANTENNA_DIVERSITY\r
-       //_cancel_timer_ex(&pdmpriv->SwAntennaSwitchTimer);     \r
        ODM_CancelAllTimers(podmpriv);  \r
-#endif\r
 }\r
 \r
 \r
index 45fd34f954485aeb23d4c6ecc6bc463f692c3073..7f367f07d9b84a14a5516e70373b9a4a4dc0a0a4 100644 (file)
@@ -790,10 +790,14 @@ void _MCUIO_Reset88E(PADAPTER padapter,u8 bReset)
        u8 u1bTmp;
 
        if(bReset==_TRUE){
+               u1bTmp = rtw_read8(padapter, REG_RSV_CTRL);
+               rtw_write8(padapter,REG_RSV_CTRL, (u1bTmp&(~BIT1)));
                // Reset MCU IO Wrapper- sugggest by SD1-Gimmy
                u1bTmp = rtw_read8(padapter, REG_RSV_CTRL+1);
                rtw_write8(padapter,REG_RSV_CTRL+1, (u1bTmp&(~BIT3)));
        }else{
+               u1bTmp = rtw_read8(padapter, REG_RSV_CTRL);
+               rtw_write8(padapter,REG_RSV_CTRL, (u1bTmp&(~BIT1)));
                // Enable MCU IO Wrapper
                u1bTmp = rtw_read8(padapter, REG_RSV_CTRL+1);
                rtw_write8(padapter, REG_RSV_CTRL+1, u1bTmp|BIT3);
@@ -814,7 +818,6 @@ void _8051Reset88E(PADAPTER padapter)
        DBG_871X("=====> _8051Reset88E(): 8051 reset success .\n");
 }
 
-extern u8 g_fwdl_chksum_fail;
 static s32 polling_fwdl_chksum(_adapter *adapter, u32 min_cnt, u32 timeout_ms)
 {
        s32 ret = _FAIL;
@@ -835,11 +838,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;
 
@@ -850,7 +850,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;
@@ -878,11 +877,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;
 
@@ -922,7 +918,7 @@ s32 rtl8188e_FirmwareDownload(PADAPTER padapter, BOOLEAN  bUsedWoWLANFw)
        PRT_8188E_FIRMWARE_HDR          pFwHdr = NULL;
        
        u8                      *pFirmwareBuf;
-       u32                     FirmwareLen;
+       u32                     FirmwareLen,tmp_fw_len=0;
 #ifdef CONFIG_FILE_FWIMG
        u8 *fwfilepath;
 #endif // CONFIG_FILE_FWIMG
@@ -975,22 +971,36 @@ s32 rtl8188e_FirmwareDownload(PADAPTER padapter, BOOLEAN  bUsedWoWLANFw)
                case FW_SOURCE_HEADER_FILE:
 #ifdef CONFIG_WOWLAN
                        if(bUsedWoWLANFw) {
-                               ODM_ConfigFWWithHeaderFile(&pHalData->odmpriv, CONFIG_FW_WoWLAN, 
-                                       (u8 *)&(pFirmware->szFwBuffer), &(pFirmware->ulFwLength));
+                               #ifdef CONFIG_SFW_SUPPORTED
+                               if(IS_VENDOR_8188E_I_CUT_SERIES(padapter))
+                                       ODM_ConfigFWWithHeaderFile(&pHalData->odmpriv, CONFIG_FW_WoWLAN_2, 
+                                               (u8 *)&(pFirmware->szFwBuffer), &(pFirmware->ulFwLength));
+                               else    
+                               #endif  
+                                       ODM_ConfigFWWithHeaderFile(&pHalData->odmpriv, CONFIG_FW_WoWLAN, 
+                                               (u8 *)&(pFirmware->szFwBuffer), &(pFirmware->ulFwLength));
                                DBG_871X("%s fw:%s, size: %d\n",__FUNCTION__, "WoWLAN", pFirmware->ulFwLength);
                        }else
 #endif //CONFIG_WOWLAN
                        {
-                               ODM_ConfigFWWithHeaderFile(&pHalData->odmpriv, CONFIG_FW_NIC, 
+                               #ifdef CONFIG_SFW_SUPPORTED
+                               if(IS_VENDOR_8188E_I_CUT_SERIES(padapter))
+                                       ODM_ConfigFWWithHeaderFile(&pHalData->odmpriv, CONFIG_FW_NIC_2, 
+                                       (u8 *)&(pFirmware->szFwBuffer), &(pFirmware->ulFwLength));
+                               else                            
+                               #endif  
+                                       ODM_ConfigFWWithHeaderFile(&pHalData->odmpriv, CONFIG_FW_NIC, 
                                        (u8 *)&(pFirmware->szFwBuffer), &(pFirmware->ulFwLength));
                                DBG_871X("%s fw:%s, size: %d\n", __FUNCTION__, "NIC", pFirmware->ulFwLength);
                        }
                        break;
        }
 
-       if (pFirmware->ulFwLength > FW_8188E_SIZE) {
+       tmp_fw_len = IS_VENDOR_8188E_I_CUT_SERIES(padapter)?FW_8188E_SIZE_2:FW_8188E_SIZE;
+               
+       if (pFirmware->ulFwLength > tmp_fw_len) {
                rtStatus = _FAIL;
-               DBG_871X_LEVEL(_drv_emerg_, "Firmware size:%u exceed %u\n", pFirmware->ulFwLength, FW_8188E_SIZE);
+               DBG_871X_LEVEL(_drv_emerg_, "Firmware size:%u exceed %u\n", pFirmware->ulFwLength, tmp_fw_len);
                goto exit;
        }
        
@@ -1116,12 +1126,6 @@ SetFwRelatedForWoWLAN8188ES(
 static void rtl8188e_free_hal_data(PADAPTER padapter)
 {
 _func_enter_;
-
-       if(padapter->HalData)
-       {
-               rtw_vmfree(padapter->HalData, sizeof(HAL_DATA_TYPE));
-               padapter->HalData = NULL;
-       }
        
 _func_exit_;
 }
@@ -2767,16 +2771,15 @@ static void rtl8188e_read_chip_version(PADAPTER padapter)
 }
 void rtl8188e_GetHalODMVar(    
        PADAPTER                                Adapter,
-       HAL_ODM_VARIABLE                eVariable,
+       HAL_ODM_VARIABLE                eVariable,      
        PVOID                                   pValue1,
-       BOOLEAN                                 bSet)
+       PVOID                                   pValue2)
 {
        HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
        PDM_ODM_T podmpriv = &pHalData->odmpriv;
        switch(eVariable){
-               case HAL_ODM_STA_INFO:
-                       break;
                default:
+                       GetHalODMVar(Adapter,eVariable,pValue1,pValue2);
                        break;
        }
 }
@@ -2790,39 +2793,15 @@ void rtl8188e_SetHalODMVar(
        PDM_ODM_T podmpriv = &pHalData->odmpriv;
        //_irqL irqL;
        switch(eVariable){
-               case HAL_ODM_STA_INFO:
-                       {       
-                               struct sta_info *psta = (struct sta_info *)pValue1;                             
-                               if(bSet){
-                                       DBG_8192C("### Set STA_(%d) info\n",psta->mac_id);
-                                       ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS,psta->mac_id,psta);
-                                       #if(RATE_ADAPTIVE_SUPPORT==1)
-                                       ODM_RAInfo_Init(podmpriv,psta->mac_id);
-                                       #endif
-                               }
-                               else{
-                                       DBG_8192C("### Clean STA_(%d) info\n",psta->mac_id);
-                                       //_enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL);
-                                       ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS,psta->mac_id,NULL);
-                                       
-                                       //_exit_critical_bh(&pHalData->odm_stainfo_lock, &irqL);
-                                   }
-                       }
-                       break;
-               case HAL_ODM_P2P_STATE:         
-                               ODM_CmnInfoUpdate(podmpriv,ODM_CMNINFO_WIFI_DIRECT,bSet);
-                       break;
-               case HAL_ODM_WIFI_DISPLAY_STATE:
-                               ODM_CmnInfoUpdate(podmpriv,ODM_CMNINFO_WIFI_DISPLAY,bSet);
-                       break;
                default:
+                       SetHalODMVar(Adapter,eVariable,pValue1,bSet);
                        break;
        }
 }      
 
 void rtl8188e_start_thread(_adapter *padapter)
 {
-#ifdef CONFIG_SDIO_HCI
+#if defined(CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)
 #ifndef CONFIG_SDIO_TX_TASKLET
        struct xmit_priv *xmitpriv = &padapter->xmitpriv;
 
@@ -2837,10 +2816,9 @@ void rtl8188e_start_thread(_adapter *padapter)
 
 void rtl8188e_stop_thread(_adapter *padapter)
 {
-#ifdef CONFIG_SDIO_HCI
+#if defined(CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)
 #ifndef CONFIG_SDIO_TX_TASKLET
        struct xmit_priv *xmitpriv = &padapter->xmitpriv;
-       u8 res = 0;
 
        // stop xmit_buf_thread
        if (xmitpriv->SdioXmitThread ) {
@@ -2889,41 +2867,22 @@ void UpdateHalRAMask8188E(PADAPTER padapter, u32 mac_id, u8 rssi_level)
 
        rate_bitmap = 0xffffffff;                                       
        rate_bitmap = ODM_Get_Rate_Bitmap(&pHalData->odmpriv,mac_id,mask,rssi_level);
-       DBG_871X("%s => mac_id:%d, networkType:0x%02x, mask:0x%08x\n\t ==> rssi_level:%d, rate_bitmap:0x%08x\n",
-                       __FUNCTION__,mac_id,psta->wireless_mode,mask,rssi_level,rate_bitmap);
+
+       
+       DBG_871X("%s => mac_id:%d, rate_id:%d, networkType:0x%02x, mask:0x%08x\n\t ==> rssi_level:%d, rate_bitmap:0x%08x\n",
+                       __FUNCTION__,mac_id,psta->raid,psta->wireless_mode,mask,rssi_level,rate_bitmap);
 
        mask &= rate_bitmap;
        
        if(pHalData->fw_ractrl == _TRUE)
        {
-               u8 arg = 0;
+               u8 arg[4] ={0};
 
-               //arg = (cam_idx-4)&0x1f;//MACID
-               arg = mac_id&0x1f;//MACID
-               
-               arg |= BIT(7);
-               
-               if (shortGIrate==_TRUE)
-                       arg |= BIT(5);
-               mask |= ((psta->raid<<28)&0xf0000000);
-               DBG_871X("update raid entry, mask=0x%x, arg=0x%x\n", mask, arg);
-
-#ifdef CONFIG_INTEL_PROXIM
-               if(padapter->proximity.proxim_on ==_TRUE){
-                       arg &= ~BIT(6);
-               }
-               else {
-                       arg |= BIT(6);
-               }
-#endif //CONFIG_INTEL_PROXIM
-
-               //to do ,for 8188E-SMIC
-               /*
-               *(pu4Byte)&RateMask=EF4Byte((ratr_bitmap&0x0fffffff) | (ratr_index<<28));
-               RateMask[4] = macId | (bShortGI?0x20:0x00) | 0x80;
-               */      
-               rtl8188e_set_raid_cmd(padapter, mask);  
-               
+               arg[0] = mac_id;//MACID
+               arg[1] = psta->raid;
+               arg[2] = shortGIrate;
+               arg[3] =  psta->init_rate;
+               rtl8188e_set_raid_cmd(padapter, mask,arg);
        }
        else
        {       
@@ -2942,6 +2901,15 @@ void UpdateHalRAMask8188E(PADAPTER padapter, u32 mac_id, u8 rssi_level)
        }
 }
 
+void rtl8188e_init_default_value(_adapter *adapter)
+{
+       HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
+
+       /* hal capability values */
+       hal_data->macid_num = MACID_NUM_88E;
+       hal_data->cam_entry_num = CAM_ENTRY_NUM_88E;
+}
+
 void rtl8188e_set_hal_ops(struct hal_ops *pHalFunc)
 {
        pHalFunc->free_hal_data = &rtl8188e_free_hal_data;
@@ -3005,7 +2973,12 @@ void rtl8188e_set_hal_ops(struct hal_ops *pHalFunc)
 #endif
 
        pHalFunc->hal_notch_filter = &hal_notch_filter_8188e;
-
+       pHalFunc->fill_h2c_cmd = &FillH2CCmd_88E;
+       pHalFunc->fill_fake_txdesc = &rtl8188e_fill_fake_txdesc;
+#ifdef CONFIG_WOWLAN
+       pHalFunc->hal_set_wowlan_fw = &SetFwRelatedForWoWLAN8188ES;
+#endif
+       pHalFunc->hal_get_tx_buff_rsvd_page_num = &GetTxBufferRsvdPageNum8188E;
 }
 
 u8 GetEEPROMSize8188E(PADAPTER padapter)
@@ -3022,7 +2995,7 @@ u8 GetEEPROMSize8188E(PADAPTER padapter)
        return size;
 }
 
-#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_PCI_HCI)
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_PCI_HCI) || defined(CONFIG_GSPI_HCI)
 //-------------------------------------------------------------------------
 //
 // LLT R/W/Init function
@@ -3054,7 +3027,7 @@ s32 _LLTWrite(PADAPTER padapter, u32 address, u32 data)
 
 u8 _LLTRead(PADAPTER padapter, u32 address)
 {
-       s32     count = 0;
+       s32     count = POLLING_LLT_THRESHOLD;
        u32     value = _LLT_INIT_ADDR(address) | _LLT_OP(_LLT_READ_ACCESS);
        u16     LLTReg = REG_LLT_INIT;
 
@@ -3067,12 +3040,12 @@ u8 _LLTRead(PADAPTER padapter, u32 address)
                if (_LLT_NO_ACTIVE == _LLT_OP_VALUE(value)) {
                        return (u8)value;
                }
-
-               if (count > POLLING_LLT_THRESHOLD) {
-                       RT_TRACE(_module_hal_init_c_, _drv_err_, ("Failed to polling read LLT done at address %d!\n", address));
-                       break;
-               }
-       } while (count++);
+       } while (--count);
+       
+       if (count <=0 ) {
+               RT_TRACE(_module_hal_init_c_, _drv_err_, ("Failed to polling read LLT done at address %d!\n", address));                
+       }
+       
 
        return 0xFF;
 }
@@ -3081,7 +3054,7 @@ s32 InitLLTTable(PADAPTER padapter, u8 txpktbuf_bndy)
 {
        s32     status = _FAIL;
        u32     i;
-       u32     Last_Entry_Of_TxPktBuf = LAST_ENTRY_OF_TX_PKT_BUFFER_8188E;// 176, 22k
+       u32     Last_Entry_Of_TxPktBuf = LAST_ENTRY_OF_TX_PKT_BUFFER_8188E(padapter);// 176, 22k
        HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
 
 #if defined(CONFIG_IOL_LLT)
@@ -3140,7 +3113,7 @@ Hal_InitPGData88E(PADAPTER        padapter)
                if (is_boot_from_eeprom(padapter))
                {
                        // Read all Content from EEPROM or EFUSE.
-                       for(i = 0; i < HWSET_MAX_SIZE_88E; i += 2)
+                       for(i = 0; i < HWSET_MAX_SIZE; i += 2)
                        {
 //                             value16 = EF2Byte(ReadEEprom(pAdapter, (u2Byte) (i>>1)));
 //                             *((u16*)(&PROMContent[i])) = value16;
@@ -3202,22 +3175,15 @@ Hal_ReadPowerValueFromPROM_8188E(
        _rtw_memset(pwrInfo24G, 0, sizeof(TxPowerInfo24G));
 
        if(AutoLoadFail)
-       {
+       {       
                for(rfPath = 0 ; rfPath < pHalData->NumTotalRFPath ; rfPath++)
                {
-                       //2.4G default CCK ITX value 
-                       for (group = 0;group < MAX_CHNL_GROUP_24G;group++) {
-                               pwrInfo24G->IndexCCK_Base[rfPath][group] =
-                                       EEPROM_DEFAULT_24G_CCK_TX_INDEX;
-                       }
-
-                       //2.4G default BW40 ITX value 
-                       for (group = 0;group < MAX_CHNL_GROUP_24G-1;group ++) {
-                               pwrInfo24G->IndexBW40_Base[rfPath][group] =
-                                       EEPROM_DEFAULT_24G_BW40_TX_INDEX;
-
+                       //2.4G default value
+                       for(group = 0 ; group < MAX_CHNL_GROUP_24G; group++)
+                       {
+                               pwrInfo24G->IndexCCK_Base[rfPath][group] =      EEPROM_DEFAULT_24G_INDEX;
+                               pwrInfo24G->IndexBW40_Base[rfPath][group] =     EEPROM_DEFAULT_24G_INDEX;
                        }
-
                        for(TxCount=0;TxCount<MAX_TX_COUNT;TxCount++)
                        {
                                if(TxCount==0)
@@ -3243,7 +3209,7 @@ Hal_ReadPowerValueFromPROM_8188E(
 
        for(rfPath = 0 ; rfPath < pHalData->NumTotalRFPath ; rfPath++)
        {
-               //2.4G default CCK ITX value 
+               //2.4G default value
                for(group = 0 ; group < MAX_CHNL_GROUP_24G; group++)
                {
                        //printk(" IndexCCK_Base rfPath:%d group:%d,eeAddr:0x%02x ",rfPath,group,eeAddr);
@@ -3251,19 +3217,18 @@ Hal_ReadPowerValueFromPROM_8188E(
                        //printk(" IndexCCK_Base:%02x \n",pwrInfo24G->IndexCCK_Base[rfPath][group] );
                        if(pwrInfo24G->IndexCCK_Base[rfPath][group] == 0xFF)
                        {
-                               pwrInfo24G->IndexCCK_Base[rfPath][group] = EEPROM_DEFAULT_24G_CCK_TX_INDEX;
+                               pwrInfo24G->IndexCCK_Base[rfPath][group] = EEPROM_DEFAULT_24G_INDEX;
 //                             pHalData->bNOPG = TRUE;                                                         
                        }
                }
-               //2.4G default BW40 ITX value 
                for(group = 0 ; group < MAX_CHNL_GROUP_24G-1; group++)
                {
                        //printk(" IndexBW40_Base rfPath:%d group:%d,eeAddr:0x%02x ",rfPath,group,eeAddr);
                        pwrInfo24G->IndexBW40_Base[rfPath][group] =     PROMContent[eeAddr++];
                        //printk(" IndexBW40_Base: %02x \n",pwrInfo24G->IndexBW40_Base[rfPath][group]  );
                        if(pwrInfo24G->IndexBW40_Base[rfPath][group] == 0xFF)
-                               pwrInfo24G->IndexBW40_Base[rfPath][group] = EEPROM_DEFAULT_24G_BW40_TX_INDEX;
-               }
+                               pwrInfo24G->IndexBW40_Base[rfPath][group] =     EEPROM_DEFAULT_24G_INDEX;
+               }                       
                for(TxCount=0;TxCount<MAX_TX_COUNT_8188E;TxCount++)
                {
                        if(TxCount==0)
@@ -3616,8 +3581,6 @@ rtl8188e_EfuseParseChnlPlan(
                , AutoLoadFail
        );
 
-       Hal_ChannelPlanToRegulation(padapter, padapter->mlmepriv.ChannelPlan);
-
        DBG_871X("mlmepriv.ChannelPlan = 0x%02x\n", padapter->mlmepriv.ChannelPlan);
 }
 
@@ -3728,14 +3691,23 @@ void Hal_ReadRFGainOffset(
        IN              u8*             PROMContent,
        IN              BOOLEAN         AutoloadFail)
 {
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       u8 thermal_offset=0;
        //
        // BB_RF Gain Offset from EEPROM
        //
 
        if (!AutoloadFail) {
                Adapter->eeprompriv.EEPROMRFGainOffset =PROMContent[EEPROM_RF_GAIN_OFFSET];
-               DBG_871X("AutoloadFail =%x,\n", AutoloadFail);
-               Adapter->eeprompriv.EEPROMRFGainVal=EFUSE_Read1Byte(Adapter, EEPROM_RF_GAIN_VAL);
+
+               if((Adapter->eeprompriv.EEPROMRFGainOffset  != 0xFF) && 
+                       (Adapter->eeprompriv.EEPROMRFGainOffset & BIT4)){
+                       Adapter->eeprompriv.EEPROMRFGainVal = EFUSE_Read1Byte(Adapter, EEPROM_RF_GAIN_VAL);
+               }else{
+                       Adapter->eeprompriv.EEPROMRFGainOffset = 0;
+                       Adapter->eeprompriv.EEPROMRFGainVal = 0;                        
+               }
+               
                DBG_871X("Adapter->eeprompriv.EEPROMRFGainVal=%x\n", Adapter->eeprompriv.EEPROMRFGainVal);
        } else {
                Adapter->eeprompriv.EEPROMRFGainVal=EFUSE_Read1Byte(Adapter,EEPROM_RF_GAIN_VAL);
@@ -3743,26 +3715,32 @@ void Hal_ReadRFGainOffset(
                if(Adapter->eeprompriv.EEPROMRFGainVal != 0xFF)
                        Adapter->eeprompriv.EEPROMRFGainOffset = BIT4;
                else
-                       Adapter->eeprompriv.EEPROMRFGainOffset = 0;             
+                       Adapter->eeprompriv.EEPROMRFGainOffset = 0;
                DBG_871X("else AutoloadFail =%x,\n", AutoloadFail);
        }
-       
-       if(Adapter->eeprompriv.EEPROMRFGainOffset & BIT4)
-       {
-               HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-               u8 thermal_offset = EFUSE_Read1Byte(Adapter, EEPROM_THERMAL_OFFSET);
+       //
+       // BB_RF Thermal Offset from EEPROM
+       //
+       if(     (Adapter->eeprompriv.EEPROMRFGainOffset!= 0xFF) && 
+               (Adapter->eeprompriv.EEPROMRFGainOffset & BIT4))
+       {       
+               
+               thermal_offset = EFUSE_Read1Byte(Adapter, EEPROM_THERMAL_OFFSET);
                if( thermal_offset != 0xFF){
                        if(thermal_offset & BIT0)
                                pHalData->EEPROMThermalMeter += ((thermal_offset>>1) & 0x0F);
                        else
                                pHalData->EEPROMThermalMeter -= ((thermal_offset>>1) & 0x0F);
 
-                       DBG_871X("pHalData->EEPROMThermalMeter=%x\n", pHalData->EEPROMThermalMeter);
+                       DBG_871X("%s =>thermal_offset:0x%02x pHalData->EEPROMThermalMeter=0x%02x\n",__FUNCTION__ ,thermal_offset,pHalData->EEPROMThermalMeter);
                }               
-       }
+       }       
+
+       DBG_871X("%s => EEPRORFGainOffset = 0x%02x,EEPROMRFGainVal=0x%02x,thermal_offset:0x%02x \n",
+               __FUNCTION__, Adapter->eeprompriv.EEPROMRFGainOffset,Adapter->eeprompriv.EEPROMRFGainVal,thermal_offset);
        
-       DBG_871X("EEPRORFGainOffset = 0x%02x\n", Adapter->eeprompriv.EEPROMRFGainOffset);
 }
+
 #endif //CONFIG_RF_GAIN_OFFSET
 
 void
@@ -3875,158 +3853,1695 @@ void _InitTransferPageSize(PADAPTER padapter)
        rtw_write8(padapter, REG_PBP, value8);
 }
 
-void SetHwReg8188E(_adapter *adapter, u8 variable, u8 *val)
+void ResumeTxBeacon(PADAPTER padapter)
 {
-       HAL_DATA_TYPE *HalData = GET_HAL_DATA(adapter);
+       HAL_DATA_TYPE*  pHalData = GET_HAL_DATA(padapter);
 
-_func_enter_;
+       // 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value
+       // which should be read from register to a global variable.
 
-       switch (variable) {
-               case HW_VAR_BASIC_RATE:
-               {
-                       struct mlme_ext_info *mlmext_info = &adapter->mlmeextpriv.mlmext_info;
-                       u16 input_b = 0, masked = 0, ioted = 0, BrateCfg = 0, RateIndex = 0;
-                       u16 rrsr_2g_force_mask = (RRSR_11M|RRSR_5_5M|RRSR_1M);
-                       u16 rrsr_2g_allow_mask = (RRSR_24M|RRSR_12M|
-                                               RRSR_6M|RRSR_11M|
-                                               RRSR_5_5M|RRSR_2M|RRSR_1M);
+       RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("+ResumeTxBeacon\n"));
 
-                       HalSetBrateCfg(adapter, val, &BrateCfg);
-                       input_b = BrateCfg;
+       rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl) | BIT6);
+       pHalData->RegFwHwTxQCtrl |= BIT6;
+       rtw_write8(padapter, REG_TBTT_PROHIBIT+1, 0xff);
+       pHalData->RegReg542 |= BIT0;
+       rtw_write8(padapter, REG_TBTT_PROHIBIT+2, pHalData->RegReg542);
+}
 
-                       /* apply force and allow mask */
-                       BrateCfg |= rrsr_2g_force_mask;
-                       BrateCfg &= rrsr_2g_allow_mask;
-                       masked = BrateCfg;
+void StopTxBeacon(PADAPTER padapter)
+{
+       HAL_DATA_TYPE*  pHalData = GET_HAL_DATA(padapter);
 
-                       /* IOT consideration */
-                       if (mlmext_info->assoc_AP_vendor == HT_IOT_PEER_CISCO) {
-                               /* if peer is cisco and didn't use ofdm rate, we enable 6M ack */
-                               if((BrateCfg & (RRSR_24M|RRSR_12M|RRSR_6M)) == 0)
-                                       BrateCfg |= RRSR_6M;
-                       }
+       // 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value
+       // which should be read from register to a global variable.
 
-                       ioted = BrateCfg;
+       RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("+StopTxBeacon\n"));
 
-                       HalData->BasicRateSet = BrateCfg;
+       rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl) & (~BIT6));
+       pHalData->RegFwHwTxQCtrl &= (~BIT6);
+       rtw_write8(padapter, REG_TBTT_PROHIBIT+1, 0x64);
+       pHalData->RegReg542 &= ~(BIT0);
+       rtw_write8(padapter, REG_TBTT_PROHIBIT+2, pHalData->RegReg542);
 
-                       DBG_8192C("HW_VAR_BASIC_RATE: %#x -> %#x -> %#x\n", input_b, masked, ioted);
+       CheckFwRsvdPageContent(padapter);  // 2010.06.23. Added by tynli.
+}
 
-                       // Set RRSR rate table.
-                       rtw_write16(adapter, REG_RRSR, BrateCfg);
-                       rtw_write8(adapter, REG_RRSR+2, rtw_read8(adapter, REG_RRSR+2)&0xf0);
+static void hw_var_set_opmode(PADAPTER Adapter, u8 variable, u8* val)
+{
+       u8      val8;
+       u8      mode = *((u8 *)val);    
+
+       DBG_871X( ADPT_FMT "Port-%d  set opmode = %d\n",ADPT_ARG(Adapter),
+               #ifdef CONFIG_CONCURRENT_MODE
+               Adapter->iface_type
+               #else
+               0
+               #endif
+               ,mode);
+       
+#ifdef CONFIG_CONCURRENT_MODE
+       if(Adapter->iface_type == IFACE_PORT1)
+       {
+               // disable Port1 TSF update
+               rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(4));
+               
+               // set net_type         
+               Set_MSR(Adapter, mode);
 
-                       // Set RTS initial rate
-                       while(BrateCfg > 0x1)
+               if((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_))
+               {
+                       if(!check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE))                      
                        {
-                               BrateCfg = (BrateCfg>> 1);
-                               RateIndex++;
+                               #ifdef CONFIG_INTERRUPT_BASED_TXBCN
+                               #ifdef  CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT  
+                               rtw_write8(Adapter, REG_DRVERLYINT, 0x05);//restore early int time to 5ms
+
+                               #if defined(CONFIG_USB_HCI)
+                               UpdateInterruptMask8188EU(Adapter,_TRUE, 0, IMR_BCNDMAINT0_88E);        
+                               #elif defined(CONFIG_SDIO_HCI)
+                               UpdateInterruptMask8188ESdio(Adapter, 0, SDIO_HIMR_BCNERLY_INT_MSK);                            
+                               #endif 
+                               
+                               #endif // CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT
+                               
+                               #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR
+                               #if defined(CONFIG_USB_HCI)
+                               UpdateInterruptMask8188EU(Adapter,_TRUE ,0, (IMR_TBDER_88E|IMR_TBDOK_88E));
+                               #elif defined(CONFIG_SDIO_HCI)
+                               UpdateInterruptMask8188ESdio(Adapter, 0, (SDIO_HIMR_TXBCNOK_MSK|SDIO_HIMR_TXBCNERR_MSK));                               
+                               #endif
+                               
+                               #endif// CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR
+                               #endif //CONFIG_INTERRUPT_BASED_TXBCN           
+
+                               StopTxBeacon(Adapter);
+                               #if defined(CONFIG_PCI_HCI)
+                               UpdateInterruptMask8188EE( Adapter, 0, 0, RT_BCN_INT_MASKS, 0);
+                               #endif
                        }
-                       rtw_write8(adapter, REG_INIRTS_RATE_SEL, RateIndex);
+                       
+                       rtw_write8(Adapter,REG_BCN_CTRL_1, 0x11);//disable atim wnd and disable beacon function
+                       //rtw_write8(Adapter,REG_BCN_CTRL_1, 0x18);
                }
-               break;
-       case HW_VAR_CHECK_TXBUF:
-       {
-               u8 retry_limit;
-               u16 val16;
-               u32 reg_200 = 0, reg_204 = 0;
-               u32 init_reg_200 = 0, init_reg_204 = 0;
-               u32 start = rtw_get_current_time();
-               u32 pass_ms;
-               int i = 0;
+               else if((mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/)
+               {       
+                       //Beacon is polled to TXBUF
+                       rtw_write32(Adapter, REG_CR, rtw_read32(Adapter, REG_CR)|BIT(8));
+                       
+                       ResumeTxBeacon(Adapter);
+                       rtw_write8(Adapter,REG_BCN_CTRL_1, 0x1a);
+                       //BIT4 - If set 0, hw will clr bcnq when tx becon ok/fail or port 1
+                       rtw_write8(Adapter, REG_MBID_NUM, rtw_read8(Adapter, REG_MBID_NUM)|BIT(3)|BIT(4));
+               }
+               else if(mode == _HW_STATE_AP_)
+               {
+                       #ifdef CONFIG_INTERRUPT_BASED_TXBCN                     
+                       #ifdef  CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT
+                       #if defined(CONFIG_USB_HCI)
+                       UpdateInterruptMask8188EU(Adapter,_TRUE ,IMR_BCNDMAINT0_88E, 0);
+                       #elif defined(CONFIG_SDIO_HCI)
+                       UpdateInterruptMask8188ESdio(Adapter, SDIO_HIMR_BCNERLY_INT_MSK, 0);
+                       #endif
+                       #endif//CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT
 
-               retry_limit = 0x01;
+                       #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR  
+                       #if defined(CONFIG_USB_HCI)
+                       UpdateInterruptMask8188EU(Adapter,_TRUE ,(IMR_TBDER_88E|IMR_TBDOK_88E), 0);
+                       #elif defined(CONFIG_SDIO_HCI)
+                       UpdateInterruptMask8188ESdio(Adapter, (SDIO_HIMR_TXBCNOK_MSK|SDIO_HIMR_TXBCNERR_MSK), 0);
+                       #endif
+                       #endif//CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR
+                                       
+                       #endif //CONFIG_INTERRUPT_BASED_TXBCN
 
-               val16 = retry_limit << RETRY_LIMIT_SHORT_SHIFT | retry_limit << RETRY_LIMIT_LONG_SHIFT;
-               rtw_write16(adapter, REG_RL, val16);
+                       ResumeTxBeacon(Adapter);
+                                       
+                       rtw_write8(Adapter, REG_BCN_CTRL_1, 0x12);
 
-               while (rtw_get_passing_time_ms(start) < 2000
-                       && !adapter->bDriverStopped && !adapter->bSurpriseRemoved
-               ) {
-                       reg_200 = rtw_read32(adapter, 0x200);
-                       reg_204 = rtw_read32(adapter, 0x204);
+                       //Beacon is polled to TXBUF
+                       rtw_write32(Adapter, REG_CR, rtw_read32(Adapter, REG_CR)|BIT(8));
 
-                       if (i == 0) {
-                               init_reg_200 = reg_200;
-                               init_reg_204 = reg_204;
-                       }
+                       //Set RCR
+                       //rtw_write32(padapter, REG_RCR, 0x70002a8e);//CBSSID_DATA must set to 0
+                       rtw_write32(Adapter, REG_RCR, 0x7000208e);//CBSSID_DATA must set to 0,Reject ICV_ERROR packets
+                       
+                       //enable to rx data frame                               
+                       rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF);
+                       //enable to rx ps-poll
+                       rtw_write16(Adapter, REG_RXFLTMAP1, 0x0400);
+
+                       //Beacon Control related register for first time 
+                       rtw_write8(Adapter, REG_BCNDMATIM, 0x02); // 2ms                
+                       rtw_write8(Adapter, REG_DRVERLYINT, 0x05);// 5ms
+                       //rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF);
+                       rtw_write8(Adapter, REG_ATIMWND_1, 0x0a); // 10ms for port1
+                       rtw_write16(Adapter, REG_BCNTCFG, 0x00);
+                       rtw_write16(Adapter, REG_TBTT_PROHIBIT, 0xff04);
+                       rtw_write16(Adapter, REG_TSFTR_SYN_OFFSET, 0x7fff);// +32767 (~32ms)
+       
+                       //reset TSF2    
+                       rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1));
 
-                       i++;
-                       if ((reg_200 & 0x00ffffff) != (reg_204 & 0x00ffffff)) {
-                               //DBG_871X("%s: (HW_VAR_CHECK_TXBUF)TXBUF NOT empty - 0x204=0x%x, 0x200=0x%x (%d)\n", __FUNCTION__, reg_204, reg_200, i);
-                               rtw_msleep_os(10);
-                       } else {
-                               break;
+
+                       //BIT4 - If set 0, hw will clr bcnq when tx becon ok/fail or port 1
+                       rtw_write8(Adapter, REG_MBID_NUM, rtw_read8(Adapter, REG_MBID_NUM)|BIT(3)|BIT(4));
+                       //enable BCN1 Function for if2
+                       //don't enable update TSF1 for if2 (due to TSF update when beacon/probe rsp are received)
+                       rtw_write8(Adapter, REG_BCN_CTRL_1, (DIS_TSF_UDT0_NORMAL_CHIP|EN_BCN_FUNCTION | EN_TXBCN_RPT|BIT(1)));
+
+#ifdef CONFIG_CONCURRENT_MODE
+                       if(check_buddy_fwstate(Adapter, WIFI_FW_NULL_STATE))
+                               rtw_write8(Adapter, REG_BCN_CTRL, 
+                                       rtw_read8(Adapter, REG_BCN_CTRL) & ~EN_BCN_FUNCTION);
+#endif
+                    //BCN1 TSF will sync to BCN0 TSF with offset(0x518) if if1_sta linked
+                       //rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(5));
+                       //rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(3));
+                                       
+                       //dis BCN0 ATIM  WND if if1 is station
+                       rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(0));
+
+#ifdef CONFIG_TSF_RESET_OFFLOAD
+                       // Reset TSF for STA+AP concurrent mode
+                       if ( check_buddy_fwstate(Adapter, (WIFI_STATION_STATE|WIFI_ASOC_STATE)) ) {
+                               if (reset_tsf(Adapter, IFACE_PORT1) == _FALSE)
+                                       DBG_871X("ERROR! %s()-%d: Reset port1 TSF fail\n",
+                                               __FUNCTION__, __LINE__);
+                       }
+#endif // CONFIG_TSF_RESET_OFFLOAD
+#if defined(CONFIG_PCI_HCI) 
+                       UpdateInterruptMask8188EE( Adapter, RT_BCN_INT_MASKS, 0, 0, 0);
+#endif 
+               }
+       }
+       else    // (Adapter->iface_type == IFACE_PORT1)
+#endif //CONFIG_CONCURRENT_MODE
+       {
+               // disable Port0 TSF update
+               rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4));
+               
+               // set net_type
+               Set_MSR(Adapter, mode);
+               
+               if((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_))
+               {
+#ifdef CONFIG_CONCURRENT_MODE
+                       if(!check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE))              
+#endif //CONFIG_CONCURRENT_MODE
+                       {
+                               #ifdef CONFIG_INTERRUPT_BASED_TXBCN     
+                               #ifdef  CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT
+                               rtw_write8(Adapter, REG_DRVERLYINT, 0x05);//restore early int time to 5ms       
+                               #if defined(CONFIG_USB_HCI)
+                               UpdateInterruptMask8188EU(Adapter,_TRUE, 0, IMR_BCNDMAINT0_88E);
+                               #elif defined(CONFIG_SDIO_HCI)
+                               UpdateInterruptMask8188ESdio(Adapter, 0, SDIO_HIMR_BCNERLY_INT_MSK);    
+                               #endif
+                               #endif//CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT
+                               
+                               #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR          
+                               #if defined(CONFIG_USB_HCI)
+                               UpdateInterruptMask8188EU(Adapter,_TRUE ,0, (IMR_TBDER_88E|IMR_TBDOK_88E));
+                               #elif defined(CONFIG_SDIO_HCI)
+                               UpdateInterruptMask8188ESdio(Adapter, 0, (SDIO_HIMR_TXBCNOK_MSK|SDIO_HIMR_TXBCNERR_MSK));       
+                               #endif
+                               #endif //CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR
+                                       
+                               #endif //CONFIG_INTERRUPT_BASED_TXBCN           
+                               StopTxBeacon(Adapter);
+                               #if defined(CONFIG_PCI_HCI) 
+                               UpdateInterruptMask8188EE(Adapter, 0, 0, RT_BCN_INT_MASKS, 0);
+                               #endif
                        }
+                       
+                       rtw_write8(Adapter,REG_BCN_CTRL, 0x19);//disable atim wnd
+                       //rtw_write8(Adapter,REG_BCN_CTRL, 0x18);
+               }
+               else if((mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/)
+               {
+                       //Beacon is polled to TXBUF
+                       rtw_write16(Adapter, REG_CR, rtw_read16(Adapter, REG_CR)|BIT(8));
+
+                       ResumeTxBeacon(Adapter);
+                       rtw_write8(Adapter,REG_BCN_CTRL, 0x1a);
+                       //BIT3 - If set 0, hw will clr bcnq when tx becon ok/fail or port 0
+                       rtw_write8(Adapter, REG_MBID_NUM, rtw_read8(Adapter, REG_MBID_NUM)|BIT(3)|BIT(4));
                }
+               else if(mode == _HW_STATE_AP_)
+               {
+                       #ifdef CONFIG_INTERRUPT_BASED_TXBCN                     
+                       #ifdef  CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT
+                       #if defined(CONFIG_USB_HCI)
+                       UpdateInterruptMask8188EU(Adapter,_TRUE ,IMR_BCNDMAINT0_88E, 0);
+                       #elif defined(CONFIG_SDIO_HCI)
+                       UpdateInterruptMask8188ESdio(Adapter, SDIO_HIMR_BCNERLY_INT_MSK, 0);
+                       #endif
+                       #endif//CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT
+
+                       #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR  
+                       #if defined(CONFIG_USB_HCI)
+                       UpdateInterruptMask8188EU(Adapter,_TRUE ,(IMR_TBDER_88E|IMR_TBDOK_88E), 0);
+                       #elif defined(CONFIG_SDIO_HCI)
+                       UpdateInterruptMask8188ESdio(Adapter, (SDIO_HIMR_TXBCNOK_MSK|SDIO_HIMR_TXBCNERR_MSK), 0);
+                       #endif
+                       #endif//CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR
+                                       
+                       #endif //CONFIG_INTERRUPT_BASED_TXBCN
+
+                       ResumeTxBeacon(Adapter);
 
-               pass_ms = rtw_get_passing_time_ms(start);
+                       rtw_write8(Adapter, REG_BCN_CTRL, 0x12);                
+                       
+                       //Beacon is polled to TXBUF
+                       rtw_write32(Adapter, REG_CR, rtw_read32(Adapter, REG_CR)|BIT(8));
+                       
+                       //Set RCR
+                       //rtw_write32(padapter, REG_RCR, 0x70002a8e);//CBSSID_DATA must set to 0
+                       rtw_write32(Adapter, REG_RCR, 0x7000208e);//CBSSID_DATA must set to 0,reject ICV_ERR packet
+                       //enable to rx data frame
+                       rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF);
+                       //enable to rx ps-poll
+                       rtw_write16(Adapter, REG_RXFLTMAP1, 0x0400);
+
+                       //Beacon Control related register for first time
+                       rtw_write8(Adapter, REG_BCNDMATIM, 0x02); // 2ms                        
+                       rtw_write8(Adapter, REG_DRVERLYINT, 0x05);// 5ms
+                       //rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF);
+                       rtw_write8(Adapter, REG_ATIMWND, 0x0a); // 10ms
+                       rtw_write16(Adapter, REG_BCNTCFG, 0x00);
+                       rtw_write16(Adapter, REG_TBTT_PROHIBIT, 0xff04);
+                       rtw_write16(Adapter, REG_TSFTR_SYN_OFFSET, 0x7fff);// +32767 (~32ms)
+
+                       //reset TSF
+                       rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(0));
+
+                       //BIT3 - If set 0, hw will clr bcnq when tx becon ok/fail or port 0
+                       rtw_write8(Adapter, REG_MBID_NUM, rtw_read8(Adapter, REG_MBID_NUM)|BIT(3)|BIT(4));
+       
+                       //enable BCN0 Function for if1
+                       //don't enable update TSF0 for if1 (due to TSF update when beacon/probe rsp are received)
+                       #if defined(CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR)
+                       rtw_write8(Adapter, REG_BCN_CTRL, (DIS_TSF_UDT0_NORMAL_CHIP|EN_BCN_FUNCTION | EN_TXBCN_RPT|BIT(1)));
+                       #else
+                       rtw_write8(Adapter, REG_BCN_CTRL, (DIS_TSF_UDT0_NORMAL_CHIP|EN_BCN_FUNCTION |BIT(1)));
+                       #endif
+
+#ifdef CONFIG_CONCURRENT_MODE
+                       if(check_buddy_fwstate(Adapter, WIFI_FW_NULL_STATE))
+                               rtw_write8(Adapter, REG_BCN_CTRL_1, 
+                                       rtw_read8(Adapter, REG_BCN_CTRL_1) & ~EN_BCN_FUNCTION);
+#endif
 
-               if (adapter->bDriverStopped || adapter->bSurpriseRemoved) {
-               } else if (pass_ms >= 2000 || (reg_200 & 0x00ffffff) != (reg_204 & 0x00ffffff)) {
-                       DBG_871X_LEVEL(_drv_always_, "%s:(HW_VAR_CHECK_TXBUF)NOT empty(%d) in %d ms\n", __FUNCTION__, i, pass_ms);
-                       DBG_871X_LEVEL(_drv_always_, "%s:(HW_VAR_CHECK_TXBUF)0x200=0x%08x, 0x204=0x%08x (0x%08x, 0x%08x)\n",
-                               __FUNCTION__, reg_200, reg_204, init_reg_200, init_reg_204);
-                       //rtw_warn_on(1);
-               } else {
-                       DBG_871X("%s:(HW_VAR_CHECK_TXBUF)TXBUF Empty(%d) in %d ms\n", __FUNCTION__, i, pass_ms);
+                       //dis BCN1 ATIM  WND if if2 is station
+                       rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(0)); 
+#ifdef CONFIG_TSF_RESET_OFFLOAD
+                       // Reset TSF for STA+AP concurrent mode
+                       if ( check_buddy_fwstate(Adapter, (WIFI_STATION_STATE|WIFI_ASOC_STATE)) ) {
+                               if (reset_tsf(Adapter, IFACE_PORT0) == _FALSE)
+                                       DBG_871X("ERROR! %s()-%d: Reset port0 TSF fail\n",
+                                               __FUNCTION__, __LINE__);
+                       }
+#endif // CONFIG_TSF_RESET_OFFLOAD
+#if defined(CONFIG_PCI_HCI) 
+                       UpdateInterruptMask8188EE( Adapter, RT_BCN_INT_MASKS, 0, 0, 0);
+#endif
                }
+       }
+
+}
+static void hw_var_set_macaddr(PADAPTER Adapter, u8 variable, u8* val)
+{
+       u8 idx = 0;
+       u32 reg_macid;
 
-               retry_limit = 0x30;
-               val16 = retry_limit << RETRY_LIMIT_SHORT_SHIFT | retry_limit << RETRY_LIMIT_LONG_SHIFT;
-               rtw_write16(adapter, REG_RL, val16);
+#ifdef CONFIG_CONCURRENT_MODE
+       if(Adapter->iface_type == IFACE_PORT1)
+       {
+               reg_macid = REG_MACID1;
+       }
+       else
+#endif
+       {
+               reg_macid = REG_MACID;
        }
-               break;
-       case HW_VAR_RESP_SIFS:
+
+       for(idx = 0 ; idx < 6; idx++)
        {
-               struct mlme_ext_priv    *pmlmeext = &adapter->mlmeextpriv;
+               rtw_write8(GET_PRIMARY_ADAPTER(Adapter), (reg_macid+idx), val[idx]);
+       }
+       
+}
 
-               if((pmlmeext->cur_wireless_mode==WIRELESS_11G) ||
-               (pmlmeext->cur_wireless_mode==WIRELESS_11BG))//WIRELESS_MODE_G){
-               {
-                       val[0] = 0x0a;
-                       val[1] = 0x0a;
-               } else {
-                       val[0] = 0x0e;
-                       val[1] = 0x0e;
-               }
+static void hw_var_set_bssid(PADAPTER Adapter, u8 variable, u8* val)
+{
+       u8      idx = 0;
+       u32 reg_bssid;
 
-               // SIFS for OFDM Data ACK
-               rtw_write8(adapter, REG_SIFS_CTX+1, val[0]);
-               // SIFS for OFDM consecutive tx like CTS data!
-               rtw_write8(adapter, REG_SIFS_TRX+1, val[1]);
+#ifdef CONFIG_CONCURRENT_MODE
+       if(Adapter->iface_type == IFACE_PORT1)
+       {
+               reg_bssid = REG_BSSID1;
+       }
+       else
+#endif
+       {
+               reg_bssid = REG_BSSID;
+       }
 
-               rtw_write8(adapter, REG_SPEC_SIFS+1, val[0]);
-               rtw_write8(adapter, REG_MAC_SPEC_SIFS+1, val[0]);
-                               
-               //RESP_SIFS for OFDM
-               rtw_write8(adapter, REG_RESP_SIFS_OFDM, val[0]);
-               rtw_write8(adapter, REG_RESP_SIFS_OFDM+1, val[0]);
+       for(idx = 0 ; idx < 6; idx++)
+       {
+               rtw_write8(Adapter, (reg_bssid+idx), val[idx]);
+       }
+
+}
+
+static void hw_var_set_bcn_func(PADAPTER Adapter, u8 variable, u8* val)
+{
+       u32 bcn_ctrl_reg;
+
+#ifdef CONFIG_CONCURRENT_MODE
+       if(Adapter->iface_type == IFACE_PORT1)
+       {
+               bcn_ctrl_reg = REG_BCN_CTRL_1;
+       }       
+       else
+#endif         
+       {               
+               bcn_ctrl_reg = REG_BCN_CTRL;
        }
-               break;
-       default:
-               SetHwReg(adapter, variable, val);
-               break;
+
+       if(*((u8 *)val))
+       {
+               rtw_write8(Adapter, bcn_ctrl_reg, (EN_BCN_FUNCTION | EN_TXBCN_RPT));
+       }
+       else
+       {
+               rtw_write8(Adapter, bcn_ctrl_reg, rtw_read8(Adapter, bcn_ctrl_reg)&(~(EN_BCN_FUNCTION | EN_TXBCN_RPT)));
        }
+       
 
-_func_exit_;
 }
 
-void GetHwReg8188E(_adapter *adapter, u8 variable, u8 *val)
+static void hw_var_set_correct_tsf(PADAPTER Adapter, u8 variable, u8* val)
 {
-       HAL_DATA_TYPE *HalData = GET_HAL_DATA(adapter);
+#ifdef CONFIG_CONCURRENT_MODE
+       u64     tsf;
+       struct mlme_ext_priv    *pmlmeext = &Adapter->mlmeextpriv;
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;
 
-_func_enter_;
+       //tsf = pmlmeext->TSFValue - ((u32)pmlmeext->TSFValue % (pmlmeinfo->bcn_interval*1024)) -1024; //us
+       tsf = pmlmeext->TSFValue - rtw_modular64(pmlmeext->TSFValue, (pmlmeinfo->bcn_interval*1024)) -1024; //us
 
-       switch (variable) {
-       case HW_VAR_SYS_CLKR:
-               *val = rtw_read8(adapter, REG_SYS_CLKR);
-               break;
-       default:
-               GetHwReg(adapter, variable, val);
-               break;
+       if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))
+       {                               
+               //pHalData->RegTxPause |= STOP_BCNQ;BIT(6)
+               //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)|BIT(6)));
+               StopTxBeacon(Adapter);
        }
 
-_func_exit_;
+       if(Adapter->iface_type == IFACE_PORT1)
+       {
+               //disable related TSF function
+               rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3)));
+                                                       
+               rtw_write32(Adapter, REG_TSFTR1, tsf);
+               rtw_write32(Adapter, REG_TSFTR1+4, tsf>>32);
+
+
+               //enable related TSF function
+               rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(3)); 
+
+               // Update buddy port's TSF if it is SoftAP for beacon TX issue!
+               if ( (pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE
+                       && check_buddy_fwstate(Adapter, WIFI_AP_STATE)
+               ) { 
+                       //disable related TSF function
+                       rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(3)));
+
+                       rtw_write32(Adapter, REG_TSFTR, tsf);
+                       rtw_write32(Adapter, REG_TSFTR+4, tsf>>32);
+
+                       //enable related TSF function
+                       rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(3));
+#ifdef CONFIG_TSF_RESET_OFFLOAD
+               // Update buddy port's TSF(TBTT) if it is SoftAP for beacon TX issue!
+                       if (reset_tsf(Adapter, IFACE_PORT0) == _FALSE)
+                               DBG_871X("ERROR! %s()-%d: Reset port0 TSF fail\n",
+                                       __FUNCTION__, __LINE__);
+
+#endif // CONFIG_TSF_RESET_OFFLOAD     
+               }               
+               
+       }
+       else
+       {
+               //disable related TSF function
+               rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(3)));
+                                                       
+               rtw_write32(Adapter, REG_TSFTR, tsf);
+               rtw_write32(Adapter, REG_TSFTR+4, tsf>>32);
+
+               //enable related TSF function
+               rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(3));
+               
+               // Update buddy port's TSF if it is SoftAP for beacon TX issue!
+               if ( (pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE
+                       && check_buddy_fwstate(Adapter, WIFI_AP_STATE)
+               ) { 
+                       //disable related TSF function
+                       rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3)));
+
+                       rtw_write32(Adapter, REG_TSFTR1, tsf);
+                       rtw_write32(Adapter, REG_TSFTR1+4, tsf>>32);
+
+                       //enable related TSF function
+                       rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(3));
+#ifdef CONFIG_TSF_RESET_OFFLOAD
+               // Update buddy port's TSF if it is SoftAP for beacon TX issue!
+                       if (reset_tsf(Adapter, IFACE_PORT1) == _FALSE)
+                               DBG_871X("ERROR! %s()-%d: Reset port1 TSF fail\n",
+                                       __FUNCTION__, __LINE__);
+#endif // CONFIG_TSF_RESET_OFFLOAD
+               }               
+
+       }
+                               
+                                                       
+       if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))
+       {
+               //pHalData->RegTxPause  &= (~STOP_BCNQ);
+               //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)&(~BIT(6))));
+               ResumeTxBeacon(Adapter);
+       }
+#endif
+}
+
+static void hw_var_set_mlme_disconnect(PADAPTER Adapter, u8 variable, u8* val)
+{
+#ifdef CONFIG_CONCURRENT_MODE
+       //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+       PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;
+                       
+                               
+       if(check_buddy_mlmeinfo_state(Adapter, _HW_STATE_NOLINK_))      
+               rtw_write16(Adapter, REG_RXFLTMAP2, 0x00);
+       
+
+       if(Adapter->iface_type == IFACE_PORT1)
+       {
+               //reset TSF1
+               rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1));
+
+               //disable update TSF1
+               rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(4));
+
+               // disable Port1's beacon function
+               rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3)));
+       }
+       else
+       {
+               //reset TSF
+               rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(0));
+
+               //disable update TSF
+               rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4));
+       }
+#endif
+}
+
+static void hw_var_set_mlme_sitesurvey(PADAPTER Adapter, u8 variable, u8* val)
+{      
+#ifdef CONFIG_CONCURRENT_MODE  
+       struct mlme_priv *pmlmepriv=&(Adapter->mlmepriv);
+       struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
+       struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
+       u32     value_rcr, rcr_clear_bit, value_rxfltmap2;
+
+
+#ifdef CONFIG_FIND_BEST_CHANNEL
+
+       rcr_clear_bit = (RCR_CBSSID_BCN | RCR_CBSSID_DATA);
+
+       // Recieve all data frames
+        value_rxfltmap2 = 0xFFFF;
+       
+#else /* CONFIG_FIND_BEST_CHANNEL */
+       
+       rcr_clear_bit = RCR_CBSSID_BCN;
+
+       //config RCR to receive different BSSID & not to receive data frame
+       value_rxfltmap2 = 0;
+
+#endif /* CONFIG_FIND_BEST_CHANNEL */
+
+       value_rcr = rtw_read32(Adapter, REG_RCR);
+       if(*((u8 *)val))//under sitesurvey
+       {
+               //config RCR to receive different BSSID & not to receive data frame
+               value_rcr &= ~(rcr_clear_bit);
+               rtw_write32(Adapter, REG_RCR, value_rcr);
+               rtw_write16(Adapter, REG_RXFLTMAP2, value_rxfltmap2);
+
+               //disable update TSF
+               if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)
+               {
+                       if(Adapter->iface_type == IFACE_PORT1)
+                       {
+                               rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(4));
+                       }
+                       else
+                       {
+                               rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4));
+                       }
+               }
+
+               if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&
+                       check_buddy_fwstate(Adapter, _FW_LINKED))               
+               {
+                       StopTxBeacon(Adapter);
+               }
+       }
+       else//sitesurvey done
+       {
+               //enable to rx data frame
+               //write32(Adapter, REG_RCR, read32(padapter, REG_RCR)|RCR_ADF);
+               if(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE))
+                       || check_buddy_fwstate(Adapter, (_FW_LINKED|WIFI_AP_STATE)))
+                       rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF);
+
+               //enable update TSF
+               if(Adapter->iface_type == IFACE_PORT1)
+                       rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(4)));
+               else
+                       rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4)));
+
+               value_rcr |= rcr_clear_bit;
+               rtw_write32(Adapter, REG_RCR, value_rcr);
+
+               if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&
+                       check_buddy_fwstate(Adapter, _FW_LINKED))
+               {
+                       ResumeTxBeacon(Adapter);
+               }
+       }
+#endif                 
+}
+
+static void hw_var_set_mlme_join(PADAPTER Adapter, u8 variable, u8* val)
+{
+#ifdef CONFIG_CONCURRENT_MODE
+       u8      RetryLimit = 0x30;
+       u8      type = *((u8 *)val);
+       HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+       struct mlme_priv        *pmlmepriv = &Adapter->mlmepriv;
+       EEPROM_EFUSE_PRIV       *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter);
+
+       if(type == 0) // prepare to join
+       {               
+               if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&
+                       check_buddy_fwstate(Adapter, _FW_LINKED))               
+               {
+                       StopTxBeacon(Adapter);
+               }
+       
+               //enable to rx data frame.Accept all data frame
+               //rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF);
+               rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF);
+
+               if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE))
+                       rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_BCN);
+               else
+                       rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN);
+
+               if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
+               {
+                       RetryLimit = (pEEPROM->CustomerID == RT_CID_CCX) ? 7 : 48;
+               }
+               else // Ad-hoc Mode
+               {
+                       RetryLimit = 0x7;
+               }
+       }
+       else if(type == 1) //joinbss_event call back when join res < 0
+       {               
+               if(check_buddy_mlmeinfo_state(Adapter, _HW_STATE_NOLINK_))              
+                       rtw_write16(Adapter, REG_RXFLTMAP2,0x00);
+
+               if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&
+                       check_buddy_fwstate(Adapter, _FW_LINKED))
+               {
+                       ResumeTxBeacon(Adapter);                        
+                       
+                       //reset TSF 1/2 after ResumeTxBeacon
+                       rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1)|BIT(0));   
+                       
+               }
+       }
+       else if(type == 2) //sta add event call back
+       {
+        
+               //enable update TSF
+               if(Adapter->iface_type == IFACE_PORT1)
+                       rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(4)));
+               else
+                       rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4)));
+                
+       
+               if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE))
+               {
+                       //fixed beacon issue for 8191su...........
+                       rtw_write8(Adapter,0x542 ,0x02);
+                       RetryLimit = 0x7;
+               }
+
+
+               if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&
+                       check_buddy_fwstate(Adapter, _FW_LINKED))
+               {
+                       ResumeTxBeacon(Adapter);                        
+                       
+                       //reset TSF 1/2 after ResumeTxBeacon
+                       rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1)|BIT(0));
+               }
+               
+       }
+
+       rtw_write16(Adapter, REG_RL, RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT);
+       
+#endif
+}
+
+
+
+void SetHwReg8188E(_adapter *adapter, u8 variable, u8 *val)
+{
+       HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
+       DM_ODM_T                *podmpriv = &pHalData->odmpriv;
+_func_enter_;
+
+       switch (variable) {
+               case HW_VAR_MEDIA_STATUS:
+                       {
+                               u8 val8;
+
+                               val8 = rtw_read8(adapter, MSR)&0x0c;
+                               val8 |= *((u8 *)val);
+                               rtw_write8(adapter, MSR, val8);
+                       }
+                       break;
+               case HW_VAR_MEDIA_STATUS1:
+                       {
+                               u8 val8;
+                               
+                               val8 = rtw_read8(adapter, MSR)&0x03;
+                               val8 |= *((u8 *)val) <<2;
+                               rtw_write8(adapter, MSR, val8);
+                       }
+                       break;
+               case HW_VAR_SET_OPMODE:
+                       hw_var_set_opmode(adapter, variable, val);
+                       break;
+               case HW_VAR_MAC_ADDR:
+                       hw_var_set_macaddr(adapter, variable, val);                     
+                       break;
+               case HW_VAR_BSSID:
+                       hw_var_set_bssid(adapter, variable, val);
+                       break;
+               case HW_VAR_BASIC_RATE:
+               {
+                       struct mlme_ext_info *mlmext_info = &adapter->mlmeextpriv.mlmext_info;
+                       u16 input_b = 0, masked = 0, ioted = 0, BrateCfg = 0;
+                       u16 rrsr_2g_force_mask = (RRSR_11M|RRSR_5_5M|RRSR_1M);
+                       u16 rrsr_2g_allow_mask = (RRSR_24M|RRSR_12M|RRSR_6M|RRSR_CCK_RATES);
+
+                       HalSetBrateCfg(adapter, val, &BrateCfg);
+                       input_b = BrateCfg;
+
+                       /* apply force and allow mask */
+                       BrateCfg |= rrsr_2g_force_mask;
+                       BrateCfg &= rrsr_2g_allow_mask;
+                       masked = BrateCfg;
+
+                       /* IOT consideration */
+                       if (mlmext_info->assoc_AP_vendor == HT_IOT_PEER_CISCO) {
+                               /* if peer is cisco and didn't use ofdm rate, we enable 6M ack */
+                               if((BrateCfg & (RRSR_24M|RRSR_12M|RRSR_6M)) == 0)
+                                       BrateCfg |= RRSR_6M;
+                       }
+                       ioted = BrateCfg;
+
+                       pHalData->BasicRateSet = BrateCfg;
+
+                       DBG_8192C("HW_VAR_BASIC_RATE: %#x -> %#x -> %#x\n", input_b, masked, ioted);
+
+                       // Set RRSR rate table.
+                       rtw_write16(adapter, REG_RRSR, BrateCfg);
+                       rtw_write8(adapter, REG_RRSR+2, rtw_read8(adapter, REG_RRSR+2)&0xf0);
+
+                       rtw_hal_set_hwreg(adapter, HW_VAR_INIT_RTS_RATE, (u8*)&BrateCfg);
+               }
+                       break;
+               case HW_VAR_TXPAUSE:
+                       rtw_write8(adapter, REG_TXPAUSE, *((u8 *)val)); 
+                       break;
+               case HW_VAR_BCN_FUNC:
+                       hw_var_set_bcn_func(adapter, variable, val);
+                       break;
+                       
+               case HW_VAR_CORRECT_TSF:
+#ifdef CONFIG_CONCURRENT_MODE
+                       hw_var_set_correct_tsf(adapter, variable, val);
+#else
+                       {
+                               u64     tsf;
+                               struct mlme_ext_priv    *pmlmeext = &adapter->mlmeextpriv;
+                               struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+
+                               //tsf = pmlmeext->TSFValue - ((u32)pmlmeext->TSFValue % (pmlmeinfo->bcn_interval*1024)) -1024; //us
+                               tsf = pmlmeext->TSFValue - rtw_modular64(pmlmeext->TSFValue, (pmlmeinfo->bcn_interval*1024)) -1024; //us
+
+                               if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))
+                               {                               
+                                       //pHalData->RegTxPause |= STOP_BCNQ;BIT(6)
+                                       //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)|BIT(6)));
+                                       StopTxBeacon(adapter);
+                               }
+
+                               //disable related TSF function
+                               rtw_write8(adapter, REG_BCN_CTRL, rtw_read8(adapter, REG_BCN_CTRL)&(~BIT(3)));
+                                                       
+                               rtw_write32(adapter, REG_TSFTR, tsf);
+                               rtw_write32(adapter, REG_TSFTR+4, tsf>>32);
+
+                               //enable related TSF function
+                               rtw_write8(adapter, REG_BCN_CTRL, rtw_read8(adapter, REG_BCN_CTRL)|BIT(3));
+                               
+                                                       
+                               if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))
+                               {
+                                       //pHalData->RegTxPause  &= (~STOP_BCNQ);
+                                       //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)&(~BIT(6))));
+                                       ResumeTxBeacon(adapter);
+                               }
+                       }
+#endif
+                       break;
+
+               case HW_VAR_CHECK_BSSID:
+                       if(*((u8 *)val))
+                       {
+                               rtw_write32(adapter, REG_RCR, rtw_read32(adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN);
+                       }
+                       else
+                       {
+                               u32     val32;
+
+                               val32 = rtw_read32(adapter, REG_RCR);
+
+                               val32 &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN);
+
+                               rtw_write32(adapter, REG_RCR, val32);
+                       }
+                       break;
+
+               case HW_VAR_MLME_DISCONNECT:
+#ifdef CONFIG_CONCURRENT_MODE
+                       hw_var_set_mlme_disconnect(adapter, variable, val);
+#else
+                       {
+                               //Set RCR to not to receive data frame when NO LINK state
+                               //rtw_write32(Adapter, REG_RCR, rtw_read32(padapter, REG_RCR) & ~RCR_ADF);
+                               //reject all data frames
+                               rtw_write16(adapter, REG_RXFLTMAP2,0x00);
+
+                               //reset TSF
+                               rtw_write8(adapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1)));
+
+                               //disable update TSF
+                               rtw_write8(adapter, REG_BCN_CTRL, rtw_read8(adapter, REG_BCN_CTRL)|BIT(4));     
+                       }
+#endif
+                       break;
+
+               case HW_VAR_MLME_SITESURVEY:
+#ifdef CONFIG_CONCURRENT_MODE
+                       hw_var_set_mlme_sitesurvey(adapter, variable,  val);
+#else
+                       {
+                               u32     value_rcr, rcr_clear_bit, value_rxfltmap2;
+       #ifdef CONFIG_FIND_BEST_CHANNEL
+
+                               rcr_clear_bit = (RCR_CBSSID_BCN | RCR_CBSSID_DATA);
+
+                               // Recieve all data frames
+                               value_rxfltmap2 = 0xFFFF;
+               
+       #else /* CONFIG_FIND_BEST_CHANNEL */
+               
+                               rcr_clear_bit = RCR_CBSSID_BCN;
+
+                               //config RCR to receive different BSSID & not to receive data frame
+                               value_rxfltmap2 = 0;
+
+       #endif /* CONFIG_FIND_BEST_CHANNEL */
+                       
+                               value_rcr = rtw_read32(adapter, REG_RCR);
+                               if(*((u8 *)val))//under sitesurvey
+                               {
+                                       //config RCR to receive different BSSID & not to receive data frame
+                                       value_rcr &= ~(rcr_clear_bit);
+                                       rtw_write32(adapter, REG_RCR, value_rcr);
+                                       rtw_write16(adapter, REG_RXFLTMAP2, value_rxfltmap2);
+
+                                       //disable update TSF
+                                       rtw_write8(adapter, REG_BCN_CTRL, rtw_read8(adapter, REG_BCN_CTRL)|BIT(4));
+                               }
+                               else//sitesurvey done
+                               {
+                                       struct mlme_ext_priv    *pmlmeext = &adapter->mlmeextpriv;
+                                       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+
+                                       if ((is_client_associated_to_ap(adapter) == _TRUE) ||
+                                               ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) )
+                                       {
+                                               //enable to rx data frame
+                                               //rtw_write32(Adapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF);
+                                               rtw_write16(adapter, REG_RXFLTMAP2,0xFFFF);
+
+                                               //enable update TSF
+                                               rtw_write8(adapter, REG_BCN_CTRL, rtw_read8(adapter, REG_BCN_CTRL)&(~BIT(4)));
+                                       }
+                                       else if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
+                                       {
+                                               //rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_ADF);
+                                               rtw_write16(adapter, REG_RXFLTMAP2,0xFFFF);
+
+                                               //enable update TSF
+                                               rtw_write8(adapter, REG_BCN_CTRL, rtw_read8(adapter, REG_BCN_CTRL)&(~BIT(4)));
+                                       }
+
+                                       value_rcr |= rcr_clear_bit;
+                                       if(((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) && (adapter->in_cta_test)) {
+                                               u32 v = rtw_read32(adapter, REG_RCR);
+                                               v &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN );//| RCR_ADF
+                                               rtw_write32(adapter, REG_RCR, v);
+                                       } else {
+                                               rtw_write32(adapter, REG_RCR, value_rcr);       
+                                       }
+                               }
+                       }
+#endif                 
+                       break;
+
+               case HW_VAR_MLME_JOIN:
+#ifdef CONFIG_CONCURRENT_MODE
+                       hw_var_set_mlme_join(adapter, variable,  val);
+#else
+                       {
+                               u8      RetryLimit = 0x30;
+                               u8      type = *((u8 *)val);
+                               struct mlme_priv        *pmlmepriv = &adapter->mlmepriv;
+                               EEPROM_EFUSE_PRIV       *pEEPROM = GET_EEPROM_EFUSE_PRIV(adapter);
+                               
+                               if(type == 0) // prepare to join
+                               {
+                                       //enable to rx data frame.Accept all data frame
+                                       //rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF);
+                                       rtw_write16(adapter, REG_RXFLTMAP2,0xFFFF);
+
+                                       if(adapter->in_cta_test)
+                                       {
+                                               u32 v = rtw_read32(adapter, REG_RCR);
+                                               v &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN );//| RCR_ADF
+                                               rtw_write32(adapter, REG_RCR, v);
+                                       }
+                                       else
+                                       {
+                                               rtw_write32(adapter, REG_RCR, rtw_read32(adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN);
+                                       }
+
+                                       if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
+                                       {
+                                               RetryLimit = (pEEPROM->CustomerID == RT_CID_CCX) ? 7 : 48;
+                                       }
+                                       else // Ad-hoc Mode
+                                       {
+                                               RetryLimit = 0x7;
+                                       }
+                               }
+                               else if(type == 1) //joinbss_event call back when join res < 0
+                               {
+                                       rtw_write16(adapter, REG_RXFLTMAP2,0x00);
+                               }
+                               else if(type == 2) //sta add event call back
+                               {
+                                       //enable update TSF
+                                       rtw_write8(adapter, REG_BCN_CTRL, rtw_read8(adapter, REG_BCN_CTRL)&(~BIT(4)));
+
+                                       if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE))
+                                       {
+                                               RetryLimit = 0x7;
+                                       }
+                               }
+
+                               rtw_write16(adapter, REG_RL, RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT);
+                       }
+#endif
+                       break;
+
+               case HW_VAR_ON_RCR_AM:
+                        rtw_write32(adapter, REG_RCR, rtw_read32(adapter, REG_RCR)|RCR_AM);
+                        DBG_871X("%s, %d, RCR= %x \n", __FUNCTION__,__LINE__, rtw_read32(adapter, REG_RCR));
+                        break;
+              case HW_VAR_OFF_RCR_AM:
+                        rtw_write32(adapter, REG_RCR, rtw_read32(adapter, REG_RCR)& (~RCR_AM));
+                        DBG_871X("%s, %d, RCR= %x \n", __FUNCTION__,__LINE__, rtw_read32(adapter, REG_RCR));
+                        break;
+               case HW_VAR_BEACON_INTERVAL:
+                       rtw_write16(adapter, REG_BCN_INTERVAL, *((u16 *)val));
+#ifdef  CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT
+                       {
+                               struct mlme_ext_priv    *pmlmeext = &adapter->mlmeextpriv;
+                               struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+                               u16 bcn_interval =      *((u16 *)val);
+                               if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE){
+                                       DBG_8192C("%s==> bcn_interval:%d, eraly_int:%d \n",__FUNCTION__,bcn_interval,bcn_interval>>1);
+                                       rtw_write8(adapter, REG_DRVERLYINT, bcn_interval>>1);// 50ms for sdio 
+                               }                       
+                       }
+#endif//CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT
+
+                       break;
+               case HW_VAR_SLOT_TIME:
+                       {
+                               rtw_write8(adapter, REG_SLOT, val[0]);
+                       }
+                       break;
+               case HW_VAR_ACK_PREAMBLE:
+                       {
+                               u8      regTmp;
+                               u8      bShortPreamble = *( (PBOOLEAN)val );
+                               // Joseph marked out for Netgear 3500 TKIP channel 7 issue.(Temporarily)
+                               regTmp = (pHalData->nCur40MhzPrimeSC)<<5;
+                               rtw_write8(adapter, REG_RRSR+2, regTmp);
+
+                               regTmp = rtw_read8(adapter,REG_WMAC_TRXPTCL_CTL+2);
+                               if(bShortPreamble)              
+                                       regTmp |= BIT1;
+                               else
+                                       regTmp &= (~BIT1);
+                               rtw_write8(adapter,REG_WMAC_TRXPTCL_CTL+2,regTmp);                              
+                       }
+                       break;
+               case HW_VAR_CAM_EMPTY_ENTRY:
+                       {
+                               u8      ucIndex = *((u8 *)val);
+                               u8      i;
+                               u32     ulCommand=0;
+                               u32     ulContent=0;
+                               u32     ulEncAlgo=CAM_AES;
+
+                               for(i=0;i<CAM_CONTENT_COUNT;i++)
+                               {
+                                       // filled id in CAM config 2 byte
+                                       if( i == 0)
+                                       {
+                                               ulContent |=(ucIndex & 0x03) | ((u16)(ulEncAlgo)<<2);
+                                               //ulContent |= CAM_VALID;
+                                       }
+                                       else
+                                       {
+                                               ulContent = 0;
+                                       }
+                                       // polling bit, and No Write enable, and address
+                                       ulCommand= CAM_CONTENT_COUNT*ucIndex+i;
+                                       ulCommand= ulCommand | CAM_POLLINIG|CAM_WRITE;
+                                       // write content 0 is equall to mark invalid
+                                       rtw_write32(adapter, WCAMI, ulContent);  //delay_ms(40);
+                                       //RT_TRACE(COMP_SEC, DBG_LOUD, ("CAM_empty_entry(): WRITE A4: %lx \n",ulContent));
+                                       rtw_write32(adapter, RWCAM, ulCommand);  //delay_ms(40);
+                                       //RT_TRACE(COMP_SEC, DBG_LOUD, ("CAM_empty_entry(): WRITE A0: %lx \n",ulCommand));
+                               }
+                       }
+                       break;
+               case HW_VAR_CAM_INVALID_ALL:
+                       rtw_write32(adapter, RWCAM, BIT(31)|BIT(30));
+                       break;
+               case HW_VAR_CAM_WRITE:
+                       {
+                               u32     cmd;
+                               u32     *cam_val = (u32 *)val;
+                               rtw_write32(adapter, WCAMI, cam_val[0]);
+                               
+                               cmd = CAM_POLLINIG | CAM_WRITE | cam_val[1];
+                               rtw_write32(adapter, RWCAM, cmd);
+                       }
+                       break;
+               case HW_VAR_AC_PARAM_VO:
+                       rtw_write32(adapter, REG_EDCA_VO_PARAM, ((u32 *)(val))[0]);
+                       break;
+               case HW_VAR_AC_PARAM_VI:
+                       rtw_write32(adapter, REG_EDCA_VI_PARAM, ((u32 *)(val))[0]);
+                       break;
+               case HW_VAR_AC_PARAM_BE:
+                       pHalData->AcParam_BE = ((u32 *)(val))[0];
+                       rtw_write32(adapter, REG_EDCA_BE_PARAM, ((u32 *)(val))[0]);
+                       break;
+               case HW_VAR_AC_PARAM_BK:
+                       rtw_write32(adapter, REG_EDCA_BK_PARAM, ((u32 *)(val))[0]);
+                       break;
+               case HW_VAR_ACM_CTRL:
+                       {
+                               u8      acm_ctrl = *((u8 *)val);
+                               u8      AcmCtrl = rtw_read8( adapter, REG_ACMHWCTRL);
+
+                               if(acm_ctrl > 1)
+                                       AcmCtrl = AcmCtrl | 0x1;
+
+                               if(acm_ctrl & BIT(3))
+                                       AcmCtrl |= AcmHw_VoqEn;
+                               else
+                                       AcmCtrl &= (~AcmHw_VoqEn);
+
+                               if(acm_ctrl & BIT(2))
+                                       AcmCtrl |= AcmHw_ViqEn;
+                               else
+                                       AcmCtrl &= (~AcmHw_ViqEn);
+
+                               if(acm_ctrl & BIT(1))
+                                       AcmCtrl |= AcmHw_BeqEn;
+                               else
+                                       AcmCtrl &= (~AcmHw_BeqEn);
+
+                               DBG_871X("[HW_VAR_ACM_CTRL] Write 0x%X\n", AcmCtrl );
+                               rtw_write8(adapter, REG_ACMHWCTRL, AcmCtrl );
+                       }
+                       break;
+               case HW_VAR_AMPDU_FACTOR:
+                       {
+                               u8      RegToSet_Normal[4]={0x41,0xa8,0x72, 0xb9};
+                               u8      RegToSet_BT[4]={0x31,0x74,0x42, 0x97};
+                               u8      FactorToSet;
+                               u8      *pRegToSet;
+                               u8      index = 0;
+
+#ifdef CONFIG_BT_COEXIST
+                               if(     (pHalData->bt_coexist.BT_Coexist) &&
+                                       (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4) )
+                                       pRegToSet = RegToSet_BT; // 0x97427431;
+                               else
+#endif
+                                       pRegToSet = RegToSet_Normal; // 0xb972a841;
+
+                               FactorToSet = *((u8 *)val);
+                               if(FactorToSet <= 3)
+                               {
+                                       FactorToSet = (1<<(FactorToSet + 2));
+                                       if(FactorToSet>0xf)
+                                               FactorToSet = 0xf;
+
+                                       for(index=0; index<4; index++)
+                                       {
+                                               if((pRegToSet[index] & 0xf0) > (FactorToSet<<4))
+                                                       pRegToSet[index] = (pRegToSet[index] & 0x0f) | (FactorToSet<<4);
+                                       
+                                               if((pRegToSet[index] & 0x0f) > FactorToSet)
+                                                       pRegToSet[index] = (pRegToSet[index] & 0xf0) | (FactorToSet);
+                                               
+                                               rtw_write8(adapter, (REG_AGGLEN_LMT+index), pRegToSet[index]);
+                                       }
+
+                                       //RT_TRACE(COMP_MLME, DBG_LOUD, ("Set HW_VAR_AMPDU_FACTOR: %#x\n", FactorToSet));
+                               }
+                       }
+                       break;          
+                case HW_VAR_H2C_FW_PWRMODE:
+                       {
+                               u8      psmode = (*(u8 *)val);
+                       
+                               // Forece leave RF low power mode for 1T1R to prevent conficting setting in Fw power
+                               // saving sequence. 2010.06.07. Added by tynli. Suggested by SD3 yschang.
+                               if( (psmode != PS_MODE_ACTIVE) && (!IS_92C_SERIAL(pHalData->VersionID)))
+                               {
+                                       ODM_RF_Saving(podmpriv, _TRUE);
+                               }
+                               rtl8188e_set_FwPwrMode_cmd(adapter, psmode);
+                       }
+                       break;
+               case HW_VAR_H2C_FW_JOINBSSRPT:
+                   {
+                               u8      mstatus = (*(u8 *)val);
+                               rtl8188e_set_FwJoinBssReport_cmd(adapter, mstatus);
+                       }
+                       break;
+#ifdef CONFIG_P2P_PS
+               case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
+                       {
+                               u8      p2p_ps_state = (*(u8 *)val);
+                               rtl8188e_set_p2p_ps_offload_cmd(adapter, p2p_ps_state);
+                       }
+                       break;
+#endif //CONFIG_P2P_PS
+#ifdef CONFIG_TDLS
+               case HW_VAR_TDLS_WRCR:
+                       rtw_write32(adapter, REG_RCR, rtw_read32(adapter, REG_RCR)&(~RCR_CBSSID_DATA ));
+                       break;
+               case HW_VAR_TDLS_INIT_CH_SEN:
+                       {
+                               rtw_write32(adapter, REG_RCR, rtw_read32(adapter, REG_RCR)&(~ RCR_CBSSID_DATA )&(~RCR_CBSSID_BCN ));
+                               rtw_write16(adapter, REG_RXFLTMAP2,0xffff);
+
+                               //disable update TSF
+                               rtw_write8(adapter, REG_BCN_CTRL, rtw_read8(adapter, REG_BCN_CTRL)|BIT(4));
+                       }
+                       break;
+               case HW_VAR_TDLS_DONE_CH_SEN:
+                       {
+                               //enable update TSF
+                               rtw_write8(adapter, REG_BCN_CTRL, rtw_read8(adapter, REG_BCN_CTRL)&(~ BIT(4)));
+                               rtw_write32(adapter, REG_RCR, rtw_read32(adapter, REG_RCR)|(RCR_CBSSID_BCN ));
+                       }
+                       break;
+               case HW_VAR_TDLS_RS_RCR:
+                       rtw_write32(adapter, REG_RCR, rtw_read32(adapter, REG_RCR)|(RCR_CBSSID_DATA));
+                       break;
+#endif //CONFIG_TDLS
+#ifdef CONFIG_BT_COEXIST
+               case HW_VAR_BT_SET_COEXIST:
+                       {
+                               u8      bStart = (*(u8 *)val);
+                               rtl8192c_set_dm_bt_coexist(adapter, bStart);
+                       }
+                       break;
+               case HW_VAR_BT_ISSUE_DELBA:
+                       {
+                               u8      dir = (*(u8 *)val);
+                               rtl8192c_issue_delete_ba(adapter, dir);
+                       }
+                       break;
+#endif
+#if (RATE_ADAPTIVE_SUPPORT==1)
+               case HW_VAR_RPT_TIMER_SETTING:
+                       {
+                               u16     min_rpt_time = (*(u16 *)val);
+
+                               //DBG_8192C("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B");
+
+                               ODM_RA_Set_TxRPT_Time(podmpriv,min_rpt_time);   
+                       }
+                       break;
+#endif
+
+#ifdef CONFIG_SW_ANTENNA_DIVERSITY
+               case HW_VAR_ANTENNA_DIVERSITY_LINK:
+                       //odm_SwAntDivRestAfterLink8192C(Adapter);
+                       ODM_SwAntDivRestAfterLink(podmpriv);
+                       break;
+#endif                 
+#ifdef CONFIG_ANTENNA_DIVERSITY
+               case HW_VAR_ANTENNA_DIVERSITY_SELECT:
+                       {
+                               u8      Optimum_antenna = (*(u8 *)val);
+                               u8      Ant ; 
+                               //switch antenna to Optimum_antenna
+                               //DBG_8192C("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B");
+                               if(pHalData->CurAntenna !=  Optimum_antenna)            
+                               {                                       
+                                       Ant = (Optimum_antenna==2)?MAIN_ANT:AUX_ANT;
+                                       ODM_UpdateRxIdleAnt(&pHalData->odmpriv, Ant);
+                                       
+                                       pHalData->CurAntenna = Optimum_antenna ;
+                                       //DBG_8192C("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B");
+                               }
+                       }
+                       break;
+#endif
+               case HW_VAR_EFUSE_BYTES: // To set EFUE total used bytes, added by Roger, 2008.12.22.
+                       pHalData->EfuseUsedBytes = *((u16 *)val);                       
+                       break;
+               case HW_VAR_FIFO_CLEARN_UP:
+                       {                               
+                               struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
+                               u8 trycnt = 100;        
+                               
+                               //pause tx
+                               rtw_write8(adapter,REG_TXPAUSE,0xff);
+                       
+                               //keep sn
+                               adapter->xmitpriv.nqos_ssn = rtw_read16(adapter,REG_NQOS_SEQ);
+
+                               if(pwrpriv->bkeepfwalive != _TRUE)
+                               {
+                                       //RX DMA stop
+                                       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))
+                                                       break;
+                                       }while(trycnt--);
+                                       if(trycnt ==0)
+                                               DBG_8192C("Stop RX DMA failed...... \n");
+
+                                       //RQPN Load 0
+                                       rtw_write16(adapter,REG_RQPN_NPQ,0x0);
+                                       rtw_write32(adapter,REG_RQPN,0x80000000);
+                                       rtw_mdelay_os(10);
+                               }
+                       }
+                       break;
+
+
+               case HW_VAR_APFM_ON_MAC:
+                       pHalData->bMacPwrCtrlOn = *val;
+                       DBG_871X("%s: bMacPwrCtrlOn=%d\n", __func__, pHalData->bMacPwrCtrlOn);
+                       break;
+       #if (RATE_ADAPTIVE_SUPPORT == 1)
+               case HW_VAR_TX_RPT_MAX_MACID:
+                       {
+                               if(pHalData->fw_ractrl == _FALSE){
+                                       u8 maxMacid = *val;                             
+                                       DBG_8192C("### MacID(%d),Set Max Tx RPT MID(%d)\n",maxMacid,maxMacid+1);
+                                       rtw_write8(adapter, REG_TX_RPT_CTRL+1, maxMacid+1);
+                               }
+                       }
+                       break;
+        #endif //  (RATE_ADAPTIVE_SUPPORT == 1)                
+               case HW_VAR_H2C_MEDIA_STATUS_RPT:
+                       {                               
+                               rtl8188e_set_FwMediaStatus_cmd(adapter , (*(u16 *)val));
+                       }
+                       break;
+               case HW_VAR_BCN_VALID:
+                       //BCN_VALID, BIT16 of REG_TDECTRL = BIT0 of REG_TDECTRL+2, write 1 to clear, Clear by sw
+                       rtw_write8(adapter, REG_TDECTRL+2, rtw_read8(adapter, REG_TDECTRL+2) | BIT0); 
+                       break;
+                       
+                       
+               case HW_VAR_CHECK_TXBUF:
+                       {
+                               u8 retry_limit;
+                               u16 val16;
+                               u32 reg_200 = 0, reg_204 = 0;
+                               u32 init_reg_200 = 0, init_reg_204 = 0;
+                               u32 start = rtw_get_current_time();
+                               u32 pass_ms;
+                               int i = 0;
+
+                               retry_limit = 0x01;
+
+                               val16 = retry_limit << RETRY_LIMIT_SHORT_SHIFT | retry_limit << RETRY_LIMIT_LONG_SHIFT;
+                               rtw_write16(adapter, REG_RL, val16);
+
+                               while (rtw_get_passing_time_ms(start) < 2000
+                                       && !adapter->bDriverStopped && !adapter->bSurpriseRemoved
+                               ) {
+                                       reg_200 = rtw_read32(adapter, 0x200);
+                                       reg_204 = rtw_read32(adapter, 0x204);
+
+                                       if (i == 0) {
+                                               init_reg_200 = reg_200;
+                                               init_reg_204 = reg_204;
+                                       }
+
+                                       i++;
+                                       if ((reg_200 & 0x00ffffff) != (reg_204 & 0x00ffffff)) {
+                                               //DBG_871X("%s: (HW_VAR_CHECK_TXBUF)TXBUF NOT empty - 0x204=0x%x, 0x200=0x%x (%d)\n", __FUNCTION__, reg_204, reg_200, i);
+                                               rtw_msleep_os(10);
+                                       } else {
+                                               break;
+                                       }
+                               }
+
+                               pass_ms = rtw_get_passing_time_ms(start);
+
+                               if (adapter->bDriverStopped || adapter->bSurpriseRemoved) {
+                               } else if (pass_ms >= 2000 || (reg_200 & 0x00ffffff) != (reg_204 & 0x00ffffff)) {
+                                       DBG_871X_LEVEL(_drv_always_, "%s:(HW_VAR_CHECK_TXBUF)NOT empty(%d) in %d ms\n", __FUNCTION__, i, pass_ms);
+                                       DBG_871X_LEVEL(_drv_always_, "%s:(HW_VAR_CHECK_TXBUF)0x200=0x%08x, 0x204=0x%08x (0x%08x, 0x%08x)\n",
+                                               __FUNCTION__, reg_200, reg_204, init_reg_200, init_reg_204);
+                                       //rtw_warn_on(1);
+                               } else {
+                                       DBG_871X("%s:(HW_VAR_CHECK_TXBUF)TXBUF Empty(%d) in %d ms\n", __FUNCTION__, i, pass_ms);
+                               }
+
+                               retry_limit = 0x30;
+                               val16 = retry_limit << RETRY_LIMIT_SHORT_SHIFT | retry_limit << RETRY_LIMIT_LONG_SHIFT;
+                               rtw_write16(adapter, REG_RL, val16);
+                       }
+                       break;
+               case HW_VAR_RESP_SIFS:
+                       {
+                               struct mlme_ext_priv    *pmlmeext = &adapter->mlmeextpriv;
+
+                               if((pmlmeext->cur_wireless_mode==WIRELESS_11G) ||
+                               (pmlmeext->cur_wireless_mode==WIRELESS_11BG))//WIRELESS_MODE_G){
+                               {
+                                       val[0] = 0x0a;
+                                       val[1] = 0x0a;
+                               } else {
+                                       val[0] = 0x0e;
+                                       val[1] = 0x0e;
+                               }
+
+                               // SIFS for OFDM Data ACK
+                               rtw_write8(adapter, REG_SIFS_CTX+1, val[0]);
+                               // SIFS for OFDM consecutive tx like CTS data!
+                               rtw_write8(adapter, REG_SIFS_TRX+1, val[1]);
+
+                               rtw_write8(adapter, REG_SPEC_SIFS+1, val[0]);
+                               rtw_write8(adapter, REG_MAC_SPEC_SIFS+1, val[0]);
+                                               
+                               //RESP_SIFS for OFDM
+                               rtw_write8(adapter, REG_RESP_SIFS_OFDM, val[0]);
+                               rtw_write8(adapter, REG_RESP_SIFS_OFDM+1, val[0]);
+                       }
+                       break;
+
+               case HW_VAR_MACID_SLEEP:
+               {
+                       u32 reg_macid_sleep;
+                       u8 bit_shift;
+                       u8 id = *(u8*)val;
+                       u32 val32;
+
+                       if (id < 32){
+                               reg_macid_sleep = REG_MACID_PAUSE_0;
+                               bit_shift = id;
+                       } else if (id < 64) {
+                               reg_macid_sleep = REG_MACID_PAUSE_1;
+                               bit_shift = id-32;
+                       } else {
+                               rtw_warn_on(1);
+                               break;
+                       }
+
+                       val32 = rtw_read32(adapter, reg_macid_sleep);
+                       DBG_8192C(FUNC_ADPT_FMT ": [HW_VAR_MACID_SLEEP] macid=%d, org reg_0x%03x=0x%08X\n",
+                               FUNC_ADPT_ARG(adapter), id, reg_macid_sleep, val32);
+
+                       if (val32 & BIT(bit_shift))
+                               break;
+
+                       val32 |= BIT(bit_shift);
+                       rtw_write32(adapter, reg_macid_sleep, val32);
+               }
+                       break;
+
+               case HW_VAR_MACID_WAKEUP:
+               {
+                       u32 reg_macid_sleep;
+                       u8 bit_shift;
+                       u8 id = *(u8*)val;
+                       u32 val32;
+
+                       if (id < 32){
+                               reg_macid_sleep = REG_MACID_PAUSE_0;
+                               bit_shift = id;
+                       } else if (id < 64) {
+                               reg_macid_sleep = REG_MACID_PAUSE_1;
+                               bit_shift = id-32;
+                       } else {
+                               rtw_warn_on(1);
+                               break;
+                       }
+
+                       val32 = rtw_read32(adapter, reg_macid_sleep);
+                       DBG_8192C(FUNC_ADPT_FMT ": [HW_VAR_MACID_WAKEUP] macid=%d, org reg_0x%03x=0x%08X\n",
+                               FUNC_ADPT_ARG(adapter), id, reg_macid_sleep, val32);
+
+                       if (!(val32 & BIT(bit_shift)))
+                               break;
+
+                       val32 &= ~BIT(bit_shift);
+                       rtw_write32(adapter, reg_macid_sleep, val32);
+               }
+                       break;
+
+               default:
+                       SetHwReg(adapter, variable, val);
+                       break;
+       }
+
+_func_exit_;
+}
+
+struct qinfo_88e {
+       u32 head:8;
+       u32 pkt_num:8;
+       u32 tail:8;
+       u32 ac:2;
+       u32 macid:6;
+};
+
+struct bcn_qinfo_88e {
+       u16 head:8;
+       u16 pkt_num:8;
+};
+
+void dump_qinfo_88e(void *sel, struct qinfo_88e *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_88e(void *sel, struct bcn_qinfo_88e *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_88e(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_88e(sel, (struct qinfo_88e *)&q0_info, "Q0 ");
+       dump_qinfo_88e(sel, (struct qinfo_88e *)&q1_info, "Q1 ");
+       dump_qinfo_88e(sel, (struct qinfo_88e *)&q2_info, "Q2 ");
+       dump_qinfo_88e(sel, (struct qinfo_88e *)&q3_info, "Q3 ");
+       /*
+       dump_qinfo_88e(sel, (struct qinfo_88e *)&q4_info, "Q4 ");
+       dump_qinfo_88e(sel, (struct qinfo_88e *)&q5_info, "Q5 ");
+       dump_qinfo_88e(sel, (struct qinfo_88e *)&q6_info, "Q6 ");
+       dump_qinfo_88e(sel, (struct qinfo_88e *)&q7_info, "Q7 ");
+       */
+       dump_qinfo_88e(sel, (struct qinfo_88e *)&mg_q_info, "MG ");
+       dump_qinfo_88e(sel, (struct qinfo_88e *)&hi_q_info, "HI ");
+       dump_bcn_qinfo_88e(sel, (struct bcn_qinfo_88e *)&bcn_q_info, "BCN ");
+}
+
+void GetHwReg8188E(_adapter *adapter, u8 variable, u8 *val)
+{
+       HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
+
+_func_enter_;
+
+       switch (variable) {
+               case HW_VAR_SYS_CLKR:
+                       *val = rtw_read8(adapter, REG_SYS_CLKR);
+                       break;
+
+               case HW_VAR_TXPAUSE:
+                       val[0] = rtw_read8(adapter, REG_TXPAUSE);
+                       break;
+               case HW_VAR_BCN_VALID:
+                       //BCN_VALID, BIT16 of REG_TDECTRL = BIT0 of REG_TDECTRL+2
+                       val[0] = (BIT0 & rtw_read8(adapter, REG_TDECTRL+2))?_TRUE:_FALSE;
+                       break;
+               case HW_VAR_FWLPS_RF_ON:
+                       {
+                               //When we halt NIC, we should check if FW LPS is leave.
+                               if(adapter_to_pwrctl(adapter)->rf_pwrstate == rf_off)
+                               {
+                                       // If it is in HW/SW Radio OFF or IPS state, we do not check Fw LPS Leave,
+                                       // because Fw is unload.
+                                       val[0] = _TRUE;
+                               }
+                               else
+                               {
+                                       u32 valRCR;
+                                       valRCR = rtw_read32(adapter, REG_RCR);
+                                       valRCR &= 0x00070000;
+                                       if(valRCR)
+                                               val[0] = _FALSE;
+                                       else
+                                               val[0] = _TRUE;
+                               }
+                       }
+                       break;
+#ifdef CONFIG_ANTENNA_DIVERSITY
+               case HW_VAR_CURRENT_ANTENNA:
+                       val[0] = pHalData->CurAntenna;
+                       break;
+#endif
+               case HW_VAR_EFUSE_BYTES: // To get EFUE total used bytes, added by Roger, 2008.12.22.
+                       *((u16 *)(val)) = pHalData->EfuseUsedBytes;     
+                       break;
+               case HW_VAR_APFM_ON_MAC:
+                       *val = pHalData->bMacPwrCtrlOn;
+                       break;
+               case HW_VAR_CHK_HI_QUEUE_EMPTY:
+                       *val = ((rtw_read32(adapter, REG_HGQ_INFO)&0x0000ff00)==0) ? _TRUE:_FALSE;
+                       break;
+               case HW_VAR_DUMP_MAC_QUEUE_INFO:
+                       dump_mac_qinfo_88e(val, adapter);
+                       break;
+               default:
+                       GetHwReg(adapter, variable, val);
+                       break;
+       }
+
+_func_exit_;
+}
+
+u8
+GetHalDefVar8188E(
+       IN      PADAPTER                                Adapter,
+       IN      HAL_DEF_VARIABLE                eVariable,
+       IN      PVOID                                   pValue
+       )
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);      
+       u8                      bResult = _SUCCESS;
+
+       switch(eVariable)
+       {
+               case HAL_DEF_IS_SUPPORT_ANT_DIV:
+#ifdef CONFIG_ANTENNA_DIVERSITY
+                       *((u8 *)pValue) = (pHalData->AntDivCfg==0)?_FALSE:_TRUE;
+                       #endif
+break;
+               case HAL_DEF_CURRENT_ANTENNA:
+#ifdef CONFIG_ANTENNA_DIVERSITY
+                       *(( u8*)pValue) = pHalData->CurAntenna;
+#endif
+                       break;
+               case HAL_DEF_DRVINFO_SZ:
+                       *(( u32*)pValue) = DRVINFO_SZ;
+                       break;  
+               case HAL_DEF_MAX_RECVBUF_SZ:
+                       *(( u32*)pValue) = MAX_RECVBUF_SZ;
+                       break;
+               case HAL_DEF_RX_PACKET_OFFSET:
+                       *(( u32*)pValue) = RXDESC_SIZE + DRVINFO_SZ;
+                       break;                  
+#if (RATE_ADAPTIVE_SUPPORT == 1)
+               case HAL_DEF_RA_DECISION_RATE:
+                       {
+                               u8 MacID = *((u8*)pValue);
+                               *((u8*)pValue) = ODM_RA_GetDecisionRate_8188E(&(pHalData->odmpriv), MacID);
+                       }
+                       break;
+               
+               case HAL_DEF_RA_SGI:
+                       {
+                               u8 MacID = *((u8*)pValue);
+                               *((u8*)pValue) = ODM_RA_GetShortGI_8188E(&(pHalData->odmpriv), MacID);
+                       }
+                       break;          
+#endif
+
+
+               case HAL_DEF_PT_PWR_STATUS:
+#if(POWER_TRAINING_ACTIVE==1)  
+                       {
+                               u8 MacID = *((u8*)pValue);
+                               *((u8*)pValue) = ODM_RA_GetHwPwrStatus_8188E(&(pHalData->odmpriv), MacID);
+                       }
+#endif //(POWER_TRAINING_ACTIVE==1)
+                       break;          
+               case HAL_DEF_EXPLICIT_BEAMFORMEE:
+               case HAL_DEF_EXPLICIT_BEAMFORMER:
+                       *((u8 *)pValue) = _FALSE;
+                       break;
+
+               case HW_DEF_RA_INFO_DUMP:
+
+                       {
+                               u8 mac_id = *((u8*)pValue);                             
+                               u8                      bLinked = _FALSE;
+#ifdef CONFIG_CONCURRENT_MODE
+                               PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;
+#endif //CONFIG_CONCURRENT_MODE
+
+                               if(rtw_linked_check(Adapter))
+                                       bLinked = _TRUE;
+               
+#ifdef CONFIG_CONCURRENT_MODE
+                               if(pbuddy_adapter && rtw_linked_check(pbuddy_adapter))
+                                       bLinked = _TRUE;
+#endif                 
+                               
+                               if(bLinked){
+                                       DBG_871X("============ RA status - Mac_id:%d ===================\n",mac_id);
+                                       if(pHalData->fw_ractrl == _FALSE){
+                                               #if (RATE_ADAPTIVE_SUPPORT == 1)                                                                                        
+                                               DBG_8192C("Mac_id:%d ,RSSI:%d(%%) ,PTStage = %d\n",
+                                                       mac_id,pHalData->odmpriv.RAInfo[mac_id].RssiStaRA,pHalData->odmpriv.RAInfo[mac_id].PTStage);                                                    
+
+                                               DBG_8192C("RateID = %d,RAUseRate = 0x%08x,RateSGI = %d, DecisionRate = %s\n",
+                                                       pHalData->odmpriv.RAInfo[mac_id].RateID,
+                                                       pHalData->odmpriv.RAInfo[mac_id].RAUseRate,
+                                                       pHalData->odmpriv.RAInfo[mac_id].RateSGI,
+                                                       HDATA_RATE(pHalData->odmpriv.RAInfo[mac_id].DecisionRate));
+                                               #endif // (RATE_ADAPTIVE_SUPPORT == 1)
+                                       }else{
+                                               u8 cur_rate = rtw_read8(Adapter,REG_ADAPTIVE_DATA_RATE_0+mac_id);
+                                               u8 sgi = (cur_rate & BIT7)?_TRUE:_FALSE;
+                                               cur_rate &= 0x7f;
+                                               DBG_8192C("Mac_id:%d ,SGI:%d ,Rate:%s \n",mac_id,sgi,HDATA_RATE(cur_rate));
+                                       }
+                               }
+                       }
+
+                       break;
+               case HAL_DEF_TX_PAGE_SIZE:
+                        *(( u32*)pValue) = PAGE_SIZE_128;
+                       break;
+               case HAL_DEF_TX_PAGE_BOUNDARY:
+                       if (!Adapter->registrypriv.wifi_spec)
+                               *(u8*)pValue = TX_PAGE_BOUNDARY_88E(Adapter);
+                       else
+                               *(u8*)pValue = WMM_NORMAL_TX_PAGE_BOUNDARY_88E(Adapter);
+                       break;
+               case HAL_DEF_MACID_SLEEP:
+                       *(u8*)pValue = _TRUE; // support macid sleep
+                       break;
+               default:
+                       bResult = GetHalDefVar(Adapter, eVariable, pValue);
+                       break;
+       }
+
+       return bResult;
 }
 
index 7e63d5c17c2154d77abd7b7de145ddc4261cc358..a26218b0b92e39c31c1f074d6a6eb89a8b14b273 100644 (file)
@@ -403,12 +403,12 @@ void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 *TxPower)
        // rf-A cck tx power\r
        write_bbreg(pAdapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, TxPower[RF_PATH_A]);\r
        tmpval = (TxPower[RF_PATH_A]<<16) | (TxPower[RF_PATH_A]<<8) | TxPower[RF_PATH_A];\r
-       write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval);\r
+       write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskH3Bytes, tmpval);\r
 \r
        // rf-B cck tx power\r
        write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, TxPower[RF_PATH_B]);\r
        tmpval = (TxPower[RF_PATH_B]<<16) | (TxPower[RF_PATH_B]<<8) | TxPower[RF_PATH_B];\r
-       write_bbreg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval);\r
+       write_bbreg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, bMaskH3Bytes, tmpval);\r
 \r
        RT_TRACE(_module_mp_, _drv_notice_,\r
                 ("-SetCCKTxPower: A[0x%02x] B[0x%02x]\n",\r
@@ -760,7 +760,7 @@ s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther)
 void Hal_TriggerRFThermalMeter(PADAPTER pAdapter)\r
 {\r
   \r
-       _write_rfreg( pAdapter, RF_PATH_A , RF_T_METER_88E , BIT17 |BIT16 , 0x03 );\r
+       PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_T_METER_88E, bRFRegOffsetMask, 0x60);\r
 \r
 //     RT_TRACE(_module_mp_,_drv_alert_, ("TriggerRFThermalMeter() finished.\n" ));\r
 }\r
index d265a854bd286a25d0f0c2bde321a166c2fdb156..6f9314e685984e3426506069d34fd880694698b6 100644 (file)
@@ -783,8 +783,8 @@ s32 PHY_MACConfig8188E(PADAPTER Adapter)
 {\r
        int             rtStatus = _SUCCESS;\r
        HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
-       s8                      *pszMACRegFile;\r
-       s8                      sz8188EMACRegFile[] = RTL8188E_PHY_MACREG;\r
+       s8              *pszMACRegFile;\r
+       s8              sz8188EMACRegFile[] = RTL8188E_PHY_MACREG;\r
        u16             val=0;\r
 \r
        pszMACRegFile = sz8188EMACRegFile;\r
@@ -933,7 +933,7 @@ storePwrIndexDiffRateOffset(
                //printk("MCSTxPowerLevelOriginalOffset[%d][6]-TxAGC_A_CCK1_Mcs32 = 0x%x\n", pHalData->pwrGroupCnt,\r
                //      pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6]);\r
        }\r
-       if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0xffffff00)\r
+       if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == bMaskH3Bytes)\r
        {\r
                pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7] = Data;\r
                //printk("MCSTxPowerLevelOriginalOffset[%d][7]-TxAGC_B_CCK11_A_CCK2_11 = 0x%x\n", pHalData->pwrGroupCnt,\r
@@ -1691,28 +1691,18 @@ phy_SpurCalibration_8188E(
 {\r
        HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
        \r
-       if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_20 && pHalData->CurrentChannel == 13){\r
+       //DbgPrint("===> phy_SpurCalibration_8188E  CurrentChannelBW = %d, CurrentChannel = %d\n", pHalData->CurrentChannelBW, pHalData->CurrentChannel);\r
+       if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_20 &&( pHalData->CurrentChannel == 13 || pHalData->CurrentChannel == 14)){\r
                PHY_SetBBReg(Adapter, rOFDM0_RxDSP, BIT(9), 0x1);                       //enable notch filter\r
-               PHY_SetBBReg(Adapter, rOFDM0_RxDSP, BIT(28)|BIT(27)|BIT(26)|BIT(25)|BIT(24), 0xb);\r
-               PHY_SetBBReg(Adapter, rOFDM1_CFOTracking, BIT(28), 0x1);                         //enable CSI Mask\r
-               PHY_SetBBReg(Adapter, rOFDM1_csi_fix_mask1, BIT(26)|BIT(25), 0x3);       //Fix CSI Mask Tone\r
-               PHY_SetBBReg(Adapter, rOFDM1_csi_fix_mask2, BIT(26)|BIT(25), 0x0); \r
+               PHY_SetBBReg(Adapter, rOFDM1_IntfDet, BIT(8)|BIT(7)|BIT(6), 0x2);       //intf_TH\r
        }\r
        else if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_40 && pHalData->CurrentChannel == 11){\r
-               if(Adapter->registrypriv.notch_filter == 0)\r
-                       PHY_SetBBReg(Adapter, rOFDM0_RxDSP, BIT9, 0x0);                                 //disable notch filter\r
-               PHY_SetBBReg(Adapter, rOFDM0_RxDSP, BIT(28)|BIT(27)|BIT(26)|BIT(25)|BIT(24), 0x1f);\r
-               PHY_SetBBReg(Adapter, rOFDM1_CFOTracking, BIT(28), 0x1);                         //enable CSI Mask\r
-               PHY_SetBBReg(Adapter, rOFDM1_csi_fix_mask1, BIT(26)|BIT(25), 0x0); \r
-               PHY_SetBBReg(Adapter, rOFDM1_csi_fix_mask2, BIT(26)|BIT(25), 0x3);      //Fix CSI Mask Tone\r
+               PHY_SetBBReg(Adapter, rOFDM0_RxDSP, BIT(9), 0x1);                       //enable notch filter\r
+               PHY_SetBBReg(Adapter, rOFDM1_IntfDet, BIT(8)|BIT(7)|BIT(6), 0x2);       //intf_TH\r
        }\r
        else{\r
                if(Adapter->registrypriv.notch_filter == 0)\r
-                       PHY_SetBBReg(Adapter, rOFDM0_RxDSP, BIT9, 0x0);                                 //disable notch filter\r
-               PHY_SetBBReg(Adapter, rOFDM0_RxDSP, BIT(28)|BIT(27)|BIT(26)|BIT(25)|BIT(24), 0x1f);\r
-               PHY_SetBBReg(Adapter, rOFDM1_CFOTracking, BIT(28), 0x0);                        //disable CSI Mask\r
-               PHY_SetBBReg(Adapter, rOFDM1_csi_fix_mask1, BIT(26)|BIT(25), 0x0); \r
-               PHY_SetBBReg(Adapter, rOFDM1_csi_fix_mask2, BIT(26)|BIT(25), 0x0); \r
+                       PHY_SetBBReg(Adapter, rOFDM0_RxDSP, BIT(9), 0x0);       //disable notch filter\r
        }\r
 }\r
 \r
@@ -1950,8 +1940,10 @@ PHY_SetBWMode8188E(
        #else\r
                _PHY_SetBWMode88E(Adapter);\r
        #endif\r
-               if (IS_VENDOR_8188E_I_CUT_SERIES(Adapter)&& IS_HARDWARE_TYPE_8188ES(Adapter))\r
+       #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+               if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter))\r
                        phy_SpurCalibration_8188E( Adapter);\r
+       #endif\r
        }\r
        else\r
        {\r
@@ -2053,8 +2045,11 @@ PHY_SwChnl8188E( // Call after initialization
                _PHY_SwChnl8188E(Adapter, channel);\r
                #endif\r
 \r
-               if (IS_VENDOR_8188E_I_CUT_SERIES(Adapter)&& IS_HARDWARE_TYPE_8188ES(Adapter))\r
+               #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+               if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter))\r
                        phy_SpurCalibration_8188E( Adapter);\r
+               #endif\r
+\r
                \r
 \r
                if(bResult)\r
index 0039b76730f1798805fc9218f5b51fa018d5f518..4bdc6e3792ccf429498c8921180d69bf9f8a7d4d 100644 (file)
 #include <drv_types.h>
 #include <rtl8188e_hal.h>
 
-static s32  translate2dbm(u8 signal_strength_idx)
-{
-       s32     signal_power; // in dBm.
-
-
-       // Translate to dBm (x=0.5y-95).
-       signal_power = (s32)((signal_strength_idx + 1) >> 1);
-       signal_power -= 95;
-
-       return signal_power;
-}
-
-
 static void process_rssi(_adapter *padapter,union recv_frame *prframe)
 {
        u32     last_rssi, tmp_val;
@@ -77,10 +64,10 @@ static void process_rssi(_adapter *padapter,union recv_frame *prframe)
                
                if(padapter->recvpriv.is_signal_dbg) {
                        padapter->recvpriv.signal_strength= padapter->recvpriv.signal_strength_dbg;
-                       padapter->recvpriv.rssi=(s8)translate2dbm((u8)padapter->recvpriv.signal_strength_dbg);
+                       padapter->recvpriv.rssi=(s8)translate_percentage_to_dbm(padapter->recvpriv.signal_strength_dbg);
                } else {
                        padapter->recvpriv.signal_strength= tmp_val;
-                       padapter->recvpriv.rssi=(s8)translate2dbm((u8)tmp_val);
+                       padapter->recvpriv.rssi=(s8)translate_percentage_to_dbm(tmp_val);
                }
 
                RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("UI RSSI = %d, ui_rssi.TotalVal = %d, ui_rssi.TotalNum = %d\n", tmp_val, padapter->recvpriv.signal_strength_data.total_val,padapter->recvpriv.signal_strength_data.total_num));
@@ -289,6 +276,8 @@ void update_recvframe_phyinfo_88e(
                !pattrib->icv_err && !pattrib->crc_err &&
                _rtw_memcmp(get_hdr_bssid(wlanhdr), get_bssid(&padapter->mlmepriv), ETH_ALEN));
 
+       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);
@@ -329,6 +318,7 @@ void update_recvframe_phyinfo_88e(
 
        //_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;
index 9fd239f9feab1033cde095708a7b4a99cadc4937..53166d30f1e682069e67a7ec6101c6e881efa48e 100644 (file)
@@ -287,4 +287,21 @@ void UpdateEarlyModeInfo8188E(struct xmit_priv *pxmitpriv,struct xmit_buf *pxmit
 }
 #endif
 
+void rtl8188e_cal_txdesc_chksum(struct tx_desc *ptxdesc)
+{
+       u16     *usPtr = (u16*)ptxdesc;
+       u32 count = 16;         // (32 bytes / 2 bytes per XOR) => 16 times
+       u32 index;
+       u16 checksum = 0;
+
+
+       // Clear first
+       ptxdesc->txdw7 &= cpu_to_le32(0xffff0000);
+
+       for (index = 0; index < count; index++) {
+               checksum ^= le16_to_cpu(*(usPtr + index));
+       }
+
+       ptxdesc->txdw7 |= cpu_to_le32(checksum & 0x0000ffff);
+}
 
index d3253fdc37c09827bd86a266832517583f2ad8c5..4b706923697f4c5d2efffb503b753d5afb42013b 100644 (file)
@@ -132,23 +132,6 @@ static void fill_txdesc_phy(struct pkt_attrib *pattrib, PTXDESC_8188E ptxdesc)
        }
 }
 
-static void rtl8188e_cal_txdesc_chksum(struct tx_desc *ptxdesc)
-{
-       u16     *usPtr = (u16*)ptxdesc;
-       u32 count = 16;         // (32 bytes / 2 bytes per XOR) => 16 times
-       u32 index;
-       u16 checksum = 0;
-
-
-       // Clear first
-       ptxdesc->txdw7 &= cpu_to_le32(0xffff0000);
-
-       for (index = 0; index < count; index++) {
-               checksum ^= le16_to_cpu(*(usPtr + index));
-       }
-
-       ptxdesc->txdw7 |= cpu_to_le32(checksum & 0x0000ffff);
-}
 //
 // Description: In normal chip, we should send some packet to Hw which will be used by Fw
 //                     in FW LPS mode. The function is to fill the Tx descriptor of this packets, then
@@ -156,11 +139,11 @@ static void rtl8188e_cal_txdesc_chksum(struct tx_desc *ptxdesc)
 //
 void rtl8188e_fill_fake_txdesc(
        PADAPTER        padapter,
-       u8*                     pDesc,
-       u32                     BufferLen,
-       u8                      IsPsPoll,
-       u8                      IsBTQosNull,
-       u8                      bDataFrame)
+       u8*             pDesc,
+       u32             BufferLen,
+       u8              IsPsPoll,
+       u8              IsBTQosNull,
+       u8              bDataFrame)
 {
        struct tx_desc *ptxdesc;
 
@@ -269,10 +252,13 @@ void rtl8188es_fill_default_txdesc(
        {
                ptxdesc->macid = pattrib->mac_id; // CAM_ID(MAC_ID)
 
-               if (pattrib->ampdu_en == _TRUE)
+               if (pattrib->ampdu_en == _TRUE){
                        ptxdesc->agg_en = 1; // AGG EN
-               else
+                       ptxdesc->ampdu_density = pattrib->ampdu_spacing; 
+               }
+               else{
                        ptxdesc->bk = 1; // AGG BK
+               }
 
                ptxdesc->qsel = pattrib->qsel;
                ptxdesc->rate_id = pattrib->raid;
@@ -283,8 +269,6 @@ void rtl8188es_fill_default_txdesc(
 
                //todo: qos_en
 
-               ptxdesc->userate = 1; // driver uses rate       
-
                if ((pattrib->ether_type != 0x888e) &&
                        (pattrib->ether_type != 0x0806) &&
                        (pattrib->dhcp_pkt != 1))
@@ -299,26 +283,32 @@ void rtl8188es_fill_default_txdesc(
                        ptxdesc->rts_ratefb_lmt = 0xF;
 
 #if (RATE_ADAPTIVE_SUPPORT == 1)
-                       /* driver-based RA*/
-                       if (pattrib->ht_en)
-                               ptxdesc->sgi = ODM_RA_GetShortGI_8188E(&pHalData->odmpriv,pattrib->mac_id);
-                       ptxdesc->datarate = ODM_RA_GetDecisionRate_8188E(&pHalData->odmpriv,pattrib->mac_id);
-
-                       #if (POWER_TRAINING_ACTIVE==1)
-                       ptxdesc->pwr_status = ODM_RA_GetHwPwrStatus_8188E(&pHalData->odmpriv,pattrib->mac_id);
-                       #endif
-#else /* (RATE_ADAPTIVE_SUPPORT == 1) */
-                       /* FW-based RA, TODO */
-                       if(pattrib->ht_en)
-                               ptxdesc->sgi = 1;
-
-                       ptxdesc->datarate = 0x13; //MCS7
+                       if(pHalData->fw_ractrl == _FALSE){
+                               /* driver-based RA*/
+                               ptxdesc->userate = 1; // driver uses rate       
+                               if (pattrib->ht_en)
+                                       ptxdesc->sgi = ODM_RA_GetShortGI_8188E(&pHalData->odmpriv,pattrib->mac_id);
+                               ptxdesc->datarate = ODM_RA_GetDecisionRate_8188E(&pHalData->odmpriv,pattrib->mac_id);
+
+                               #if (POWER_TRAINING_ACTIVE==1)
+                               ptxdesc->pwr_status = ODM_RA_GetHwPwrStatus_8188E(&pHalData->odmpriv,pattrib->mac_id);
+                               #endif
+                       }
+                       else
 #endif /* (RATE_ADAPTIVE_SUPPORT == 1) */
+                       {
+                               /* FW-based RA, TODO */
+                               if(pattrib->ht_en)
+                                       ptxdesc->sgi = 1;
+
+                               ptxdesc->datarate = 0x13; //MCS7
+                       }
 
                        if (padapter->fix_rate != 0xFF) {
                                ptxdesc->userate = 1;
                                ptxdesc->datarate = padapter->fix_rate;
-                               ptxdesc->disdatafb = 1;
+                               if (!padapter->data_fb)
+                                       ptxdesc->disdatafb = 1;
                                ptxdesc->sgi = (padapter->fix_rate & BIT(7))?1:0;
                        }
                }
@@ -327,7 +317,7 @@ void rtl8188es_fill_default_txdesc(
                        // EAP data packet and ARP and DHCP packet.
                        // Use the 1M or 6M data rate to send the EAP/ARP packet.
                        // This will maybe make the handshake smooth.
-
+                       ptxdesc->userate = 1; // driver uses rate       
                        ptxdesc->bk = 1; // AGG BK      
 
                        if (pmlmeinfo->preamble_mode == PREAMBLE_SHORT)
@@ -341,7 +331,7 @@ void rtl8188es_fill_default_txdesc(
        else if (pxmitframe->frame_tag == MGNT_FRAMETAG)
        {
 //             RT_TRACE(_module_hal_xmit_c_, _drv_notice_, ("%s: MGNT_FRAMETAG\n", __FUNCTION__));
-
+               ptxdesc->userate = 1; // driver uses rate       
                ptxdesc->macid = pattrib->mac_id; // CAM_ID(MAC_ID)
                ptxdesc->qsel = pattrib->qsel;
                ptxdesc->rate_id = pattrib->raid; // Rate ID
@@ -1176,7 +1166,7 @@ static s32 xmit_xmitframes(PADAPTER padapter, struct xmit_priv *pxmitpriv)
                                
                                if ((NULL == pxmitbuf) ||
                                        ((_RND(pxmitbuf->len, 8) + txlen) > max_xmit_len)
-                                       || (agg_num>= (rtw_hal_sdio_max_txoqt_free_space(padapter)-1))          
+                                       || (agg_num>= (rtw_hal_sdio_max_txoqt_free_space(padapter)-1))
                                        || ((agg_num!=0) && (_FAIL == rtw_hal_busagg_qsel_check(padapter,pre_qsel,next_qsel)))
                                )
                                {
@@ -1386,9 +1376,9 @@ next:
 thread_return rtl8188es_xmit_thread(thread_context context)
 {
        s32 ret;
-       PADAPTER padapter= (PADAPTER)context;
+       PADAPTER padapter= (PADAPTER)context;   
        struct xmit_priv *pxmitpriv= &padapter->xmitpriv;
-
+       
        ret = _SUCCESS;
 
        thread_enter("RTWHALXT");
@@ -1406,6 +1396,7 @@ thread_return rtl8188es_xmit_thread(thread_context context)
 
        RT_TRACE(_module_hal_xmit_c_, _drv_notice_, ("-%s\n", __FUNCTION__));
        DBG_871X("exit %s\n", __FUNCTION__);
+
        thread_exit();
 }
 #endif
@@ -1448,11 +1439,9 @@ s32 rtl8188es_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe)
                rtw_IOL_cmd_buf_dump(padapter,pxmitbuf->len,pxmitbuf->pdata);
 #endif 
 
-               rtw_write_port(padapter, ffaddr2deviceId(pdvobjpriv, pxmitbuf->ff_hwaddr), pxmitbuf->len, (u8 *)pxmitbuf);
-               
-               //rtw_free_xmitframe(pxmitpriv, pmgntframe);
-               
-               //pxmitbuf->priv_data = NULL;
+               ret = rtw_write_port(padapter, ffaddr2deviceId(pdvobjpriv, pxmitbuf->ff_hwaddr), pxmitbuf->len, (u8 *)pxmitbuf);
+               if (ret != _SUCCESS)
+                       rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_WRITE_PORT_ERR);
                
                rtw_free_xmitbuf(pxmitpriv, pxmitbuf);
        }               
@@ -1461,9 +1450,6 @@ s32 rtl8188es_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe)
                enqueue_pending_xmitbuf(pxmitpriv, pxmitbuf);
        }
 
-       if  (ret != _SUCCESS)
-               rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_UNKNOWN);
-
        return ret;
 }
 
index f430a520c901e9cdd2db403a957e3ebf44b0443e..1919eb31d476eec370d2cd981b822083d773f593 100644 (file)
@@ -94,6 +94,24 @@ static int PowerOnCheck(PADAPTER padapter)
        } else {
                DBG_871X("%s: fail at cmd52, cmd53.\n", __func__);
        }
+
+       if (ret == _FAIL) {
+               DBG_871X_LEVEL(_drv_err_, "Dump MAC Page0 register:\n");
+               /* Dump Page0 for check cystal*/
+               for (index = 0 ; index < 0xff ; index++) {
+                       if(index%16==0)
+                               printk("0x%02x ",index);
+
+                       printk("%02x ", rtw_read8(padapter, index)); 
+
+                       if(index%16==15)
+                               printk("\n");
+                       else if(index%8==7)
+                               printk("\t");
+               }
+               printk("\n");
+       }
+
        return ret;
 }
 
@@ -558,7 +576,7 @@ static void _InitQueueReservedPage(PADAPTER padapter)
        value8 = (u8)_NPQ(numNQ);
        rtw_write8(padapter, REG_RQPN_NPQ, value8);
 
-       numPubQ = TX_TOTAL_PAGE_NUMBER_88E - numHQ - numLQ - numNQ;
+       numPubQ = TX_TOTAL_PAGE_NUMBER_88E(padapter) - numHQ - numLQ - numNQ;
 
        // TX DMA
        value32 = _HPQ(numHQ) | _LPQ(numLQ) | _PUBQ(numPubQ) | LD_RQPN;
@@ -758,7 +776,7 @@ static void _InitQueuePriority(PADAPTER padapter)
 static void _InitPageBoundary(PADAPTER padapter)
 {
        // RX Page Boundary     
-       u16 rxff_bndy = MAX_RX_DMA_BUFFER_SIZE_88E-1;
+       u16 rxff_bndy = MAX_RX_DMA_BUFFER_SIZE_88E(padapter)-1;
 
        rtw_write16(padapter, (REG_TRXFF_BNDY + 2), rxff_bndy);
 
@@ -895,8 +913,6 @@ static void HalRxAggr8188ESdio(PADAPTER padapter)
        else
        {
                valueDMATimeout = 0x06;
-               //valueDMAPageCount = 0x0F;
-               //valueDMATimeout = 0x0a;  
                valueDMAPageCount = 0x24;
        }
 
@@ -1035,25 +1051,6 @@ void _InitOperationMode(PADAPTER padapter)
 
        rtw_write8(padapter, REG_BWOPMODE, regBwOpMode);
 
-       // For Min Spacing configuration.
-       switch(pHalData->rf_type)
-       {
-               case RF_1T2R:
-               case RF_1T1R:
-                       RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("Initializepadapter: RF_Type%s\n", (pHalData->rf_type==RF_1T1R? "(1T1R)":"(1T2R)")));
-//                     padapter->MgntInfo.MinSpaceCfg = (MAX_MSS_DENSITY_1T<<3);
-                       MinSpaceCfg = (MAX_MSS_DENSITY_1T << 3);
-                       break;
-               case RF_2T2R:
-               case RF_2T2R_GREEN:
-                       RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("Initializepadapter:RF_Type(2T2R)\n"));
-//                     padapter->MgntInfo.MinSpaceCfg = (MAX_MSS_DENSITY_2T<<3);
-                       MinSpaceCfg = (MAX_MSS_DENSITY_2T << 3);
-                       break;
-       }
-
-//     rtw_write8(padapter, REG_AMPDU_MIN_SPACE, padapter->MgntInfo.MinSpaceCfg);
-       rtw_write8(padapter, REG_AMPDU_MIN_SPACE, MinSpaceCfg);
 }
 
 
@@ -1236,14 +1233,13 @@ static u32 rtl8188es_hal_init(PADAPTER padapter)
        HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(padapter);
        struct pwrctrl_priv             *pwrctrlpriv = adapter_to_pwrctl(padapter);
        struct registry_priv    *pregistrypriv = &padapter->registrypriv;
-       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
        u8 is92C = IS_92C_SERIAL(pHalData->VersionID);
        rt_rf_power_state       eRfPowerStateToSet;
        u8 value8;
+       u8 cpwm_orig, cpwm_now, rpwm;
        u16 value16;
 
        u32 init_start_time = rtw_get_current_time();
-       u8 cpwm_orig, cpwm_now, rpwm;
        u32 start_time;
 
 #ifdef DBG_HAL_INIT_PROFILING
@@ -1348,7 +1344,7 @@ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BEGIN);
 
        if(rtw_read8(padapter, REG_MCUFWDL) == 0xc6) {
 #ifdef CONFIG_LPS_LCLK
-               _enter_pwrlock(&pwrpriv->lock);
+               _enter_pwrlock(&pwrctrlpriv->lock);
                cpwm_orig = 0, rpwm = 0;
                rtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_orig);
 
@@ -1383,7 +1379,7 @@ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BEGIN);
                                break;
                        }
                } while (1);
-               _exit_pwrlock(&pwrpriv->lock);
+               _exit_pwrlock(&pwrctrlpriv->lock);
                
                hal_poweroff_8188es(padapter);
 #endif
@@ -1412,10 +1408,10 @@ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_PW_ON);
 
 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC01);
        if (!pregistrypriv->wifi_spec) {
-               txpktbuf_bndy = TX_PAGE_BOUNDARY_88E;
+               txpktbuf_bndy = TX_PAGE_BOUNDARY_88E(padapter);
        } else {
                // for WMM
-               txpktbuf_bndy = WMM_NORMAL_TX_PAGE_BOUNDARY_88E;
+               txpktbuf_bndy = WMM_NORMAL_TX_PAGE_BOUNDARY_88E(padapter);
        }
        _InitQueueReservedPage(padapter);       
        _InitQueuePriority(padapter);
@@ -1446,6 +1442,7 @@ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_DOWNLOAD_FW);
        padapter->bFWReady = _FALSE; //because no fw for test chip      
        pHalData->fw_ractrl = _FALSE;
 #else
+
        ret = rtl8188e_FirmwareDownload(padapter, _FALSE);
 
        if (ret != _SUCCESS) {
@@ -1456,7 +1453,11 @@ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_DOWNLOAD_FW);
        } else {
                RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("Initializepadapter8192CSdio(): Download Firmware Success!!\n"));
                padapter->bFWReady = _TRUE;
+               #ifdef CONFIG_SFW_SUPPORTED
+               pHalData->fw_ractrl = IS_VENDOR_8188E_I_CUT_SERIES(padapter)?_TRUE:_FALSE;
+               #else
                pHalData->fw_ractrl = _FALSE;
+               #endif
        }
 #endif
        }
@@ -1509,18 +1510,24 @@ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_LLTT);
                RT_TRACE(_module_hci_hal_init_c_, _drv_err_, ("Failed to init LLT Table!\n"));
                goto exit;
        }
+       //Enable TX Report & Tx Report Timer   
+       value8 = rtw_read8(padapter, REG_TX_RPT_CTRL);
+       rtw_write8(padapter,  REG_TX_RPT_CTRL, (value8|BIT1|BIT0));
 
 #if (RATE_ADAPTIVE_SUPPORT==1)
-       {//Enable TX Report
-               //Enable Tx Report Timer   
-               value8 = rtw_read8(padapter, REG_TX_RPT_CTRL);
-               rtw_write8(padapter,  REG_TX_RPT_CTRL, (value8|BIT1|BIT0));
+       if(!pHalData->fw_ractrl ){
                //Set MAX RPT MACID
                rtw_write8(padapter,  REG_TX_RPT_CTRL+1, 2);//FOR sta mode ,0: bc/mc ,1:AP
                //Tx RPT Timer. Unit: 32us
                rtw_write16(padapter, REG_TX_RPT_TIME, 0xCdf0);
        }
+       else
 #endif 
+       {
+               //disable tx rpt
+               rtw_write8(padapter,  REG_TX_RPT_CTRL+1, 0);//FOR sta mode ,0: bc/mc ,1:AP
+       }
 
 #if 0
        if(pHTInfo->bRDGEnable){
@@ -1803,12 +1810,10 @@ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC31);
        pHalData->SdioTxOQTMaxFreeSpace = pHalData->SdioTxOQTFreeSpace;
 
 
-       if(pregistrypriv->wifi_spec)
+       if(pregistrypriv->wifi_spec) {
                rtw_write16(padapter,REG_FAST_EDCA_CTRL ,0);
-
-
-       //TODO:Setting HW_VAR_NAV_UPPER !!!!!!!!!!!!!!!!!!!!
-       //rtw_hal_set_hwreg(Adapter, HW_VAR_NAV_UPPER, ((pu1Byte)&NavUpper));
+               rtw_write8(padapter,REG_NAV_UPPER ,0x0);
+       }
 
        if(IS_HARDWARE_TYPE_8188ES(padapter))
        {
@@ -1818,15 +1823,17 @@ HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC31);
 
        //pHalData->PreRpwmVal = PlatformEFSdioLocalCmd52Read1Byte(Adapter, SDIO_REG_HRPWM1)&0x80;
 
-
-       // enable Tx report.
-       rtw_write8(padapter,  REG_FWHW_TXQ_CTRL+1, 0x0F);
+       if(!pHalData->fw_ractrl ){
+               // enable Tx report.
+               rtw_write8(padapter,  REG_FWHW_TXQ_CTRL+1, 0x0F);
+               //tynli_test_tx_report.
+               rtw_write16(padapter, REG_TX_RPT_TIME, 0x3DF0);
+       }
 /*
        // Suggested by SD1 pisa. Added by tynli. 2011.10.21.
        PlatformEFIOWrite1Byte(Adapter, REG_EARLY_MODE_CONTROL+3, 0x01);
 
-*/     //tynli_test_tx_report.
-       rtw_write16(padapter, REG_TX_RPT_TIME, 0x3DF0);
+*/     
        //RT_TRACE(COMP_INIT, DBG_TRACE, ("InitializeAdapter8188EUsb() <====\n"));
 
        
@@ -1928,6 +1935,9 @@ static void rtl8188es_init_default_value(PADAPTER padapter)
        pHalData = GET_HAL_DATA(padapter);
        pwrctrlpriv = adapter_to_pwrctl(padapter);
        pdmpriv = &pHalData->dmpriv;
+
+       rtl8188e_init_default_value(padapter);
+
        padapter->registrypriv.wireless_mode = WIRELESS_11BG_24N;
 
        //init default value
@@ -2015,34 +2025,6 @@ Hal_EfuseParsePIDVID_8188ES(
 //     RT_TRACE(COMP_INIT, DBG_LOUD, ("EEPROM PID = 0x%4x\n", pHalData->EEPROMPID));
 }
 
-static void Hal_GetPhyEfuseMACAddr_8188ES(PADAPTER padapter, u8* mac_addr) {
-       int i = 0;
-
-       rtw_efuse_map_read(padapter, EEPROM_MAC_ADDR_88ES, ETH_ALEN, mac_addr);
-
-       if (rtw_check_invalid_mac_address(mac_addr) == _TRUE) {
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))
-               get_random_bytes(mac_addr, ETH_ALEN);
-               mac_addr[0] = 0x00;
-               mac_addr[1] = 0xe0;
-               mac_addr[2] = 0x4c;
-#else
-               mac_addr[0] = 0x00;
-               mac_addr[1] = 0xe0;
-               mac_addr[2] = 0x4c;
-               mac_addr[3] = (u8)(curtime & 0xff) ;
-               mac_addr[4] = (u8)((curtime>>8) & 0xff) ;
-               mac_addr[5] = (u8)((curtime>>16) & 0xff) ;
-#endif
-                DBG_871X("MAC Address from phy efuse error, assign random MAC !!!\n");
-       }
-
-       DBG_871X("%s: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x\n",
-                       __func__, mac_addr[0], mac_addr[1], mac_addr[2],
-                       mac_addr[3], mac_addr[4], mac_addr[5]);
-}
-
-
 static void
 Hal_EfuseParseMACAddr_8188ES(
        IN      PADAPTER                padapter,
@@ -2091,185 +2073,39 @@ Hal_EfuseParseMACAddr_8188ES(
                  pEEPROM->mac_addr[4], pEEPROM->mac_addr[5]);
 }
 
-
-static u32 Hal_readPGDataFromConfigFile(
-       PADAPTER        padapter,
-       struct file *fp)
-{
-       u32 i;
-       mm_segment_t fs;
-       u8 temp[3];
-       loff_t pos = 0;
-       EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
-       u8      *PROMContent = pEEPROM->efuse_eeprom_data;
-
-       temp[2] = 0; // add end of string '\0'
-
-       fs = get_fs();
-       set_fs(KERNEL_DS);
-
-       for (i = 0 ; i < HWSET_MAX_SIZE_88E ; i++) {
-               vfs_read(fp, temp, 2, &pos);
-               PROMContent[i] = simple_strtoul(temp, NULL, 16);
-               if ((i % EFUSE_FILE_COLUMN_NUM) == (EFUSE_FILE_COLUMN_NUM - 1)) {
-                       //Filter the lates space char.
-                       vfs_read(fp, temp, 1, &pos);
-                       if (strchr(temp, ' ') == NULL) {
-                               pos--;
-                               vfs_read(fp, temp, 2, &pos);
-                       }
-               } else {
-                       pos += 1; // Filter the space character
-               }
-       }
-
-       set_fs(fs);
-       pEEPROM->bloadfile_fail_flag = _FALSE;
-
-#ifdef CONFIG_DEBUG
-       DBG_871X("Efuse configure file:\n");
-       for (i=0; i<HWSET_MAX_SIZE_88E; i++)
-       {
-               if (i % 16 == 0)
-                       printk("\n");
-
-               printk("%02X ", PROMContent[i]);
-       }
-       printk("\n");
-#endif
-
-       return _SUCCESS;
-}
-
-static void
-Hal_ReadMACAddrFromFile_8188ES(
-       PADAPTER                padapter,
-       struct file *fp)
-{
-       u32 i;
-       mm_segment_t fs;
-       u8 source_addr[18];
-       loff_t pos = 0;
-       u32     curtime = rtw_get_current_time();
-       EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
-       u8 *head, *end;
-
-       _rtw_memset(source_addr, 0, 18);
-       _rtw_memset(pEEPROM->mac_addr, 0, ETH_ALEN);
-
-       fs = get_fs();
-       set_fs(KERNEL_DS);
-
-       DBG_871X("wifi mac address:\n");
-       vfs_read(fp, source_addr, 18, &pos);
-       source_addr[17] = ':';
-
-       head = end = source_addr;
-       for (i=0; i<ETH_ALEN; i++) {
-               while (end && (*end != ':') )
-                       end++;
-
-               if (end && (*end == ':') )
-                       *end = '\0';
-
-               pEEPROM->mac_addr[i] = simple_strtoul(head, NULL, 16 );
-
-               if (end) {
-                       end++;
-                       head = end;
-               }
-       }
-
-       set_fs(fs);
-       pEEPROM->bloadmac_fail_flag = _FALSE;
-
-       if (rtw_check_invalid_mac_address(pEEPROM->mac_addr) == _TRUE) {
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))
-               get_random_bytes(pEEPROM->mac_addr, ETH_ALEN);
-               pEEPROM->mac_addr[0] = 0x00;
-               pEEPROM->mac_addr[1] = 0xe0;
-               pEEPROM->mac_addr[2] = 0x4c;
-#else
-               pEEPROM->mac_addr[0] = 0x00;
-               pEEPROM->mac_addr[1] = 0xe0;
-               pEEPROM->mac_addr[2] = 0x4c;
-               pEEPROM->mac_addr[3] = (u8)(curtime & 0xff) ;
-               pEEPROM->mac_addr[4] = (u8)((curtime>>8) & 0xff) ;
-               pEEPROM->mac_addr[5] = (u8)((curtime>>16) & 0xff) ;
-#endif
-                DBG_871X("MAC Address from wifimac error is invalid, assign random MAC !!!\n");
-       }
-
-       DBG_871X("%s: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x\n",
-                       __func__, pEEPROM->mac_addr[0], pEEPROM->mac_addr[1],
-                       pEEPROM->mac_addr[2], pEEPROM->mac_addr[3],
-                       pEEPROM->mac_addr[4], pEEPROM->mac_addr[5]);
-}
-
-static int check_phy_efuse_tx_power_info_valid(PADAPTER padapter) {
-       EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
-       u8* pContent = pEEPROM->efuse_eeprom_data;
-       int index = 0;
-
-       for (index = 0 ; index < 12 ; index++) {
-               if (pContent[EEPROM_TX_PWR_INX_88E+index] == 0xFF) {
-                       return _FALSE;
-               } else {
-                       DBG_871X("0x%02x ,", pContent[EEPROM_TX_PWR_INX_88E+index]);
-               }
-       }
-       DBG_871X("\n");
-       return _TRUE;
-}
-
-static int check_phy_efuse_macaddr_info_valid(PADAPTER padapter) {
-
-       u8 val = 0;
-
-       rtw_efuse_map_read(padapter, EEPROM_MAC_ADDR_88ES, 1, &val);
-
-       if (val == 0xFF) {
-               return _FALSE;
-       } else {
-               DBG_871X("phy efuse with valid MAC addr\n");
-               return _TRUE;
-       }
-}
-
 static VOID
 readAdapterInfo_8188ES(
        IN PADAPTER                     padapter
        )
 {
        EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
+
+#ifdef CONFIG_EFUSE_CONFIG_FILE
        struct file *fp = NULL;
+#endif
 
        /* parse the eeprom/efuse content */
        Hal_EfuseParseIDCode88E(padapter, pEEPROM->efuse_eeprom_data);
        Hal_EfuseParsePIDVID_8188ES(padapter, pEEPROM->efuse_eeprom_data, pEEPROM->bautoload_fail_flag);
 
-#if 1
+#ifdef CONFIG_EFUSE_CONFIG_FILE
        if (check_phy_efuse_macaddr_info_valid(padapter) == _TRUE) {
                DBG_871X("using phy efuse mac\n");
-               Hal_GetPhyEfuseMACAddr_8188ES(padapter, pEEPROM->mac_addr);
+               Hal_GetPhyEfuseMACAddr(padapter, pEEPROM->mac_addr);
        } else {
                fp = filp_open(WIFIMAC_PATH, O_RDONLY, 0);
                if (fp == NULL || IS_ERR(fp)) {
                        DBG_871X("wifimac does not exist!!\n");
-                       Hal_GetPhyEfuseMACAddr_8188ES(padapter, pEEPROM->mac_addr);
+                       Hal_GetPhyEfuseMACAddr(padapter, pEEPROM->mac_addr);
                } else {
-                       Hal_ReadMACAddrFromFile_8188ES(padapter, fp);
+                       Hal_ReadMACAddrFromFile(padapter, fp);
                        filp_close(fp, NULL);
                }
        }
-#else
-#ifdef CONFIG_EFUSE_CONFIG_FILE
-       Hal_ReadMACAddrFromFile_8188ES(padapter);
 #else //CONFIG_EFUSE_CONFIG_FILE
        Hal_EfuseParseMACAddr_8188ES(padapter, pEEPROM->efuse_eeprom_data, pEEPROM->bautoload_fail_flag);
 #endif //CONFIG_EFUSE_CONFIG_FILE
-#endif
-       
+
        Hal_ReadPowerSavingMode88E(padapter, pEEPROM->efuse_eeprom_data, pEEPROM->bautoload_fail_flag);
        Hal_ReadTxPowerInfo88E(padapter, pEEPROM->efuse_eeprom_data, pEEPROM->bautoload_fail_flag);
        Hal_EfuseParseEEPROMVer88E(padapter, pEEPROM->efuse_eeprom_data, pEEPROM->bautoload_fail_flag);
@@ -2297,7 +2133,9 @@ static void _ReadPROMContent(
 {
        EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
        u8                      eeValue;
+#ifdef CONFIG_EFUSE_CONFIG_FILE
        struct file *fp;
+#endif //CONFIG_EFUSE_CONFIG_FILE      
 
        /* check system boot selection */
        eeValue = rtw_read8(padapter, REG_9346CR);
@@ -2312,8 +2150,10 @@ static void _ReadPROMContent(
 //     pHalData->EEType = IS_BOOT_FROM_EEPROM(Adapter) ? EEPROM_93C46 : EEPROM_BOOT_EFUSE;
 
 
-#if 1
+
        Hal_InitPGData88E(padapter);
+
+#ifdef CONFIG_EFUSE_CONFIG_FILE
        if (check_phy_efuse_tx_power_info_valid(padapter) == _FALSE) {
                fp = filp_open(EFUSE_MAP_PATH, O_RDONLY, 0);
                if (fp == NULL || IS_ERR(fp)) {
@@ -2323,19 +2163,14 @@ static void _ReadPROMContent(
                        filp_close(fp, NULL);
                }
        }
-#else
-#ifdef CONFIG_EFUSE_CONFIG_FILE
-       Hal_readPGDataFromConfigFile(padapter);
-#else //CONFIG_EFUSE_CONFIG_FILE
-       Hal_InitPGData88E(padapter);
 #endif //CONFIG_EFUSE_CONFIG_FILE      
-#endif
+
        readAdapterInfo_8188ES(padapter);
 }
 
 static VOID
 _InitOtherVariable(
-       IN PADAPTER             Adapter
+       IN PADAPTER             Adapter
        )
 {
        //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
@@ -2401,41 +2236,10 @@ static void ReadAdapterInfo8188ES(PADAPTER padapter)
        _ReadAdapterInfo8188ES(padapter);
 }
 
-static void ResumeTxBeacon(PADAPTER padapter)
-{
-       HAL_DATA_TYPE*  pHalData = GET_HAL_DATA(padapter);
-
-       // 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value
-       // which should be read from register to a global variable.
-
-       RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("+ResumeTxBeacon\n"));
-
-       rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl) | BIT6);
-       pHalData->RegFwHwTxQCtrl |= BIT6;
-       rtw_write8(padapter, REG_TBTT_PROHIBIT+1, 0xff);
-       pHalData->RegReg542 |= BIT0;
-       rtw_write8(padapter, REG_TBTT_PROHIBIT+2, pHalData->RegReg542);
-}
-
-static void StopTxBeacon(PADAPTER padapter)
-{
-       HAL_DATA_TYPE*  pHalData = GET_HAL_DATA(padapter);
-
-       // 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value
-       // which should be read from register to a global variable.
-
-       RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("+StopTxBeacon\n"));
-
-       rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl) & (~BIT6));
-       pHalData->RegFwHwTxQCtrl &= (~BIT6);
-       rtw_write8(padapter, REG_TBTT_PROHIBIT+1, 0x64);
-       pHalData->RegReg542 &= ~(BIT0);
-       rtw_write8(padapter, REG_TBTT_PROHIBIT+2, pHalData->RegReg542);
 
-       CheckFwRsvdPageContent(padapter);  // 2010.06.23. Added by tynli.
-}
 
 // todo static 
+#if 0
 void hw_var_set_opmode(PADAPTER Adapter, u8 variable, u8* val)
 {
        u8      val8;
@@ -2666,1327 +2470,105 @@ void hw_var_set_opmode(PADAPTER Adapter, u8 variable, u8* val)
        }
 
 }
+#endif
 
-static void hw_var_set_macaddr(PADAPTER Adapter, u8 variable, u8* val)
+static void SetHwReg8188ES(PADAPTER Adapter, u8 variable, u8* val)
 {
-       u8 idx = 0;
-       u32 reg_macid;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       
+_func_enter_;
 
-#ifdef CONFIG_CONCURRENT_MODE
-       if(Adapter->iface_type == IFACE_PORT1)
-       {
-               reg_macid = REG_MACID1;
-       }
-       else
+       switch(variable)
+       {                       
+               case HW_VAR_RXDMA_AGG_PG_TH:
+               break;
+               case HW_VAR_SET_RPWM:
+#ifdef CONFIG_LPS_LCLK
+                       {
+                               u8      ps_state = *((u8 *)val);
+                               //rpwm value only use BIT0(clock bit) ,BIT6(Ack bit), and BIT7(Toggle bit) for 88e.
+                               //BIT0 value - 1: 32k, 0:40MHz.
+                               //BIT6 value - 1: report cpwm value after success set, 0:do not report.
+                               //BIT7 value - Toggle bit change.
+                               //modify by Thomas. 2012/4/2.
+                               ps_state = ps_state & 0xC1;
+
+#ifdef CONFIG_EXT_CLK //for sprd
+                               if(ps_state&BIT(6)) // want to leave 32k
+                               {
+                                       //enable ext clock req before leave LPS-32K
+                                       //DBG_871X("enable ext clock req before leaving LPS-32K\n");                                    
+                                       EnableGpio5ClockReq(Adapter, _FALSE, 1);
+                               }
+#endif //CONFIG_EXT_CLK
+
+                               //DBG_871X("##### Change RPWM value to = %x for switch clk #####\n",ps_state);
+                               rtw_write8(Adapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1, ps_state);
+                       }
 #endif
-       {
-               reg_macid = REG_MACID;
+                       break;
+               default:
+                       SetHwReg8188E(Adapter, variable, val);
+                       break;
        }
 
-       for(idx = 0 ; idx < 6; idx++)
-       {
-               rtw_write8(GET_PRIMARY_ADAPTER(Adapter), (reg_macid+idx), val[idx]);
-       }
+_func_exit_;
 }
 
-static void hw_var_set_bssid(PADAPTER Adapter, u8 variable, u8* val)
+static void GetHwReg8188ES(PADAPTER padapter, u8 variable, u8 *val)
 {
-       u8      idx = 0;
-       u32 reg_bssid;
-
-
-#ifdef CONFIG_CONCURRENT_MODE
-       if(Adapter->iface_type == IFACE_PORT1)
-       {
-               reg_bssid = REG_BSSID1;
-       }
-       else
-#endif
-       {
-               reg_bssid = REG_BSSID;
-       }
-
-printk("hw_var_set_bssid   reg=%x \n", reg_bssid);
+       PHAL_DATA_TYPE  pHalData= GET_HAL_DATA(padapter);       
+_func_enter_;
 
-       for(idx = 0 ; idx < 6; idx++)
+       switch (variable)
        {
-               rtw_write8(Adapter, (reg_bssid+idx), val[idx]);
+               case HW_VAR_CPWM:
+                       *val = rtw_read8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HCPWM1);
+                       break;
+               default:
+                       GetHwReg8188E(padapter, variable, val);
+                       break;
        }
 
+_func_exit_;
 }
 
-static void hw_var_set_bcn_func(PADAPTER Adapter, u8 variable, u8* val)
+//
+//     Description:
+//             Query setting of specified variable.
+//
+u8
+GetHalDefVar8188ESDIO(
+       IN      PADAPTER                                Adapter,
+       IN      HAL_DEF_VARIABLE                eVariable,
+       IN      PVOID                                   pValue
+       )
 {
-       u32 bcn_ctrl_reg;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);      
+       u8                      bResult = _SUCCESS;
 
-#ifdef CONFIG_CONCURRENT_MODE
-       if(Adapter->iface_type == IFACE_PORT1)
+       switch(eVariable)
        {
-               bcn_ctrl_reg = REG_BCN_CTRL_1;
-       }       
-       else
-#endif         
-       {               
-               bcn_ctrl_reg = REG_BCN_CTRL;
-       }
+               case HW_VAR_MAX_RX_AMPDU_FACTOR:
+                       *(( u32*)pValue) = MAX_AMPDU_FACTOR_16K;
+                       break;
 
-       if(*((u8 *)val))
-       {
-               rtw_write8(Adapter, bcn_ctrl_reg, (EN_BCN_FUNCTION | EN_TXBCN_RPT));
-       }
-       else
-       {
-               rtw_write8(Adapter, bcn_ctrl_reg, rtw_read8(Adapter, bcn_ctrl_reg)&(~(EN_BCN_FUNCTION | EN_TXBCN_RPT)));
+               case HAL_DEF_TX_LDPC:
+               case HAL_DEF_RX_LDPC:
+                       *((u8 *)pValue) = _FALSE;
+                       break;
+               case HAL_DEF_TX_STBC:
+                       *((u8 *)pValue) = 0;
+                       break;
+               case HAL_DEF_RX_STBC:
+                       *((u8 *)pValue) = 1;
+                       break;
+               default:
+                       bResult = GetHalDefVar8188E(Adapter, eVariable, pValue);
+                       break;
        }
-       
 
-}
-
-static void hw_var_set_correct_tsf(PADAPTER Adapter, u8 variable, u8* val)
-{
-#ifdef CONFIG_CONCURRENT_MODE
-       u64     tsf;
-       struct mlme_ext_priv    *pmlmeext = &Adapter->mlmeextpriv;
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-       PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;
-
-       //tsf = pmlmeext->TSFValue - ((u32)pmlmeext->TSFValue % (pmlmeinfo->bcn_interval*1024)) -1024; //us
-       tsf = pmlmeext->TSFValue - rtw_modular64(pmlmeext->TSFValue, (pmlmeinfo->bcn_interval*1024)) -1024; //us
-
-       if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))
-       {                               
-               //pHalData->RegTxPause |= STOP_BCNQ;BIT(6)
-               //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)|BIT(6)));
-               StopTxBeacon(Adapter);
-       }
-
-       if(Adapter->iface_type == IFACE_PORT1)
-       {
-               //disable related TSF function
-               rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3)));
-                                                       
-               rtw_write32(Adapter, REG_TSFTR1, tsf);
-               rtw_write32(Adapter, REG_TSFTR1+4, tsf>>32);
-               //enable related TSF function
-               rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(3));
-               // Update buddy port's TSF if it is SoftAP for beacon TX issue!
-               if ( (pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE
-                       && check_buddy_fwstate(Adapter, WIFI_AP_STATE)
-               ) { 
-                       //disable related TSF function
-                       rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(3)));
-
-                       rtw_write32(Adapter, REG_TSFTR, tsf);
-                       rtw_write32(Adapter, REG_TSFTR+4, tsf>>32);
-
-                       //enable related TSF function
-                       rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(3));
-#ifdef CONFIG_TSF_RESET_OFFLOAD
-               // Update buddy port's TSF(TBTT) if it is SoftAP for beacon TX issue!
-                       if (reset_tsf(Adapter, IFACE_PORT0) == _FALSE)
-                               DBG_871X("ERROR! %s()-%d: Reset port0 TSF fail\n",
-                                       __FUNCTION__, __LINE__);
-
-#endif // CONFIG_TSF_RESET_OFFLOAD     
-               }               
-       
-       }
-       else
-       {
-               //disable related TSF function
-               rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(3)));
-                                                       
-               rtw_write32(Adapter, REG_TSFTR, tsf);
-               rtw_write32(Adapter, REG_TSFTR+4, tsf>>32);
-
-               //enable related TSF function
-               rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(3));             
-               // Update buddy port's TSF if it is SoftAP for beacon TX issue!
-               if ( (pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE
-                       && check_buddy_fwstate(Adapter, WIFI_AP_STATE)
-               ) { 
-                       //disable related TSF function
-                       rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3)));
-
-                       rtw_write32(Adapter, REG_TSFTR1, tsf);
-                       rtw_write32(Adapter, REG_TSFTR1+4, tsf>>32);
-
-                       //enable related TSF function
-                       rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(3));
-#ifdef CONFIG_TSF_RESET_OFFLOAD
-               // Update buddy port's TSF if it is SoftAP for beacon TX issue!
-                       if (reset_tsf(Adapter, IFACE_PORT1) == _FALSE)
-                               DBG_871X("ERROR! %s()-%d: Reset port1 TSF fail\n",
-                                       __FUNCTION__, __LINE__);
-#endif // CONFIG_TSF_RESET_OFFLOAD
-               }               
-       }
-                               
-                                                       
-       if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))
-       {
-               //pHalData->RegTxPause  &= (~STOP_BCNQ);
-               //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)&(~BIT(6))));
-               ResumeTxBeacon(Adapter);
-       }
-#endif
-}
-
-static void hw_var_set_mlme_disconnect(PADAPTER Adapter, u8 variable, u8* val)
-{
-#ifdef CONFIG_CONCURRENT_MODE
-       //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
-       PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;
-                       
-                               
-       if(check_buddy_mlmeinfo_state(Adapter, _HW_STATE_NOLINK_))      
-               rtw_write16(Adapter, REG_RXFLTMAP2, 0x00);
-       
-
-       if(Adapter->iface_type == IFACE_PORT1)
-       {
-               //reset TSF1
-               rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1));
-
-               //disable update TSF1
-               rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(4));
-
-               // disable Port1's beacon function
-               rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3)));
-       }
-       else
-       {
-               //reset TSF
-               rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(0));
-
-               //disable update TSF
-               rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4));
-       }
-#endif
-}
-
-static void hw_var_set_mlme_sitesurvey(PADAPTER Adapter, u8 variable, u8* val)
-{      
-#ifdef CONFIG_CONCURRENT_MODE  
-       //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
-
-       struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
-       struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
-
-       if(*((u8 *)val))//under sitesurvey
-       {
-               //config RCR to receive different BSSID & not to receive data frame
-               u32 v = rtw_read32(Adapter, REG_RCR);
-               v &= ~(RCR_CBSSID_BCN);
-               rtw_write32(Adapter, REG_RCR, v);
-
-               //disable update TSF
-               if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)
-               {
-                       if(Adapter->iface_type == IFACE_PORT1)
-                       {
-                               rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(4));
-                       }
-                       else
-                       {
-                               rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4));
-                       }                               
-               }
-                               
-               if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&
-                       check_buddy_fwstate(Adapter, _FW_LINKED))               
-               {
-                       StopTxBeacon(Adapter);
-               }               
-                               
-       }
-       else//sitesurvey done
-       {
-               //enable to rx data frame
-               //write32(Adapter, REG_RCR, read32(padapter, REG_RCR)|RCR_ADF);
-               rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF);
-
-               //enable update TSF
-               if(Adapter->iface_type == IFACE_PORT1)
-                       rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(4)));
-               else
-                       rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4)));
-
-               rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_BCN);
-
-               if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&
-                       check_buddy_fwstate(Adapter, _FW_LINKED))
-               {
-                       ResumeTxBeacon(Adapter);                        
-               }
-                                       
-       }
-#endif                 
-}
-
-static void hw_var_set_mlme_join(PADAPTER Adapter, u8 variable, u8* val)
-{
-#ifdef CONFIG_CONCURRENT_MODE
-       u8      RetryLimit = 0x30;
-       u8      type = *((u8 *)val);
-       HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
-       struct mlme_priv        *pmlmepriv = &Adapter->mlmepriv;
-       EEPROM_EFUSE_PRIV       *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter);
-
-       if(type == 0) // prepare to join
-       {               
-               if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&
-                       check_buddy_fwstate(Adapter, _FW_LINKED))               
-               {
-                       StopTxBeacon(Adapter);
-               }
-       
-               //enable to rx data frame.Accept all data frame
-               //rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF);
-               rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF);
-
-               if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE))
-                       rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_BCN);
-               else
-                       rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN);
-
-               if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
-               {
-                       RetryLimit = (pEEPROM->CustomerID == RT_CID_CCX) ? 7 : 48;
-               }
-               else // Ad-hoc Mode
-               {
-                       RetryLimit = 0x7;
-               }
-       }
-       else if(type == 1) //joinbss_event call back when join res < 0
-       {               
-               if(check_buddy_mlmeinfo_state(Adapter, _HW_STATE_NOLINK_))              
-                       rtw_write16(Adapter, REG_RXFLTMAP2,0x00);
-
-               if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&
-                       check_buddy_fwstate(Adapter, _FW_LINKED))
-               {
-                       ResumeTxBeacon(Adapter);                        
-                       
-                       //reset TSF 1/2 after ResumeTxBeacon
-                       rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1)|BIT(0));   
-                       
-               }
-       }
-       else if(type == 2) //sta add event call back
-       {
-        
-               //enable update TSF
-               if(Adapter->iface_type == IFACE_PORT1)
-                       rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(4)));
-               else
-                       rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4)));
-                
-       
-               if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE))
-               {
-                       //fixed beacon issue for 8191su...........
-                       rtw_write8(Adapter,0x542 ,0x02);
-                       RetryLimit = 0x7;
-               }
-
-
-               if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&
-                       check_buddy_fwstate(Adapter, _FW_LINKED))
-               {
-                       ResumeTxBeacon(Adapter);                        
-                       
-                       //reset TSF 1/2 after ResumeTxBeacon
-                       rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1)|BIT(0));
-               }
-               
-       }
-
-       rtw_write16(Adapter, REG_RL, RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT);
-       
-#endif
-}
-static void SetHwReg8188ES(PADAPTER Adapter, u8 variable, u8* val)
-{
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
-       DM_ODM_T                *podmpriv = &pHalData->odmpriv;
-_func_enter_;
-
-       switch(variable)
-       {
-               case HW_VAR_MEDIA_STATUS:
-                       {
-                               u8 val8;
-
-                               val8 = rtw_read8(Adapter, MSR)&0x0c;
-                               val8 |= *((u8 *)val);
-                               rtw_write8(Adapter, MSR, val8);
-                       }
-                       break;
-               case HW_VAR_MEDIA_STATUS1:
-                       {
-                               u8 val8;
-
-                               val8 = rtw_read8(Adapter, MSR)&0x03;
-                               val8 |= *((u8 *)val) <<2;
-                               rtw_write8(Adapter, MSR, val8);
-                       }
-                       break;
-               case HW_VAR_SET_OPMODE:
-                       hw_var_set_opmode(Adapter, variable, val);
-                       break;
-               case HW_VAR_MAC_ADDR:
-                       hw_var_set_macaddr(Adapter, variable, val);
-                       break;
-               case HW_VAR_BSSID:
-                       hw_var_set_bssid(Adapter, variable, val);
-                       break;
-               case HW_VAR_TXPAUSE:
-                       rtw_write8(Adapter, REG_TXPAUSE, *((u8 *)val));
-                       break;
-               case HW_VAR_BCN_FUNC:
-                       hw_var_set_bcn_func(Adapter, variable, val);
-                       break;
-               case HW_VAR_CORRECT_TSF:
-#ifdef CONFIG_CONCURRENT_MODE
-                       hw_var_set_correct_tsf(Adapter, variable, val);
-#else
-                       {
-                               u64     tsf;
-                               struct mlme_ext_priv    *pmlmeext = &Adapter->mlmeextpriv;
-                               struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-
-                               //f = pmlmeext->TSFValue - ((u32)pmlmeext->TSFValue % (pmlmeinfo->bcn_interval*1024)) -1024; //us
-                               tsf = pmlmeext->TSFValue - rtw_modular64(pmlmeext->TSFValue, (pmlmeinfo->bcn_interval*1024)) - 1024; //us
-
-                               if (((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) ||
-                                       ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE))
-                               {
-                                       //pHalData->RegTxPause |= STOP_BCNQ;BIT(6)
-                                       //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)|BIT(6)));
-                                       StopTxBeacon(Adapter);
-                               }
-
-                               // disable related TSF function
-                               rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(3)));
-
-                               rtw_write32(Adapter, REG_TSFTR, tsf);
-                               rtw_write32(Adapter, REG_TSFTR+4, tsf>>32);
-
-                               // enable related TSF function
-                               rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(3));
-
-                               if (((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) ||
-                                       ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE))
-                               {
-                                       //pHalData->RegTxPause  &= (~STOP_BCNQ);
-                                       //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)&(~BIT(6))));
-                                       ResumeTxBeacon(Adapter);
-                               }
-                       }
-#endif
-                       break;
-               case HW_VAR_CHECK_BSSID:
-                       if(*((u8 *)val))
-                       { 
-                               rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN); 
-                       }
-                       else
-                       {
-                               u32     val32;
-
-                               val32 = rtw_read32(Adapter, REG_RCR);
-                               val32 &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN);
-
-                               rtw_write32(Adapter, REG_RCR, val32);
-                       }
-                       break;
-               case HW_VAR_MLME_DISCONNECT:
-#ifdef CONFIG_CONCURRENT_MODE
-                       hw_var_set_mlme_disconnect(Adapter, variable, val);
-#else
-                       {
-                               //Set RCR to not to receive data frame when NO LINK state
-                               //rtw_write32(Adapter, REG_RCR, rtw_read32(padapter, REG_RCR) & ~RCR_ADF);
-                               //reject all data frames
-                               rtw_write16(Adapter, REG_RXFLTMAP2,0x00);
-
-                               //reset TSF
-                               rtw_write8(Adapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1)));
-
-                               //disable update TSF
-                               rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4));     
-                       }
-#endif
-                       break;
-               case HW_VAR_MLME_SITESURVEY:
-#ifdef CONFIG_CONCURRENT_MODE
-                       hw_var_set_mlme_sitesurvey(Adapter, variable,  val);
-#else
-                       if(*((u8 *)val))//under sitesurvey
-                       {
-                               //config RCR to receive different BSSID & not to receive data frame
-                               u32 v = rtw_read32(Adapter, REG_RCR);
-                               v &= ~(RCR_CBSSID_BCN);
-                               rtw_write32(Adapter, REG_RCR, v);
-                               //reject all data frame
-                               rtw_write16(Adapter, REG_RXFLTMAP2,0x00);
-
-                               //disable update TSF
-                               rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4));
-                       }
-                       else//sitesurvey done
-                       {
-                               struct mlme_ext_priv    *pmlmeext = &Adapter->mlmeextpriv;
-                               struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-
-                               if ((is_client_associated_to_ap(Adapter) == _TRUE) ||
-                                       ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) )
-                               {
-                                       //enable to rx data frame
-                                       //rtw_write32(Adapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF);
-                                       rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF);
-
-                                       //enable update TSF
-                                       rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4)));
-                               }
-                               else if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
-                               {
-                                       //rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_ADF);
-                                       rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF);
-
-                                       //enable update TSF
-                                       rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4)));
-                               }
-
-                               if(Adapter->in_cta_test)
-                               {
-                                       if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
-                                       {
-                                               rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_BCN);
-                                       }
-                                       else
-                                       {
-                                               u32 v = rtw_read32(Adapter, REG_RCR);
-                                               v &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN );//| RCR_ADF
-                                               rtw_write32(Adapter, REG_RCR, v);
-                                       }
-                               }
-                               else
-                               {
-                                       rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_BCN);
-                               }
-                       }
-#endif
-                       break;
-               case HW_VAR_MLME_JOIN:
-#ifdef CONFIG_CONCURRENT_MODE
-                       hw_var_set_mlme_join(Adapter, variable,  val);
-#else
-                       {
-                               u8      RetryLimit = 0x30;
-                               u8      type = *((u8 *)val);
-                               struct mlme_priv        *pmlmepriv = &Adapter->mlmepriv;
-                               EEPROM_EFUSE_PRIV       *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter);
-                               
-                               if(type == 0) // prepare to join
-                               {
-                                       //enable to rx data frame.Accept all data frame
-                                       //rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF);
-                                       rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF);
-                                       if(Adapter->in_cta_test)
-                                       {
-                                               u32 v = rtw_read32(Adapter, REG_RCR);
-                                               v &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN );//| RCR_ADF
-                                               rtw_write32(Adapter, REG_RCR, v);
-                                       }
-                                       else
-                                       {
-                                               rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN);
-                                       }
-                                       if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
-                                       {
-                                               RetryLimit = (pEEPROM->CustomerID == RT_CID_CCX) ? 7 : 48;
-                                       }
-                                       else // Ad-hoc Mode
-                                       {
-                                               RetryLimit = 0x7;
-                                       }
-                               }
-                               else if(type == 1) //joinbss_event call back when join res < 0
-                               {
-                                       rtw_write16(Adapter, REG_RXFLTMAP2,0x00);
-                               }
-                               else if(type == 2) //sta add event call back
-                               {
-                                       // enable update TSF
-                                       rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4)));
-
-                                       if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE))
-                                       {
-                                               RetryLimit = 0x7;
-                                       }
-                               }
-
-                               rtw_write16(Adapter, REG_RL, RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT);
-                       }
-#endif
-                       break;
-               case HW_VAR_ON_RCR_AM:
-                        rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_AM);
-                        DBG_871X("%s, %d, RCR= %x \n", __FUNCTION__,__LINE__, rtw_read32(Adapter, REG_RCR));
-                        break;
-              case HW_VAR_OFF_RCR_AM:
-                        rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)& (~RCR_AM));
-                        DBG_871X("%s, %d, RCR= %x \n", __FUNCTION__,__LINE__, rtw_read32(Adapter, REG_RCR));
-                        break;
-               case HW_VAR_BEACON_INTERVAL:
-                       rtw_write16(Adapter, REG_BCN_INTERVAL, *((u16 *)val));
-
-#ifdef  CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT
-                       {
-                               struct mlme_ext_priv    *pmlmeext = &Adapter->mlmeextpriv;
-                               struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-                               u16 bcn_interval =      *((u16 *)val);
-                               if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE){
-                                       DBG_8192C("%s==> bcn_interval:%d, eraly_int:%d \n",__FUNCTION__,bcn_interval,bcn_interval>>1);
-                                       rtw_write8(Adapter, REG_DRVERLYINT, bcn_interval>>1);// 50ms for sdio 
-                               }
-                               else{
-                                       
-                               }
-                       }
-#endif//CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT
-
-                       break;
-               case HW_VAR_SLOT_TIME:
-                       {
-                               rtw_write8(Adapter, REG_SLOT, val[0]);
-                       }
-                       break;
-               case HW_VAR_ACK_PREAMBLE:
-                       {
-                               u8      regTmp;
-                               u8      bShortPreamble = *( (PBOOLEAN)val );
-                               // Joseph marked out for Netgear 3500 TKIP channel 7 issue.(Temporarily)
-                               regTmp = (pHalData->nCur40MhzPrimeSC)<<5;
-                               rtw_write8(Adapter, REG_RRSR+2, regTmp);
-
-                               regTmp = rtw_read8(Adapter,REG_WMAC_TRXPTCL_CTL+2);
-                               if(bShortPreamble)              
-                                       regTmp |= BIT1;
-                               else
-                                       regTmp &= (~BIT1);
-                               rtw_write8(Adapter,REG_WMAC_TRXPTCL_CTL+2,regTmp);                              
-                       }
-                       break;
-               case HW_VAR_CAM_EMPTY_ENTRY:
-                       {
-                               u8      ucIndex = *((u8 *)val);
-                               u8      i;
-                               u32     ulCommand=0;
-                               u32     ulContent=0;
-                               u32     ulEncAlgo=CAM_AES;
-
-                               for(i=0;i<CAM_CONTENT_COUNT;i++)
-                               {
-                                       // filled id in CAM config 2 byte
-                                       if( i == 0)
-                                       {
-                                               ulContent |=(ucIndex & 0x03) | ((u16)(ulEncAlgo)<<2);
-                                               //ulContent |= CAM_VALID;
-                                       }
-                                       else
-                                       {
-                                               ulContent = 0;
-                                       }
-                                       // polling bit, and No Write enable, and address
-                                       ulCommand= CAM_CONTENT_COUNT*ucIndex+i;
-                                       ulCommand= ulCommand | CAM_POLLINIG|CAM_WRITE;
-                                       // write content 0 is equall to mark invalid
-                                       rtw_write32(Adapter, WCAMI, ulContent);  //delay_ms(40);
-                                       //RT_TRACE(COMP_SEC, DBG_LOUD, ("CAM_empty_entry(): WRITE A4: %lx \n",ulContent));
-                                       rtw_write32(Adapter, RWCAM, ulCommand);  //delay_ms(40);
-                                       //RT_TRACE(COMP_SEC, DBG_LOUD, ("CAM_empty_entry(): WRITE A0: %lx \n",ulCommand));
-                               }
-                       }
-                       break;
-               case HW_VAR_CAM_INVALID_ALL:
-                       rtw_write32(Adapter, RWCAM, BIT(31)|BIT(30));
-                       break;
-               case HW_VAR_CAM_WRITE:
-                       {
-                               u32     cmd;
-                               u32     *cam_val = (u32 *)val;
-                               rtw_write32(Adapter, WCAMI, cam_val[0]);
-
-                               cmd = CAM_POLLINIG | CAM_WRITE | cam_val[1];
-                               rtw_write32(Adapter, RWCAM, cmd);
-                       }
-                       break;
-               case HW_VAR_AC_PARAM_VO:
-                       rtw_write32(Adapter, REG_EDCA_VO_PARAM, ((u32 *)(val))[0]);
-                       break;
-               case HW_VAR_AC_PARAM_VI:
-                       rtw_write32(Adapter, REG_EDCA_VI_PARAM, ((u32 *)(val))[0]);
-                       break;
-               case HW_VAR_AC_PARAM_BE:
-                       pHalData->AcParam_BE = ((u32 *)(val))[0];
-                       rtw_write32(Adapter, REG_EDCA_BE_PARAM, ((u32 *)(val))[0]);
-                       break;
-               case HW_VAR_AC_PARAM_BK:
-                       rtw_write32(Adapter, REG_EDCA_BK_PARAM, ((u32 *)(val))[0]);
-                       break;
-               case HW_VAR_AMPDU_MIN_SPACE:
-                       {
-                               u8      MinSpacingToSet;
-                               u8      SecMinSpace;
-
-                               MinSpacingToSet = *((u8 *)val);
-                               if(MinSpacingToSet <= 7)
-                               {
-                                       switch(Adapter->securitypriv.dot11PrivacyAlgrthm)
-                                       {
-                                               case _NO_PRIVACY_:
-                                               case _AES_:
-                                                       SecMinSpace = 0;
-                                                       break;
-
-                                               case _WEP40_:
-                                               case _WEP104_:
-                                               case _TKIP_:
-                                               case _TKIP_WTMIC_:
-                                                       SecMinSpace = 6;
-                                                       break;
-                                               default:
-                                                       SecMinSpace = 7;
-                                                       break;
-                                       }
-
-                                       if(MinSpacingToSet < SecMinSpace){
-                                               MinSpacingToSet = SecMinSpace;
-                                       }
-
-                                       //RT_TRACE(COMP_MLME, DBG_LOUD, ("Set HW_VAR_AMPDU_MIN_SPACE: %#x\n", Adapter->MgntInfo.MinSpaceCfg));
-                                       rtw_write8(Adapter, REG_AMPDU_MIN_SPACE, (rtw_read8(Adapter, REG_AMPDU_MIN_SPACE) & 0xf8) | MinSpacingToSet);
-                               }
-                       }
-                       break;
-               case HW_VAR_AMPDU_FACTOR:
-                       {
-                               u8      RegToSet_Normal[4]={0x41,0xa8,0x72, 0xb9};
-                               u8      RegToSet_BT[4]={0x31,0x74,0x42, 0x97};
-                               u8      FactorToSet;
-                               u8      *pRegToSet;
-                               u8      index = 0;
-
-#ifdef CONFIG_BT_COEXIST
-                               if(     (pHalData->bt_coexist.BT_Coexist) &&
-                                       (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4) )
-                                       pRegToSet = RegToSet_BT; // 0x97427431;
-                               else
-#endif
-                                       pRegToSet = RegToSet_Normal; // 0xb972a841;
-
-                               FactorToSet = *((u8 *)val);
-                               if(FactorToSet <= 3)
-                               {
-                                       FactorToSet = (1<<(FactorToSet + 2));
-                                       if(FactorToSet>0xf)
-                                               FactorToSet = 0xf;
-
-                                       for(index=0; index<4; index++)
-                                       {
-                                               if((pRegToSet[index] & 0xf0) > (FactorToSet<<4))
-                                                       pRegToSet[index] = (pRegToSet[index] & 0x0f) | (FactorToSet<<4);
-
-                                               if((pRegToSet[index] & 0x0f) > FactorToSet)
-                                                       pRegToSet[index] = (pRegToSet[index] & 0xf0) | (FactorToSet);
-
-                                               rtw_write8(Adapter, (REG_AGGLEN_LMT+index), pRegToSet[index]);
-                                       }
-
-                                       //RT_TRACE(COMP_MLME, DBG_LOUD, ("Set HW_VAR_AMPDU_FACTOR: %#x\n", FactorToSet));
-                               }
-                       }
-                       break;
-               case HW_VAR_RXDMA_AGG_PG_TH:
-                       rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, *((u8 *)val));
-                       break;
-               case HW_VAR_SET_RPWM:
-#ifdef CONFIG_LPS_LCLK
-                       {
-                               u8      ps_state = *((u8 *)val);
-                               //rpwm value only use BIT0(clock bit) ,BIT6(Ack bit), and BIT7(Toggle bit) for 88e.
-                               //BIT0 value - 1: 32k, 0:40MHz.
-                               //BIT6 value - 1: report cpwm value after success set, 0:do not report.
-                               //BIT7 value - Toggle bit change.
-                               //modify by Thomas. 2012/4/2.
-                               ps_state = ps_state & 0xC1;
-
-#ifdef CONFIG_EXT_CLK //for sprd
-                               if(ps_state&BIT(6)) // want to leave 32k
-                               {
-                                       //enable ext clock req before leave LPS-32K
-                                       //DBG_871X("enable ext clock req before leaving LPS-32K\n");                                    
-                                       EnableGpio5ClockReq(Adapter, _FALSE, 1);
-                               }
-#endif //CONFIG_EXT_CLK
-
-                               //DBG_871X("##### Change RPWM value to = %x for switch clk #####\n",ps_state);
-                               rtw_write8(Adapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1, ps_state);
-                       }
-#endif
-                       break;
-               case HW_VAR_H2C_FW_PWRMODE:
-                       {
-                               u8      psmode = (*(u8 *)val);
-
-                               // Forece leave RF low power mode for 1T1R to prevent conficting setting in Fw power
-                               // saving sequence. 2010.06.07. Added by tynli. Suggested by SD3 yschang.
-                               if( (psmode != PS_MODE_ACTIVE) && (!IS_92C_SERIAL(pHalData->VersionID)))
-                               {
-                                       ODM_RF_Saving(podmpriv, _TRUE);
-                               }
-                               rtl8188e_set_FwPwrMode_cmd(Adapter, psmode);
-                       }
-                       break;
-               case HW_VAR_H2C_FW_JOINBSSRPT:
-                       {
-                               u8      mstatus = (*(u8 *)val);
-                               rtl8188e_set_FwJoinBssReport_cmd(Adapter, mstatus);
-                       }
-                       break;
-#ifdef CONFIG_P2P_PS
-               case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
-                       {
-                               u8      p2p_ps_state = (*(u8 *)val);
-                               rtl8188e_set_p2p_ps_offload_cmd(Adapter, p2p_ps_state);
-                       }
-                       break;
-#endif // CONFIG_P2P_PS
-               case HW_VAR_INITIAL_GAIN:
-                       {                               
-                               DIG_T   *pDigTable = &podmpriv->DM_DigTable;                                    
-                               u32             rx_gain = ((u32 *)(val))[0];
-               
-                               if(rx_gain == 0xff){//restore rx gain                                   
-                                       ODM_Write_DIG(podmpriv,pDigTable->BackupIGValue);
-                               }
-                               else{
-                                       pDigTable->BackupIGValue = pDigTable->CurIGValue;
-                                       ODM_Write_DIG(podmpriv,rx_gain);
-                               }
-                       }               
-                       break;
-               case HW_VAR_TRIGGER_GPIO_0:
-//                     rtl8192cu_trigger_gpio_0(Adapter);
-                       break;
-#ifdef CONFIG_BT_COEXIST
-               case HW_VAR_BT_SET_COEXIST:
-                       {
-                               u8      bStart = (*(u8 *)val);
-                               rtl8192c_set_dm_bt_coexist(Adapter, bStart);
-                       }
-                       break;
-               case HW_VAR_BT_ISSUE_DELBA:
-                       {
-                               u8      dir = (*(u8 *)val);
-                               rtl8192c_issue_delete_ba(Adapter, dir);
-                       }
-                       break;
-#endif
-#if (RATE_ADAPTIVE_SUPPORT==1)
-               case HW_VAR_RPT_TIMER_SETTING:
-                       {
-                               u16     min_rpt_time = (*(u16 *)val);
-
-                               //DBG_8192C("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B");
-
-                               //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, Optimum_antenna);
-                               ODM_RA_Set_TxRPT_Time(podmpriv,min_rpt_time);   
-                       }
-                       break;
-#endif
-
-#ifdef CONFIG_SW_ANTENNA_DIVERSITY
-               case HW_VAR_ANTENNA_DIVERSITY_LINK:
-                       //SwAntDivRestAfterLink8192C(Adapter);
-                       ODM_SwAntDivRestAfterLink(podmpriv);
-                       break;
-#endif
-#ifdef CONFIG_ANTENNA_DIVERSITY
-               case HW_VAR_ANTENNA_DIVERSITY_SELECT:
-                       {
-                               u8      Optimum_antenna = (*(u8 *)val);
-                               u8      Ant ; 
-                               //switch antenna to Optimum_antenna
-                               //DBG_8192C("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B");
-                               if(pHalData->CurAntenna !=  Optimum_antenna)            
-                               {                                       
-                                       Ant = (Optimum_antenna==2)?MAIN_ANT:AUX_ANT;
-                                       ODM_UpdateRxIdleAnt_88E(&pHalData->odmpriv, Ant);
-                                       
-                                       pHalData->CurAntenna = Optimum_antenna ;
-                                       //DBG_8192C("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B");
-                               }
-                       }
-                       break;
-#endif
-               case HW_VAR_EFUSE_BYTES: // To set EFUE total used bytes, added by Roger, 2008.12.22.
-                       pHalData->EfuseUsedBytes = *((u16 *)val);
-                       break;
-               case HW_VAR_FIFO_CLEARN_UP:
-                       {                               
-                               struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(Adapter);
-                               u8 trycnt = 100;
-
-                               //pause tx
-                               rtw_write8(Adapter,REG_TXPAUSE,0xff);
-
-                               //keep sn
-                               Adapter->xmitpriv.nqos_ssn = rtw_read16(Adapter,REG_NQOS_SEQ);
-
-                               //RX DMA stop
-                               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))
-                                               break;
-                               }while(trycnt--);
-                               if(trycnt ==0)
-                                       DBG_8192C("Stop RX DMA failed...... \n");
-
-                               //RQPN Load 0
-                               rtw_write16(Adapter,REG_RQPN_NPQ,0x0);
-                               rtw_write32(Adapter,REG_RQPN,0x80000000);
-                               rtw_mdelay_os(10);
-
-                       }
-                       break;
-#ifdef CONFIG_WOWLAN
-               case HW_VAR_WOWLAN:
-               {
-                       struct wowlan_ioctl_param *poidparam;
-                       struct recv_buf *precvbuf;
-                       struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(Adapter);
-                       struct security_priv *psecuritypriv = &Adapter->securitypriv;
-                       int res, i;
-                       u32 tmp;
-                       u64 iv_low = 0, iv_high = 0;
-                       u16 len = 0;
-                       u8 mstatus = (*(u8 *)val);
-                       u8 trycnt = 100;
-                       u8 data[4];
-                       u8 val8;
-
-                       poidparam = (struct wowlan_ioctl_param *)val;
-                       switch (poidparam->subcode){
-                               case WOWLAN_ENABLE:
-                                       DBG_871X_LEVEL(_drv_always_, "WOWLAN_ENABLE\n");
-
-#ifndef DYNAMIC_CAMID_ALLOC
-                                       val8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf;
-                                       rtw_write8(Adapter, REG_SECCFG, val8);
-                                       DBG_871X_LEVEL(_drv_always_, "REG_SECCFG: %02x\n", rtw_read8(Adapter, REG_SECCFG));
-#endif
-
-                                       SetFwRelatedForWoWLAN8188ES(Adapter, _TRUE);
-
-                                       rtl8188e_set_FwJoinBssReport_cmd(Adapter, 1);
-                                       rtw_msleep_os(2);
-
-                                       //Set Pattern
-                                       //if(pwrctl->wowlan_pattern==_TRUE)
-                                       //      rtw_wowlan_reload_pattern(Adapter);
-
-                                       //disable TX Report, only use in 88e
-                                       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));
-
-                                       //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");
-                                                       DBG_871X("0x284-1:0x%08x\n", rtw_read32(Adapter, 0x284));
-                                                       break;
-                                               } 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);
-                                               }
-                                       }while(trycnt--);
-
-                                       DBG_871X("0x284-2:0x%08x\n", rtw_read32(Adapter, 0x284));
-                                       DBG_871X("TX_RPT-2:0x%02x\n", rtw_read8(Adapter, REG_TX_RPT_CTRL));
-
-                                       if(trycnt ==0)
-                                               DBG_871X_LEVEL(_drv_always_, "Stop RX DMA failed...... \n");
-
-                                       //Enable CPWM2 only.
-                                       DBG_871X_LEVEL(_drv_always_, "Enable only CPWM2\n");
-                                       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);
-                                       }else
-                                           DBG_871X_LEVEL(_drv_info_, "sdio_local_write fail\n");
-
-                                       //Set WOWLAN H2C command.
-                                       DBG_871X_LEVEL(_drv_always_, "Set WOWLan cmd\n");
-                                       rtl8188es_set_wowlan_ctrl_cmd(Adapter, 1);
-                                       rtl8188es_set_global_info_cmd(Adapter, 1);
-                                       rtl8188es_set_keep_alive_cmd(Adapter, 1);
-                                       rtl8188es_set_disconnect_decision_cmd(Adapter, 1);
-                                       rtl8188es_set_remote_wake_ctrl_cmd(Adapter, 1);
-
-                                       mstatus = rtw_read8(Adapter, REG_WOW_CTRL);
-                                       trycnt = 10;
-
-                                       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);
-                                               DBG_871X_LEVEL(_drv_always_, "0x284 0x%08x\n", rtw_read32(Adapter, 0x284));
-                                               DBG_871X_LEVEL(_drv_always_, "0x11c 0x%08x\n", rtw_read32(Adapter, 0x11c));
-                                               DBG_871X_LEVEL(_drv_always_, "0x1c4 0x%08x\n", rtw_read32(Adapter, 0x1c4));
-                                               DBG_871X_LEVEL(_drv_always_, "0x690 0x%08x\n", rtw_read32(Adapter, 0x690));
-                                               trycnt --;
-                                               rtw_msleep_os(20);
-                                       }
-
-                                       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);
-                                       //rtw_msleep_os(10);
-                                       break;
-                               case WOWLAN_DISABLE:
-                                       trycnt = 10;
-                                       
-                                       DBG_871X_LEVEL(_drv_always_, "WOWLAN_DISABLE\n");
-                                       rtl8188e_set_FwJoinBssReport_cmd(Adapter, 0);
-                                       
-#ifndef DYNAMIC_CAMID_ALLOC
-                                       rtw_write8(     Adapter, REG_SECCFG, 0x0c|BIT(5));// enable tx enc and rx dec engine, and no key search for MC/BC
-                                       DBG_871X_LEVEL(_drv_always_, "REG_SECCFG: %02x\n", rtw_read8(Adapter, REG_SECCFG));
-#endif
-
-                                       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);
-                                       //rtl8188es_set_wowlan_cmd(Adapter, 0);
-                                       rtl8188es_set_wowlan_ctrl_cmd(Adapter, 0);
-                                       rtl8188es_set_global_info_cmd(Adapter, 0);
-                                       rtl8188es_set_keep_alive_cmd(Adapter, 0);
-                                       rtl8188es_set_disconnect_decision_cmd(Adapter, 0);
-                                       rtl8188es_set_remote_wake_ctrl_cmd(Adapter, 0);
-
-                                       mstatus = rtw_read8(Adapter, REG_WOW_CTRL);
-                                       DBG_871X_LEVEL(_drv_info_, "%s mstatus:0x%02x\n", __func__, mstatus);
-
-                                       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);
-                                               DBG_871X_LEVEL(_drv_always_, "0x284 0x%08x\n", rtw_read32(Adapter, 0x284));
-                                               DBG_871X_LEVEL(_drv_always_, "0x11c 0x%08x\n", rtw_read32(Adapter, 0x11c));
-                                               DBG_871X_LEVEL(_drv_always_, "0x1c4 0x%08x\n", rtw_read32(Adapter, 0x1c4));
-                                               DBG_871X_LEVEL(_drv_always_, "0x690 0x%08x\n", rtw_read32(Adapter, 0x690));
-                                               trycnt --;
-                                               rtw_msleep_os(2);
-                                       }
-
-                                       if (mstatus & BIT1) {
-                                               DBG_871X_LEVEL(_drv_always_, "Disable WOW mode fail!!\n");
-                                               DBG_871X("Set 0x690=0x00\n");
-                                               rtw_write8(Adapter, REG_WOW_CTRL, (rtw_read8(Adapter, REG_WOW_CTRL)&0xf0));
-                                               DBG_871X_LEVEL(_drv_always_, "Release RXDMA\n");
-                                               rtw_write32(Adapter, REG_RXPKT_NUM,(rtw_read32(Adapter,REG_RXPKT_NUM)&(~RW_RELEASE_EN)));
-                                       }
-
-                                       //enable TX Report, only use in 88e
-                                       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));
-
-                                       // 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);
-
-                                       SetFwRelatedForWoWLAN8188ES(Adapter, _FALSE);
-#ifdef CONFIG_GPIO_WAKEUP
-                                       DBG_871X_LEVEL(_drv_always_, "Set Wake GPIO to high for default.\n");
-                                       HalSetOutPutGPIO(Adapter, WAKEUP_GPIO_IDX, 1);
-#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))
-                                               rtl8188e_set_FwJoinBssReport_cmd(Adapter, 1);
-
-                                       rtw_msleep_os(5);
-
-                                       break;
-                               default:
-                                       break;
-                       }
-               }
-               break;
-#endif //CONFIG_WOWLAN
-               case HW_VAR_APFM_ON_MAC:
-                       pHalData->bMacPwrCtrlOn = *val;
-                       DBG_871X("%s: bMacPwrCtrlOn=%d\n", __func__, pHalData->bMacPwrCtrlOn);
-                       break;
-#if (RATE_ADAPTIVE_SUPPORT == 1)
-               case HW_VAR_TX_RPT_MAX_MACID:
-                       {
-                               u8 maxMacid = *val;
-                               DBG_8192C("### MacID(%d),Set Max Tx RPT MID(%d)\n",maxMacid,maxMacid+1);
-                               rtw_write8(Adapter, REG_TX_RPT_CTRL+1, maxMacid+1);
-                       }
-                       break;
-#endif //  (RATE_ADAPTIVE_SUPPORT == 1)                
-               case HW_VAR_H2C_MEDIA_STATUS_RPT:
-                       {                               
-                               rtl8188e_set_FwMediaStatus_cmd(Adapter , (*(u16 *)val));
-                       }
-                       break;
-               case HW_VAR_BCN_VALID:
-                       //BCN_VALID, BIT16 of REG_TDECTRL = BIT0 of REG_TDECTRL+2, write 1 to clear, Clear by sw
-                       rtw_write8(Adapter, REG_TDECTRL+2, rtw_read8(Adapter, REG_TDECTRL+2) | BIT0); 
-                       break;
-               default:
-                       SetHwReg8188E(Adapter, variable, val);
-                       break;
-       }
-
-_func_exit_;
-}
-
-static void GetHwReg8188ES(PADAPTER padapter, u8 variable, u8 *val)
-{
-       PHAL_DATA_TYPE  pHalData= GET_HAL_DATA(padapter);
-       DM_ODM_T                *podmpriv = &pHalData->odmpriv;
-_func_enter_;
-
-       switch (variable)
-       {
-               case HW_VAR_CPWM:
-                       *val = rtw_read8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HCPWM1);
-                       break;
-               case HW_VAR_TXPAUSE:
-                       val[0] = rtw_read8(padapter, REG_TXPAUSE);
-                       break;
-
-               case HW_VAR_BCN_VALID:
-                       //BCN_VALID, BIT16 of REG_TDECTRL = BIT0 of REG_TDECTRL+2
-                       val[0] = (BIT0 & rtw_read8(padapter, REG_TDECTRL+2))?_TRUE:_FALSE;
-                       break;
-
-               case HW_VAR_FWLPS_RF_ON:
-                       {
-                               //When we halt NIC, we should check if FW LPS is leave.                         
-                               if ((padapter->bSurpriseRemoved == _TRUE) ||
-                                       (adapter_to_pwrctl(padapter)->rf_pwrstate == rf_off))
-                               {
-                                       // If it is in HW/SW Radio OFF or IPS state, we do not check Fw LPS Leave,
-                                       // because Fw is unload.
-                                       val[0] = _TRUE;
-                               }
-                               else
-                               {
-                                       u32     valRCR;
-                                       valRCR = rtw_read32(padapter, REG_RCR);
-                                       valRCR &= 0x00070000;
-                                       if(valRCR)
-                                               val[0] = _FALSE;
-                                       else
-                                               val[0] = _TRUE;
-                               }
-                       }
-                       break;
-#ifdef CONFIG_ANTENNA_DIVERSITY
-               case HW_VAR_CURRENT_ANTENNA:
-                       val[0] = pHalData->CurAntenna;
-                       break;
-#endif
-               case HW_VAR_EFUSE_BYTES: // To get EFUE total used bytes, added by Roger, 2008.12.22.
-                       *((u16*)val) = pHalData->EfuseUsedBytes;
-                       break;
-
-               case HW_VAR_APFM_ON_MAC:
-                       *val = pHalData->bMacPwrCtrlOn;
-                       break;
-               case HW_VAR_CHK_HI_QUEUE_EMPTY:
-                       *val = ((rtw_read32(padapter, REG_HGQ_INFORMATION)&0x0000ff00)==0) ? _TRUE:_FALSE;
-                       break;
-               default:
-                       GetHwReg8188E(padapter, variable, val);
-                       break;
-       }
-
-_func_exit_;
-}
-
-//
-//     Description:
-//             Query setting of specified variable.
-//
-u8
-GetHalDefVar8188ESDIO(
-       IN      PADAPTER                                Adapter,
-       IN      HAL_DEF_VARIABLE                eVariable,
-       IN      PVOID                                   pValue
-       )
-{
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);      
-       u8                      bResult = _SUCCESS;
-
-       switch(eVariable)
-       {
-               case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
-                       {
-                               struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
-                               struct sta_priv * pstapriv = &Adapter->stapriv;
-                               struct sta_info * psta;
-                               psta = rtw_get_stainfo(pstapriv, pmlmepriv->cur_network.network.MacAddress);
-                               if(psta)
-                               {
-                                       *((int *)pValue) = psta->rssi_stat.UndecoratedSmoothedPWDB;     
-                               }
-                       }
-
-                       break;
-               case HAL_DEF_IS_SUPPORT_ANT_DIV:
-                       #ifdef CONFIG_ANTENNA_DIVERSITY
-                       *((u8 *)pValue) = (pHalData->AntDivCfg==0)?_FALSE:_TRUE;
-                       #endif
-                       break;
-               case HAL_DEF_CURRENT_ANTENNA:
-#ifdef CONFIG_ANTENNA_DIVERSITY
-                       *(( u8*)pValue) = pHalData->CurAntenna;
-#endif
-                       break;
-               case HAL_DEF_DRVINFO_SZ:
-                       *(( u32*)pValue) = DRVINFO_SZ;
-                       break;  
-               case HAL_DEF_MAX_RECVBUF_SZ:
-                       *(( u32*)pValue) = MAX_RECVBUF_SZ;
-                       break;
-               case HAL_DEF_RX_PACKET_OFFSET:
-                       *(( u32*)pValue) = RXDESC_SIZE + DRVINFO_SZ;
-                       break;  
-#if (RATE_ADAPTIVE_SUPPORT == 1)
-               case HAL_DEF_RA_DECISION_RATE:
-                       {
-                               u8 MacID = *((u8*)pValue);
-                               *((u8*)pValue) = ODM_RA_GetDecisionRate_8188E(&(pHalData->odmpriv), MacID);
-                       }
-                       break;
-               
-               case HAL_DEF_RA_SGI:
-                       {
-                               u8 MacID = *((u8*)pValue);
-                               *((u8*)pValue) = ODM_RA_GetShortGI_8188E(&(pHalData->odmpriv), MacID);
-                       }
-                       break;          
-#endif
-
-
-               case HAL_DEF_PT_PWR_STATUS:
-#if(POWER_TRAINING_ACTIVE==1)  
-                       {
-                               u8 MacID = *((u8*)pValue);
-                               *((u8*)pValue) = ODM_RA_GetHwPwrStatus_8188E(&(pHalData->odmpriv), MacID);
-                       }
-#endif //(POWER_TRAINING_ACTIVE==1)
-                       break;          
-
-               case HW_VAR_MAX_RX_AMPDU_FACTOR:
-                       *(HT_CAP_AMPDU_FACTOR*)pValue = MAX_AMPDU_FACTOR_16K;
-                       break;
-
-               case HAL_DEF_TX_LDPC:
-               case HAL_DEF_RX_LDPC:
-                       *((u8 *)pValue) = _FALSE;
-                       break;
-               case HAL_DEF_TX_STBC:
-                       *((u8 *)pValue) = 0;
-                       break;
-               case HAL_DEF_RX_STBC:
-                       *((u8 *)pValue) = 1;
-                       break;
-               case HAL_DEF_EXPLICIT_BEAMFORMEE:
-               case HAL_DEF_EXPLICIT_BEAMFORMER:
-                       *((u8 *)pValue) = _FALSE;
-                       break;
-
-               case HW_DEF_RA_INFO_DUMP:
-#if (RATE_ADAPTIVE_SUPPORT == 1)       
-                       {
-                               u8 mac_id = *((u8*)pValue);                             
-                               u8                      bLinked = _FALSE;
-#ifdef CONFIG_CONCURRENT_MODE
-                               PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;
-#endif //CONFIG_CONCURRENT_MODE
-
-                               if(rtw_linked_check(Adapter))
-                                       bLinked = _TRUE;
-               
-#ifdef CONFIG_CONCURRENT_MODE
-                               if(pbuddy_adapter && rtw_linked_check(pbuddy_adapter))
-                                       bLinked = _TRUE;
-#endif                 
-                               
-                               if(bLinked){                                    
-                                       DBG_871X("============ RA status - Mac_id:%d ===================\n",mac_id);                                    
-                                       DBG_8192C("Mac_id:%d ,RSSI:%d(%%) ,PTStage = %d\n",
-                                               mac_id,pHalData->odmpriv.RAInfo[mac_id].RssiStaRA,pHalData->odmpriv.RAInfo[mac_id].PTStage);                                                    
-
-                                       DBG_8192C("RateID = %d,RAUseRate = 0x%08x,RateSGI = %d, DecisionRate = %s\n",
-                                               pHalData->odmpriv.RAInfo[mac_id].RateID,
-                                               pHalData->odmpriv.RAInfo[mac_id].RAUseRate,
-                                               pHalData->odmpriv.RAInfo[mac_id].RateSGI,
-                                               HDATA_RATE(pHalData->odmpriv.RAInfo[mac_id].DecisionRate));                             
-                               }
-                       }
-#endif // (RATE_ADAPTIVE_SUPPORT == 1)
-                       break;
-
-               default:
-                       bResult = GetHalDefVar(Adapter, eVariable, pValue);
-                       break;
-       }
-
-       return bResult;
+       return bResult;
 }
 
 
@@ -4104,20 +2686,6 @@ void rtl8188es_set_hal_ops(PADAPTER padapter)
 
 _func_enter_;
 
-
-#ifdef CONFIG_CONCURRENT_MODE
-       if(padapter->isprimary)
-#endif //CONFIG_CONCURRENT_MODE
-       {
-               //set hardware operation functions
-               padapter->HalData = rtw_zvmalloc(sizeof(HAL_DATA_TYPE));
-               if(padapter->HalData == NULL){
-                       DBG_8192C("cant not alloc memory for HAL DATA \n");
-               }
-       }
-
-       padapter->hal_data_sz = sizeof(HAL_DATA_TYPE);
-
        pHalFunc->hal_power_on = _InitPowerOn_8188ES;
        pHalFunc->hal_power_off = hal_poweroff_8188es;
        
index 763cceadf4b60ef07036e5ceb91796b0457df7d8..2ef34ed802d37333d27cff1b2a6154ffbc8d0f06 100644 (file)
 #define                bMaskHWord                              0xffff0000\r
 #define                bMaskLWord                              0x0000ffff\r
 #define                bMaskDWord                              0xffffffff\r
+#define                bMaskH3Bytes                            0xffffff00\r
 #define                bMask12Bits                             0xfff   \r
 #define                bMaskH4Bits                             0xf0000000      \r
 #define                bMaskOFDM_D                     0xffc00000\r
index e4e977c67fbbe9111d375708f681b77ce2360b30..1c7cd5d1ed1eb0059d8719953b1e5a3ec0a5b326 100644 (file)
 #define                bMaskHWord              0xffff0000
 #define                bMaskLWord                      0x0000ffff
 #define                bMaskDWord              0xffffffff
+#define                bMaskH3Bytes            0xffffff00
 #define                bMask12Bits                     0xfff
 #define                bMaskH4Bits                     0xf0000000      
 #define                bMaskOFDM_D             0xffc00000
index fb32eacd90ae300c8b8b87ff64c25b59dd718b75..b5af827275de7a5efecca52f16ab6d0e30abf8c3 100644 (file)
 #define                RF_TX_G3                                        0x22    // 
 
 #define                RF_TX_BB1                                       0x23    // 
-
+#define                RF_T_METER_92D                  0x42
 #define                RF_T_METER                                      0x42    // 
 
 #define                RF_SYN_G1                                       0x25    // RF TX Power control
 #define                bMaskHWord              0xffff0000
 #define                bMaskLWord                      0x0000ffff
 #define                bMaskDWord              0xffffffff
+#define                bMaskH3Bytes            0xffffff00
 #define                bMask12Bits                     0xfff
 #define                bMaskH4Bits                     0xf0000000      
 #define                bMaskOFDM_D             0xffc00000
index d76863be2fae6f6595d788998d17a96a8bf370c1..a11804197d4bd372907509c8063abb039a125ad4 100644 (file)
@@ -139,8 +139,7 @@ PHY_SetSwChnlBWMode8192E(
 \r
 void \r
 phy_SpurCalibration_8192E(\r
-       IN      PADAPTER                        Adapter,\r
-       IN      SPUR_CAL_METHOD Method\r
+       IN      PADAPTER                        Adapter\r
 );\r
 //\r
 // BB/MAC/RF other monitor API\r
index 0621fb96fb18e2a01a6a88056712e8bdd2bf3262..02a3f865a96b7c067f2374b3fbff1653c7d462de 100644 (file)
 \r
 #define                RF_TX_BB1                                       0x23    // \r
 \r
-//#if HARDWARE_TYPE_IS_RTL8192D        == 1\r
-#define                RF_T_METER_92D                                  0x42    // \r
-//#else\r
-#define                RF_T_METER_88E                                  0x42    // \r
+#define                RF_T_METER_8192E                        0x42    // \r
+#define                RF_T_METER_88E                          0x42    //\r
 #define                RF_T_METER                                      0x24    // \r
 \r
 //#endif\r
 #define                bMaskHWord                              0xffff0000\r
 #define                bMaskLWord                              0x0000ffff\r
 #define                bMaskDWord                              0xffffffff\r
+#define                bMaskH3Bytes                            0xffffff00\r
 #define                bMask12Bits                             0xfff   \r
 #define                bMaskH4Bits                             0xf0000000      \r
 #define                bMaskOFDM_D                     0xffc00000\r
index 5125e227dc235248ebc7f2b1dd842c0cb70ee8ff..929718951f797448281cfe8b4487dbb6ec1b3e5d 100644 (file)
 #define rFPGA0_AdDaClockEn                     0x888   // enable ad/da clock1 for dual-phy\r
 #define rFPGA0_AnalogParameter4        0x88c\r
 #define rFPGA0_XB_LSSIReadBack         0x8a4\r
+#define rFPGA0_XCD_RFPara      0x8b4\r
+\r
 //\r
 // 4. Page9(0x900)\r
 //\r
 //\r
 #define rCCK0_System                           0xa00\r
 #define rCCK0_AFESetting                               0xa04   // Disable init gain now // Select RX path by RSSI\r
+#define        rCCK0_DSPParameter2                     0xa1c   //SQ threshold\r
 #define rCCK0_TxFilter1                                0xa20\r
 #define rCCK0_TxFilter2                                0xa24\r
 #define rCCK0_DebugPort                                0xa28   //debug port and Tx filter3\r
+#define        rCCK0_FalseAlarmReport                  0xa2c   //0xa2d useless now 0xa30-a4f channel report\r
 \r
 //\r
 // PageB(0xB00)\r
 #define bMaskHWord                     0xffff0000\r
 #define bMaskLWord                             0x0000ffff\r
 #define bMaskDWord                     0xffffffff\r
+#define bMaskH3Bytes                           0xffffff00\r
 #define bMask12Bits                            0xfff   \r
 #define bMaskH4Bits                            0xf0000000      \r
 #define bMaskOFDM_D                    0xffc00000\r
index 0d0c2f76775c83f301d399eaddd8e82ee2f73f39..5d6a7ad22b6f70f9583980ae6fbf40b03f48cbd1 100644 (file)
@@ -61,7 +61,7 @@
        /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/                                                         \\r
        {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/     \\r
        {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1    power ready*/    \\r
-       {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/ \\r
+       /*{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0}, disable HWPDN 0x04[15]=0*/ \\r
        {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, 0},/* disable WL suspend*/    \\r
        {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/     \\r
        {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/\r
@@ -76,7 +76,7 @@
        {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},  /* Whole BB is reset*/                   \\r
        /*{0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},//0x1F[7:0] = 0 turn off RF*/    \\r
        /*{0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},//0x4C[23] = 0x4E[7] = 0, switch DPDT_SEL_P output from register 0x65[2] */      \\r
-       {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x28}, /* 0x07[7:0] = 0x28 sps pwm mode */    \\r
+       {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x2A}, /* 0x07[7:0] = 0x28 sps pwm mode 0x2a for BT coex*/    \\r
        {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x02, 0},/*0x8[1] = 0 ANA clk =500k */      \\r
        /*{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0|BIT1, 0}, //  0x02[1:0] = 0  reset BB */     \\r
        {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/       \\r
index 052011111b29900843916dd5610973446ce16b83..8b9b838615e43fb9520c5109287128f9de153a42 100644 (file)
-/******************************************************************************\r
- *\r
- * Copyright(c) 2010 - 2012 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
- * Automatically generated C config: don't edit\r
- */\r
-//***** temporarily flag *******\r
-#define CONFIG_SINGLE_IMG\r
-\r
-//***** temporarily flag *******\r
-\r
-//***** temporarily flag *******\r
-\r
-\r
-#define AUTOCONF_INCLUDED\r
-#define RTL871X_MODULE_NAME "8189ES"\r
-#define DRV_NAME "rtl8189es"\r
-#define EFUSE_MAP_PATH "/system/etc/wifi/wifi_efuse_8189e.map"\r
-#define WIFIMAC_PATH "/data/wifimac.txt"\r
-\r
-#define CONFIG_SDIO_HCI\r
-#define PLATFORM_LINUX\r
-\r
-//#define CONFIG_IOCTL_CFG80211\r
-\r
-#ifdef CONFIG_IOCTL_CFG80211\r
-       //#define RTW_USE_CFG80211_STA_EVENT /* Indecate new sta asoc through cfg80211_new_sta */\r
-       #define CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER\r
-       //#define CONFIG_DEBUG_CFG80211\r
-       #define CONFIG_SET_SCAN_DENY_TIMER\r
-#endif\r
-\r
-#define CONFIG_EMBEDDED_FWIMG\r
-//#define CONFIG_FILE_FWIMG\r
-\r
-#define CONFIG_XMIT_ACK\r
-#ifdef CONFIG_XMIT_ACK\r
-       #define CONFIG_ACTIVE_KEEP_ALIVE_CHECK\r
-#endif\r
-#define CONFIG_80211N_HT\r
-#define CONFIG_RECV_REORDERING_CTRL\r
-\r
-//#define CONFIG_CONCURRENT_MODE\r
-#ifdef CONFIG_CONCURRENT_MODE\r
-       #define CONFIG_TSF_RESET_OFFLOAD                // For 2 PORT TSF SYNC.\r
-       //#define CONFIG_HWPORT_SWAP                            //Port0->Sec , Port1 -> Pri\r
-       #define CONFIG_RUNTIME_PORT_SWITCH\r
-       //#define DBG_RUNTIME_PORT_SWITCH\r
-       #define CONFIG_STA_MODE_SCAN_UNDER_AP_MODE\r
-#endif\r
-\r
-#define CONFIG_AP_MODE\r
-#ifdef CONFIG_AP_MODE\r
-\r
-       #define CONFIG_INTERRUPT_BASED_TXBCN // Tx Beacon when driver early interrupt occurs    \r
-       #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_INTERRUPT_BASED_TXBCN)\r
-               #undef CONFIG_INTERRUPT_BASED_TXBCN\r
-       #endif\r
-       #ifdef CONFIG_INTERRUPT_BASED_TXBCN\r
-               //#define CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT\r
-               #define CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR         \r
-       #endif\r
-       \r
-       #define CONFIG_NATIVEAP_MLME\r
-       #ifndef CONFIG_NATIVEAP_MLME\r
-               #define CONFIG_HOSTAPD_MLME\r
-       #endif\r
-       #define CONFIG_FIND_BEST_CHANNEL\r
-       //#define CONFIG_NO_WIRELESS_HANDLERS\r
-#endif\r
-\r
-#define CONFIG_TX_MCAST2UNI            // Support IP multicast->unicast\r
-//#define CONFIG_CHECK_AC_LIFETIME     // Check packet lifetime of 4 ACs.\r
-\r
-#define CONFIG_P2P\r
-#ifdef CONFIG_P2P\r
-       //The CONFIG_WFD is for supporting the Wi-Fi display\r
-       #define CONFIG_WFD\r
-       \r
-       #ifndef CONFIG_WIFI_TEST\r
-               #define CONFIG_P2P_REMOVE_GROUP_INFO\r
-       #endif\r
-       //#define CONFIG_DBG_P2P\r
-\r
-       #define CONFIG_P2P_PS\r
-       //#define CONFIG_P2P_IPS\r
-       #define CONFIG_P2P_OP_CHK_SOCIAL_CH\r
-       #define CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT  //replace CONFIG_P2P_CHK_INVITE_CH_LIST flag\r
-       #define CONFIG_P2P_INVITE_IOT\r
-#endif\r
-\r
-//     Added by Kurt 20110511\r
-//#define CONFIG_TDLS\r
-#ifdef CONFIG_TDLS\r
-//     #ifndef CONFIG_WFD\r
-//             #define CONFIG_WFD      \r
-//     #endif\r
-//     #define CONFIG_TDLS_AUTOSETUP                   \r
-//     #define CONFIG_TDLS_AUTOCHECKALIVE              \r
-#endif\r
-\r
-#define CONFIG_SKB_COPY        //for amsdu\r
-\r
-#define CONFIG_LAYER2_ROAMING\r
-#define CONFIG_LAYER2_ROAMING_RESUME\r
-\r
-#define CONFIG_LONG_DELAY_ISSUE\r
-#define CONFIG_NEW_SIGNAL_STAT_PROCESS\r
-#define RTW_NOTCH_FILTER 0 /* 0:Disable, 1:Enable, */\r
-#define CONFIG_DEAUTH_BEFORE_CONNECT\r
-\r
-/*\r
- * Hardware Related Config\r
- */\r
-\r
-//#define SUPPORT_HW_RFOFF_DETECTED\r
-\r
-//#define CONFIG_SW_LED\r
-\r
-/*\r
- * Interface Related Config\r
- */\r
-#define CONFIG_TX_AGGREGATION\r
-//#define CONFIG_SDIO_TX_TASKLET\r
-#define CONFIG_SDIO_RX_COPY\r
-#define CONFIG_SDIO_TX_ENABLE_AVAL_INT\r
-\r
-/*\r
- * Others\r
- */\r
-//#define CONFIG_MAC_LOOPBACK_DRIVER\r
-\r
-\r
-/*\r
- * Auto Config Section\r
- */\r
-#if defined(CONFIG_RTL8188E) && defined(CONFIG_SDIO_HCI)\r
-#define CONFIG_RTL8188E_SDIO \r
-#define CONFIG_XMIT_THREAD_MODE\r
-#endif\r
-\r
-#define CONFIG_IPS\r
-#define CONFIG_LPS\r
-#if defined(CONFIG_LPS) && defined(CONFIG_SDIO_HCI)\r
-#define CONFIG_LPS_LCLK\r
-\r
-#ifdef CONFIG_LPS_LCLK\r
-#define LPS_RPWM_WAIT_MS 300\r
-\r
-//#define CONFIG_DETECT_CPWM_BY_POLLING\r
-//#define CONFIG_LPS_RPWM_TIMER\r
-\r
-#if defined(CONFIG_LPS_RPWM_TIMER) || defined(CONFIG_DETECT_CPWM_BY_POLLING)\r
-#define LPS_RPWM_WAIT_MS 300\r
-#endif\r
-//#define CONFIG_LPS_LCLK_WD_TIMER // Watch Dog timer in LPS LCLK\r
-#endif\r
-       \r
-#endif\r
-\r
-#ifdef CONFIG_MAC_LOOPBACK_DRIVER\r
-#undef CONFIG_AP_MODE\r
-#undef CONFIG_NATIVEAP_MLME\r
-#undef CONFIG_POWER_SAVING\r
-#undef SUPPORT_HW_RFOFF_DETECTED\r
-#endif\r
-\r
-#ifdef CONFIG_MP_INCLUDED\r
-\r
-       #define MP_DRIVER               1\r
-       #define CONFIG_MP_IWPRIV_SUPPORT\r
-\r
-       // disable unnecessary functions for MP\r
-       //#undef CONFIG_IPS\r
-       //#undef CONFIG_LPS\r
-       //#undef CONFIG_LPS_LCLK\r
-       //#undef SUPPORT_HW_RFOFF_DETECTED\r
-\r
-#else// #ifdef CONFIG_MP_INCLUDED\r
-\r
-       #define MP_DRIVER               0\r
-       \r
-#endif // #ifdef CONFIG_MP_INCLUDED\r
-\r
-#define CONFIG_IOL\r
-#ifdef CONFIG_IOL\r
-       #define CONFIG_IOL_NEW_GENERATION\r
-       #define CONFIG_IOL_READ_EFUSE_MAP\r
-       //#define DBG_IOL_READ_EFUSE_MAP\r
-       //#define CONFIG_IOL_LLT\r
-       #define CONFIG_IOL_EFUSE_PATCH\r
-       //#define CONFIG_IOL_IOREG_CFG\r
-       //#define CONFIG_IOL_IOREG_CFG_DBG\r
-#endif\r
-\r
-\r
-#ifdef CONFIG_PLATFORM_ACTIONS_ATV5201\r
-#define CONFIG_SDIO_DISABLE_RXFIFO_POLLING_LOOP \r
-#endif\r
-\r
-/*\r
- * Outsource  Related Config\r
- */\r
-\r
-#define        RTL8192CE_SUPPORT                               0\r
-#define        RTL8192CU_SUPPORT                       0\r
-#define        RTL8192C_SUPPORT                                (RTL8192CE_SUPPORT|RTL8192CU_SUPPORT)   \r
-\r
-#define        RTL8192DE_SUPPORT                               0\r
-#define        RTL8192DU_SUPPORT                       0\r
-#define        RTL8192D_SUPPORT                                (RTL8192DE_SUPPORT|RTL8192DU_SUPPORT)   \r
-\r
-#define        RTL8723_FPGA_VERIFICATION               0\r
-#define        RTL8723AU_SUPPORT                               0\r
-#define        RTL8723AS_SUPPORT                               0\r
-#define        RTL8723AE_SUPPORT                               0\r
-#define        RTL8723A_SUPPORT                                (RTL8723AU_SUPPORT|RTL8723AS_SUPPORT|RTL8723AE_SUPPORT)\r
-\r
-#define RTL8188EE_SUPPORT                              0\r
-#define RTL8188EU_SUPPORT                              0\r
-#define RTL8188ES_SUPPORT                              1\r
-#define RTL8188E_SUPPORT                               (RTL8188EE_SUPPORT|RTL8188EU_SUPPORT|RTL8188ES_SUPPORT)\r
-#define TESTCHIP_SUPPORT                       0\r
-\r
-#define RTL8812E_SUPPORT                               0\r
-#define RTL8812AU_SUPPORT                              0\r
-#define RTL8812A_SUPPORT                               (RTL8812E_SUPPORT|RTL8812AU_SUPPORT)\r
-\r
-#define RTL8821A_SUPPORT                               0\r
-\r
-#define RTL8723B_SUPPORT                               0\r
-\r
-#define RTL8192E_SUPPORT                               0\r
-\r
-#define RTL8813A_SUPPORT                               0\r
-\r
-//#if (RTL8188E_SUPPORT==1)\r
-#define RATE_ADAPTIVE_SUPPORT                  1\r
-#define POWER_TRAINING_ACTIVE                  1\r
-//#define      CONFIG_TX_EARLY_MODE\r
-\r
-#ifdef CONFIG_TX_EARLY_MODE\r
-#define        RTL8188E_EARLY_MODE_PKT_NUM_10  0\r
-#endif\r
-//#endif\r
-\r
-#define CONFIG_ATTEMPT_TO_FIX_AP_BEACON_ERROR\r
-\r
-#ifdef CONFIG_GPIO_WAKEUP\r
-#define WAKEUP_GPIO_IDX 7\r
-#endif\r
-\r
-#define CONFIG_GPIO_API\r
-/*\r
- * HAL Related Config\r
- */\r
-\r
-//for FPGA VERIFICATION config\r
-#define RTL8188E_FPGA_TRUE_PHY_VERIFICATION 0\r
-\r
-#define DISABLE_BB_RF  0\r
-\r
-#define CONFIG_RF_GAIN_OFFSET\r
-#define CONFIG_80211D\r
-\r
-#define CONFIG_ARP_KEEP_ALIVE\r
-\r
-/*\r
- * Debug Related Config\r
- */\r
-#define DBG    0\r
-\r
-#define CONFIG_DEBUG /* DBG_871X, etc... */\r
-//#define CONFIG_DEBUG_RTL871X /* RT_TRACE, RT_PRINT_DATA, _func_enter_, _func_exit_ */\r
-\r
-#define CONFIG_PROC_DEBUG\r
-\r
-#define DBG_CONFIG_ERROR_DETECT\r
-#define DBG_CONFIG_ERROR_RESET\r
-\r
-//#define CONFIG_DISABLE_ODM\r
-\r
-//#define DBG_IO\r
-//#define DBG_DELAY_OS\r
-//#define DBG_MEM_ALLOC\r
-//#define DBG_IOCTL\r
-\r
-//#define DBG_TX\r
-//#define DBG_XMIT_BUF\r
-//#define DBG_XMIT_BUF_EXT\r
-//#define DBG_TX_DROP_FRAME\r
-\r
-//#define DBG_RX_DROP_FRAME\r
-//#define DBG_RX_SEQ\r
-//#define DBG_RX_SIGNAL_DISPLAY_PROCESSING\r
-//#define DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED "jeff-ap"\r
-\r
-\r
-//#define HAL_8195A_USB 0\r
-\r
-//#define RTL8188E_FOR_MP_TEST 1\r
-\r
-//#define DOWNLOAD_FW_TO_TXPKT_BUF 0\r
-\r
-//#define DBG_HAL_INIT_PROFILING\r
-\r
+/******************************************************************************
+ *
+ * Copyright(c) 2010 - 2012 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
+ *
+ *
+ ******************************************************************************/
+/*
+ * Automatically generated C config: don't edit
+ */
+//***** temporarily flag *******
+#define CONFIG_SINGLE_IMG
+
+//***** temporarily flag *******
+
+//***** temporarily flag *******
+
+
+#define AUTOCONF_INCLUDED
+#define RTL871X_MODULE_NAME "8189ES"
+#define DRV_NAME "rtl8189es"
+
+#ifdef CONFIG_EFUSE_CONFIG_FILE
+#ifndef EFUSE_MAP_PATH
+#define EFUSE_MAP_PATH "/system/etc/wifi/wifi_efuse_8189e.map"
+#endif //EFUSE_MAP_PATH
+#endif
+
+#define CONFIG_SDIO_HCI
+#define PLATFORM_LINUX
+
+#define CONFIG_IOCTL_CFG80211
+
+#ifdef CONFIG_IOCTL_CFG80211
+       #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_SET_SCAN_DENY_TIMER
+#endif
+
+#define CONFIG_EMBEDDED_FWIMG
+//#define CONFIG_FILE_FWIMG
+
+#define CONFIG_XMIT_ACK
+#ifdef CONFIG_XMIT_ACK
+       #define CONFIG_ACTIVE_KEEP_ALIVE_CHECK
+#endif
+#define CONFIG_80211N_HT
+#define CONFIG_RECV_REORDERING_CTRL
+
+#define CONFIG_CONCURRENT_MODE
+#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
+#endif
+
+#define CONFIG_AP_MODE
+#ifdef CONFIG_AP_MODE
+
+       #define CONFIG_INTERRUPT_BASED_TXBCN // Tx Beacon when driver early 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
+       #endif
+       //#define CONFIG_FIND_BEST_CHANNEL
+       //#define CONFIG_NO_WIRELESS_HANDLERS
+#endif
+
+#define CONFIG_TX_MCAST2UNI            // Support IP multicast->unicast
+//#define CONFIG_CHECK_AC_LIFETIME     // Check packet lifetime of 4 ACs.
+
+#define CONFIG_P2P
+#ifdef CONFIG_P2P
+       //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_CFG80211_ONECHANNEL_UNDER_CONCURRENT  //replace CONFIG_P2P_CHK_INVITE_CH_LIST flag
+       #define CONFIG_P2P_INVITE_IOT
+#endif
+
+//     Added by Kurt 20110511
+//#define CONFIG_TDLS
+#ifdef CONFIG_TDLS
+//     #ifndef CONFIG_WFD
+//             #define CONFIG_WFD      
+//     #endif
+//     #define CONFIG_TDLS_AUTOSETUP                   
+//     #define CONFIG_TDLS_AUTOCHECKALIVE              
+#endif
+
+#define CONFIG_SKB_COPY        //for amsdu
+
+#define CONFIG_LAYER2_ROAMING
+#define CONFIG_LAYER2_ROAMING_RESUME
+
+#define CONFIG_LONG_DELAY_ISSUE
+#define CONFIG_NEW_SIGNAL_STAT_PROCESS
+#define RTW_NOTCH_FILTER 0 /* 0:Disable, 1:Enable, */
+#define CONFIG_DEAUTH_BEFORE_CONNECT
+
+/*
+ * Hardware Related Config
+ */
+
+//#define SUPPORT_HW_RFOFF_DETECTED
+
+//#define CONFIG_SW_LED
+
+/*
+ * Interface Related Config
+ */
+#define CONFIG_TX_AGGREGATION
+//#define CONFIG_SDIO_TX_TASKLET
+#define CONFIG_SDIO_RX_COPY
+#define CONFIG_SDIO_TX_ENABLE_AVAL_INT
+
+/*
+ * Others
+ */
+//#define CONFIG_MAC_LOOPBACK_DRIVER
+
+
+/*
+ * Auto Config Section
+ */
+#if defined(CONFIG_RTL8188E) && defined(CONFIG_SDIO_HCI)
+#define CONFIG_RTL8188E_SDIO 
+#define CONFIG_XMIT_THREAD_MODE
+#endif
+
+#define CONFIG_IPS
+#define CONFIG_LPS
+#if defined(CONFIG_LPS) && defined(CONFIG_SDIO_HCI)
+#define CONFIG_LPS_LCLK
+
+#ifdef CONFIG_LPS_LCLK
+#define LPS_RPWM_WAIT_MS 300
+
+//#define CONFIG_DETECT_CPWM_BY_POLLING
+//#define CONFIG_LPS_RPWM_TIMER
+
+#if defined(CONFIG_LPS_RPWM_TIMER) || defined(CONFIG_DETECT_CPWM_BY_POLLING)
+#define LPS_RPWM_WAIT_MS 300
+#endif
+//#define CONFIG_LPS_LCLK_WD_TIMER // Watch Dog timer in LPS LCLK
+#endif
+       
+#endif
+
+#ifdef CONFIG_MAC_LOOPBACK_DRIVER
+#undef CONFIG_AP_MODE
+#undef CONFIG_NATIVEAP_MLME
+#undef CONFIG_POWER_SAVING
+#undef SUPPORT_HW_RFOFF_DETECTED
+#endif
+
+#ifdef CONFIG_MP_INCLUDED
+
+       #define MP_DRIVER               1
+       #define CONFIG_MP_IWPRIV_SUPPORT
+
+       // disable unnecessary functions for MP
+       //#undef CONFIG_IPS
+       //#undef CONFIG_LPS
+       //#undef CONFIG_LPS_LCLK
+       //#undef SUPPORT_HW_RFOFF_DETECTED
+
+#else// #ifdef CONFIG_MP_INCLUDED
+
+       #define MP_DRIVER               0
+       
+#endif // #ifdef CONFIG_MP_INCLUDED
+
+#define CONFIG_IOL
+#ifdef CONFIG_IOL
+       #define CONFIG_IOL_NEW_GENERATION
+       #define CONFIG_IOL_READ_EFUSE_MAP
+       //#define DBG_IOL_READ_EFUSE_MAP
+       //#define CONFIG_IOL_LLT
+       #define CONFIG_IOL_EFUSE_PATCH
+       //#define CONFIG_IOL_IOREG_CFG
+       //#define CONFIG_IOL_IOREG_CFG_DBG
+#endif
+
+#ifdef CONFIG_WOWLAN
+#define CONFIG_ARP_KEEP_ALIVE
+#endif
+
+/*
+ * Outsource  Related Config
+ */
+#define TESTCHIP_SUPPORT                               0
+
+#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        RTL8723_FPGA_VERIFICATION               0
+#define        RTL8723AU_SUPPORT                               0
+#define        RTL8723AS_SUPPORT                               0
+#define        RTL8723AE_SUPPORT                               0
+#define        RTL8723A_SUPPORT                                (RTL8723AU_SUPPORT|RTL8723AS_SUPPORT|RTL8723AE_SUPPORT)
+
+#define        RTL8188E_SUPPORT                                1
+#define        RTL8812A_SUPPORT                                0
+#define        RTL8821A_SUPPORT                                0
+#define        RTL8723B_SUPPORT                                0
+#define        RTL8192E_SUPPORT                                0
+#define        RTL8814A_SUPPORT                                0
+#define        RTL8195A_SUPPORT                                0
+
+//#if (RTL8188E_SUPPORT==1)
+#define RATE_ADAPTIVE_SUPPORT                  1
+#define POWER_TRAINING_ACTIVE                  1
+
+//#define      CONFIG_TX_EARLY_MODE
+#ifdef CONFIG_TX_EARLY_MODE
+#define        RTL8188E_EARLY_MODE_PKT_NUM_10  0
+#endif
+//#endif
+
+#define CONFIG_ATTEMPT_TO_FIX_AP_BEACON_ERROR
+
+/*
+ * HAL Related Config
+ */
+
+//for FPGA VERIFICATION config
+#define RTL8188E_FPGA_TRUE_PHY_VERIFICATION 0
+
+#define DISABLE_BB_RF  0
+
+#define CONFIG_RF_GAIN_OFFSET
+#define CONFIG_80211D
+
+#ifdef CONFIG_GPIO_WAKEUP
+#define WAKEUP_GPIO_IDX 7
+#endif
+
+#define CONFIG_GPIO_API
+
+/*
+ * Debug Related Config
+ */
+#define DBG    0
+
+#define CONFIG_DEBUG /* DBG_871X, etc... */
+//#define CONFIG_DEBUG_RTL871X /* RT_TRACE, RT_PRINT_DATA, _func_enter_, _func_exit_ */
+
+#define CONFIG_PROC_DEBUG
+
+#define DBG_CONFIG_ERROR_DETECT
+#define DBG_CONFIG_ERROR_RESET
+
+//#define DBG_IO
+//#define DBG_DELAY_OS
+//#define DBG_MEM_ALLOC
+//#define DBG_IOCTL
+
+//#define DBG_TX
+//#define DBG_XMIT_BUF
+//#define DBG_XMIT_BUF_EXT
+//#define DBG_TX_DROP_FRAME
+
+//#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 DOWNLOAD_FW_TO_TXPKT_BUF 0
+
+//#define DBG_HAL_INIT_PROFILING
+
index a793f208d26cb8e49c2ae73a99c98d8d7d066ca9..09befee9681154cabbfb69837838a456bb53ccdd 100644 (file)
@@ -45,6 +45,7 @@
 //Android expect dbm as the rx signal strength unit
 #define CONFIG_SIGNAL_DISPLAY_DBM
 #endif
+
 /*
 #if defined(CONFIG_HAS_EARLYSUSPEND) && defined (CONFIG_RESUME_IN_WORKQUEUE)
        #warning "You have CONFIG_HAS_EARLYSUSPEND enabled in your system, we disable CONFIG_RESUME_IN_WORKQUEUE automatically"
@@ -56,6 +57,7 @@
        #undef CONFIG_RESUME_IN_WORKQUEUE
 #endif
 */
+
 #ifdef CONFIG_RESUME_IN_WORKQUEUE //this can be removed, because there is no case for this...
        #if !defined( CONFIG_WAKELOCK) && !defined(CONFIG_ANDROID_POWER)
        #error "enable CONFIG_RESUME_IN_WORKQUEUE without CONFIG_WAKELOCK or CONFIG_ANDROID_POWER will suffer from the danger of wifi's unfunctionality..."
 
 #define DYNAMIC_CAMID_ALLOC
 
+#ifndef CONFIG_RTW_HIQ_FILTER
+       #define CONFIG_RTW_HIQ_FILTER 1
+#endif
+
+#ifndef CONFIG_RTW_ADAPTIVITY_EN
+       #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 1dedbad7435f4b3b1eb89b2bbedd05745f510676..b42c42bab9695bbcd4f9a5ac1b13dfcb868ab135 100644 (file)
@@ -60,8 +60,6 @@ enum _NIC_VERSION {
 
 };
 
-#define CONFIG_SUSPEND_REFINE  
-
 typedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER;
 
 #include <rtw_debug.h>
@@ -96,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>
@@ -115,6 +114,10 @@ typedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER;
 #include <rtw_version.h>
 #include <rtw_odm.h>
 
+#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER
+#include <rtw_mem.h>
+#endif
+
 #ifdef CONFIG_P2P
 #include <rtw_p2p.h>
 #endif // CONFIG_P2P
@@ -143,14 +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
-
-#ifdef CONFIG_RTL8188E  
-#include <Hal8188EPhyCfg.h>
-#endif
-
 #include <ip.h>
 #include <if_ether.h>
 #include <ethernet.h>
@@ -255,7 +250,7 @@ struct registry_priv
        u8      low_power ;
 
        u8      wifi_spec;// !turbo_mode
-
+       u8      special_rf_path; // 0: 2T2R ,1: only turn on path A 1T1R
        u8      channel_plan;
 #ifdef CONFIG_BT_COEXIST
        u8      btcoex;
@@ -327,12 +322,28 @@ struct registry_priv
        u8 ext_iface_num;//primary/secondary iface is excluded
 #endif
        u8 qos_opt_enable;
+
+       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)
 
@@ -359,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
@@ -367,6 +380,131 @@ enum _IFACE_ID {
        IFACE_ID_MAX,
 };
 
+#ifdef CONFIG_DBG_COUNTER
+
+struct rx_logs {
+       u32 intf_rx;
+       u32 intf_rx_err_recvframe;
+       u32 intf_rx_err_skb;
+       u32 intf_rx_report;
+       u32 core_rx;
+       u32 core_rx_pre;
+       u32 core_rx_pre_ver_err;
+       u32 core_rx_pre_mgmt;
+       u32 core_rx_pre_mgmt_err_80211w;
+       u32 core_rx_pre_mgmt_err;
+       u32 core_rx_pre_ctrl;
+       u32 core_rx_pre_ctrl_err;
+       u32 core_rx_pre_data;
+       u32 core_rx_pre_data_wapi_seq_err;
+       u32 core_rx_pre_data_wapi_key_err;
+       u32 core_rx_pre_data_handled;
+       u32 core_rx_pre_data_err;
+       u32 core_rx_pre_data_unknown;
+       u32 core_rx_pre_unknown;
+       u32 core_rx_enqueue;
+       u32 core_rx_dequeue;
+       u32 core_rx_post;
+       u32 core_rx_post_decrypt;
+       u32 core_rx_post_decrypt_wep;
+       u32 core_rx_post_decrypt_tkip;
+       u32 core_rx_post_decrypt_aes;
+       u32 core_rx_post_decrypt_wapi;
+       u32 core_rx_post_decrypt_hw;
+       u32 core_rx_post_decrypt_unknown;
+       u32 core_rx_post_decrypt_err;
+       u32 core_rx_post_defrag_err;
+       u32 core_rx_post_portctrl_err;
+       u32 core_rx_post_indicate;
+       u32 core_rx_post_indicate_in_oder;
+       u32 core_rx_post_indicate_reoder;
+       u32 core_rx_post_indicate_err;
+       u32 os_indicate;
+       u32 os_indicate_ap_mcast;
+       u32 os_indicate_ap_forward;
+       u32 os_indicate_ap_self;
+       u32 os_indicate_err;
+       u32 os_netif_ok;
+       u32 os_netif_err;
+};
+
+struct tx_logs {
+       u32 os_tx;
+       u32 os_tx_err_up;
+       u32 os_tx_err_xmit;
+       u32 os_tx_m2u;
+       u32 os_tx_m2u_ignore_fw_linked;
+       u32 os_tx_m2u_ignore_self;
+       u32 os_tx_m2u_entry;
+       u32 os_tx_m2u_entry_err_xmit;
+       u32 os_tx_m2u_entry_err_skb;
+       u32 os_tx_m2u_stop;
+       u32 core_tx;
+       u32 core_tx_err_pxmitframe;
+       u32 core_tx_err_brtx;
+       u32 core_tx_upd_attrib;
+       u32 core_tx_upd_attrib_adhoc;
+       u32 core_tx_upd_attrib_sta;
+       u32 core_tx_upd_attrib_ap;
+       u32 core_tx_upd_attrib_unknown;
+       u32 core_tx_upd_attrib_dhcp;
+       u32 core_tx_upd_attrib_icmp;
+       u32 core_tx_upd_attrib_active;
+       u32 core_tx_upd_attrib_err_ucast_sta;
+       u32 core_tx_upd_attrib_err_ucast_ap_link;
+       u32 core_tx_upd_attrib_err_sta;
+       u32 core_tx_upd_attrib_err_link;
+       u32 core_tx_upd_attrib_err_sec;
+       u32 core_tx_ap_enqueue_warn_fwstate;
+       u32 core_tx_ap_enqueue_warn_sta;
+       u32 core_tx_ap_enqueue_warn_nosta;
+       u32 core_tx_ap_enqueue_warn_link;
+       u32 core_tx_ap_enqueue_warn_trigger;
+       u32 core_tx_ap_enqueue_mcast;
+       u32 core_tx_ap_enqueue_ucast;
+       u32 core_tx_ap_enqueue;
+       u32 intf_tx;
+       u32 intf_tx_pending_ac;
+       u32 intf_tx_pending_fw_under_survey;
+       u32 intf_tx_pending_fw_under_linking;
+       u32 intf_tx_pending_xmitbuf;
+       u32 intf_tx_enqueue;
+       u32 core_tx_enqueue;
+       u32 core_tx_enqueue_class;
+       u32 core_tx_enqueue_class_err_sta;
+       u32 core_tx_enqueue_class_err_nosta;
+       u32 core_tx_enqueue_class_err_fwlink;
+       u32 intf_tx_direct;
+       u32 intf_tx_direct_err_coalesce;
+       u32 intf_tx_dequeue;
+       u32 intf_tx_dequeue_err_coalesce;
+       u32 intf_tx_dump_xframe;
+       u32 intf_tx_dump_xframe_err_txdesc;
+       u32 intf_tx_dump_xframe_err_port;
+};
+
+struct int_logs {
+       u32 all;
+       u32 err;
+       u32 tbdok;
+       u32 tbder;
+       u32 bcnderr;
+       u32 bcndma;
+       u32 bcndma_e;
+       u32 rx;
+       u32 rx_rdu;
+       u32 rx_fovw;
+       u32 txfovw;
+       u32 mgntok;
+       u32 highdok;
+       u32 bkdok;
+       u32 bedok;
+       u32 vidok;
+       u32 vodok;
+};
+
+#endif // CONFIG_DBG_COUNTER
+
 struct debug_priv {
        u32 dbg_sdio_free_irq_error_cnt;
        u32 dbg_sdio_alloc_irq_error_cnt;
@@ -441,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 --------*/      
@@ -451,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;
@@ -471,7 +626,9 @@ struct dvobj_priv
        //padapters[IFACE_ID1] == if2
        _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];
 
@@ -600,6 +757,7 @@ 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))
 
 #ifdef PLATFORM_LINUX
 static struct device *dvobj_to_dev(struct dvobj_priv *dvobj)
@@ -748,7 +906,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;
@@ -882,9 +1042,22 @@ struct _ADAPTER{
        PLOOPBACKDATA ploopback;
 #endif
 
+       //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      
+       struct rx_logs rx_logs;
+       struct tx_logs tx_logs;
+       struct int_logs int_logs;
+#endif
 };
 
 #define adapter_to_dvobj(adapter) (adapter->dvobj)
@@ -941,11 +1114,11 @@ 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);
+#ifdef CONFIG_WOWLAN
+int rtw_suspend_wow(_adapter *padapter);
+int rtw_resume_process_wow(_adapter *padapter);
 #endif
+
 __inline static u8 *myid(struct eeprom_priv *peepriv)
 {
        return (peepriv->mac_addr);
index efe1afbac8ac42725508616184c8eae7b198f194..77a16f5a0d18cc408e68d1cd76868ed92192e1e9 100644 (file)
@@ -21,7 +21,7 @@
 #define __GSPI_HAL_H__
 
 
-void spi_int_dpc(PADAPTER padapter);
+void spi_int_dpc(PADAPTER padapter, u32 sdio_hisr);
 void rtw_set_hal_ops(_adapter *padapter);
 
 #ifdef CONFIG_RTL8723A
index 1e77ccc183b71c63b48e995ade2276ca58c1cbab..c280503029bcb379df54a309b469267b35745bc9 100644 (file)
@@ -156,6 +156,7 @@ void rtl8188es_set_hal_ops(PADAPTER padapter);
 #define set_hal_ops rtl8188es_set_hal_ops
 #endif
 extern void spi_set_chip_endian(PADAPTER padapter);
+extern unsigned int spi_write8_endian(ADAPTER *Adapter, unsigned int addr, unsigned int buf, u32 big);
 extern void spi_set_intf_ops(_adapter *padapter,struct _io_ops *pops);
 extern void spi_set_chip_endian(PADAPTER padapter);
 extern void InitInterrupt8723ASdio(PADAPTER padapter);
@@ -164,9 +165,6 @@ extern void EnableInterrupt8723ASdio(PADAPTER padapter);
 extern void DisableInterrupt8723ASdio(PADAPTER padapter);
 extern void spi_int_hdl(PADAPTER padapter);
 extern u8 HalQueryTxBufferStatus8723ASdio(PADAPTER padapter);
-extern void InitInterrupt8188ESdio(PADAPTER padapter);
-extern void EnableInterrupt8188ESdio(PADAPTER padapter);
-extern void DisableInterrupt8188ESdio(PADAPTER padapter);
 #ifdef CONFIG_RTL8723B
 extern void InitInterrupt8723BSdio(PADAPTER padapter);
 extern void InitSysInterrupt8723BSdio(PADAPTER padapter);
@@ -175,4 +173,18 @@ extern void DisableInterrupt8723BSdio(PADAPTER padapter);
 extern u8 HalQueryTxBufferStatus8723BSdio(PADAPTER padapter);
 #endif
 
+#ifdef CONFIG_RTL8188E
+extern void InitInterrupt8188EGspi(PADAPTER padapter);
+extern void EnableInterrupt8188EGspi(PADAPTER padapter);
+extern void DisableInterrupt8188EGspi(PADAPTER padapter);
+extern void UpdateInterruptMask8188EGspi(PADAPTER padapter, u32 AddMSR, u32 RemoveMSR);
+extern u8 HalQueryTxBufferStatus8189EGspi(PADAPTER padapter);
+extern u8 HalQueryTxOQTBufferStatus8189EGspi(PADAPTER padapter);
+extern void ClearInterrupt8188EGspi(PADAPTER padapter);
+extern u8 CheckIPSStatus(PADAPTER padapter);
+#endif // CONFIG_RTL8188E
+#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
+extern u8 RecvOnePkt(PADAPTER padapter, u32 size);
+#endif // CONFIG_WOWLAN
+
 #endif //__GSPI_OPS_H__
index 206fcb783ca55b7fd6b13cb52004f62924a57d1c..84aa63ac49bfa8f3a2c307c55ed26cb7b5783d67 100644 (file)
@@ -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);
@@ -39,11 +40,14 @@ u8 hal_btcoex_IsBtExist(PADAPTER padapter);
 u8 hal_btcoex_IsBtDisabled(PADAPTER);
 void hal_btcoex_SetChipType(PADAPTER padapter, u8 chipType);
 u8 hal_btcoex_GetChipType(PADAPTER padapter);
-void hal_btcoex_SetPgAntNum(PADAPTER padapter, u8 antNum, BOOLEAN antInverse);
+void hal_btcoex_SetPgAntNum(PADAPTER padapter, u8 antNum);
 u8 hal_btcoex_GetPgAntNum(PADAPTER padapter);
+void hal_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath);
 
 u8 hal_btcoex_Initialize(PADAPTER padapter);
-void hal_btcoex_InitHwConfig(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);
 void hal_btcoex_LpsNotify(PADAPTER padapter, u8 type);
@@ -55,7 +59,7 @@ void hal_btcoex_IQKNotify(PADAPTER padapter, u8 state);
 void hal_btcoex_BtInfoNotify(PADAPTER padapter, u8 length, u8 *tmpBuf);
 void hal_btcoex_SuspendNotify(PADAPTER padapter, u8 state);
 void hal_btcoex_HaltNotify(PADAPTER padapter);
-void hal_btcoex_SwitchGntBt(PADAPTER padapter);
+void hal_btcoex_SwitchBtTRxMask(PADAPTER padapter);
 
 void hal_btcoex_Hanlder(PADAPTER padapter);
 
@@ -74,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 5af5768136925f52351ea10f89797e5bb442749a..493ffea980f0d7891a2ef144c6e0242d192c7308 100644 (file)
@@ -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
@@ -204,6 +215,9 @@ typedef enum _FIRMWARE_SOURCE {
 #define PageNum(_Len, _Size)           (u32)(((_Len)/(_Size)) + ((_Len)&((_Size) - 1) ? 1:0))
 
 
+u8 rtw_hal_data_init(_adapter *padapter);
+void rtw_hal_data_deinit(_adapter *padapter);
+
 void dump_chip_info(HAL_VERSION        ChipVersion);
 
 u8     //return the final channel plan decision
@@ -322,10 +336,56 @@ void rtw_store_phy_info(_adapter *padapter, union recv_frame *prframe);
 void rtw_dump_raw_rssi_info(_adapter *padapter);
 #endif
 
+#define                HWSET_MAX_SIZE                  512
+#ifdef CONFIG_EFUSE_CONFIG_FILE
+#define                EFUSE_FILE_COLUMN_NUM           16
+u32 Hal_readPGDataFromConfigFile(PADAPTER padapter, struct file *fp);
+void Hal_ReadMACAddrFromFile(PADAPTER padapter, struct file *fp);
+void Hal_GetPhyEfuseMACAddr(PADAPTER padapter, u8* mac_addr);
+int check_phy_efuse_tx_power_info_valid(PADAPTER padapter);
+int check_phy_efuse_macaddr_info_valid(PADAPTER padapter);
+#endif //CONFIG_EFUSE_CONFIG_FILE
 
 #ifdef CONFIG_RF_GAIN_OFFSET
 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,
+       PVOID                                   pValue1,
+       PVOID                                   pValue2);
+void SetHalODMVar(
+       PADAPTER                                Adapter,
+       HAL_ODM_VARIABLE                eVariable,
+       PVOID                                   pValue1,
+       BOOLEAN                                 bSet);
+
+#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
+struct noise_info
+{
+       u8              bPauseDIG;
+       u8              IGIValue;
+       u32     max_time;//ms   
+       u8              chan;
+};
+#endif
+
+void rtw_hal_set_fw_rsvd_page(_adapter* adapter, bool finished);
+
+#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_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..bc473acdf9f4e628ac6d750a17cb0f074b2a081e 100644 (file)
@@ -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_8BIT((__pH2CCmd)+3, 1, 7, __Value)
+#define SET_H2CCMD_WOWLAN_LOWPR_RX(__pH2CCmd, __Value)                         SET_BITS_TO_LE_1BYTE_8BIT((__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,31 @@ 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);
+
+//WOW command function
+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 6aaf8ec3e437577479404c0273dcb1cf5483192a..19276ea53628d8ea482f1d337e7c7c48cff73824 100644 (file)
@@ -285,7 +285,9 @@ int PHY_ConfigRFWithParaFile(IN     PADAPTER        Adapter, IN char*       pFileName, IN u8        eRFP
 int PHY_ConfigRFWithTxPwrTrackParaFile(IN PADAPTER     Adapter, IN char*       pFileName);
 
 int PHY_ConfigRFWithPowerLimitTableParaFile(IN PADAPTER        Adapter, IN char*       pFileName);
-#endif
+
+void phy_free_filebuf(_adapter *padapter);
+#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE
 
 
 #endif //__HAL_COMMON_H__
old mode 100644 (file)
new mode 100755 (executable)
index 530065b..6a0faf0
 //     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_PKT_BE_BK_LIFE_TIME                0x04C2
 #define REG_STBC_SETTING                               0x04C4
 #define REG_QUEUE_CTRL                                 0x04C6
+#define REG_SINGLE_AMPDU_CTRL                  0x04c7
 #define REG_PROT_MODE_CTRL                     0x04C8
 #define REG_MAX_AGGR_NUM                               0x04CA
 #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
@@ -638,6 +669,9 @@ Default: 00b.
 #define RRSR_MCS6                              BIT18
 #define RRSR_MCS7                              BIT19
 
+#define RRSR_CCK_RATES (RRSR_11M|RRSR_5_5M|RRSR_2M|RRSR_1M)
+#define RRSR_OFDM_RATES (RRSR_54M|RRSR_48M|RRSR_36M|RRSR_24M|RRSR_18M|RRSR_12M|RRSR_9M|RRSR_6M)
+
 // WOL bit information
 #define HAL92C_WOL_PTK_UPDATE_EVENT            BIT0
 #define HAL92C_WOL_GTK_UPDATE_EVENT            BIT1
@@ -762,14 +796,6 @@ Default: 00b.
 #define CAM_READ                               0x00000000
 #define CAM_POLLINIG                   BIT31
 
-#define SCR_UseDK                              0x01
-#define SCR_TxSecEnable                        0x02
-#define SCR_RxSecEnable                        0x04
-
-#define SCR_UseDK                              0x01
-#define SCR_TxSecEnable                        0x02
-#define SCR_RxSecEnable                        0x04
-
 //
 // 10. Power Save Control Registers     
 //
@@ -1520,7 +1546,6 @@ Current IOREG MAP
 #define SCR_RXBCUSEDK                  BIT(7)                  // Force Rx Broadcast packets Use Default Key
 #define SCR_CHK_KEYID                  BIT(8)
 
-
 //-----------------------------------------------------
 //
 //     SDIO Bus Specification
@@ -1722,7 +1747,7 @@ Current IOREG MAP
 // General definitions
 //========================================================
 
-#define LAST_ENTRY_OF_TX_PKT_BUFFER_8188E              176
+#define LAST_ENTRY_OF_TX_PKT_BUFFER_8188E(__Adapter)      ( IS_VENDOR_8188E_I_CUT_SERIES(__Adapter) ? 255 : 175 )
 #define LAST_ENTRY_OF_TX_PKT_BUFFER_8812                       255
 #define LAST_ENTRY_OF_TX_PKT_BUFFER_8723B              255
 #define LAST_ENTRY_OF_TX_PKT_BUFFER_8192C              255
old mode 100644 (file)
new mode 100755 (executable)
index 2b7014d..ac6007e
@@ -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
@@ -30,7 +30,9 @@
 #ifdef CONFIG_SDIO_HCI
 #include <hal_sdio.h>
 #endif
-
+#ifdef CONFIG_GSPI_HCI
+#include <hal_gspi.h>
+#endif
 //
 // <Roger_Notes> For RTL8723 WiFi/BT/GPS multi-function configuration. 2010.10.06.
 //
@@ -73,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,
@@ -245,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;
 };
 
 
@@ -364,18 +383,18 @@ typedef struct hal_com_data
        u8      TxPwrLevelCck[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];
        u8      TxPwrLevelHT40_1S[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];     // For HT 40MHZ pwr
        u8      TxPwrLevelHT40_2S[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];     // For HT 40MHZ pwr
-       u8      TxPwrHt20Diff[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff
+       s8      TxPwrHt20Diff[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff
        u8      TxPwrLegacyHtDiff[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff
 
        // Power Limit Table for 2.4G
-       u8      TxPwrLimit_2_4G[MAX_REGULATION_NUM]
+       s8      TxPwrLimit_2_4G[MAX_REGULATION_NUM]
                                                [MAX_2_4G_BANDWITH_NUM]
                                        [MAX_RATE_SECTION_NUM]
                                        [CHANNEL_MAX_NUMBER_2G]
                                                [MAX_RF_PATH_NUM];
 
        // Power Limit Table for 5G
-       u8      TxPwrLimit_5G[MAX_REGULATION_NUM]
+       s8      TxPwrLimit_5G[MAX_REGULATION_NUM]
                                                [MAX_5G_BANDWITH_NUM]
                                                [MAX_RATE_SECTION_NUM]
                                                [CHANNEL_MAX_NUMBER_5G]
@@ -461,13 +480,13 @@ typedef struct hal_com_data
        u8      RegReg542;
        u8      RegCR_1;
        u8      Reg837;
-       u8      RegRFPathS1;
        u16     RegRRSR;
 
        u8      CurAntenna;
        u8      AntDivCfg;
        u8      AntDetection;
        u8      TRxAntDivType;
+       u8      ant_path; //for 8723B s0/s1 selection
 
        u8      u1ForcedIgiLb;                  // forced IGI lower bound
 
@@ -495,17 +514,17 @@ typedef struct hal_com_data
        u8      p2p_ps_offload;
 #endif
 
-       u8      AMPDUDensity;
+       //u8    AMPDUDensity;
 
        // Auto FSM to Turn On, include clock, isolation, power control for MAC only
        u8      bMacPwrCtrlOn;
-
+       u8      bDisableTXPowerTraining;
        u8      RegIQKFWOffload;
        struct submit_ctx       iqk_sctx;
 
        RT_AMPDU_BRUST          AMPDUBurstMode; //92C maybe not use, but for compile successfully
 
-#ifdef CONFIG_SDIO_HCI
+#if defined (CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
        //
        // For SDIO Interface HAL related
        //
@@ -593,6 +612,8 @@ typedef struct hal_com_data
        
        u8      bInterruptMigration;
        u8      bDisableTxInt;
+
+       u16     RxTag;  
 #endif //CONFIG_PCI_HCI
 
        struct dm_priv  dmpriv;
@@ -678,6 +699,14 @@ typedef struct hal_com_data
        char *rf_tx_pwr_lmt;
        u32     rf_tx_pwr_lmt_len;
 #endif
+
+#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;
 
 
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/include/hal_gspi.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/include/hal_gspi.h
new file mode 100644 (file)
index 0000000..f5880e2
--- /dev/null
@@ -0,0 +1,32 @@
+/******************************************************************************
+ *
+ * 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 __HAL_GSPI_H_
+#define __HAL_GSPI_H_
+
+#define ffaddr2deviceId(pdvobj, addr)  (pdvobj->Queue2Pipe[addr])
+
+u8 rtw_hal_gspi_max_txoqt_free_space(_adapter *padapter);
+u8 rtw_hal_gspi_query_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum);
+void rtw_hal_gspi_update_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum);
+void rtw_hal_set_gspi_tx_max_length(PADAPTER padapter, u8 numHQ, u8 numNQ, u8 numLQ, u8 numPubQ);
+u32 rtw_hal_get_gspi_tx_max_length(PADAPTER padapter, u8 queue_idx);
+
+#endif 
+
index bd455ea92cd564e0941c911508fe81c332111155..458cb5e0b46ccea60738a03cad9113b285496666 100644 (file)
@@ -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_VAR_MAX_AGGR_NUM,
 }HW_VARIABLES;
 
@@ -182,12 +184,15 @@ 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{
        HAL_ODM_STA_INFO,       
        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{
@@ -254,7 +259,7 @@ struct hal_ops {
        u8      (*GetHalDefVarHandler)(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);
        u8      (*SetHalDefVarHandler)(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);
 
-       void    (*GetHalODMVarHandler)(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet);
+       void    (*GetHalODMVarHandler)(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,PVOID pValue2);
        void    (*SetHalODMVarHandler)(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet);
 
        void    (*UpdateRAMaskHandler)(_adapter *padapter, u32 mac_id, u8 rssi_level);
@@ -318,10 +323,13 @@ 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
+       void (*fill_fake_txdesc)(PADAPTER, u8 *pDesc, u32 BufferLen,
+                       u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame);
+#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 +403,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
 //
@@ -413,6 +424,11 @@ typedef enum _HARDWARE_TYPE{
 #define        IS_HARDWARE_TYPE_8188E(_Adapter)        \
 (IS_HARDWARE_TYPE_8188EE(_Adapter) || IS_HARDWARE_TYPE_8188EU(_Adapter) || IS_HARDWARE_TYPE_8188ES(_Adapter))
 
+
+#define        IS_HARDWARE_TYPE_8188E_before(_Adapter)                 \
+(IS_HARDWARE_TYPE_8192C(_Adapter) ||IS_HARDWARE_TYPE_8192D(_Adapter) ||IS_HARDWARE_TYPE_8723A(_Adapter))
+
+
 #define IS_HARDWARE_TYPE_OLDER_THAN_8812A(_Adapter)    \
 (IS_HARDWARE_TYPE_8192D(_Adapter) || IS_HARDWARE_TYPE_8192C(_Adapter) ||\
  IS_HARDWARE_TYPE_8723AE(_Adapter) || IS_HARDWARE_TYPE_8723AU(_Adapter) || IS_HARDWARE_TYPE_8723AS(_Adapter) ||\
@@ -531,7 +547,7 @@ u8 rtw_hal_set_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pVa
 u8 rtw_hal_get_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);
 
 void rtw_hal_set_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet);
-void   rtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet);
+void   rtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,PVOID pValue2);
        
 void rtw_hal_enable_interrupt(_adapter *padapter);
 void rtw_hal_disable_interrupt(_adapter *padapter);
@@ -624,12 +640,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 410b93d19733615b9d2fd232ce74acb2f6c1e3ad..9d9911f3cf3b45830dac20a9c4273f25467a90b2 100644 (file)
 #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
 #define EEPROM_Default_LNAType                                         0\r
 \r
 //New EFUSE deafult value\r
-#define EEPROM_DEFAULT_24G_INDEX               0x2D\r
-#define EEPROM_DEFAULT_24G_CCK_TX_INDEX                0x25\r
-#define EEPROM_DEFAULT_24G_BW40_TX_INDEX       0x28\r
+#define EEPROM_DEFAULT_24G_INDEX                       0x2D\r
 #define EEPROM_DEFAULT_24G_HT20_DIFF           0X02\r
-#define EEPROM_DEFAULT_24G_OFDM_DIFF           0X02\r
+#define EEPROM_DEFAULT_24G_OFDM_DIFF   0X04\r
 \r
 #define EEPROM_DEFAULT_5G_INDEX                        0X2A\r
 #define EEPROM_DEFAULT_5G_HT20_DIFF            0X00\r
index fc293c45759882a1bb87705aee10aa841e0e3c95..5dfc421366cbd6ce16b95a74a8c6b22809688f4e 100644 (file)
@@ -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);
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/include/ioctl_cfg80211.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/include/ioctl_cfg80211.h
deleted file mode 100644 (file)
index 6fe9f86..0000000
+++ /dev/null
@@ -1,175 +0,0 @@
-/******************************************************************************\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
-#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, 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
-#endif //__IOCTL_CFG80211_H__\r
-\r
index 955ea8d316e28d549f3158cb9aecb890d7ad0b8d..d79caeb592bc8754d3f36c3041e9bc692d594e4c 100644 (file)
 #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 40286ea4e01df0928d5d3fb0e284c13fd19f3967..805f3b2f5eeb567dc90c4e99684e27487ee8991a 100644 (file)
@@ -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
 
 
@@ -154,11 +159,8 @@ void rtw_ndev_destructor(_nic_hdl ndev);
 int    rtw_gw_addr_query(_adapter *padapter);
 #endif
 
-#ifdef CONFIG_SUSPEND_REFINE
 int rtw_suspend_common(_adapter *padapter);
 int rtw_resume_common(_adapter *padapter);
-#endif
-
 
 #endif //_OSDEP_INTF_H_
 
index d4cb887d650feaa096d033939ebb0b1c06add9e4..b5901766e262025ef920e113831e3a16d03736d4 100644 (file)
@@ -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
@@ -493,9 +496,6 @@ extern void rtw_lock_traffic_suspend_timeout(u32 timeout_ms);
 extern void rtw_lock_resume_scan_timeout(u32 timeout_ms);
 extern void rtw_resume_lock_suspend(void);
 extern void rtw_resume_unlock_suspend(void);
-extern void rtw_ap_connection_lock_suspend(void);
-extern void rtw_ap_connection_unlock_suspend(void);
-
 #ifdef CONFIG_AP_WOWLAN
 extern void rtw_softap_lock_suspend(void);
 extern void rtw_softap_unlock_suspend(void);
index 7b2ffd5b77a1c5a2d5015308300d531ad880a176..894169dd1e58d0dd30f13e4e83fd796bd4451042 100644 (file)
@@ -84,7 +84,9 @@
        #include <linux/earlysuspend.h>\r
 #endif //CONFIG_HAS_EARLYSUSPEND\r
 \r
+#ifdef CONFIG_EFUSE_CONFIG_FILE\r
        #include <linux/fs.h>\r
+#endif //CONFIG_EFUSE_CONFIG_FILE\r
 \r
 #ifdef CONFIG_USB_HCI\r
        #include <linux/usb.h>\r
old mode 100644 (file)
new mode 100755 (executable)
index 3180a4c..a37040b
@@ -36,6 +36,10 @@ void rtl8188ee_set_hal_ops(_adapter * padapter);
 void rtl8812ae_set_hal_ops(_adapter * padapter);
 #endif
 
+#if defined(CONFIG_RTL8192E)
+void rtl8192ee_set_hal_ops(_adapter * padapter);
+#endif
+
 #ifdef CONFIG_RTL8723B
 void rtl8723be_set_hal_ops(_adapter * padapter);
 #endif
old mode 100644 (file)
new mode 100755 (executable)
index 75de6de..cc2f45d
@@ -68,6 +68,16 @@ void rtl8812ae_prepare_bcn_tasklet(void *priv);
 void   rtl8812ae_set_intf_ops(struct _io_ops   *pops);
 #endif
 
+#ifdef CONFIG_RTL8192E
+u32    rtl8192ee_init_desc_ring(_adapter * padapter);
+u32    rtl8192ee_free_desc_ring(_adapter * padapter);
+void   rtl8192ee_reset_desc_ring(_adapter * padapter);
+void   rtl8192ee_recv_tasklet(void *priv);
+void   rtl8192ee_prepare_bcn_tasklet(void *priv);
+int    rtl8192ee_interrupt(PADAPTER Adapter);
+void   rtl8192ee_set_intf_ops(struct _io_ops   *pops);
+#endif
+
 #ifdef CONFIG_RTL8723B
 u32    rtl8723be_init_desc_ring(_adapter * padapter);
 u32    rtl8723be_free_desc_ring(_adapter * padapter);
index a4c9a47a265bd8d53a4b29799e2187bfd9c814bb..839b1e03bb65baad9d94184afd81ea1da3b9dc5c 100644 (file)
@@ -65,7 +65,7 @@ typedef enum _RTL8188E_H2C_CMD_ID
        //Class DM
        H2C_DM_MACID_CFG                                =0x40,
        H2C_DM_TXBF                                     =0x41,
-
+       H2C_RSSI_REPORT                                 =0x42,
        //Class BT
        H2C_BT_COEX_MASK                                =0x60,
        H2C_BT_COEX_GPIO_MODE           =0x61,
@@ -142,9 +142,11 @@ typedef struct _RSVDPAGE_LOC_88E {
 void rtl8188e_set_FwPwrMode_cmd(PADAPTER padapter, u8 Mode);
 void rtl8188e_set_FwJoinBssReport_cmd(PADAPTER padapter, u8 mstatus);
 u8 rtl8188e_set_rssi_cmd(PADAPTER padapter, u8 *param);
-u8 rtl8188e_set_raid_cmd(PADAPTER padapter, u32 mask);
+u8 rtl8188e_set_raid_cmd(_adapter*padapter, u32 bitmap, u8* arg);
 void rtl8188e_Add_RateATid(PADAPTER padapter, u32 bitmap, u8* arg, u8 rssi_level);
+s32 FillH2CCmd_88E(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);
 //u8 rtl8192c_set_FwSelectSuspend_cmd(PADAPTER padapter, u8 bfwpoll, u16 period);
+u8 GetTxBufferRsvdPageNum8188E(_adapter *padapter, bool wowlan);
 
 
 #ifdef CONFIG_P2P
@@ -226,11 +228,6 @@ typedef struct _SETAOAC_GLOBAL_INFO{
 #define FW_ADOPT_USER                                  BIT(1)
 */
 void rtl8188es_set_wowlan_cmd(_adapter* padapter, u8 enable);
-void rtl8188es_set_global_info_cmd(_adapter* padapter, u8 enable);
-void rtl8188es_set_keep_alive_cmd(_adapter* padapter, u8 enable);
-void rtl8188es_set_disconnect_decision_cmd(_adapter* padapter, u8 enable);
-void rtl8188es_set_wowlan_ctrl_cmd(_adapter* padapter, u8 enable);
-void rtl8188es_set_remote_wake_ctrl_cmd(_adapter* padapter, u8 enable);
 void SetFwRelatedForWoWLAN8188ES(_adapter* padapter, u8 bHostIsGoingtoSleep);
 
 #endif//CONFIG_WOWLAN
index 51e66f99d8f5507bfd7632d5d79739a5056852cc..e0dc8ef902cdd9700d0941fd4fa0c54f12f16028 100644 (file)
 #define __RTL8188E_HAL_H__\r
 \r
 //#include "hal_com.h"\r
-#if 1\r
 #include "hal_data.h"\r
-#else\r
-#include "../hal/OUTSRC/odm_precomp.h"\r
-#endif\r
 \r
 //include HAL Related header after HAL Related compiling flags \r
 #include "rtl8188e_spec.h"\r
 \r
 \r
 #if 1 // download firmware related data structure\r
+#define MAX_FW_8188E_SIZE                      0x8000 //32768,32k / 16384,16k\r
+\r
 #define FW_8188E_SIZE                          0x4000 //16384,16k\r
+#define FW_8188E_SIZE_2                        0x8000 //32768,32k \r
+\r
 #define FW_8188E_START_ADDRESS 0x1000\r
 #define FW_8188E_END_ADDRESS           0x1FFF //0x5FFF\r
 \r
 \r
-\r
-\r
 #define IS_FW_HEADER_EXIST_88E(_pFwHdr)        ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88E0)\r
 \r
 typedef struct _RT_FIRMWARE_8188E {\r
@@ -94,7 +92,7 @@ typedef struct _RT_FIRMWARE_8188E {
 #ifdef CONFIG_EMBEDDED_FWIMG\r
        u8*                     szFwBuffer;\r
 #else\r
-       u8                      szFwBuffer[FW_8188E_SIZE];\r
+       u8                      szFwBuffer[MAX_FW_8188E_SIZE];\r
 #endif\r
        u32                     ulFwLength;\r
 } RT_FIRMWARE_8188E, *PRT_FIRMWARE_8188E;\r
@@ -140,8 +138,8 @@ typedef struct _RT_8188E_FIRMWARE_HDR
 #define BCN_DMA_ATIME_INT_TIME_8188E           0x02\r
 \r
 \r
-#define MAX_RX_DMA_BUFFER_SIZE_88E           0x2400 //9k for 88E nornal chip , //MaxRxBuff=10k-max(TxReportSize(64*8), WOLPattern(16*24))\r
-//#define MAX_RX_DMA_BUFFER_SIZE_88E(__Adapter)        ((!IS_VENDOR_8188E_I_CUT_SERIES(__Adapter))?0x2400:0x3C00)\r
+//#define MAX_RX_DMA_BUFFER_SIZE_88E         0x2400 //9k for 88E nornal chip , //MaxRxBuff=10k-max(TxReportSize(64*8), WOLPattern(16*24))\r
+#define MAX_RX_DMA_BUFFER_SIZE_88E(__Adapter)  ((!IS_VENDOR_8188E_I_CUT_SERIES(__Adapter))?0x2400:0x3C00)\r
 \r
 \r
 #define MAX_TX_REPORT_BUFFER_SIZE                      0x0400 // 1k \r
@@ -161,11 +159,11 @@ typedef struct _RT_8188E_FIRMWARE_HDR
 #define WOWLAN_PAGE_NUM_88E    0x00\r
 #endif\r
 \r
-#define TX_TOTAL_PAGE_NUMBER_88E       (0xB0 - BCNQ_PAGE_NUM_88E - WOWLAN_PAGE_NUM_88E)\r
-#define TX_PAGE_BOUNDARY_88E           (TX_TOTAL_PAGE_NUMBER_88E + 1)\r
+#define TX_TOTAL_PAGE_NUMBER_88E(_Adapter)     ( (IS_VENDOR_8188E_I_CUT_SERIES(_Adapter)?0x100:0xB0) - BCNQ_PAGE_NUM_88E - WOWLAN_PAGE_NUM_88E)\r
+#define TX_PAGE_BOUNDARY_88E(_Adapter)         (TX_TOTAL_PAGE_NUMBER_88E(_Adapter) + 1)\r
 \r
-#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_88E    TX_TOTAL_PAGE_NUMBER_88E\r
-#define WMM_NORMAL_TX_PAGE_BOUNDARY_88E                (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_88E + 1)\r
+#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_88E(_Adapter)  TX_TOTAL_PAGE_NUMBER_88E(_Adapter)\r
+#define WMM_NORMAL_TX_PAGE_BOUNDARY_88E(_Adapter)              (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_88E(_Adapter) + 1)\r
 \r
 // For Normal Chip Setting\r
 // (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723B\r
@@ -191,6 +189,7 @@ typedef struct _RT_8188E_FIRMWARE_HDR
 //     Channel Plan\r
 //-------------------------------------------------------------------------\r
 \r
+\r
 #define EFUSE_REAL_CONTENT_LEN         512\r
 #define EFUSE_MAP_LEN                          128\r
 #define EFUSE_MAX_SECTION                      16\r
@@ -207,9 +206,6 @@ typedef struct _RT_8188E_FIRMWARE_HDR
 //\r
 #define EFUSE_OOB_PROTECT_BYTES                15      // PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte.\r
 \r
-#define                HWSET_MAX_SIZE_88E              512\r
-#define                EFUSE_FILE_COLUMN_NUM           16\r
-\r
 #define                EFUSE_REAL_CONTENT_LEN_88E      256\r
 #define                EFUSE_MAP_LEN_88E               512\r
 #define                EFUSE_MAX_SECTION_88E           64\r
@@ -283,6 +279,8 @@ void Hal_InitChannelPlan(PADAPTER padapter);
 void Hal_ReadRFGainOffset(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);\r
 #endif //CONFIG_RF_GAIN_OFFSET\r
 \r
+void rtl8188e_init_default_value(_adapter *adapter);\r
+\r
 void rtl8188e_set_hal_ops(struct hal_ops *pHalFunc);\r
 \r
 // register\r
@@ -299,6 +297,13 @@ void _InitTransferPageSize(PADAPTER padapter);
 \r
 void SetHwReg8188E(PADAPTER padapter, u8 variable, u8 *val);\r
 void GetHwReg8188E(PADAPTER padapter, u8 variable, u8 *val);\r
-\r
+void ResumeTxBeacon(PADAPTER padapter);\r
+void StopTxBeacon(PADAPTER padapter);\r
+u8\r
+GetHalDefVar8188E(\r
+       IN      PADAPTER                                Adapter,\r
+       IN      HAL_DEF_VARIABLE                eVariable,\r
+       IN      PVOID                                   pValue\r
+       );\r
 #endif //__RTL8188E_HAL_H__\r
 \r
index c5e38009a6f46e887c5921a8859acc664a8b0900..4b05994a8ba07a77021a3259d9cf03d768c1ea39 100644 (file)
@@ -32,7 +32,7 @@ void rtl8188eu_DeInitSwLeds(PADAPTER padapter);
 void rtl8188ee_InitSwLeds(PADAPTER padapter);\r
 void rtl8188ee_DeInitSwLeds(PADAPTER padapter);\r
 #endif\r
-#ifdef CONFIG_SDIO_HCI\r
+#if defined (CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\r
 void rtl8188es_InitSwLeds(PADAPTER padapter);\r
 void rtl8188es_DeInitSwLeds(PADAPTER padapter);\r
 #endif\r
index df6e59ff562fbb7685dbdf23bfbc5dbb3cc01556..5d4e62888dcd6c47f0ebf3765287587cca541b43 100644 (file)
@@ -109,7 +109,7 @@ typedef struct rxreport_8188e
 } RXREPORT, *PRXREPORT;\r
 \r
 \r
-#ifdef CONFIG_SDIO_HCI\r
+#if defined (CONFIG_SDIO_HCI)||defined(CONFIG_GSPI_HCI)\r
 s32 rtl8188es_init_recv_priv(PADAPTER padapter);\r
 void rtl8188es_free_recv_priv(PADAPTER padapter);\r
 void rtl8188es_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf);\r
index 535862c6ece27a92121a7d6dfe004c8792f70271..287efee84e8a7bd6022f81c6b2945564e7694e32 100644 (file)
@@ -49,6 +49,8 @@
 #define REG_HISRE_88E                                  0x00BC //RTL8188E\r
 #define REG_MACID_NO_LINK_0                    0x0484\r
 #define REG_MACID_NO_LINK_1                    0x0488\r
+#define REG_MACID_PAUSE_0                      0x048c\r
+#define REG_MACID_PAUSE_1                      0x0490\r
 \r
 //-----------------------------------------------------\r
 //\r
 // General definitions\r
 //========================================================\r
 \r
+#define MACID_NUM_88E 64\r
+#define CAM_ENTRY_NUM_88E 32\r
 \r
 //----------------------------------------------------------------------------\r
 //       8192C EEPROM/EFUSE share register definition.\r
 #define EFUSE_ACCESS_ON                        0x69    // For RTL8723 only.\r
 #define EFUSE_ACCESS_OFF                       0x00    // For RTL8723 only.\r
 \r
-#endif //__RTL8188E_SPEC_H__\r
+#endif /* __RTL8188E_SPEC_H__ */\r
 \r
index 24bbb9bce9a0bade624ca2f9fdaa60a8219aa99a..793a66bfbc142325994c3e137cb8a5564405ad07 100644 (file)
 #define __RTL8188E_XMIT_H__\r
 \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
 \r
 //For 88e early mode\r
 #define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value)\r
@@ -249,9 +239,13 @@ struct txrpt_ccx_88e {
 #define txrpt_ccx_sw_88e(txrpt_ccx) ((txrpt_ccx)->sw0 + ((txrpt_ccx)->sw1<<8))\r
 #define txrpt_ccx_qtime_88e(txrpt_ccx) ((txrpt_ccx)->ccx_qtime0+((txrpt_ccx)->ccx_qtime1<<8))\r
 \r
-void rtl8188e_fill_fake_txdesc(PADAPTER        padapter, u8*pDesc, u32 BufferLen,\r
-               u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame);\r
-#ifdef CONFIG_SDIO_HCI\r
+#define SET_TX_DESC_SEC_TYPE_8188E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value)\r
+\r
+void rtl8188e_fill_fake_txdesc(PADAPTER        padapter,u8*pDesc,u32 BufferLen,\r
+               u8 IsPsPoll,u8  IsBTQosNull, u8 bDataFrame);\r
+void rtl8188e_cal_txdesc_chksum(struct tx_desc *ptxdesc);\r
+\r
+#if defined(CONFIG_SDIO_HCI)||defined (CONFIG_GSPI_HCI)\r
 s32 rtl8188es_init_xmit_priv(PADAPTER padapter);\r
 void rtl8188es_free_xmit_priv(PADAPTER padapter);\r
 s32 rtl8188es_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\r
@@ -279,14 +273,14 @@ s32 rtl8188eu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv
 #ifdef CONFIG_PCI_HCI\r
 s32 rtl8188ee_init_xmit_priv(PADAPTER padapter);\r
 void rtl8188ee_free_xmit_priv(PADAPTER padapter);\r
-struct xmit_buf *rtl8188ee_dequeue_xmitbuf(struct rtw_tx_ring *ring);\r
 void   rtl8188ee_xmitframe_resume(_adapter *padapter);\r
 s32 rtl8188ee_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\r
 s32 rtl8188ee_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\r
+s32    rtl8188ee_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\r
 void rtl8188ee_xmit_tasklet(void *priv);\r
 #endif\r
 \r
-#define SET_TX_DESC_SEC_TYPE_8188E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value)\r
+\r
 \r
 #ifdef CONFIG_TX_EARLY_MODE\r
 void UpdateEarlyModeInfo8188E(struct xmit_priv *pxmitpriv,struct xmit_buf *pxmitbuf );\r
index 4febe67c8e8a8bc8f299c4d2aacdb8f62c4a6f67..3f254d6a1114716e1aa6d273374d5747cf90874f 100644 (file)
@@ -78,6 +78,7 @@ u8    rtl8192c_set_rssi_cmd(_adapter*padapter, u8 *param);
 void   rtl8192c_set_raid_cmd(_adapter*padapter, u32 mask, u8* arg);
 void   rtl8192c_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8* arg, u8 rssi_level);
 u8     rtl8192c_set_FwSelectSuspend_cmd(_adapter*padapter,u8 bfwpoll, u16 period);
+int rtl8192c_FillH2CCmd(_adapter* padapter, u8 ElementID, u32 CmdLen, u8* pCmdBuffer);
 #ifdef CONFIG_P2P
 void   rtl8192c_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state);
 #endif //CONFIG_P2P
index 795e39696666d191a0162549f4507474d88dabbb..ccde9d54af398d5080060f670493f27a44ac69b1 100644 (file)
 #define __RTL8192C_HAL_H__
 
 //#include "hal_com.h"
-
-#if 1
 #include "hal_data.h"
-#else
-#include "../hal/OUTSRC/odm_precomp.h"
-#endif
-
 
 #include "drv_types.h"
 #include "rtl8192c_spec.h"
@@ -402,8 +396,9 @@ void rtl8192c_EfuseParseChnlPlan(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoad
 
 HAL_VERSION rtl8192c_ReadChipVersion(IN PADAPTER Adapter);
 void rtl8192c_ReadBluetoothCoexistInfo(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail);
-//void rtl8192c_free_hal_data(_adapter * padapter);
+
 VOID rtl8192c_EfuseParseIDCode(PADAPTER pAdapter, u8 *hwinfo);
+void rtl8192c_init_default_value(_adapter *adapter);
 void rtl8192c_set_hal_ops(struct hal_ops *pHalFunc);
 
 s32 c2h_id_filter_ccx_8192c(u8 *buf);
index 85716b4105e47f6bc1c4088f929a02b08b9566b1..ad4d370107004d04c3bb2ca04a9c2145f3575186 100644 (file)
@@ -26,6 +26,7 @@
 
 #if defined(CONFIG_USB_HCI)
 
+#ifndef MAX_RECVBUF_SZ
 #ifdef PLATFORM_OS_CE
 #define MAX_RECVBUF_SZ (8192+1024) // 8K+1k
 #else
@@ -43,6 +44,7 @@
                #define MAX_RECVBUF_SZ (4000) // about 4K
        #endif
 #endif
+#endif //!MAX_RECVBUF_SZ
 
 #elif defined(CONFIG_PCI_HCI)
 //#ifndef CONFIG_MINIMAL_MEMORY_USAGE
@@ -52,7 +54,7 @@
 //#endif
 
 
-#elif defined(CONFIG_SDIO_HCI)
+#elif defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
 
 #define MAX_RECVBUF_SZ (10240)
 
index 040651f954399cb023fb107d1c4bd29f6c8f5f75..80927de1cd8a3775b9362634c5bd9f816b9ff95f 100644 (file)
 //
 // Interface type.
 //
-#endif 
-
-#ifdef CONFIG_USB_HCI
-
-//should be renamed and moved to another file
-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
 
-
 #define EFUSE_ACCESS_ON                        0x69    // For RTL8723 only.
 #define EFUSE_ACCESS_OFF                       0x00    // For RTL8723 only.
 
@@ -136,8 +118,10 @@ typedef    enum _BOARD_TYPE_8192CUSB{
 // General definitions
 //========================================================
 
+#define MACID_NUM_92C 32
+#define CAM_ENTRY_NUM_92C 32
 
 #include "basic_types.h"
 
-#endif
+#endif /* __RTL8192C_SPEC_H__ */
 
index c48847117179c13fe4874d111986e87fcb1c9102..c1108eb0c4beac1e51b447d085daadf58bd4d430 100644 (file)
 //OFFSET 20
 #define SGI            BIT(6)
 
-//
-// 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
+
 
 struct txrpt_ccx_8192c {
        /* offset 0 */
index 3896b7daa751ce09bde05ed7267a19af8f698107..deb03a0465f66dce3b7029da278661d37df41cd0 100644 (file)
 // User Define Message [31:8]
 
 //_SETPWRMODE_PARM
-#define SET_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)                       SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)           SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)
-#define SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)      SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)                               SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)                   SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
+#define SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)      SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
 
 //JOINBSSRPT_PARM
-#define SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
+#define SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(__pH2CCmd, __Value)                  SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
 
 //_RSVDPAGE_LOC
-#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)
-#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)                  SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)                             SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)                  SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
 
 
-#define SET_H2CCMD_P2P_PS_OFFLOAD_EN(__pH2CCmd, __Value)               SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
-#define SET_H2CCMD_P2P_PS_OFFLOAD_CTW(__pH2CCmd, __Value)              SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
-#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA0(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
-#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA1(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
+#define SET_H2CCMD_P2P_PS_OFFLOAD_EN(__pH2CCmd, __Value)                               SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
+#define SET_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value)                             SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_H2CCMD_P2P_PS_OFFLOAD_CTW(__pH2CCmd, __Value)                              SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
+#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA0(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
+#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA1(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
 #define SET_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value)              SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)
 #define SET_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value)
 
 // Fisrt constructed by tynli. 2009.10.09.
 typedef enum _RTL8192D_H2C_CMD 
 {
-       H2C_AP_OFFLOAD = 0,             /*0*/
+       H2C_92D_AP_OFFLOAD = 0,         /*0*/
        H2C_SETPWRMODE = 1,             /*1*/
        H2C_JOINBSSRPT = 2,             /*2*/
        H2C_RSVDPAGE = 3,
        H2C_RSSI_REPORT = 5,
        H2C_RA_MASK = 6,
-       H2C_P2P_PS_OFFLOAD = 8,
+       H2C_92D_P2P_PS_OFFLOAD = 8,
        H2C_MAC_MODE_SEL = 9,
        H2C_PWRM=15,
        H2C_P2P_PS_CTW_CMD = 24,
@@ -76,7 +76,7 @@ struct cmd_msg_parm {
 };
 
 
-void   FillH2CCmd92D(_adapter* padapter, u8 ElementID, u32 CmdLen, u8* pCmdBuffer);
+int FillH2CCmd92D(_adapter* padapter, u8 ElementID, u32 CmdLen, u8* pCmdBuffer);
 
 // host message to firmware cmd
 void   rtl8192d_set_FwPwrMode_cmd(_adapter*padapter, u8 Mode);
index b9779d5971955a9a139cc670d0f7ec598269e01d..7190694c9c14b10932e393bdc513d9db6d46e5fa 100644 (file)
 
 //#include "hal_com.h"
 
-#if 1
 #include "hal_data.h"
-#else
-#include "../hal/OUTSRC/odm_precomp.h"
-#endif
 
 #include "rtl8192d_spec.h"
 #include "Hal8192DPhyReg.h"
@@ -401,6 +397,7 @@ BOOLEAN PHY_CheckPowerOffFor8192D(PADAPTER Adapter);
 VOID PHY_SetPowerOnFor8192D(PADAPTER Adapter);
 //void PHY_ConfigMacPhyMode92D(PADAPTER Adapter);
 void rtl8192d_free_hal_data(_adapter * padapter);
+void rtl8192d_init_default_value(_adapter *adapter);
 void rtl8192d_set_hal_ops(struct hal_ops *pHalFunc);
 
 void SetHwReg8192D(_adapter *adapter, u8 variable, u8 *val);
index eff00fe7d6cc56d0c6e66823802c9b87eab7d12b..8ebdfdf3f0eaaf73b44f5e891340cb5e5fdf1292 100644 (file)
@@ -27,6 +27,7 @@
 
 #if defined(CONFIG_USB_HCI)
 
+#ifndef MAX_RECVBUF_SZ
 #ifdef PLATFORM_OS_CE
 #define MAX_RECVBUF_SZ (8192+1024) // 8K+1k
 #else
@@ -43,6 +44,7 @@
                #define MAX_RECVBUF_SZ (4000) // about 4K
        #endif
 #endif
+#endif //!MAX_RECVBUF_SZ
 
 #elif defined(CONFIG_PCI_HCI)
 //#ifndef CONFIG_MINIMAL_MEMORY_USAGE
index f1184a6831b94af5b3ac795a57caf944078159cc..b316b7c4b6210fb15ee79a82979f3c58db40508f 100644 (file)
 // General definitions
 //========================================================
 
+#define MACID_NUM_92D 32
+#define CAM_ENTRY_NUM_92D 32
+
 #include "basic_types.h"
 
-#endif
+#endif /* __RTL8192D_SPEC_H__ */
 
index bddc3385e03b60d7b34920d092eafa4919ad68a1..8add5a1a3b014e71abd83cd5ceedb7abd9c4e3fe 100644 (file)
 //OFFSET 20
 #define SGI            BIT(6)
 
-//
-// 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
+
 
 //Because we open EM for normal case, we just always insert 2*8 bytes.by wl
 #ifdef USB_PACKET_OFFSET_SZ
index 54502455040ac75d16acd192068f8decb0bd3e50..37dd341300ab81c38882a75b69370e82e3edf053 100644 (file)
@@ -114,22 +114,22 @@ typedef struct _RSVDPAGE_LOC_92E {
 
 
 //_SETPWRMODE_PARM
-#define SET_8192E_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)                 SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)                 SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)        SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)      SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value)            SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value)                        SET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value)
-#define GET_8192E_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd)                                  LE_BITS_TO_1BYTE(__pH2CCmd, 0, 8)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)                         SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)                         SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)      SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value)                                SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+5, 0, 8, __Value)
+#define GET_8192E_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd)                                          LE_BITS_TO_1BYTE(__pH2CCmd, 0, 8)
 
 //_P2P_PS_OFFLOAD
 #define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ENABLE(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value)                       SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value)                               SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
 #define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_CTWINDOW_EN(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
-#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_NOA0_EN(__pH2CCmd, __Value)    SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
-#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_NOA1_EN(__pH2CCmd, __Value)    SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
-#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value)        SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)
+#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_NOA0_EN(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
+#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_NOA1_EN(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
+#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)
 
 
 // host message to firmware cmd
@@ -138,9 +138,13 @@ void rtl8192e_set_FwJoinBssReport_cmd(PADAPTER padapter, u8 mstatus);
 u8 rtl8192e_set_rssi_cmd(PADAPTER padapter, u8 *param);
 void rtl8192e_set_raid_cmd(PADAPTER padapter, u32 bitmap, u8* arg);
 void rtl8192e_Add_RateATid(PADAPTER padapter, u32 bitmap, u8 *arg, u8 rssi_level);
+s32 FillH2CCmd_8192E(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);
+u8 GetTxBufferRsvdPageNum8192E(_adapter *padapter, bool wowlan);
 //u8 rtl8192c_set_FwSelectSuspend_cmd(PADAPTER padapter, u8 bfwpoll, u16 period);
-
-
+s32 c2h_handler_8192e(PADAPTER padapter, u8 *buf);
+#ifdef CONFIG_BT_COEXIST
+void rtl8192e_download_BTCoex_AP_mode_rsvd_page(PADAPTER padapter);
+#endif // CONFIG_BT_COEXIST
 #ifdef CONFIG_P2P_PS
 void rtl8192e_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state);
 //void rtl8723a_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state);
@@ -150,7 +154,6 @@ void CheckFwRsvdPageContent(PADAPTER padapter);
 void rtl8192e_set_FwMediaStatus_cmd(PADAPTER padapter, u16 mstatus_rpt );
 
 #ifdef CONFIG_TSF_RESET_OFFLOAD
-//u8 rtl8188e_reset_tsf(_adapter *padapter, u8 reset_port);
 int reset_tsf(PADAPTER Adapter, u8 reset_port );
 #endif // CONFIG_TSF_RESET_OFFLOAD
 
@@ -212,4 +215,4 @@ C2HPacketHandler_8192E(
        IN      u1Byte                  Length
 );
 
-#endif//__RTL8188E_CMD_H__
+#endif//__RTL8192E_CMD_H__
\ No newline at end of file
index 2b76b8cc95b7010f5045515efb29e4c42409cc12..363f00d595786ac075e3b19358cae9e624a4737a 100644 (file)
 \r
 //#include "hal_com.h"\r
 \r
-#if 1\r
 #include "hal_data.h"\r
-#else\r
-#include "../hal/OUTSRC/odm_precomp.h"\r
-#endif\r
 \r
 //include HAL Related header after HAL Related compiling flags \r
 #include "rtl8192e_spec.h"\r
@@ -59,7 +55,8 @@
        #define RTL8192E_PHY_MACREG                             "rtl8192e/MAC_REG.txt"\r
        #define RTL8192E_PHY_REG_PG                             "rtl8192e/PHY_REG_PG.txt"\r
        #define RTL8192E_PHY_REG_MP                             "rtl8192e/PHY_REG_MP.txt" \r
-       #define RTL8192E_TXPWR_LMT                              "rtl8192e/TXPWR_LMT.txt" \r
+       #define RTL8192E_TXPWR_LMT                                      "rtl8192e/TXPWR_LMT.txt"\r
+       #define RTL8192E_WIFI_ANT_ISOLATION             "rtl8192e/wifi_ant_isolation.txt"\r
 \r
 //---------------------------------------------------------------------\r
 //             RTL8192E Power Configuration CMDs for PCIe interface\r
@@ -135,41 +132,56 @@ typedef struct _RT_FIRMWARE_8192E {
 #define MAX_RX_DMA_BUFFER_SIZE_8192E           0x3d00 //0x3E80   //0x3FFF      // RX 16K reserved for WOW ?\r
 \r
 \r
-#define TX_TOTAL_PAGE_NUMBER_8192E             243 //0x00~0xF3 totoal pages: F4\r
+//For General Reserved Page Number(Beacon Queue is reserved page)\r
+//if (CONFIG_2BCN_EN) Beacon:4, PS-Poll:1, Null Data:1,Prob Rsp:1,Qos Null Data:1\r
+//Beacon:2, PS-Poll:1, Null Data:1,Prob Rsp:1,Qos Null Data:1\r
+#define RSVD_PAGE_NUM_8192E            0x08\r
+//For WoWLan , more reserved page\r
+//ARP Rsp:1, RWC:1, GTK Info:1,GTK RSP:2,GTK EXT MEM:2, PNO: 6\r
+#ifdef CONFIG_WOWLAN\r
+#define WOWLAN_PAGE_NUM_8192E  0x07\r
+#else\r
+#define WOWLAN_PAGE_NUM_8192E  0x00\r
+#endif\r
+\r
+#ifdef CONFIG_PNO_SUPPORT\r
+#undef WOWLAN_PAGE_NUM_8192E\r
+#define WOWLAN_PAGE_NUM_8192E  0x0d\r
+#endif\r
+\r
+#define        TOTAL_RSVD_PAGE_NUMBER_8192E    (RSVD_PAGE_NUM_8192E+WOWLAN_PAGE_NUM_8192E)\r
+#define        TX_TOTAL_PAGE_NUMBER_8192E      (0x100 - TOTAL_RSVD_PAGE_NUMBER_8192E)\r
+\r
+#define        TX_PAGE_BOUNDARY_8192E  TX_TOTAL_PAGE_NUMBER_8192E\r
+\r
 \r
-#define TX_PAGE_BOUNDARY_8192E                 (TX_TOTAL_PAGE_NUMBER_8192E + 1)//0xF4,Rserved 12 pages for BCN/PS-POLL..\r
 #define TX_PAGE_LOAD_FW_BOUNDARY_8192E         0x47 //0xA5\r
 #define TX_PAGE_BOUNDARY_WOWLAN_8192E          0xE0\r
 \r
 // For Normal Chip Setting\r
 // (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_92C\r
-#define NORMAL_PAGE_NUM_PUBQ_8192E                     0xE0\r
-#define NORMAL_PAGE_NUM_LPQ_8192E                      0x0C\r
-#define NORMAL_PAGE_NUM_HPQ_8192E                      0x08\r
-#define NORMAL_PAGE_NUM_NPQ_8192E                      0x00\r
-#define NORMAL_PAGE_NUM_EPQ_8192E                      0x00\r
 \r
+#define NORMAL_PAGE_NUM_HPQ_8192E                      0x10\r
+#define NORMAL_PAGE_NUM_LPQ_8192E                      0x10\r
+#define NORMAL_PAGE_NUM_NPQ_8192E                      0x10\r
+#define NORMAL_PAGE_NUM_EPQ_8192E                      0x00\r
 \r
 \r
 //Note: For WMM Normal Chip Setting ,modify later\r
-#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8192E  TX_PAGE_BOUNDARY_8192E\r
-#define WMM_NORMAL_TX_PAGE_BOUNDARY_8192E              (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8192E + 1)\r
-\r
-#define WMM_NORMAL_PAGE_NUM_PUBQ_8192E NORMAL_PAGE_NUM_PUBQ_8192E\r
 #define WMM_NORMAL_PAGE_NUM_HPQ_8192E          NORMAL_PAGE_NUM_HPQ_8192E\r
 #define WMM_NORMAL_PAGE_NUM_LPQ_8192E          NORMAL_PAGE_NUM_LPQ_8192E\r
 #define WMM_NORMAL_PAGE_NUM_NPQ_8192E          NORMAL_PAGE_NUM_NPQ_8192E\r
 \r
-#define USB_JAGUAR_DUMMY_OFFSET_8192EU         2\r
-#define USB_JAGUAR_DUMMY_UNIT_8192EU                   8\r
-#define USB_JAGUAR_ALL_DUMMY_LENGTH_8192EU                     (USB_JAGUAR_DUMMY_OFFSET_8192EU * USB_JAGUAR_DUMMY_UNIT_8192EU)\r
-#define USB_HWDESC_HEADER_LEN_8192EU           (TX_DESC_SIZE_8192E + USB_JAGUAR_ALL_DUMMY_LENGTH_8192EU)\r
-\r
 \r
 //-------------------------------------------------------------------------\r
 //     Chip specific\r
 //-------------------------------------------------------------------------\r
 \r
+// pic buffer descriptor\r
+#define RTL8192EE_SEG_NUM                      TX_BUFFER_SEG_NUM\r
+#define TX_DESC_NUM_92E                        128\r
+#define RX_DESC_NUM_92E                        128\r
+\r
 //-------------------------------------------------------------------------\r
 //     Channel Plan\r
 //-------------------------------------------------------------------------\r
@@ -203,7 +215,7 @@ typedef struct _RT_FIRMWARE_8192E {
 #define                EFUSE_BT_MAX_SECTION_8192E                              128             // 1024/8\r
 \r
 #define                EFUSE_PROTECT_BYTES_BANK_8192E                  16\r
-#define        EFUSE_MAX_BANK_8192E                                    3\r
+#define                EFUSE_MAX_BANK_8192E                                    3\r
 //===========================================================\r
 \r
 #define INCLUDE_MULTI_FUNC_BT(_Adapter)        (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT)\r
@@ -213,8 +225,6 @@ typedef struct _RT_FIRMWARE_8192E {
 \r
 //#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) )\r
 \r
-#define GetDefaultAdapter(padapter)    padapter\r
-\r
 // rtl8812_hal_init.c\r
 void   _8051Reset8192E(PADAPTER padapter);\r
 s32    FirmwareDownload8192E(PADAPTER Adapter, BOOLEAN bUsedWoWLANFw);\r
@@ -246,6 +256,8 @@ void Hal_DetectWoWMode(PADAPTER pAdapter);
 \r
 /***********************************************************/\r
 // RTL8192E-MAC Setting\r
+VOID _InitQueueReservedPage_8192E(IN  PADAPTER Adapter);\r
+VOID _InitQueuePriority_8192E(IN       PADAPTER Adapter);\r
 VOID _InitTxBufferBoundary_8192E(IN PADAPTER Adapter,IN u8 txpktbuf_bndy);\r
 VOID _InitPageBoundary_8192E(IN PADAPTER Adapter);\r
 //VOID _InitTransferPageSize_8192E(IN PADAPTER Adapter);\r
@@ -255,15 +267,16 @@ VOID _InitRDGSetting_8192E(PADAPTER Adapter);
 void _InitID_8192E(IN  PADAPTER Adapter);\r
 VOID _InitNetworkType_8192E(IN  PADAPTER Adapter);\r
 VOID _InitWMACSetting_8192E(IN PADAPTER Adapter);\r
-VOID _InitAdaptiveCtrl_8192E(IN  PADAPTER Adapter);\r
+VOID _InitAdaptiveCtrl_8192E(IN  PADAPTER Adapter);\r\r
+VOID _InitRateFallback_8192E(IN  PADAPTER Adapter);\r
 VOID _InitEDCA_8192E( IN  PADAPTER Adapter);\r
 VOID _InitRetryFunction_8192E( IN  PADAPTER Adapter);\r
+VOID _BBTurnOnBlock_8192E(IN   PADAPTER Adapter);\r
 VOID _InitBeaconParameters_8192E(IN  PADAPTER Adapter);\r
 VOID _InitBeaconMaxError_8192E(\r
        IN  PADAPTER    Adapter,\r
        IN      BOOLEAN         InfraMode\r
        );\r
-void _BBTurnOnBlock_8192E(PADAPTER padapter);\r
 void SetBeaconRelatedRegisters8192E(PADAPTER padapter);\r
 VOID hal_ReadRFType_8192E(PADAPTER     Adapter);\r
 // RTL8192E-MAC Setting\r
@@ -291,5 +304,21 @@ void SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits);
 \r
 void rtl8192e_start_thread(_adapter *padapter);\r
 void rtl8192e_stop_thread(_adapter *padapter);\r
+\r
+#ifdef CONFIG_PCI_HCI\r
+BOOLEAN        InterruptRecognized8192EE(PADAPTER Adapter);\r
+u16    get_txdesc_buf_addr(u16 ff_hwaddr);\r
+#endif\r
+\r
+#ifdef CONFIG_SDIO_HCI\r
+#ifdef CONFIG_SDIO_TX_ENABLE_AVAL_INT\r
+void _init_available_page_threshold(PADAPTER padapter, u8 numHQ, u8 numNQ, u8 numLQ, u8 numPubQ);\r
+#endif\r
+#endif\r
+\r
+#ifdef CONFIG_BT_COEXIST\r
+void rtl8192e_combo_card_WifiOnlyHwInit(PADAPTER Adapter);\r
+#endif\r
+\r
 #endif //__RTL8192E_HAL_H__\r
 \r
index a8404849669cb92ed2aadc81190699678063e1ea..34537c23c22a6fb9f4d8c7dd46df921ea9bc68c1 100644 (file)
 \r
 #if defined(CONFIG_USB_HCI)\r
 \r
+#ifndef MAX_RECVBUF_SZ\r
 #ifdef PLATFORM_OS_CE\r
 #define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\r
 #else\r
        #ifdef CONFIG_MINIMAL_MEMORY_USAGE\r
                #define MAX_RECVBUF_SZ (4000) // about 4K\r
        #else\r
+               #ifdef CONFIG_PLATFORM_MSTAR\r
+                       #define MAX_RECVBUF_SZ (8192) // 8K\r
+               #else\r
                #define MAX_RECVBUF_SZ (32768) // 32k\r
+               #endif\r
                //#define MAX_RECVBUF_SZ (20480) //20K\r
                //#define MAX_RECVBUF_SZ (10240) //10K \r
                //#define MAX_RECVBUF_SZ (16384) //  16k - 92E RX BUF :16K\r
                //#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k           \r
        #endif\r
 #endif\r
+#endif //!MAX_RECVBUF_SZ\r
 \r
 #elif defined(CONFIG_PCI_HCI)\r
 //#ifndef CONFIG_MINIMAL_MEMORY_USAGE\r
 #define Rx_Smooth_Factor (20)\r
 \r
 //=============\r
+// [1] Rx Buffer Descriptor (for PCIE) buffer descriptor architecture\r
+//DWORD 0\r
+#define SET_RX_BUFFER_DESC_DATA_LENGTH_92E(__pRxStatusDesc, __Value)           SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value)\r
+#define SET_RX_BUFFER_DESC_LS_92E(__pRxStatusDesc,__Value)     SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 15, 1, __Value)\r
+#define SET_RX_BUFFER_DESC_FS_92E(__pRxStatusDesc, __Value)            SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 16, 1, __Value)\r
+#define SET_RX_BUFFER_DESC_TOTAL_LENGTH_92E(__pRxStatusDesc, __Value)          SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 16, 15, __Value)\r
+\r
+#define GET_RX_BUFFER_DESC_OWN_92E(__pRxStatusDesc)            LE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1)\r
+#define GET_RX_BUFFER_DESC_LS_92E(__pRxStatusDesc)             LE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1)\r
+#define GET_RX_BUFFER_DESC_FS_92E(__pRxStatusDesc)             LE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 1)\r
+#define GET_RX_BUFFER_DESC_TOTAL_LENGTH_92E(__pRxStatusDesc)           LE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 15)\r
+\r
 \r
+//DWORD 1\r
+#define SET_RX_BUFFER_PHYSICAL_LOW_92E(__pRxStatusDesc, __Value)               SET_BITS_TO_LE_4BYTE( __pRxStatusDesc+4, 0, 32, __Value)\r
+#define GET_RX_BUFFER_PHYSICAL_LOW_92E(__pRxStatusDesc)                LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 0, 32)\r
+\r
+//DWORD 2\r
+#define SET_RX_BUFFER_PHYSICAL_HIGH_92E(__pRxStatusDesc, __Value)              SET_BITS_TO_LE_4BYTE( __pRxStatusDesc+8, 0, 32, __Value)\r
+\r
+//=============\r
+// [2] Rx Descriptor\r
 //DWORD 0\r
 #define GET_RX_STATUS_DESC_PKT_LEN_92E(__pRxStatusDesc)                        LE_BITS_TO_4BYTE( __pRxStatusDesc, 0, 14)\r
 #define GET_RX_STATUS_DESC_CRC32_92E(__pRxStatusDesc)                  LE_BITS_TO_4BYTE( __pRxStatusDesc, 14, 1)\r
 #define GET_RX_STATUS_DESC_PHY_STATUS_92E(__pRxStatusDesc)             LE_BITS_TO_4BYTE( __pRxStatusDesc, 26, 1)\r
 #define GET_RX_STATUS_DESC_SWDEC_92E(__pRxStatusDesc)                  LE_BITS_TO_4BYTE( __pRxStatusDesc, 27, 1)\r
 #define GET_RX_STATUS_DESC_EOR_92E(__pRxStatusDesc)                            LE_BITS_TO_4BYTE( __pRxStatusDesc, 30, 1)\r
+#define GET_RX_STATUS_DESC_OWN_92E(__pRxStatusDesc)                            LE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1)\r
+\r
+\r
+#define SET_RX_STATUS_DESC_PKT_LEN_92E(__pRxStatusDesc, __Value)               SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value)\r
+#define SET_RX_STATUS_DESC_EOR_92E(__pRxStatusDesc, __Value)           SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 30, 1, __Value)\r
+#define SET_RX_STATUS_DESC_OWN_92E(__pRxStatusDesc, __Value)           SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 31, 1, __Value)\r
 \r
 //DWORD 1\r
 #define GET_RX_STATUS_DESC_MACID_92E(__pRxDesc)                                        LE_BITS_TO_4BYTE(__pRxDesc+4, 0, 7)\r
 #define GET_RX_STATUS_DESC_BUFF_ADDR_92E(__pRxDesc)            LE_BITS_TO_4BYTE(__pRxDesc+24, 0, 32)\r
 #define GET_RX_STATUS_DESC_BUFF_ADDR64_92E(__pRxDesc)          LE_BITS_TO_4BYTE(__pRxDesc+28, 0, 32)\r
 \r
-#define SET_RX_STATUS_DESC_BUFF_ADDR_92E(__pRxDesc, __Value)   SET_BITS_TO_LE_4BYTE(__pRxDesc+24, 0, 32, __Value)\r
-\r
 \r
 #ifdef CONFIG_SDIO_HCI\r
-s32 rtl8812s_init_recv_priv(PADAPTER padapter);\r
-void rtl8812s_free_recv_priv(PADAPTER padapter);\r
-void rtl8812s_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf);\r
+s32 rtl8192es_init_recv_priv(PADAPTER padapter);\r
+void rtl8192es_free_recv_priv(PADAPTER padapter);\r
+void rtl8192es_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf);\r
 #endif\r
 \r
 #ifdef CONFIG_USB_HCI\r
index c3f9316b0882edd40ec7e78704f9e6b96f83c3a1..8f19f5e9e1f49ac1faadc95324b97b94d417dd77 100644 (file)
@@ -35,6 +35,8 @@
 //     0x0000h ~ 0x00FFh       System Configuration\r
 //\r
 //-----------------------------------------------------\r
+#define REG_SYS_SWR_CTRL1_8192E                0x0010  // 1 Byte        \r
+#define REG_SYS_SWR_CTRL2_8192E                0x0014  // 1 Byte      \r
 #define REG_AFE_CTRL1_8192E                    0x0024\r
 #define REG_AFE_CTRL2_8192E                    0x0028\r
 #define REG_AFE_CTRL3_8192E                    0x002c\r
@@ -79,6 +81,8 @@
 //     0x0200h ~ 0x027Fh       TXDMA Configuration\r
 //\r
 //-----------------------------------------------------\r
+#define REG_DWBCN0_CTRL             0x0208\r
+#define REG_DWBCN1_CTRL             0x0228\r
 \r
 //-----------------------------------------------------\r
 //\r
 //     0x0300h ~ 0x03FFh       PCIe\r
 //\r
 //-----------------------------------------------------\r
-#define        REG_PCIE_MULTIFET_CTRL_8192E    0x036A  //PCIE Multi-Fethc Control\r
+#define        REG_PCIE_CTRL_REG_8192E                 0x0300\r
+#define        REG_INT_MIG_8192E                                       0x0304  // Interrupt Migration \r
+#define        REG_BCNQ_TXBD_DESA_8192E                0x0308  // TX Beacon Descriptor Address\r
+#define        REG_MGQ_TXBD_DESA_8192E                 0x0310  // TX Manage Queue Descriptor Address\r
+#define        REG_VOQ_TXBD_DESA_8192E                 0x0318  // TX VO Queue Descriptor Address\r
+#define        REG_VIQ_TXBD_DESA_8192E                 0x0320  // TX VI Queue Descriptor Address\r
+#define        REG_BEQ_TXBD_DESA_8192E                 0x0328  // TX BE Queue Descriptor Address\r
+#define        REG_BKQ_TXBD_DESA_8192E                 0x0330  // TX BK Queue Descriptor Address\r
+#define        REG_RXQ_RXBD_DESA_8192E                 0x0338  // RX Queue     Descriptor Address\r
+#define        REG_HI0Q_TXBD_DESA_8192E                        0x0340\r
+#define        REG_HI1Q_TXBD_DESA_8192E                        0x0348\r
+#define        REG_HI2Q_TXBD_DESA_8192E                        0x0350\r
+#define        REG_HI3Q_TXBD_DESA_8192E                        0x0358\r
+#define        REG_HI4Q_TXBD_DESA_8192E                        0x0360\r
+#define        REG_HI5Q_TXBD_DESA_8192E                        0x0368\r
+#define        REG_HI6Q_TXBD_DESA_8192E                        0x0370\r
+#define        REG_HI7Q_TXBD_DESA_8192E                        0x0378\r
+#define        REG_MGQ_TXBD_NUM_8192E                  0x0380\r
+#define        REG_RX_RXBD_NUM_8192E                   0x0382\r
+#define        REG_VOQ_TXBD_NUM_8192E                  0x0384\r
+#define        REG_VIQ_TXBD_NUM_8192E                  0x0386\r
+#define        REG_BEQ_TXBD_NUM_8192E                  0x0388\r
+#define        REG_BKQ_TXBD_NUM_8192E                  0x038A\r
+#define        REG_HI0Q_TXBD_NUM_8192E                 0x038C\r
+#define        REG_HI1Q_TXBD_NUM_8192E                 0x038E\r
+#define        REG_HI2Q_TXBD_NUM_8192E                 0x0390\r
+#define        REG_HI3Q_TXBD_NUM_8192E                 0x0392\r
+#define        REG_HI4Q_TXBD_NUM_8192E                 0x0394\r
+#define        REG_HI5Q_TXBD_NUM_8192E                 0x0396\r
+#define        REG_HI6Q_TXBD_NUM_8192E                 0x0398\r
+#define        REG_HI7Q_TXBD_NUM_8192E                 0x039A\r
+#define        REG_TSFTIMER_HCI_8192E                  0x039C\r
+\r
+//Read Write Point\r
+#define        REG_VOQ_TXBD_IDX_8192E                  0x03A0\r
+#define        REG_VIQ_TXBD_IDX_8192E                  0x03A4\r
+#define        REG_BEQ_TXBD_IDX_8192E                  0x03A8\r
+#define        REG_BKQ_TXBD_IDX_8192E                  0x03AC\r
+#define        REG_MGQ_TXBD_IDX_8192E                  0x03B0\r
+#define        REG_RXQ_TXBD_IDX_8192E                  0x03B4\r
+#define        REG_HI0Q_TXBD_IDX_8192E                 0x03B8\r
+#define        REG_HI1Q_TXBD_IDX_8192E                 0x03BC\r
+#define        REG_HI2Q_TXBD_IDX_8192E                 0x03C0\r
+#define        REG_HI3Q_TXBD_IDX_8192E                 0x03C4\r
+#define        REG_HI4Q_TXBD_IDX_8192E                 0x03C8\r
+#define        REG_HI5Q_TXBD_IDX_8192E                 0x03CC\r
+#define        REG_HI6Q_TXBD_IDX_8192E                 0x03D0\r
+#define        REG_HI7Q_TXBD_IDX_8192E                 0x03D4\r
+\r
+#define        REG_PCIE_HCPWM_8192EE                   0x03D8 // ??????\r
+#define        REG_PCIE_HRPWM_8192EE                   0x03DC  //PCIe RPWM // ??????\r
+#define        REG_DBI_WDATA_V1_8192E                  0x03E8\r
+#define        REG_DBI_RDATA_V1_8192E                  0x03EC\r
+#define        REG_DBI_FLAG_V1_8192E                           0x03F0\r
+#define        REG_MDIO_V1_8192E                                       0x3F4\r
+#define        REG_PCIE_MIX_CFG_8192E                          0x3F8\r
 \r
 //-----------------------------------------------------\r
 //\r
 //\r
 //-----------------------------------------------------\r
 #define REG_TXBF_CTRL_8192E                            0x042C\r
+#define REG_ARFR0_8192E                                        0x0444\r
 #define REG_ARFR1_8192E                                        0x044C\r
 #define REG_CCK_CHECK_8192E                            0x0454\r
 #define REG_AMPDU_MAX_TIME_8192E                       0x0456\r
 #define REG_BCNQ1_BDNY_8192E                           0x0457\r
 \r
 #define REG_AMPDU_MAX_LENGTH_8192E     0x0458\r
+#define REG_WMAC_LBK_BUF_HD_8192E                      0x045D\r
 #define REG_NDPA_OPT_CTRL_8192E                0x045F\r
 #define REG_DATA_SC_8192E                              0x0483\r
+#ifdef CONFIG_WOWLAN\r
+#define REG_TXPKTBUF_IV_LOW             0x0484\r
+#define REG_TXPKTBUF_IV_HIGH            0x0488\r
+#endif\r
+#define REG_ARFR2_8192E                                        0x048C\r
+#define REG_ARFR3_8192E                                        0x0494\r
 #define REG_TXRPT_START_OFFSET                 0x04AC\r
 #define REG_AMPDU_BURST_MODE_8192E     0x04BC\r
 #define REG_HT_SINGLE_AMPDU_8192E              0x04C7\r
 #define        AcmHw_ViqStatus_8192E                   BIT(6)\r
 #define        AcmHw_BeqStatus_8192E                   BIT(7)\r
 \r
+//========================================================\r
+// General definitions\r
+//========================================================\r
 \r
-\r
+#define MACID_NUM_8192E 128\r
+#define CAM_ENTRY_NUM_8192E 64\r
 \r
 #endif //__RTL8192E_SPEC_H__\r
 \r
index 200a111b20e71e2461fe60a348081b2a97e2c2bc..04b629e7ac8282262d43d8819bc1e245f41668bd 100644 (file)
@@ -127,17 +127,7 @@ typedef struct txdescriptor_8192e
        u32 mcs15_sgi_max_len:4;\r
 }TXDESC_8192E, *PTXDESC_8192E; \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
 \r
 //For 88e early mode\r
 #define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value)\r
@@ -207,16 +197,48 @@ typedef struct txdescriptor_8192e
 #define USB_TXAGG_NUM_SHT      24\r
 \r
 \r
+//=====Tx Desc Buffer content\r
+\r
+// config element for each tx buffer \r
+/*\r
+#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16), 0, 16, __Valeu)\r
+#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16), 31, 1, __Valeu)\r
+#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+4, 0, 32, __Valeu)\r
+#define SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+8, 0, 32, __Valeu)\r
+*/\r
+#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8), 0, 16, __Valeu)\r
+#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8), 31, 1, __Valeu)\r
+#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8)+4, 0, 32, __Valeu)\r
+#define SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+8, 0, 32, __Valeu)\r
+\r
+\r
+// Dword 0\r
+#define SET_TX_BUFF_DESC_LEN_0_92E(__pTxDesc, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 14, __Valeu)\r
+#define SET_TX_BUFF_DESC_PSB_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 15, __Value)\r
+#define SET_TX_BUFF_DESC_OWN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value)\r
+// Dword 1\r
+#define SET_TX_BUFF_DESC_ADDR_LOW_0_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 32, __Value)\r
+#define GET_TX_DESC_TX_BUFFER_ADDRESS_92E(__pTxDesc) LE_BITS_TO_4BYTE(__pTxDesc+4, 0,32)\r
+\r
+\r
+// Dword 2\r
+#define SET_TX_BUFF_DESC_ADDR_HIGH_0_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0, 32, __Value)\r
+// Dword 3, RESERVED \r
+\r
 \r
-//=====Desc content\r
+//=====Tx Desc content\r
 // Dword 0\r
 #define SET_TX_DESC_PKT_SIZE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Value)\r
 #define SET_TX_DESC_OFFSET_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value)\r
 #define SET_TX_DESC_BMC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 24, 1, __Value)\r
 #define SET_TX_DESC_HTC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 25, 1, __Value)\r
+#define SET_TX_DESC_LAST_SEG_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 26, 1, __Value)\r
+#define SET_TX_DESC_FIRST_SEG_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 27, 1, __Value)\r
 #define SET_TX_DESC_LINIP_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 28, 1, __Value)\r
 #define SET_TX_DESC_NO_ACM_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 29, 1, __Value)\r
 #define SET_TX_DESC_GF_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 30, 1, __Value)\r
+#define SET_TX_DESC_OWN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value)\r
+#define GET_TX_DESC_OWN_92E(__pTxDesc) LE_BITS_TO_4BYTE(__pTxDesc, 31, 1)\r
 \r
 // Dword 1\r
 #define SET_TX_DESC_MACID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 7, __Value)\r
@@ -324,13 +346,8 @@ typedef struct txdescriptor_8192e
 #define SET_TX_DESC_TXBF_PATH_92E(__pTxDesc, __Value)                                  SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 11, 1, __Value)\r
 #define SET_TX_DESC_SEQ_92E(__pTxDesc, __Value)                                        SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 12, 12, __Value)\r
 #define SET_TX_DESC_FINAL_DATA_RATE_92E(__pTxDesc, __Value)                                    SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 24, 8, __Value)\r
-// Dword 10\r
-#define SET_TX_DESC_TX_BUFFER_ADDRESS_92E(__pTxDesc, __Value)  SET_BITS_TO_LE_4BYTE(__pTxDesc+40, 0, 32, __Value)\r
 \r
 \r
-// Dword 11\r
-#define SET_TX_DESC_NEXT_DESC_ADDRESS_92E(__pTxDesc, __Value)  SET_BITS_TO_LE_4BYTE(__pTxDesc+48, 0, 32, __Value)\r
-\r
 #define SET_EARLYMODE_PKTNUM_92E(__pAddr, __Value)                                     SET_BITS_TO_LE_4BYTE(__pAddr, 0, 4, __Value)\r
 #define SET_EARLYMODE_LEN0_92E(__pAddr, __Value)                                       SET_BITS_TO_LE_4BYTE(__pAddr, 4, 15, __Value)\r
 #define SET_EARLYMODE_LEN1_1_92E(__pAddr, __Value)                                     SET_BITS_TO_LE_4BYTE(__pAddr, 19, 13, __Value)\r
@@ -338,9 +355,8 @@ typedef struct txdescriptor_8192e
 #define SET_EARLYMODE_LEN2_92E(__pAddr, __Value)                                       SET_BITS_TO_LE_4BYTE(__pAddr+4, 2, 15,  __Value)\r
 #define SET_EARLYMODE_LEN3_92E(__pAddr, __Value)                                       SET_BITS_TO_LE_4BYTE(__pAddr+4, 17, 15, __Value)\r
 \r
-\r
-\r
 void rtl8192e_fill_fake_txdesc(PADAPTER        padapter,u8*pDesc,u32 BufferLen,u8 IsPsPoll,u8  IsBTQosNull);\r
+void rtl8192e_cal_txdesc_chksum(u8 *ptxdesc);\r
 \r
 #ifdef CONFIG_USB_HCI\r
 s32 rtl8192eu_init_xmit_priv(PADAPTER padapter);\r
@@ -358,12 +374,27 @@ s32 rtl8192eu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv
 s32 rtl8192ee_init_xmit_priv(PADAPTER padapter);\r
 void rtl8192ee_free_xmit_priv(PADAPTER padapter);\r
 struct xmit_buf *rtl8192ee_dequeue_xmitbuf(struct rtw_tx_ring *ring);\r
+s32    rtl8192ee_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\r
 void   rtl8192ee_xmitframe_resume(_adapter *padapter);\r
 s32 rtl8192ee_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\r
 s32 rtl8192ee_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\r
 void rtl8192ee_xmit_tasklet(void *priv);\r
 #endif\r
 \r
+#if defined(CONFIG_SDIO_HCI)||defined (CONFIG_GSPI_HCI)\r
+s32 rtl8192es_init_xmit_priv(PADAPTER padapter);\r
+void rtl8192es_free_xmit_priv(PADAPTER padapter);\r
+\r
+s32 rtl8192es_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\r
+s32 rtl8192es_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\r
+s32    rtl8192es_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\r
+thread_return rtl8192es_xmit_thread(thread_context context);\r
+s32 rtl8192es_xmit_buf_handler(PADAPTER padapter);\r
+\r
+#ifdef CONFIG_SDIO_TX_TASKLET\r
+void rtl8192es_xmit_tasklet(void *priv);\r
+#endif\r
+#endif\r
 \r
 struct txrpt_ccx_92e {\r
        /* offset 0 */\r
@@ -402,12 +433,19 @@ struct txrpt_ccx_92e {
 #ifdef CONFIG_TX_EARLY_MODE\r
 void UpdateEarlyModeInfo8192E(struct xmit_priv *pxmitpriv,struct xmit_buf *pxmitbuf );\r
 #endif\r
-\r
+ s32   rtl8192e_init_xmit_priv(_adapter *padapter);\r
 void _dbg_dump_tx_info(_adapter        *padapter,int frame_tag,u8 *ptxdesc);\r
 \r
-u8     BWMapping_92E(PADAPTER Adapter, struct pkt_attrib *pattrib);\r
+void rtl8192e_fill_fake_txdesc(PADAPTER        padapter,u8*pDesc,u32 BufferLen,u8 IsPsPoll,u8  IsBTQosNull);\r
+void rtl8192e_cal_txdesc_chksum(u8 *ptxdesc);\r
 \r
+u8     BWMapping_92E(PADAPTER Adapter, struct pkt_attrib *pattrib);\r
 u8     SCMapping_92E(PADAPTER Adapter, struct pkt_attrib       *pattrib);\r
+void fill_txdesc_phy(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc);\r
+void fill_txdesc_vcs(struct pkt_attrib *pattrib, u8 *ptxdesc);\r
+void fill_txdesc_sectype(struct pkt_attrib *pattrib, u8 *ptxdesc);\r
+void rtl8192e_fixed_rate(_adapter *padapter,u8 *ptxdesc);\r
 \r
 #endif //__RTL8192E_XMIT_H__\r
 \r
+\r
index 43523d440f07ef68063944f4f4887855f7f1e6c1..ced4a49623eff15edf220af30aa824b344d1db5a 100644 (file)
@@ -21,7 +21,7 @@
 #define __RTL8723A_CMD_H__
 
 
-#define H2C_BT_FW_PATCH_LEN            3
+#define H2C_8723A_BT_FW_PATCH_LEN              3
 #define H2C_BT_PWR_FORCE_LEN           3
 
 enum cmd_msg_element_id
@@ -49,11 +49,11 @@ enum cmd_msg_element_id
        BT_PTA_MANAGER_UPDATE_ENABLE_EID = 38,
        DAC_SWING_VALUE_EID = 41,
        TRADITIONAL_TDMA_EN_EID = 51,
-       H2C_BT_FW_PATCH = 54,
+       H2C_8723A_BT_FW_PATCH = 54,
        B_TYPE_TDMA_EID = 58,
        SCAN_EN_EID = 59,
        LOWPWR_LPS_EID = 71,
-       H2C_RESET_TSF = 75,
+       H2C_8723A_RESET_TSF = 75,
        MAX_CMDMSG_EID   
 };
 
index 13c68614c0354d5b168473c1c1c851a44314de05..d7f7b8fb0a63d98ba29bd43bd1e91a6ae7076a8f 100644 (file)
 \r
 \r
 //#include "hal_com.h"\r
-#if 1\r
 #include "hal_data.h"\r
-#else\r
-#include "../hal/OUTSRC/odm_precomp.h"\r
-#endif\r
 \r
 #include "rtl8723a_spec.h"\r
 #include "rtl8723a_pg.h"\r
@@ -155,13 +151,6 @@ typedef struct _RT_FIRMWARE_8723A {
        u8                      szFwBuffer[FW_8723A_SIZE];\r
 #endif\r
        u32                     ulFwLength;\r
-\r
-#ifdef CONFIG_EMBEDDED_FWIMG\r
-       u8*                     szBTFwBuffer;\r
-#else\r
-       u8                      szBTFwBuffer[FW_8723A_SIZE];\r
-#endif\r
-       u32                     ulBTFwLength;\r
 } RT_FIRMWARE_8723A, *PRT_FIRMWARE_8723A;\r
 \r
 //\r
@@ -448,6 +437,7 @@ void Hal_InitChannelPlan(PADAPTER padapter);
 void rtl8723a_set_hal_ops(struct hal_ops *pHalFunc);\r
 void SetHwReg8723A(PADAPTER padapter, u8 variable, u8 *val);\r
 void GetHwReg8723A(PADAPTER padapter, u8 variable, u8 *val);\r
+u8 GetHalDefVar8723A(PADAPTER Adapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);\r
 #ifdef CONFIG_BT_COEXIST\r
 void rtl8723a_SingleDualAntennaDetection(PADAPTER padapter);\r
 #endif\r
index 6f67856f32964d62222cf8619c29bc12611321ab..de2c28e281adbe611a752141e6fa2c8ea176a3c3 100644 (file)
@@ -98,6 +98,8 @@
 //     General definitions\r
 //============================================================================\r
 \r
+#define MACID_NUM_8723A 32\r
+#define CAM_ENTRY_NUM_8723A 32\r
 \r
-#endif\r
+#endif /* __RTL8723A_SPEC_H__ */\r
 \r
index a4bc48d1d04ad86ff263788d240bb8fa1850af79..0613b87947bc0d8bef99d898b599ce4afa9ea033 100644 (file)
@@ -48,7 +48,7 @@
 \r
 //OFFSET 8\r
 #define AGG_EN         BIT(29)\r
-\r
+#define AMPDU_DENSITY_SHT 20\r
 //OFFSET 12\r
 #define SEQ_SHT                16\r
 \r
index c7727c4c9f42930772f61569b0386a74a0d68e9c..9826d0da30ed069fc55240f9ae06b9017f927c30 100644 (file)
@@ -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,
@@ -156,38 +158,38 @@ enum h2c_cmd_8723B{
 //----------------------------------    H2C CMD CONTENT    --------------------------------------------------//
 //---------------------------------------------------------------------------------------------------------//
 //_RSVDPAGE_LOC_CMD_0x00
-#define SET_8723B_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)            SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_8723B_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)                       SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)
-#define SET_8723B_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)            SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
-#define SET_8723B_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)
-#define SET_8723B_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value)
+#define SET_8723B_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_8723B_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)                               SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
+#define SET_8723B_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_8723B_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
+#define SET_8723B_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)
 
 //_MEDIA_STATUS_RPT_PARM_CMD_0x01
-#define SET_8723B_H2CCMD_MSRRPT_PARM_OPMODE(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID_IND(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
-#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID(__pH2CCmd, __Value)                 SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)
-#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID_END(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 8, __Value)
+#define SET_8723B_H2CCMD_MSRRPT_PARM_OPMODE(__pH2CCmd, __Value)                                SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
+#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID_IND(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID(__pH2CCmd, __Value)                         SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)
+#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID_END(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)
 
 //_KEEP_ALIVE_CMD_0x03
-#define SET_8723B_H2CCMD_KEEPALIVE_PARM_ENABLE(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_8723B_H2CCMD_KEEPALIVE_PARM_ADOPT(__pH2CCmd, __Value)              SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
-#define SET_8723B_H2CCMD_KEEPALIVE_PARM_PKT_TYPE(__pH2CCmd, __Value)           SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
-#define SET_8723B_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(__pH2CCmd, __Value)               SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)
+#define SET_8723B_H2CCMD_KEEPALIVE_PARM_ENABLE(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
+#define SET_8723B_H2CCMD_KEEPALIVE_PARM_ADOPT(__pH2CCmd, __Value)                              SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_8723B_H2CCMD_KEEPALIVE_PARM_PKT_TYPE(__pH2CCmd, __Value)                   SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
+#define SET_8723B_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(__pH2CCmd, __Value)               SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)
 
 //_DISCONNECT_DECISION_CMD_0x04
-#define SET_8723B_H2CCMD_DISCONDECISION_PARM_ENABLE(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_8723B_H2CCMD_DISCONDECISION_PARM_ADOPT(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
-#define SET_8723B_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)
-#define SET_8723B_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(__pH2CCmd, __Value)           SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 8, __Value)
+#define SET_8723B_H2CCMD_DISCONDECISION_PARM_ENABLE(__pH2CCmd, __Value)                        SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
+#define SET_8723B_H2CCMD_DISCONDECISION_PARM_ADOPT(__pH2CCmd, __Value)                 SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_8723B_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(__pH2CCmd, __Value)  SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)
+#define SET_8723B_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(__pH2CCmd, __Value)   SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)
 
 // _PWR_MOD_CMD_0x20
-#define SET_8723B_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)                 SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)                 SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)        SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)      SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value)    SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value)        SET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)                         SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)                         SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)      SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value)                                SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+5, 0, 8, __Value)
 
 #define GET_8723B_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd)                                  LE_BITS_TO_1BYTE(__pH2CCmd, 0, 8)
 
@@ -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
+
old mode 100644 (file)
new mode 100755 (executable)
index d7a99a4..b80fb45
@@ -82,14 +82,6 @@ typedef struct _RT_FIRMWARE {
        u8                      szFwBuffer[FW_8723B_SIZE];\r
 #endif\r
        u32                     ulFwLength;\r
-\r
-#ifdef CONFIG_EMBEDDED_FWIMG\r
-       u8*                     szBTFwBuffer;\r
-       u8                      myBTFwBuffer[FW_8723B_SIZE];\r
-#else\r
-       u8                      szBTFwBuffer[FW_8723B_SIZE];\r
-#endif\r
-       u32                     ulBTFwLength;\r
 } RT_FIRMWARE_8723B, *PRT_FIRMWARE_8723B;\r
 \r
 //\r
@@ -133,7 +125,11 @@ typedef struct _RT_8723B_FIRMWARE_HDR
 #define PAGE_SIZE_RX_8723B                     8\r
 \r
 #define RX_DMA_SIZE_8723B                      0x4000  // 16K\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
@@ -164,7 +160,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
@@ -231,6 +227,10 @@ 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
        MAX_C2HEVENT\r
 } C2H_EVT;\r
 \r
@@ -284,13 +284,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
@@ -320,6 +323,9 @@ void HalSetOutPutGPIO(PADAPTER padapter, u8 index, u8 OutPutValue);
 int FirmwareDownloadBT(IN PADAPTER Adapter, PRT_MP_FIRMWARE pFirmware);\r
 \r
 void CCX_FwC2HTxRpt_8723b(PADAPTER padapter, u8 *pdata, u8 len);\r
+#ifdef CONFIG_FW_C2H_DEBUG\r
+void Debug_FwC2H_8723b(PADAPTER padapter, u8 *pdata, u8 len);\r
+#endif //CONFIG_FW_C2H_DEBUG\r
 s32 c2h_id_filter_ccx_8723b(u8 *buf);\r
 s32 c2h_handler_8723b(PADAPTER padapter, u8 *pC2hEvent);\r
 u8 MRateToHwRate8723B(u8  rate);\r
old mode 100644 (file)
new mode 100755 (executable)
index 3f0990f..4218f50
 #endif // !CONFIG_SDIO_RX_COPY\r
 #endif // CONFIG_SDIO_HCI\r
 \r
-typedef struct rxreport_8723b\r
-{\r
-       //DWORD 0\r
-       u32 pktlen:14;\r
-       u32 crc32:1;\r
-       u32 icverr:1;\r
-       u32 drvinfosize:4;\r
-       u32 security:3;\r
-       u32 qos:1;\r
-       u32 shift:2;\r
-       u32 physt:1;\r
-       u32 swdec:1;\r
-       u32 rsvd0028:2;\r
-       u32 eor:1;\r
-       u32 rsvd0031:1;\r
-\r
-       //DWORD 1\r
-       u32 macid:7;\r
-       u32 rsvd0407:1;\r
-       u32 tid:4;\r
-       u32 macid_vld:1;\r
-       u32 amsdu:1;\r
-       u32 rxid_match:1;\r
-       u32 paggr:1;\r
-       u32 a1fit:4;\r
-       u32 chkerr:1;  //20\r
-       u32 rx_ipv:1;\r
-       u32 rx_is_tcp_udp:1;\r
-       u32 chk_vld:1;   //23\r
-       u32 pam:1;\r
-       u32 pwr:1;\r
-       u32 md:1;\r
-       u32 mf:1;\r
-       u32 type:2;\r
-       u32 mc:1;\r
-       u32 bc:1;\r
-\r
-       //DWORD 2\r
-       u32 seq:12;\r
-       u32 frag:4;\r
-       u32 rx_is_qos:1;\r
-       u32 rsvd0817:1;\r
-       u32 wlanhd_iv_len:6;\r
-       u32 hwrsvd0824:4;\r
-       u32 c2h_ind:1;\r
-       u32 rsvd0829:2;\r
-       u32 fcs_ok:1;\r
-\r
-       //DWORD 3\r
-       u32 rx_rate:7;\r
-       u32 rsvd1207:3;\r
-       u32 htc:1;\r
-       u32 esop:1;\r
-       u32 bssid_fit:2;\r
-       u32 rsvd1214:2;\r
-       u32 dma_agg_num:8;\r
-       u32 rsvd1224:5;\r
-       u32 patternmatch:1;\r
-       u32 unicastwake:1;\r
-       u32 magicwake:1;\r
-       \r
-       //DWORD 4\r
-       u32 splcp:1;    //Ofdm sgi or cck_splcp\r
-       u32 ldpc:1;\r
-       u32 stbc:1;\r
-       u32 not_sounding:1;\r
-       u32 bw:2;\r
-       u32 rsvd1606:26;\r
-\r
-       //DWORD 5\r
-       u32 tsfl;\r
-} RXREPORT, *PRXREPORT;\r
-\r
-typedef struct phystatus_8723b\r
-{\r
-       u32 rxgain_a:7;\r
-       u32 trsw_a:1;\r
-       u32 rxgain_b:7;\r
-       u32 trsw_b:1;\r
-       u32 chcorr_l:16;\r
-\r
-       u32 sigqualcck:8;\r
-       u32 cfo_a:8;\r
-       u32 cfo_b:8;\r
-       u32 chcorr_h:8;\r
-\r
-       u32 noisepwrdb_h:8;\r
-       u32 cfo_tail_a:8;\r
-       u32 cfo_tail_b:8;\r
-       u32 rsvd0824:8;\r
-\r
-       u32 rsvd1200:8;\r
-       u32 rxevm_a:8;\r
-       u32 rxevm_b:8;\r
-       u32 rxsnr_a:8;\r
-\r
-       u32 rxsnr_b:8;\r
-       u32 noisepwrdb_l:8;\r
-       u32 rsvd1616:8;\r
-       u32 postsnr_a:8;\r
-\r
-       u32 postsnr_b:8;\r
-       u32 csi_a:8;\r
-       u32 csi_b:8;\r
-       u32 targetcsi_a:8;\r
-\r
-       u32 targetcsi_b:8;\r
-       u32 sigevm:8;\r
-       u32 maxexpwr:8;\r
-       u32 exintflag:1;\r
-       u32 sgien:1;\r
-       u32 rxsc:2;\r
-       u32 idlelong:1;\r
-       u32 anttrainen:1;\r
-       u32 antselb:1;\r
-       u32 antsel:1;\r
-} PHYSTATUS, *PPHYSTATUS;\r
-\r
 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\r
 s32 rtl8723bs_init_recv_priv(PADAPTER padapter);\r
 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
 #ifdef CONFIG_USB_HCI\r
-void update_recvframe_attrib(PADAPTER padapter, union recv_frame *precvframe, struct recv_stat *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
@@ -167,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
old mode 100644 (file)
new mode 100755 (executable)
index b1fba0f..aa4bc2c
 #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
old mode 100644 (file)
new mode 100755 (executable)
index 2de6a68..b998233
 #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
-//OFFSET 0\r
-#define OFFSET_SZ      0\r
-#define OFFSET_SHT     16\r
-#define BMC            BIT(24)\r
-#define LSG            BIT(26)\r
-#define FSG            BIT(27)\r
-#define OWN            BIT(31)\r
-\r
-\r
-//OFFSET 4\r
-#define PKT_OFFSET_SZ  0\r
-#define BK             BIT(6)\r
-#define QSEL_SHT       8\r
-#define Rate_ID_SHT    16\r
-#define NAVUSEHDR      BIT(20)\r
-#define PKT_OFFSET_SHT 26\r
-#define HWPC           BIT(31)\r
-\r
-//OFFSET 8\r
-#define AGG_EN         BIT(29)\r
-\r
-//OFFSET 12\r
-#define SEQ_SHT                16\r
-\r
-//OFFSET 16\r
-#define QoS            BIT(6)\r
-#define HW_SEQ_EN      BIT(7)\r
-#define USERATE                BIT(8)\r
-#define DISDATAFB      BIT(10)\r
-#define DATA_SHORT     BIT(24)\r
-#define DATA_BW                BIT(25)\r
-\r
-//OFFSET 20\r
-#define SGI            BIT(6)\r
-\r
-//\r
-//defined for TX DESC Operation\r
-//\r
-typedef struct txdesc_8723b\r
-{\r
-       // Offset 0\r
-       u32 pktlen:16;\r
-       u32 offset:8;\r
-       u32 bmc:1;\r
-       u32 htc:1;\r
-       u32 rsvd0026:1;\r
-       u32 rsvd0027:1;\r
-       u32 linip:1;\r
-       u32 noacm:1;\r
-       u32 gf:1;\r
-       u32 rsvd0031:1;\r
-\r
-       // Offset 4\r
-       u32 macid:7;\r
-       u32 rsvd0407:1;\r
-       u32 qsel:5;\r
-       u32 rdg_nav_ext:1;\r
-       u32 lsig_txop_en:1;\r
-       u32 pifs:1;\r
-       u32 rate_id:5;\r
-       u32 en_desc_id:1;\r
-       u32 sectype:2;\r
-       u32 pkt_offset:5; // unit: 8 bytes\r
-       u32 moredata:1;\r
-       u32 txop_ps_cap:1;\r
-       u32 txop_ps_mode:1;\r
-\r
-       // Offset 8\r
-       u32 p_aid:9;\r
-       u32 rsvd0809:1;\r
-       u32 cca_rts:2;\r
-       u32 agg_en:1;\r
-       u32 rdg_en:1;\r
-       u32 null_0:1;\r
-       u32 null_1:1;\r
-       u32 bk:1;\r
-       u32 morefrag:1;\r
-       u32 raw:1;\r
-       u32 spe_rpt:1;\r
-       u32 ampdu_density:3;\r
-       u32 bt_null:1;\r
-       u32 g_id:6;\r
-       u32 rsvd0830:2;\r
-\r
-       // Offset 12\r
-       u32 wheader_len:4;\r
-       u32 chk_en:1;\r
-       u32 early_rate:1;\r
-       u32 hw_ssn_sel:2;\r
-       u32 userate:1;\r
-       u32 disrtsfb:1;\r
-       u32 disdatafb:1;\r
-       u32 cts2self:1;\r
-       u32 rtsen:1;\r
-       u32 hw_rts_en:1;\r
-       u32 port_id:1;\r
-       u32 navusehdr:1;\r
-       u32 use_max_len:1;\r
-       u32 max_agg_num:5;\r
-       u32 ndpa:2;\r
-       u32 ampdu_max_time:8;\r
-\r
-       // Offset 16\r
-       u32 datarate:7;\r
-       u32 try_rate:1;\r
-       u32 data_ratefb_lmt:5;\r
-       u32 rts_ratefb_lmt:4;\r
-       u32 rty_lmt_en:1;\r
-       u32 data_rt_lmt:6;\r
-       u32 rtsrate:5;\r
-       u32 pcts_en:1;\r
-       u32 pcts_mask_idx:2;\r
-\r
-       // Offset 20\r
-       u32 data_sc:4;\r
-       u32 data_short:1;\r
-       u32 data_bw:2;\r
-       u32 data_ldpc:1;\r
-       u32 data_stbc:2;\r
-       u32 vcs_stbc:2;\r
-       u32 rts_short:1;\r
-       u32 rts_sc:4;\r
-       u32 rsvd2016:7;\r
-       u32 tx_ant:4;\r
-       u32 txpwr_offset:3;\r
-       u32 rsvd2031:1;\r
-\r
-       // Offset 24\r
-       u32 sw_define:12;\r
-       u32 mbssid:4;\r
-       u32 antsel_A:3;\r
-       u32 antsel_B:3;\r
-       u32 antsel_C:3;\r
-       u32 antsel_D:3;\r
-       u32 rsvd2428:4;\r
-\r
-       // Offset 28\r
-       u32 checksum:16;\r
-       u32 rsvd2816:8;\r
-       u32 usb_txagg_num:8;\r
-\r
-       // Offset 32\r
-       u32 rts_rc:6;\r
-       u32 bar_rty_th:2;\r
-       u32 data_rc:6;\r
-       u32 rsvd3214:1;\r
-       u32 en_hwseq:1;\r
-       u32 nextneadpage:8;\r
-       u32 tailpage:8;\r
-\r
-       // Offset 36\r
-       u32 padding_len:11;\r
-       u32 txbf_path:1;\r
-       u32 seq:12;\r
-       u32 final_data_rate:8;\r
-}TXDESC_8723B, *PTXDESC_8723B;\r
 \r
 #ifndef __INC_HAL8723BDESC_H\r
 #define __INC_HAL8723BDESC_H\r
@@ -349,6 +182,7 @@ typedef struct txdesc_8723b
 \r
 // Dword 6\r
 #define SET_TX_DESC_SW_DEFINE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 0, 12, __Value)\r
+#define SET_TX_DESC_MBSSID_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 12, 4, __Value)\r
 #define SET_TX_DESC_ANTSEL_A_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 16, 3, __Value)\r
 #define SET_TX_DESC_ANTSEL_B_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 19, 3, __Value)\r
 #define SET_TX_DESC_ANTSEL_C_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 22, 3, __Value)\r
index 31b7809e43cff68eca4c259681e38413ceeebc18..2aee39b36578773d1711c67a0322ddfbbfc3f3ae 100644 (file)
@@ -41,6 +41,7 @@ typedef enum _RTL8812_H2C_CMD
        H2C_8812_RA_MASK = 0x40,
        H2C_8812_TxBF = 0x41,
        H2C_8812_RSSI_REPORT = 0x42,
+       H2C_8812_IQ_CALIBRATION = 0x45,
 
        H2C_8812_BT_FW_PATCH = 0x6a,
 
@@ -105,7 +106,7 @@ struct H2C_SS_RFOFF_PARAM{
 
 //_SETPWRMODE_PARM
 #define SET_8812_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)                          SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
-#define SET_8812_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)                                  SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
+#define SET_8812_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)                          SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
 #define SET_8812_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)                      SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)
 #define SET_8812_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
 #define SET_8812_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)       SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
@@ -134,7 +135,12 @@ u8 rtl8812_set_rssi_cmd(PADAPTER padapter, u8 *param);
 void rtl8812_set_raid_cmd(PADAPTER padapter, u32 bitmap, u8* arg);
 void rtl8812_Add_RateATid(PADAPTER padapter, u32 bitmap, u8* arg, u8 rssi_level);
 void rtl8812_set_wowlan_cmd(_adapter* padapter, u8 enable);
+s32 FillH2CCmd_8812(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);
+u8 GetTxBufferRsvdPageNum8812(_adapter *padapter, bool wowlan);
 
+#ifdef CONFIG_BT_COEXIST
+void rtl8812a_download_BTCoex_AP_mode_rsvd_page(PADAPTER padapter);
+#endif // CONFIG_BT_COEXIST
 #ifdef CONFIG_P2P_PS
 void rtl8812_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state);
 #endif //CONFIG_P2P
index 79718ee5933d472c797f446b82645d11a253d5c8..67a6518c0037441a09ec9ae9b09dcf6096fb244a 100644 (file)
 #define __RTL8812A_HAL_H__\r
 \r
 //#include "hal_com.h"\r
-#if 1\r
 #include "hal_data.h"\r
-#else\r
-#include "../hal/OUTSRC/odm_precomp.h"\r
-#endif\r
 \r
 //include HAL Related header after HAL Related compiling flags \r
 #include "rtl8812a_spec.h"\r
@@ -271,17 +267,6 @@ typedef enum _TX_PWR_PERCENTAGE{
 \r
 //#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) )\r
 \r
-#define GetRegTxBBSwing_2G(_Adapter)   (_Adapter->registrypriv.TxBBSwing_2G)\r
-#define GetRegTxBBSwing_5G(_Adapter)   (_Adapter->registrypriv.TxBBSwing_5G)\r
-\r
-#define GetRegAmplifierType2G(_Adapter)        (_Adapter->registrypriv.AmplifierType_2G)\r
-#define GetRegAmplifierType5G(_Adapter)        (_Adapter->registrypriv.AmplifierType_5G)\r
-\r
-#define GetRegbENRFEType(_Adapter)     (_Adapter->registrypriv.bEn_RFE)\r
-#define GetRegRFEType(_Adapter)        (_Adapter->registrypriv.RFE_Type)\r
-\r
-#define GetDefaultAdapter(padapter)    padapter\r
-\r
 // rtl8812_hal_init.c\r
 void   _8051Reset8812(PADAPTER padapter);\r
 s32    FirmwareDownload8812(PADAPTER Adapter, BOOLEAN bUsedWoWLANFw);\r
index d1c202995fb2c7146887a4573b71f84fc141d60a..1ad222dc99057e1914b008f8fba6a823d6bd5df2 100644 (file)
 \r
 #if defined(CONFIG_USB_HCI)\r
 \r
+#ifndef MAX_RECVBUF_SZ\r
 #ifdef PLATFORM_OS_CE\r
 #define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\r
 #else\r
        #ifndef CONFIG_MINIMAL_MEMORY_USAGE\r
+               #ifdef CONFIG_PLATFORM_MSTAR\r
+                       #define MAX_RECVBUF_SZ (8192) // 8K\r
+               #else\r
                #define MAX_RECVBUF_SZ (32768) // 32k\r
+               #endif\r
                //#define MAX_RECVBUF_SZ (24576) // 24k\r
                //#define MAX_RECVBUF_SZ (20480) //20K\r
                //#define MAX_RECVBUF_SZ (10240) //10K\r
@@ -36,6 +41,7 @@
                #define MAX_RECVBUF_SZ (4000) // about 4K\r
        #endif\r
 #endif\r
+#endif //!MAX_RECVBUF_SZ\r
 \r
 #elif defined(CONFIG_PCI_HCI)\r
 //#ifndef CONFIG_MINIMAL_MEMORY_USAGE\r
index f1e266f14e7b60e464089c56c1eb1c0174309488..c5b56c8494a9de5c194481cc98bec588be2d1e84 100644 (file)
@@ -59,6 +59,7 @@
 #define REG_PKTBUF_DBG_ADDR                    (REG_PKTBUF_DBG_CTRL)\r
 #define REG_RXPKTBUF_DBG                               (REG_PKTBUF_DBG_CTRL+2)\r
 #define REG_TXPKTBUF_DBG                               (REG_PKTBUF_DBG_CTRL+3)\r
+#define REG_WOWLAN_WAKE_REASON          REG_MCUTST_WOWLAN\r
 \r
 #define REG_RSVD3_8812                                 0x0168\r
 #define REG_C2HEVT_CMD_SEQ_88XX                0x01A1\r
 #define REG_TXPKTBUF_WMAC_LBK_BF_HD_8812       0x045D\r
 #define REG_NDPA_OPT_CTRL_8812         0x045F\r
 #define REG_DATA_SC_8812                               0x0483\r
+#ifdef CONFIG_WOWLAN\r
+#define REG_TXPKTBUF_IV_LOW             0x0484\r
+#define REG_TXPKTBUF_IV_HIGH            0x0488\r
+#endif\r
 #define REG_ARFR2_8812                                 0x048C\r
 #define REG_ARFR3_8812                                 0x0494\r
 #define REG_TXRPT_START_OFFSET         0x04AC\r
 #define        AcmHw_ViqStatus_8812                    BIT(6)\r
 #define        AcmHw_BeqStatus_8812                    BIT(7)\r
 \r
-#endif //__RTL8188E_SPEC_H__\r
+//========================================================\r
+// General definitions\r
+//========================================================\r
+\r
+#define MACID_NUM_8812A 128\r
+#define CAM_ENTRY_NUM_8812A 64\r
+\r
+#endif /* __RTL8812A_SPEC_H__ */\r
 \r
 #ifdef CONFIG_RTL8821A\r
 #include "rtl8821a_spec.h"\r
-#endif // CONFIG_RTL8821A\r
+#endif /* CONFIG_RTL8821A */\r
 \r
index cc87890450f391f5ce4ffcfa46c823a2faa8d4c6..42e1a8895c7fb706ffbb6fcc5c7fa03fa1d81004 100644 (file)
 #ifndef __RTL8812A_XMIT_H__\r
 #define __RTL8812A_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
 //For 88e early mode\r
 #define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value)\r
@@ -331,7 +320,7 @@ typedef struct txdescriptor_8812
 \r
 \r
 void rtl8812a_cal_txdesc_chksum(u8 *ptxdesc);\r
-void rtl8812a_fill_fake_txdesc(PADAPTER        padapter,u8*pDesc,u32 BufferLen,u8 IsPsPoll,u8  IsBTQosNull);\r
+void rtl8812a_fill_fake_txdesc(PADAPTER        padapter,u8*pDesc,u32 BufferLen,u8 IsPsPoll,u8  IsBTQosNull, u8 bDataFrame);\r
 void rtl8812a_fill_txdesc_sectype(struct pkt_attrib *pattrib, u8 *ptxdesc);\r
 void rtl8812a_fill_txdesc_vcs(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc);\r
 void rtl8812a_fill_txdesc_phy(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc);\r
index a6fe31b3422147bb6fd0bea103ee682f48aa0013..4c79b3a1fa0bae2475b849fe6151222ae05c62f4 100644 (file)
@@ -42,6 +42,7 @@
 //-----------------------------------------------------\r
 //     0x0100h ~ 0x01FFh       MACTOP General Configuration\r
 //-----------------------------------------------------\r
+#define REG_WOWLAN_WAKE_REASON          REG_MCUTST_WOWLAN\r
 \r
 //-----------------------------------------------------\r
 //     0x0200h ~ 0x027Fh       TXDMA Configuration\r
 //       Regsiter Bit and Content definition\r
 //============================================================\r
 \r
+//========================================================\r
+// General definitions\r
+//========================================================\r
 \r
-#endif // __RTL8821A_SPEC_H__\r
+#define MACID_NUM_8821A 128\r
+#define CAM_ENTRY_NUM_8821A 64\r
+\r
+#endif /* __RTL8821A_SPEC_H__ */\r
 \r
index 5f3892ca555aab3992711b8fbb2b449c24ea3bb5..cc59417397a1d3c6e600254d0197819aba09f347 100644 (file)
@@ -45,6 +45,9 @@ enum ANDROID_WIFI_CMD {
        ANDROID_WIFI_CMD_P2P_GET_NOA,   
        ANDROID_WIFI_CMD_P2P_SET_PS,    
        ANDROID_WIFI_CMD_SET_AP_WPS_P2P_IE,
+
+       ANDROID_WIFI_CMD_MIRACAST,
+
 #ifdef CONFIG_PNO_SUPPORT
        ANDROID_WIFI_CMD_PNOSSIDCLR_SET,
        ANDROID_WIFI_CMD_PNOSETUP_SET,
@@ -76,6 +79,12 @@ enum ANDROID_WIFI_CMD {
 int rtw_android_cmdstr_to_num(char *cmdstr);
 int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd);
 
+#if defined(CONFIG_PNO_SUPPORT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))
+int rtw_android_pno_enable(struct net_device *net, int pno_enable);
+int rtw_android_cfg80211_pno_setup(struct net_device *net,
+               struct cfg80211_ssid *ssid, int n_ssids, int interval);
+#endif
+
 #if defined(RTW_ENABLE_WIFI_CONTROL_FUNC)
 int rtw_android_wifictrl_func_add(void);
 void rtw_android_wifictrl_func_del(void);
@@ -90,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 100644 (file)
@@ -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 7a1fa0d5242292bf9ef62854f39771583fd24655..9ede51af8d6a66674d6aec06c21d47875c67a929 100644 (file)
@@ -75,7 +75,7 @@ typedef enum _MP_BT_PAYLOAD_TYPE{
        MP_BT_PAYLOAD_ALL_0                                             = 2,\r
        MP_BT_PAYLOAD_11110000                                  = 3,\r
        MP_BT_PAYLOAD_PRBS9                                             = 4,\r
-       MP_BT_PAYLOAD_MAX\r
+       MP_BT_PAYLOAD_MAX                                               = 8,\r
 }MP_BT_PAYLOAD_TYPE,*PMP_BT_PAYLOAD_TYPE;\r
 \r
 \r
index dc3e623c3ac4a1e0cb9223e6db9a66076181f959..e7b2fa0a5d6fcb84d6e6c0529989bf11b948fab9 100644 (file)
@@ -29,7 +29,9 @@
 #define        PACKET_EAPOL                    3
 
 void rtw_btcoex_Initialize(PADAPTER);
-void rtw_btcoex_HAL_Initialize(PADAPTER 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);
 void rtw_btcoex_ScanNotify(PADAPTER, u8 type);
@@ -40,7 +42,7 @@ void rtw_btcoex_IQKNotify(PADAPTER padapter, u8 state);
 void rtw_btcoex_BtInfoNotify(PADAPTER, u8 length, u8 *tmpBuf);
 void rtw_btcoex_SuspendNotify(PADAPTER, u8 state);
 void rtw_btcoex_HaltNotify(PADAPTER);
-void rtw_btcoex_SwitchGntBt(PADAPTER);
+void rtw_btcoex_SwitchBtTRxMask(PADAPTER);
 void rtw_btcoex_Switch(PADAPTER, u8 enable);
 u8 rtw_btcoex_IsBtDisabled(PADAPTER);
 void rtw_btcoex_Handler(PADAPTER);
@@ -54,8 +56,9 @@ u8 rtw_btcoex_RpwmVal(PADAPTER);
 u8 rtw_btcoex_LpsVal(PADAPTER);
 void rtw_btcoex_SetBTCoexist(PADAPTER, u8 bBtExist);
 void rtw_btcoex_SetChipType(PADAPTER, u8 chipType);
-void rtw_btcoex_SetPGAntNum(PADAPTER, u8 antNum, u8 antInverse);
+void rtw_btcoex_SetPGAntNum(PADAPTER, u8 antNum);
 u8 rtw_btcoex_GetPGAntNum(PADAPTER);
+void rtw_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath);
 u32 rtw_btcoex_GetRaMask(PADAPTER);
 void rtw_btcoex_RecordPwrMode(PADAPTER, u8 *pCmdBuf, u8 cmdLen);
 void rtw_btcoex_DisplayBtCoexInfo(PADAPTER, u8 *pbuf, u32 bufsize);
index d0635d37fd14664d5bc28346f04a8f0c0e314836..eb0e33ea10f1b11c2067532bb715766c7cd461ac 100644 (file)
@@ -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);
@@ -222,6 +232,7 @@ enum rtw_drvextra_cmd_id
        DM_RA_MSK_WK_CID, //add for STA update RAMask when bandwith change.
        BEAMFORMING_WK_CID,
        LPS_CHANGE_DTIM_CID,
+       BTINFO_WK_CID,
        MAX_WK_CID
 };
 
@@ -234,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 {
@@ -951,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_
 
 
@@ -1031,6 +1053,10 @@ extern u8 rtw_ps_cmd(_adapter*padapter);
 u8 rtw_chk_hi_queue_cmd(_adapter*padapter);
 #endif
 
+#ifdef CONFIG_BT_COEXIST
+u8 rtw_btinfo_cmd(PADAPTER padapter, u8 *pbuf, u16 length);
+#endif
+
 u8 rtw_set_ch_cmd(_adapter*padapter, u8 ch, u8 bw, u8 ch_offset, u8 enqueue);
 extern u8 rtw_set_chplan_cmd(_adapter*padapter, u8 chplan, u8 enqueue, u8 swconfig);
 extern u8 rtw_led_blink_cmd(_adapter*padapter, PVOID pLed);
@@ -1043,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);
@@ -1136,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
 };
 
@@ -1219,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 09490bc00cff4f4bd9a3fbdd7a2df7e511c6dcb2..67edf7f0a6d0246d1c3e91ce96ef58e6b04650c8 100644 (file)
@@ -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...)     \
@@ -317,6 +319,12 @@ extern void rtl871x_cedbg(const char *fmt, ...);
 #endif /* defined(_dbgdump) */
 #endif /* CONFIG_DEBUG_RTL871X */
 
+#ifdef CONFIG_DBG_COUNTER
+#define DBG_COUNTER(counter) counter++
+#else
+#define DBG_COUNTER(counter) 
+#endif
+
 void dump_drv_version(void *sel);
 void dump_log_level(void *sel);
 
@@ -328,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);
@@ -351,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);
@@ -389,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);
@@ -417,6 +445,24 @@ ssize_t proc_set_odm_dbg_level(struct file *file, const char __user *buffer, siz
 int proc_get_odm_adaptivity(struct seq_file *m, void *v);
 ssize_t proc_set_odm_adaptivity(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
 
+#ifdef CONFIG_DBG_COUNTER
+int proc_get_rx_logs(struct seq_file *m, void *v);
+int proc_get_tx_logs(struct seq_file *m, void *v);
+int proc_get_int_logs(struct seq_file *m, void *v);
+#endif
+
+#ifdef CONFIG_PCI_HCI
+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 0bb448adc7ed2d066621f25409c0b20be3eaa977..7705adc9bd5267b6b2e2c61d21c0c8d26384a80f 100644 (file)
@@ -129,7 +129,7 @@ struct eeprom_priv
 #endif //CONFIG_RF_GAIN_OFFSET
 
 #ifdef CONFIG_SDIO_HCI
-       u8              sdio_setting;
+       u8              sdio_setting;   
        u32             ocr;
        u8              cis0[eeprom_cis0_sz];
        u8              cis1[eeprom_cis1_sz];   
index e2c63248d3a75c768fa03e733c558e4469567619..2fb9503e89c58413f469bc5c6e717f43104ab8a9 100644 (file)
@@ -82,6 +82,10 @@ struct addba_event
        unsigned int tid;
 };
 
+struct wmm_event
+{
+       unsigned char wmm;
+};
 
 #ifdef CONFIG_H2CLBK
 struct c2hlbk_event{
index fb9948a1043634b2600c8baa3ce07df5e9b3287b..84b3bfb134435c4b1836bb9e80032469145ffcd1 100644 (file)
@@ -32,6 +32,8 @@ struct ht_priv
        u32     tx_amsdu_maxlen; // 1: 8k, 0:4k ; default:8k, for tx
        u32     rx_ampdu_maxlen; //for rx reordering ctrl win_sz, updated when join_callback.
        
+       u8      rx_ampdu_min_spacing;
+       
        u8      ch_offset;//PRIME_CHNL_OFFSET
        u8      sgi_20m;
        u8      sgi_40m;
@@ -94,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 10b21477426ee81c050d7bff9255dad7fa6a7528..bad0acc5f4d91289aefc0e9efdab0f3910866cde 100644 (file)
@@ -312,6 +312,11 @@ struct reg_protocol_wt {
 #define MAX_CONTINUAL_IO_ERR SD_IO_TRY_CNT
 #endif
 
+#ifdef CONFIG_GSPI_HCI
+#define SD_IO_TRY_CNT (8)
+#define MAX_CONTINUAL_IO_ERR SD_IO_TRY_CNT
+#endif
+
 
 int rtw_inc_and_chk_continual_io_error(struct dvobj_priv *dvobj);
 void rtw_reset_continual_io_error(struct dvobj_priv *dvobj);
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_mem.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/include/rtw_mem.h
new file mode 100644 (file)
index 0000000..5283d77
--- /dev/null
@@ -0,0 +1,38 @@
+/******************************************************************************\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 __RTW_MEM_H__\r
+#define __RTW_MEM_H__\r
+\r
+#include <drv_conf.h>\r
+#include <basic_types.h>\r
+#include <osdep_service.h>\r
+\r
+\r
+#ifndef MAX_RECVBUF_SZ\r
+#define MAX_RECVBUF_SZ (32768-RECVBUFF_ALIGN_SZ) // 32k\r
+#endif\r
+\r
+struct u8* rtw_alloc_revcbuf_premem(void);\r
+struct sk_buff *rtw_alloc_skb_premem(void);\r
+int rtw_free_skb_premem(struct sk_buff *pskb);\r
+\r
+\r
+#endif //__RTW_MEM_H__\r
+\r
index 5615fecf301088b02b31f565d77f40d100b32771..908a1733bd9fdf5a4d28041346a0b2343e85bfc4 100644 (file)
@@ -254,11 +254,33 @@ struct cfg80211_wifidirect_info{
        struct ieee80211_channel        remain_on_ch_channel;
        enum nl80211_channel_type       remain_on_ch_type;
        u64                                             remain_on_ch_cookie;
+       bool not_indic_ro_ch_exp;
        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 +306,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 +428,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 +470,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];
@@ -618,9 +663,9 @@ struct mlme_priv {
 #ifdef CONFIG_CONCURRENT_MODE
        u8      scanning_via_buddy_intf;
 #endif
-       u8       NumOfBcnInfoChkFail;
-       u32     timeBcnInfoChkStart;
 
+//     u8      NumOfBcnInfoChkFail;
+//     u32     timeBcnInfoChkStart;
 };
 
 #define rtw_mlme_set_auto_scan_int(adapter, ms) \
@@ -656,6 +701,7 @@ extern void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf);
 extern void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf);
 extern void rtw_atimdone_event_callback(_adapter *adapter, u8 *pbuf);
 extern void rtw_cpwm_event_callback(_adapter *adapter, u8 *pbuf);
+extern void rtw_wmm_event_callback(PADAPTER padapter, u8 *pbuf);
 
 extern void rtw_join_timeout_handler(RTW_TIMER_HDL_ARGS);
 extern void _rtw_scan_timeout_handler(RTW_TIMER_HDL_ARGS);
@@ -784,7 +830,8 @@ struct wlan_network *rtw_find_same_network(_queue *scanned_queue, struct wlan_ne
 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);
-extern void rtw_free_network_nolock(_adapter* adapter, struct wlan_network *pnetwork );
+extern void rtw_free_network_nolock(_adapter* adapter,
+               struct wlan_network *pnetwork);
 void rtw_indicate_scan_done( _adapter *padapter, bool aborted);
 void rtw_scan_abort(_adapter *adapter);
 
index c40fca01df73a3cf27b65fef0a0dfdba81d89da1..3c781d0e5648f2da49b9b5e7e853b575bd079844 100644 (file)
 #define                _48M_RATE_      10
 #define                _54M_RATE_      11
 
+/********************************************************
+MCS rate definitions
+*********************************************************/
+#define MCS_RATE_1R    (0x000000ff)
+#define MCS_RATE_2R    (0x0000ffff)
+#define MCS_RATE_3R    (0x00ffffff)
+#define MCS_RATE_4R    (0xffffffff)
+#define MCS_RATE_2R_13TO15_OFF (0x00001fff)
+
 
 extern unsigned char RTW_WPA_OUI[];
 extern unsigned char WMM_OUI[];
@@ -187,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,
@@ -239,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;
 
@@ -288,26 +302,26 @@ enum Associated_AP
 
 typedef enum _HT_IOT_PEER
 {
-       HT_IOT_PEER_UNKNOWN                     = 0,
-       HT_IOT_PEER_REALTEK                     = 1,
-       HT_IOT_PEER_REALTEK_92SE                = 2,
-       HT_IOT_PEER_BROADCOM                    = 3,
-       HT_IOT_PEER_RALINK                      = 4,
-       HT_IOT_PEER_ATHEROS                     = 5,
-       HT_IOT_PEER_CISCO                       = 6,
-       HT_IOT_PEER_MERU                        = 7,
-       HT_IOT_PEER_MARVELL                     = 8,
-       HT_IOT_PEER_REALTEK_SOFTAP      = 9,// peer is RealTek SOFT_AP, by Bohn, 2009.12.17
-       HT_IOT_PEER_SELF_SOFTAP                 = 10, // Self is SoftAP
-       HT_IOT_PEER_AIRGO                       = 11,
-       HT_IOT_PEER_INTEL                       = 12,
-       HT_IOT_PEER_RTK_APCLIENT                = 13,
-       HT_IOT_PEER_REALTEK_81XX                = 14,
-       HT_IOT_PEER_REALTEK_WOW                 = 15,
-       HT_IOT_PEER_REALTEK_JAGUAR_BCUTAP       = 16,
-       HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP       = 17,
+       HT_IOT_PEER_UNKNOWN                     = 0,
+       HT_IOT_PEER_REALTEK                     = 1,
+       HT_IOT_PEER_REALTEK_92SE                = 2,
+       HT_IOT_PEER_BROADCOM            = 3,
+       HT_IOT_PEER_RALINK                      = 4,
+       HT_IOT_PEER_ATHEROS                     = 5,
+       HT_IOT_PEER_CISCO                               = 6,
+       HT_IOT_PEER_MERU                                = 7,    
+       HT_IOT_PEER_MARVELL                     = 8,
+       HT_IOT_PEER_REALTEK_SOFTAP      = 9,// peer is RealTek SOFT_AP, by Bohn, 2009.12.17
+       HT_IOT_PEER_SELF_SOFTAP                 = 10, // Self is SoftAP
+       HT_IOT_PEER_AIRGO                               = 11,
+       HT_IOT_PEER_INTEL                               = 12, 
+       HT_IOT_PEER_RTK_APCLIENT                = 13, 
+       HT_IOT_PEER_REALTEK_81XX                = 14,   
+       HT_IOT_PEER_REALTEK_WOW                 = 15,
+       HT_IOT_PEER_REALTEK_JAGUAR_BCUTAP = 16,
+       HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP = 17,
        HT_IOT_PEER_TPLINK_745N                 = 18,
-       HT_IOT_PEER_MAX                         = 19
+       HT_IOT_PEER_MAX                                 = 19
 }HT_IOT_PEER_E, *PHTIOT_PEER_E;
 
 
@@ -554,6 +568,9 @@ struct mlme_ext_priv
        struct p2p_channels channel_list;
        unsigned char   basicrate[NumRates];
        unsigned char   datarate[NumRates];
+#ifdef CONFIG_80211N_HT
+       unsigned char default_supported_mcs_set[16];
+#endif
        
        struct ss_res           sitesurvey_res;         
        struct mlme_ext_info    mlmext_info;//for sta/adhoc mode, including current scanning/connecting/connected related info.
@@ -601,6 +618,7 @@ struct mlme_ext_priv
        
 };
 
+void init_mlme_default_rate_set(_adapter* padapter);
 int init_mlme_ext_priv(_adapter* padapter);
 int init_hw_mlme_ext(_adapter *padapter);
 void free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext);
@@ -616,6 +634,7 @@ unsigned char networktype_to_raid_ex(_adapter *adapter, struct sta_info *psta);
 
 u8 judge_network_type(_adapter *padapter, unsigned char *rate, int ratelen);
 void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len);
+void set_mcs_rate_by_mask(u8 *mcs_set, u32 mask);
 void UpdateBrateTbl(_adapter *padapter,u8 *mBratesOS);
 void UpdateBrateTblForSoftAP(u8 *bssrateset, u32 bssratelen);
 void change_band_update_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork);
@@ -647,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);
@@ -698,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
@@ -730,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);
@@ -741,6 +776,7 @@ void report_surveydone_event(_adapter *padapter);
 void report_del_sta_event(_adapter *padapter, unsigned char* MacAddr, unsigned short reason);
 void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx);
 bool rtw_port_switch_chk(_adapter *adapter);
+void report_wmm_edca_update(_adapter *padapter);
 
 void beacon_timing_control(_adapter *padapter);
 u8 chk_bmc_sleepq_cmd(_adapter* padapter);
@@ -770,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);
@@ -779,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);
 
@@ -818,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);
 
@@ -859,6 +897,7 @@ extern void correct_TSF(_adapter *padapter, struct mlme_ext_priv *pmlmeext);
 extern void adaptive_early_32k(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len);
 extern u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer);
 
+
 #ifdef CONFIG_CONCURRENT_MODE
  sint check_buddy_mlmeinfo_state(_adapter *padapter, u32 state);
 void concurrent_chk_joinbss_done(_adapter *padapter, int join_res);
@@ -918,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},
@@ -994,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
@@ -1054,6 +1095,7 @@ enum rtw_c2h_event
        GEN_EVT_CODE(_C2HBCN),
        GEN_EVT_CODE(_ReportPwrState),          //filen: only for PCIE, USB     
        GEN_EVT_CODE(_CloseRF),                         //filen: only for PCIE, work around ASPM
+       GEN_EVT_CODE(_WMM),                                     /*25*/
        MAX_C2HEVT
 };
 
@@ -1088,6 +1130,8 @@ static struct fwevent wlanevents[] =
        {0, NULL},
        {0, &rtw_cpwm_event_callback},
        {0, NULL},
+       {0, &rtw_wmm_event_callback},
+
 };
 
 #endif//_RTL8192C_CMD_C_
index b36c8889bb8f5d4ecc44f28aaa0f3ada03bfe8fd..e5f11415a4118868b2207d37bfe65da565efe768 100644 (file)
@@ -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,10 @@ enum {
        CTA_TEST,
        MP_DISABLE_BT_COEXIST,
        MP_PwrCtlDM,
+       MP_GETVER,
+#ifdef CONFIG_WOWLAN
+       MP_WOW_ENABLE,
+#endif
 #ifdef CONFIG_AP_WOWLAN
        MP_AP_WOW_ENABLE,
 #endif
@@ -379,7 +384,7 @@ struct mp_priv
        u32 rx_pktcount_filter_out;
        u32 rx_crcerrpktcount;
        u32 rx_pktloss;
-
+       BOOLEAN  rx_bindicatePkt;
        struct recv_stat rxstat;
 
        //RF/BB relative
@@ -471,14 +476,6 @@ typedef struct _MP_FIRMWARE {
        u8                      szFwBuffer[0x8000];
 #endif
        u32             ulFwLength;
-
-#ifdef CONFIG_EMBEDDED_FWIMG
-       u8*             szBTFwBuffer;
-       u8                      myBTFwBuffer[0x8000];
-#else
-       u8                      szBTFwBuffer[0x8000];
-#endif
-       u32             ulBTFwLength;
 } RT_MP_FIRMWARE, *PRT_MP_FIRMWARE;
 
 
@@ -568,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;
 
@@ -684,6 +717,9 @@ typedef enum        _MPT_TXPWR_DEF{
 #elif defined(CONFIG_RTL8188E)
        #define         REG_RF_BB_GAIN_OFFSET   0x55
        #define         RF_GAIN_OFFSET_MASK     0xfffff
+#else
+       #define         REG_RF_BB_GAIN_OFFSET   0x55
+       #define         RF_GAIN_OFFSET_MASK     0xfffff
 #endif //CONFIG_RTL8723A
 
 #endif //CONFIG_RF_GAIN_OFFSET
@@ -783,11 +819,12 @@ extern u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter);
 extern void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart);
 extern void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart);
 extern void Hal_ProSetCrystalCap (PADAPTER pAdapter , u32 CrystalCapVal);
-extern void _rtw_mp_xmit_priv(struct xmit_priv *pxmitpriv);
+//extern void _rtw_mp_xmit_priv(struct xmit_priv *pxmitpriv);
 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 781bb821994888c6d816c54c516ab939e065fe71..340015cd3b2b6255d7b73acfb987687a00f48fea 100644 (file)
 #define                bMaskByte1              0xff00
 #define                bMaskByte2              0xff0000
 #define                bMaskByte3              0xff000000
-#define                bMaskHWord              0xffff0000
+#define                bMaskHWord      0xffff0000
 #define                bMaskLWord              0x0000ffff
-#define                bMaskDWord              0xffffffff
-#define                bMaskH4Bits             0xf0000000      
-#define        bMaskOFDM_D             0xffc00000
+#define                bMaskDWord      0xffffffff
+#define                bMaskH4Bits             0xf0000000
+#define                bMaskH3Bytes    0xffffff00
+#define                bMaskOFDM_D     0xffc00000
 #define                bMaskCCK                0x3f3f3f3f
 #define                bMask12Bits             0xfff
 
index 50edd0124aee8e2f7b307adca3ea714d3b2c4483..a1d81ac4c9237dac18cad92418cadfa027433b68 100644 (file)
@@ -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
 */
@@ -34,9 +34,12 @@ void rtw_odm_dbg_level_set(_adapter *adapter, u32 level);
 void rtw_odm_ability_msg(void *sel, _adapter *adapter);
 void rtw_odm_ability_set(_adapter *adapter, u32 ability);
 
+bool rtw_odm_adaptivity_needed(_adapter *adapter);
 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 a843e30e96486c44f795317e3f97e9ac4aa4d68d..565a4849d15a65369c86866139b6ff4a8e2df952 100644 (file)
@@ -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,14 +319,17 @@ struct pwrctrl_priv
        u8              wowlan_wake_reason;
        u8              wowlan_ap_mode;
        u8              wowlan_mode;
+       u8              wowlan_p2p_mode;
+       u8              wowlan_pno_enable;
 #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;
        pno_nlo_info_t  *pnlo_info;
        pno_scan_info_t *pscan_info;
        pno_ssid_list_t *pno_ssid_list;
@@ -402,8 +408,6 @@ extern void cpwm_int_hdl(PADAPTER padapter, struct reportpwrstate_parm *preportp
 extern void LPS_Leave_check(PADAPTER padapter);
 #endif
 
-extern void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode, const char *msg);
-extern void rtw_set_rpwm(_adapter * padapter, u8 val8);
 extern void LeaveAllPowerSaveMode(PADAPTER Adapter);
 extern void LeaveAllPowerSaveModeDirect(PADAPTER Adapter);
 #ifdef CONFIG_IPS
@@ -429,7 +433,10 @@ int rtw_fw_ps_state(PADAPTER padapter);
 s32 LPS_RF_ON_check(PADAPTER padapter, u32 delay_ms);
 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 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
 
 #ifdef CONFIG_RESUME_IN_WORKQUEUE
index 271a7870d73d63460dcf28ba6e45e052f55cfae9..dab240e3efdc505ee11437a5d631e4e7ef7074b9 100644 (file)
@@ -206,8 +206,8 @@ struct rx_raw_rssi
        u8 mimo_singal_strength[4];// in 0~100 index
        u8 mimo_singal_quality[4];
        
-       s8 ofdm_pwr[4];\r
-       u8 ofdm_snr[4];\r
+       s8 ofdm_pwr[4];
+       u8 ofdm_snr[4];
 
 };
 #endif
@@ -278,7 +278,16 @@ struct rx_pkt_attrib       {
 
 #define RECVBUFF_ALIGN_SZ 8
 
+#if defined (CONFIG_RTL8192E)
+       #ifdef CONFIG_PCI_HCI
+               #define RXDESC_SIZE 16
+               #define RX_WIFI_INFO_SIZE       24
+       #else
+               #define RXDESC_SIZE     24
+       #endif
+#else
 #define RXDESC_SIZE    24
+#endif
 #define RXDESC_OFFSET RXDESC_SIZE
 
 struct recv_stat
@@ -287,10 +296,13 @@ struct recv_stat
 
        unsigned int rxdw1;
 
+#if !(defined(CONFIG_RTL8192E) && defined(CONFIG_PCI_HCI)) //exclude 8192ee
        unsigned int rxdw2;
 
        unsigned int rxdw3;
+#endif
 
+#ifndef BUF_DESC_ARCH
        unsigned int rxdw4;
 
        unsigned int rxdw5;
@@ -300,6 +312,7 @@ struct recv_stat
 
        unsigned int rxdw7;
 #endif
+#endif //if BUF_DESC_ARCH is defined, rx_buf_desc occupy 4 double words
 };
 
 #define EOR BIT(30)
@@ -371,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
@@ -397,9 +410,6 @@ struct recv_priv
        struct ifqueue rx_indicate_queue;
 #endif // CONFIG_RX_INDICATE_QUEUE
 
-#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
-       _queue  recv_buf_pending_queue;
-#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX
 #endif //defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD)
 
        u8 *pallocated_recv_buf;
@@ -407,7 +417,7 @@ struct recv_priv
        _queue  free_recv_buf_queue;
        u32     free_recv_buf_queue_cnt;
 
-#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
+#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) || defined(CONFIG_USB_HCI) 
        _queue  recv_buf_pending_queue;
 #endif
 
@@ -429,7 +439,7 @@ struct recv_priv
        struct rx_raw_rssi raw_rssi_info;
        #endif
        //s8 rxpwdb;    
-       u8 noise;       
+       s16 noise;      
        //int RxSNRdB[2];
        //s8 RxRssi[2];
        //int FalseAlmCnt_all;
@@ -445,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
@@ -825,9 +835,14 @@ __inline static s32 translate_percentage_to_dbm(u32 SignalStrengthIndex)
 {
        s32     SignalPower; // in dBm.
 
+#ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING
+       // Translate to dBm (x=y-100)
+       SignalPower = SignalStrengthIndex - 100;
+#else
        // Translate to dBm (x=0.5y-95).
        SignalPower = (s32)((SignalStrengthIndex + 1) >> 1); 
        SignalPower -= 95; 
+#endif
 
        return SignalPower;
 }
index 12da861d6a9317cb94442d7138816eeac3f1af12..00b08fd75e469cbab330ca30ed8099a281c5d3e1 100644 (file)
@@ -209,7 +209,7 @@ struct security_priv
        //u8                            szCapability[256];                              // For WPA2-PSK using zero-config, by Annie, 2005-09-20.
 
        u8 bWepDefaultKeyIdxSet;
-       
+
 #define DBG_SW_SEC_CNT
 #ifdef DBG_SW_SEC_CNT
        u64 wep_sw_enc_cnt_bc;
@@ -232,7 +232,7 @@ struct security_priv
        u64 aes_sw_dec_cnt_bc;
        u64 aes_sw_dec_cnt_mc;
        u64 aes_sw_dec_cnt_uc;
-#endif /* DBG_SW_SEC_CNT */    
+#endif /* DBG_SW_SEC_CNT */
 };
 
 struct sha256_state {
index f47a43d73468b80d717eb32fe4c35dfdadb84ce6..a8c2f5aecbba221b7a185790807f3c5b51602861 100644 (file)
@@ -1 +1 @@
-#define DRIVERVERSION  "v4.3.0.4_11916.20140724_COB"
+#define DRIVERVERSION  "v4.3.10_12447.20141008"
index 8b28be34b0ae9f43adecec844e494dd819a2a93b..aea6365290f8b3e9479962c98c1d1b95fade0a4c 100644 (file)
@@ -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 03df9dc4dcbc6df7a752ca1691144318a5a7a71b..07bc84893da628f6b59128be869a05053d242007 100644 (file)
 
 // 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  (4096)
+#define MAX_CMDBUF_SZ  (5120)  //(4096)
 
 #define MAX_NUMBLKS            (1)
 
@@ -144,8 +149,24 @@ do{\
 
 #define HWXMIT_ENTRY   4
 
-#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)|| defined(CONFIG_RTL8192E) || defined(CONFIG_RTL8723B)
+// For Buffer Descriptor ring architecture
+#ifdef BUF_DESC_ARCH   
+#if defined (CONFIG_RTL8192E)
+#define TX_BUFFER_SEG_NUM      1 // 0:2 seg, 1: 4 seg, 2: 8 seg.       
+#endif
+#endif
+
+#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)|| defined(CONFIG_RTL8723B)
 #define TXDESC_SIZE 40
+//8192EE_TODO
+#elif defined (CONFIG_RTL8192E) // this section is defined for buffer descriptor ring architecture
+       #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  //8192E USB or SDIO
+               #define TXDESC_SIZE 40
+       #endif
+//8192EE_TODO
 #else
 #define TXDESC_SIZE 32
 #endif
@@ -169,9 +190,13 @@ do{\
 #endif
 
 #ifdef CONFIG_PCI_HCI
+#if defined(CONFIG_RTL8192E) // this section is defined for buffer descriptor ring architecture
+#define TXDESC_OFFSET TX_WIFI_INFO_SIZE
+#else
 #define TXDESC_OFFSET 0
+#endif 
 #define TX_DESC_NEXT_DESC_OFFSET       (TXDESC_SIZE + 8)
-#endif
+#endif //CONFIG_PCI_HCI
 
 enum TXDESC_SC{
        SC_DONT_CARE = 0x00,
@@ -186,6 +211,20 @@ enum TXDESC_SC{
 #define TXDESC_40_BYTES
 #endif
 
+#if defined(CONFIG_RTL8192E) && defined(CONFIG_PCI_HCI) //8192ee
+//8192EE_TODO
+struct tx_desc
+{
+       unsigned int txdw0;
+       unsigned int txdw1;
+       unsigned int txdw2;
+       unsigned int txdw3;
+       unsigned int txdw4;
+       unsigned int txdw5;
+       unsigned int txdw6;
+       unsigned int txdw7;
+};
+#else
 struct tx_desc
 {
        unsigned int txdw0;
@@ -216,7 +255,7 @@ struct tx_desc
        unsigned int txdw15;
 #endif
 };
-
+#endif
 
 union txdesc {
        struct tx_desc txdesc;
@@ -227,12 +266,13 @@ union txdesc {
 #define PCI_MAX_TX_QUEUE_COUNT 8
 
 struct rtw_tx_ring {
+       unsigned char   qid;
        struct tx_desc  *desc;
-       dma_addr_t              dma;
-       unsigned int            idx;
-       unsigned int            entries;
-       _queue                  queue;
-       u32                             qlen;
+       dma_addr_t      dma;
+       unsigned int    idx;
+       unsigned int    entries;
+       _queue          queue;
+       u32             qlen;
 };
 #endif
 
@@ -305,6 +345,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)
@@ -331,6 +372,7 @@ struct pkt_attrib
        u8      ch_offset;//PRIME_CHNL_OFFSET
        u8      sgi;//short GI
        u8      ampdu_en;//tx ampdu enable
+       u8      ampdu_spacing; //ampdu_min_spacing for peer sta's rx
        u8      mdata;//more data bit
        u8      pctrl;//per packet txdesc control enable
        u8      triggered;//for ap mode handling Power Saving sta
@@ -491,6 +533,10 @@ struct xmit_buf
 #endif
 #endif
 
+#ifdef CONFIG_PCI_HCI
+       struct tx_desc *desc;
+#endif
+
 #if defined(DBG_XMIT_BUF )|| defined(DBG_XMIT_BUF_EXT)
        u8 no;
 #endif
@@ -587,6 +633,14 @@ struct agg_pkt_info{
        u16 pkt_len;
 };
 
+enum cmdbuf_type {
+       CMDBUF_BEACON = 0x00,
+       CMDBUF_RSVD,
+       CMDBUF_MAX
+};
+
+u8 rtw_get_hwseq_no(_adapter *padapter);
+
 struct xmit_priv       {
 
        _lock   lock;
@@ -674,7 +728,7 @@ struct      xmit_priv       {
 #endif
 #endif
 
-#ifdef CONFIG_SDIO_HCI
+#if defined (CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
 #ifdef CONFIG_SDIO_TX_TASKLET
        #ifdef PLATFORM_LINUX
        struct tasklet_struct xmit_tasklet;
@@ -697,8 +751,8 @@ struct      xmit_priv       {
        u8 *pxmit_extbuf;
        uint free_xmit_extbuf_cnt;
 
-       struct xmit_buf pcmd_xmitbuf;
-
+       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
 
@@ -720,9 +774,10 @@ struct     xmit_priv       {
        _lock lock_sctx;
 };
 
-extern struct xmit_frame *rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv);
-extern struct xmit_buf *rtw_alloc_cmd_xmitbuf(struct xmit_priv *pxmitpriv);
-extern s32     rtw_free_cmd_xmitbuf(struct xmit_priv *pxmitpriv);
+extern struct xmit_frame *__rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv,
+               enum cmdbuf_type buf_type);
+#define rtw_alloc_cmdxmitframe(p) __rtw_alloc_cmdxmitframe(p, CMDBUF_RSVD)
+#define rtw_alloc_bcnxmitframe(p) __rtw_alloc_cmdxmitframe(p, CMDBUF_BEACON)
 
 extern struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv);
 extern s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);
@@ -776,7 +831,7 @@ void rtw_free_hwxmits(_adapter *padapter);
 
 
 s32 rtw_xmit(_adapter *padapter, _pkt **pkt);
-
+bool xmitframe_hiq_filter(struct xmit_frame *xmitframe);
 #if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)
 sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe);
 void stop_sta_xmit(_adapter *padapter, struct sta_info *psta);
index a3a0b2f865bccf44bdbe45124c4725bf29a9c58c..a918a768d6668e666efd895dbf91f121436584b7 100644 (file)
@@ -44,5 +44,9 @@ void rtl8723bs_set_hal_ops(PADAPTER padapter);
 void rtl8821as_set_hal_ops(PADAPTER padapter);
 #endif
 
+#ifdef CONFIG_RTL8192E
+void rtl8192es_set_hal_ops(PADAPTER padapter);
+#endif
+
 #endif //__SDIO_HAL_H__
 
index e142871e0bb832021f23960a7e9f3d4d7b2eba65..0dcd86f28e17b9a87ea738c814a544eea25304fb 100644 (file)
@@ -104,5 +104,18 @@ extern void ClearInterrupt8723BSdio(PADAPTER padapter);
 #endif //CONFIG_WOWLAN
 #endif
 
+
+#ifdef CONFIG_RTL8192E
+extern void InitInterrupt8192ESdio(PADAPTER padapter);
+extern void EnableInterrupt8192ESdio(PADAPTER padapter);
+extern void DisableInterrupt8192ESdio(PADAPTER padapter);
+extern void UpdateInterruptMask8192ESdio(PADAPTER padapter, u32 AddMSR, u32 RemoveMSR);
+extern u8 HalQueryTxBufferStatus8192ESdio(PADAPTER padapter);
+extern u8 HalQueryTxOQTBufferStatus8192ESdio(PADAPTER padapter);
+extern void ClearInterrupt8192ESdio(PADAPTER padapter);
+#endif // CONFIG_RTL8192E
+
+
+
 #endif // !__SDIO_OPS_H__
 
index a048e83bda3d218b700ef1982efdf136a0298d9f..83c1c74c2ce261d455f2f0be78fc92cd466215a4 100644 (file)
@@ -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 d73aa1b5a548604dcc6d592c005fac25164a9246..dff95b413506d9e386e12734e23a1ad613f5860f 100644 (file)
@@ -48,6 +48,7 @@
 #define WLAN_MIN_ETHFRM_LEN    60
 #define WLAN_MAX_ETHFRM_LEN    1514
 #define WLAN_ETHHDR_LEN                14
+#define WLAN_WMM_LEN           24
 
 #define P80211CAPTURE_VERSION  0x80211001
 
index 79d0a8864bfedbfac5435bd80d8a7e7de6f99dfd..d489ebfcf6426c75418a491a1102a38a95b1f332 100644 (file)
@@ -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 46ae1d140c682add8d50d8822319574289cbd5e5..45606cdde5d71bd4212f16ed5c7ba430325f247b 100644 (file)
@@ -277,7 +277,42 @@ void rtw_wifi_gpio_wlan_ctrl(int onoff)
 }
 #endif //ANDROID_2X
 
-#else // !CONFIG_PLATFORM_SPRD
+#elif defined(CONFIG_PLATFORM_ARM_RK3066) 
+#include <mach/iomux.h>
+
+#define GPIO_WIFI_IRQ          RK30_PIN2_PC2
+extern unsigned int oob_irq;
+int rtw_wifi_gpio_init(void)
+{
+#ifdef CONFIG_GSPI_HCI
+       if (GPIO_WIFI_IRQ > 0) {
+               rk30_mux_api_set(GPIO2C2_LCDC1DATA18_SMCBLSN1_HSADCDATA5_NAME, GPIO2C_GPIO2C2);//jacky_test
+               gpio_request(GPIO_WIFI_IRQ, "oob_irq");
+               gpio_direction_input(GPIO_WIFI_IRQ);
+
+               oob_irq = gpio_to_irq(GPIO_WIFI_IRQ);
+
+               DBG_8192C("%s oob_irq:%d\n", __func__, oob_irq);
+       }
+#endif
+       return 0;
+}
+
+
+int rtw_wifi_gpio_deinit(void)
+{
+#ifdef CONFIG_GSPI_HCI
+       if (GPIO_WIFI_IRQ > 0)
+               gpio_free(GPIO_WIFI_IRQ);
+#endif
+       return 0;
+}
+
+void rtw_wifi_gpio_wlan_ctrl(int onoff)
+{
+}
+
+#else
 
 int rtw_wifi_gpio_init(void)
 {
index 6a27ec25d4f3dc0714797208d56d063180e4dc21..ad259219b6967f498269121f53d09cc2f3091600 100644 (file)
@@ -28,7 +28,7 @@
 #define RTW_MAX_MGMT_TX_CNT (8)\r
 \r
 #define RTW_SCAN_IE_LEN_MAX      2304\r
-#define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 3000 //ms\r
+#define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 5000 //ms\r
 #define RTW_MAX_NUM_PMKIDS 4\r
 \r
 #define RTW_CH_MAX_2G_CHANNEL               14      /* Max channel in 2G band */\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
@@ -379,7 +383,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
@@ -389,12 +396,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
@@ -493,21 +505,17 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
                freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ);\r
        else\r
                freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ);\r
+       \r
+       notify_channel = ieee80211_get_channel(wiphy, freq);\r
 \r
        if (0)\r
                notify_timestamp = le64_to_cpu(*(u64*)rtw_get_timestampe_from_ie(pnetwork->network.IEs));\r
        else\r
                notify_timestamp = rtw_get_systime_us();\r
 \r
-       notify_channel = ieee80211_get_channel(wiphy, freq);\r
-\r
-       //rtw_get_timestampe_from_ie()\r
-       notify_timestamp = jiffies_to_msecs(jiffies)*1000; /* uSec */\r
-\r
        notify_interval = le16_to_cpu(*(u16*)rtw_get_beacon_interval_from_ie(pnetwork->network.IEs));\r
        notify_capability = le16_to_cpu(*(u16*)rtw_get_capability_from_ie(pnetwork->network.IEs));              \r
 \r
-       \r
        notify_ie = pnetwork->network.IEs+_FIXED_IE_LENGTH_;\r
        notify_ielen = pnetwork->network.IELength-_FIXED_IE_LENGTH_;\r
 \r
@@ -528,7 +536,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
@@ -549,13 +557,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
@@ -563,9 +570,9 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
        //      DBG_8192C("%s, got p2p_ie\n", __func__);\r
        //}\r
        //#endif\r
-       \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
@@ -615,8 +622,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
@@ -663,6 +672,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
@@ -714,7 +728,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
@@ -813,14 +832,18 @@ check_bss:
        }\r
        else\r
        {\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\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
                DBG_8192C("pwdev->sme_state(a)=%d\n", pwdev->sme_state);\r
+       #endif\r
        }\r
 }\r
 \r
@@ -859,6 +882,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
                DBG_8192C("pwdev->sme_state(b)=%d\n", pwdev->sme_state);\r
 \r
                if(pwdev->sme_state==CFG80211_SME_CONNECTING)\r
@@ -870,6 +894,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\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
+                               WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_ATOMIC/*GFP_KERNEL*/);\r
+               #endif\r
        }\r
 }\r
        \r
@@ -1315,7 +1347,6 @@ _func_enter_;
                                                DBG_871X(" ~~~~set sta key:groupkey\n");\r
        \r
                                                padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx;\r
-\r
                                                rtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1, _TRUE);\r
                                        }\r
 #ifdef CONFIG_IEEE80211W\r
@@ -1540,13 +1571,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
@@ -1562,6 +1593,12 @@ static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev,
                ret = rtw_cfg80211_ap_set_encryption(ndev, param, param_len);\r
 #endif\r
        }\r
+        else if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE\r
+                || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)\r
+        {\r
+                //DBG_8192C("@@@@@@@@@@ fw_state=0x%x, iftype=%d\n", pmlmepriv->fw_state, rtw_wdev->iftype);\r
+                ret =  rtw_cfg80211_set_encryption(ndev, param, param_len);\r
+        }\r
        else\r
        {\r
                DBG_8192C("error! fw_state=0x%x, iftype=%d\n", pmlmepriv->fw_state, rtw_wdev->iftype);\r
@@ -1674,8 +1711,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
@@ -1691,7 +1733,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
@@ -1709,7 +1751,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
@@ -1924,12 +1966,12 @@ void rtw_cfg80211_unlink_bss(_adapter *padapter, struct wlan_network *pnetwork)
        struct wiphy *wiphy = pwdev->wiphy;\r
        struct cfg80211_bss *bss = NULL;\r
        WLAN_BSSID_EX select_network = pnetwork->network;\r
-\r
+       \r
        bss = cfg80211_get_bss(wiphy, NULL/*notify_channel*/,\r
                select_network.MacAddress, select_network.Ssid.Ssid,\r
                select_network.Ssid.SsidLength, 0/*WLAN_CAPABILITY_ESS*/, \r
                0/*WLAN_CAPABILITY_ESS*/);\r
-\r
+       \r
        if (bss) {\r
                cfg80211_unlink_bss(wiphy, bss);\r
                DBG_8192C("%s(): cfg80211_unlink %s!! () ",__func__,select_network.Ssid.Ssid );\r
@@ -1982,7 +2024,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
@@ -2341,18 +2392,15 @@ if (padapter->registrypriv.mp_mode == 1)
 #endif /* CONFIG_CONCURRENT_MODE */\r
 \r
 #ifdef CONFIG_P2P\r
-       if( pwdinfo->driver_interface == DRIVER_CFG80211 )\r
+       if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))\r
        {\r
-               if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))\r
-               {\r
-                       rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);\r
-                       rtw_free_network_queue(padapter, _TRUE);\r
+               rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);\r
+               rtw_free_network_queue(padapter, _TRUE);\r
 \r
-                       if(social_channel == 0)\r
-                               rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);\r
-                       else\r
-                               rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_SOCIAL_LAST);\r
-               }\r
+               if(social_channel == 0)\r
+                       rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);\r
+               else\r
+                       rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_SOCIAL_LAST);\r
        }\r
 #endif //CONFIG_P2P\r
 \r
@@ -2888,7 +2936,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
@@ -3033,7 +3081,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
@@ -3087,7 +3135,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
@@ -3183,7 +3231,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
@@ -3228,7 +3276,7 @@ static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev,
                rtw_indicate_disconnect(padapter);\r
                \r
                rtw_free_assoc_resources(padapter, 1);\r
-\r
+               \r
                _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\r
                // remove the network entry in scanned_queue\r
                do {\r
@@ -3244,14 +3292,13 @@ static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev,
                }while(pwlan != NULL);\r
 \r
                _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\r
-\r
-               rtw_pwr_wakeup(padapter);\r
+               \r
+               rtw_pwr_wakeup(padapter);               \r
        }\r
 \r
        padapter->mlmepriv.not_indic_disco = _FALSE;\r
 \r
        DBG_871X(FUNC_NDEV_FMT" return 0\n", FUNC_NDEV_ARG(ndev));\r
-\r
        return 0;\r
 }\r
 \r
@@ -3340,26 +3387,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
@@ -3373,8 +3427,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
@@ -3395,16 +3449,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
@@ -4089,7 +4145,7 @@ static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev,
                WLAN_BSSID_EX *pbss_network_ext = &adapter->mlmeextpriv.mlmext_info.network;\r
 \r
                if(0)\r
-               DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%d), from ie:(%s,%d)\n", FUNC_ADPT_ARG(adapter),\r
+               DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%zu), from ie:(%s,%d)\n", FUNC_ADPT_ARG(adapter),\r
                        settings->ssid, settings->ssid_len,\r
                        pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength);\r
 \r
@@ -4129,7 +4185,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
@@ -4137,7 +4198,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
@@ -4191,7 +4257,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
@@ -4228,21 +4294,65 @@ 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
        return 0;\r
 }\r
 \r
+struct sta_info *rtw_sta_info_get_by_idx(const int idx, struct sta_priv *pstapriv)\r
+\r
+{\r\r
+       _list   *phead, *plist;\r
+       struct sta_info *psta = NULL;\r
+       int i = 0;\r
+       \r
+       phead = &pstapriv->asoc_list;\r
+       plist = get_next(phead);\r
+\r
+       //check asoc_queue\r
+       while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)       \r
+       {\r
+               if(idx == i) psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);\r
+               plist = get_next(plist);        \r
+               i++;\r
+       }\r
+       return psta;\r
+}\r
+\r
 static int     cfg80211_rtw_dump_station(struct wiphy *wiphy, struct net_device *ndev,\r
                               int idx, u8 *mac, struct station_info *sinfo)\r
 {\r
-       DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));\r
 \r
-       //TODO: dump scanned queue\r
+       int ret = 0;\r
+       _irqL irqL;\r
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\r
+       struct sta_info *psta = NULL;\r
+       struct sta_priv *pstapriv = &padapter->stapriv;\r
+       DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));\r
 \r
-       return -ENOENT;\r
+       _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\r
+       psta = rtw_sta_info_get_by_idx(idx, pstapriv);\r
+       _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\r
+       if(NULL == psta)\r
+       {\r
+               DBG_871X("Station is not found\n");\r
+               ret = -ENOENT;\r
+               goto exit;\r
+       }\r
+       _rtw_memcpy(mac, psta->hwaddr, ETH_ALEN);\r
+       sinfo->filled = 0;\r
+       sinfo->filled |= STATION_INFO_SIGNAL;\r
+       sinfo->signal = psta->rssi;\r
+       \r
+exit:\r
+       return ret;\r
 }\r
 \r
 static int     cfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev,\r
@@ -4650,7 +4760,8 @@ 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
-\r
+       u8 is_p2p_find = _FALSE;\r
+       \r
        if (ndev == NULL) {\r
                return  -EINVAL;\r
        }\r
@@ -4660,20 +4771,21 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
        pmlmeext = &padapter->mlmeextpriv;\r
        pwdinfo = &padapter->wdinfo;\r
        pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;\r
-\r
+       #ifdef CONFIG_CONCURRENT_MODE\r
+       is_p2p_find=(duration < (pwdinfo->ext_listen_interval))? _TRUE : _FALSE;\r
+       #endif\r
        DBG_871X(FUNC_ADPT_FMT" ch:%u duration:%d\n", FUNC_ADPT_ARG(padapter), remain_ch, duration);\r
 \r
        if(pcfg80211_wdinfo->is_ro_ch == _TRUE)\r
        {\r
+               pcfg80211_wdinfo->not_indic_ro_ch_exp = _TRUE;\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
+               pcfg80211_wdinfo->not_indic_ro_ch_exp = _FALSE;\r
        }\r
 \r
        pcfg80211_wdinfo->is_ro_ch = _TRUE;\r
@@ -4692,7 +4804,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
@@ -4733,10 +4845,13 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
 \r
 \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
 \r
@@ -4854,12 +4969,14 @@ static s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy,
        DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));\r
 \r
        if (pcfg80211_wdinfo->is_ro_ch == _TRUE) {\r
+               pcfg80211_wdinfo->not_indic_ro_ch_exp = _TRUE;\r
                DBG_8192C("%s, cancel ro ch timer\n", __func__);\r
                _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer);\r
                #ifdef CONFIG_CONCURRENT_MODE\r
                ATOMIC_SET(&pwdev_priv->ro_ch_to, 1);\r
                #endif\r
                p2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK);\r
+               pcfg80211_wdinfo->not_indic_ro_ch_exp = _FALSE;\r
        }\r
 \r
        #if 0\r
@@ -5056,30 +5173,43 @@ static int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy,
 #else\r
        struct net_device *ndev,\r
 #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\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
        bool channel_type_valid,\r
        #endif\r
-#endif\r
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)\r
+       #endif\r
+       #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)\r
        unsigned int wait,\r
-#endif\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\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\r
+#else\r
+       struct cfg80211_mgmt_tx_params *params,\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\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
+       unsigned int wait = params->wait;\r
+       const u8 *buf = params->buf;\r
+       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\r
        int ret = 0;\r
        int tx_ret;\r
@@ -5351,12 +5481,61 @@ static int cfg80211_rtw_tdls_oper(struct wiphy *wiphy,
                case NL80211_TDLS_ENABLE_LINK:\r
                        break;\r
                case NL80211_TDLS_DISABLE_LINK:\r
-                       break;                  \r
+                       break;\r
        }\r
        return 0;\r
 }\r
 #endif /* CONFIG_TDLS */\r
 \r
+#if defined(CONFIG_PNO_SUPPORT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))\r
+static int cfg80211_rtw_sched_scan_start(struct wiphy *wiphy,\r
+               struct net_device *dev,\r
+               struct cfg80211_sched_scan_request *request) {\r
+\r
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\r
+       struct  mlme_priv       *pmlmepriv = &(padapter->mlmepriv);\r
+       u8 ret;\r
+\r
+       if (padapter->bup == _FALSE) {\r
+               DBG_871X("%s: net device is down.\n", __func__);\r
+               return -EIO;\r
+       }\r
+\r
+       if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE ||\r
+               check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE  ||\r
+               check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) {\r
+               DBG_871X("%s: device is busy.\n", __func__);\r
+               rtw_scan_abort(padapter);\r
+       }\r
+\r
+       if (request == NULL) {\r
+               DBG_871X("%s: invalid cfg80211_requests parameters.\n", __func__);\r
+               return -EINVAL;\r
+       }\r
+\r
+       ret = rtw_android_cfg80211_pno_setup(dev, request->ssids,\r
+                       request->n_ssids, request->interval);\r
+\r
+       if (ret < 0) {\r
+               DBG_871X("%s ret: %d\n", __func__, ret);\r
+               goto exit;\r
+       }\r
+\r
+       ret = rtw_android_pno_enable(dev, _TRUE);\r
+       if (ret < 0) {\r
+               DBG_871X("%s ret: %d\n", __func__, ret);\r
+               goto exit;\r
+       }\r
+exit:\r
+       return ret;\r
+}\r
+\r
+static int cfg80211_rtw_sched_scan_stop(struct wiphy *wiphy,\r
+               struct net_device *dev) {\r
+       return rtw_android_pno_enable(dev, _FALSE);\r
+}\r
+#endif /* CONFIG_PNO_SUPPORT */\r
+\r
 static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf, int len)\r
 {      \r
        int ret = 0;\r
@@ -5812,7 +5991,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
@@ -5900,7 +6079,18 @@ static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy)
 #endif\r
 \r
 #if defined(CONFIG_PM) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0))\r
+       wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN;\r
+#ifdef CONFIG_PNO_SUPPORT\r
+       wiphy->max_sched_scan_ssids = MAX_PNO_LIST_COUNT;\r
+#endif\r
+#endif\r
+\r
+#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\r
+       wiphy->wowlan = &wowlan_stub;\r
+#endif\r
 #endif\r
 \r
 #if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))\r
@@ -5916,6 +6106,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
@@ -5980,6 +6174,11 @@ static struct cfg80211_ops rtw_cfg80211_ops = {
        .tdls_mgmt = cfg80211_rtw_tdls_mgmt,\r
        .tdls_oper = cfg80211_rtw_tdls_oper,\r
 #endif /* CONFIG_TDLS */\r
+\r
+#if defined(CONFIG_PNO_SUPPORT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))\r
+       .sched_scan_start = cfg80211_rtw_sched_scan_start,\r
+       .sched_scan_stop = cfg80211_rtw_sched_scan_stop,\r
+#endif /* CONFIG_PNO_SUPPORT */\r
 };\r
 \r
 int rtw_wdev_alloc(_adapter *padapter, struct device *dev)\r
@@ -6103,6 +6302,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/rtl8189es/os_dep/linux/ioctl_cfg80211.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/ioctl_cfg80211.h
new file mode 100644 (file)
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 38be708bb55e6e1419c151a82cfc5681b5a56497..0035054c5bf492d578cd7d6a2deccce81f5b9b52 100644 (file)
@@ -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)
 #define  iwe_stream_add_point(a, b, c, d, e)  iwe_stream_add_point(b, c, d, e)
 #endif
 
+#ifdef CONFIG_80211N_HT
+extern int rtw_ht_enable;
+#endif
+
 
 #define RTL_IOCTL_WPA_SUPPLICANT       SIOCIWFIRSTPRIV+30
 
@@ -300,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 )
        {
@@ -353,7 +341,7 @@ static char *translate_scan(_adapter *padapter,
 
                        if ( blnGotP2PIE == _FALSE )
                        {
-                               return start;
+                               return _FALSE;
                        }
                        
                }
@@ -397,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;
@@ -410,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;   
@@ -718,7 +1241,12 @@ static char *translate_scan(_adapter *padapter,
        
        /* Add quality statistics */
        iwe.cmd = IWEVQUAL;
-       iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | IW_QUAL_NOISE_INVALID
+       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
@@ -737,15 +1265,33 @@ static char *translate_scan(_adapter *padapter,
        #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);
@@ -769,6 +1315,7 @@ static char *translate_scan(_adapter *padapter,
        
        return start;   
 }
+#endif
 
 static int wpa_set_auth_algs(struct net_device *dev, u32 value)
 {      
@@ -1377,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
                        {
@@ -5220,7 +5773,14 @@ static int rtw_p2p_connect(struct net_device *dev,
                DBG_871X( "[%s] WiFi Direct is disable!\n", __FUNCTION__ );
                return ret;
        }
-       
+
+#ifdef CONFIG_INTEL_WIDI
+       if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {
+               DBG_871X( "[%s] WiFi is under survey!\n", __FUNCTION__ );
+               return ret;
+       }
+#endif //CONFIG_INTEL_WIDI     
+
        if ( pwdinfo->ui_got_wps_info == P2P_NO_WPSINFO )
        {
                return -1;
@@ -5309,6 +5869,19 @@ static int rtw_p2p_connect(struct net_device *dev,
        else
        {
                DBG_871X( "[%s] Not Found in Scanning Queue~\n", __FUNCTION__ );
+#ifdef CONFIG_INTEL_WIDI
+               _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
+               rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);
+               rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);
+               rtw_free_network_queue(padapter, _TRUE);
+               /** 
+                * For WiDi, if we can't find candidate device in scanning queue,
+                * driver will do scanning itself
+                */
+               _enter_critical_bh(&pmlmepriv->lock, &irqL);
+               rtw_sitesurvey_cmd(padapter, NULL, 0, NULL, 0);
+               _exit_critical_bh(&pmlmepriv->lock, &irqL);
+#endif //CONFIG_INTEL_WIDI 
                ret = -1;
        }
 exit:  
@@ -5988,7 +6561,7 @@ static int rtw_p2p_prov_disc(struct net_device *dev,
        else
        {
 #ifdef CONFIG_INTEL_WIDI
-               if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE){
+               if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {
                        DBG_871X( "[%s] WiFi is under survey!\n", __FUNCTION__ );
                        return ret;
                }
@@ -6202,6 +6775,7 @@ static int rtw_p2p_prov_disc(struct net_device *dev,
        {
                DBG_871X( "[%s] NOT Found in the Scanning Queue!\n", __FUNCTION__ );
 #ifdef CONFIG_INTEL_WIDI
+               _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
                rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);
                rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);
                rtw_free_network_queue(padapter, _TRUE);                
@@ -6627,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)
@@ -6999,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;  
@@ -7074,6 +7652,26 @@ static int rtw_dbg_port(struct net_device *dev,
                                                printk("%s ==> max_mac_id = %d \n",__FUNCTION__,max_mac_id);
                                        }       
                                        break;
+                               case 0x0b: //Enable=1, Disable=0 driver control vrtl_carrier_sense.
+                                       {
+                                               //u8 driver_vcs_en; //Enable=1, Disable=0 driver control vrtl_carrier_sense.
+                                               //u8 driver_vcs_type;//force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1.
+
+                                               if(arg == 0){
+                                                       DBG_871X("disable driver ctrl vcs\n");                                          
+                                                       padapter->driver_vcs_en = 0;                                    
+                                               }
+                                               else if(arg == 1){                                                      
+                                                       DBG_871X("enable driver ctrl vcs = %d\n", extra_arg);
+                                                       padapter->driver_vcs_en = 1;
+       
+                                                       if(extra_arg>2)
+                                                               padapter->driver_vcs_type = 1;                                          
+                                                       else
+                                                               padapter->driver_vcs_type = extra_arg;
+                                               }
+                                       }
+                                       break;
                                case 0x0c://dump rx/tx packet
                                        {
                                                if(arg == 0){
@@ -7098,6 +7696,23 @@ static int rtw_dbg_port(struct net_device *dev,
                                        }                               
                                        break;
 #endif
+                               case 0x0e:
+                                       {
+                                               if(arg == 0){
+                                                       DBG_871X("disable driver ctrl rx_ampdu_factor\n");                                              
+                                                       padapter->driver_rx_ampdu_factor = 0xFF;
+                                               }
+                                               else if(arg == 1){
+                                                       
+                                                       DBG_871X("enable driver ctrl rx_ampdu_factor = %d\n", extra_arg);       
+       
+                                                       if(extra_arg > 0x03)
+                                                               padapter->driver_rx_ampdu_factor = 0xFF;                                                
+                                                       else
+                                                               padapter->driver_rx_ampdu_factor = extra_arg;
+                                               }                                       
+                                       }
+                                       break;
                #ifdef DBG_CONFIG_ERROR_DETECT
                                case 0x0f:
                                                {
@@ -7126,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
@@ -7172,28 +7802,142 @@ static int rtw_dbg_port(struct net_device *dev,
                                        if(arg == 0xff){
                                                rtw_odm_dbg_comp_msg(RTW_DBGDUMP,padapter);
                                        }
-                                       else{
-                                               u64 dbg_comp = (u64)extra_arg;
-                                               rtw_odm_dbg_comp_set(padapter, dbg_comp);
+                                       else{
+                                               u64 dbg_comp = (u64)extra_arg;
+                                               rtw_odm_dbg_comp_set(padapter, dbg_comp);
+                                       }
+                               }
+                                       break;
+#ifdef DBG_FIXED_CHAN
+                               case 0x17:
+                                       {
+                                               struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);                                           
+                                               printk("===>  Fixed channel to %d \n",extra_arg);
+                                               pmlmeext->fixed_chan = extra_arg;       
+                                               
+                                       }
+                                       break;
+#endif
+                               case 0x18:
+                                       {
+                                               printk("===>  Switch USB Mode %d \n",extra_arg);
+                                               rtw_hal_set_hwreg(padapter, HW_VAR_USB_MODE, (u8 *)&extra_arg);
+                                       }
+                                       break;
+#ifdef CONFIG_80211N_HT                        
+                               case 0x19:
+                                       {
+                                               struct registry_priv    *pregistrypriv = &padapter->registrypriv;
+                                               // extra_arg :
+                                               // BIT0: Enable VHT LDPC Rx, BIT1: Enable VHT LDPC Tx, 
+                                               // BIT4: Enable HT LDPC Rx, BIT5: Enable HT LDPC Tx
+                                               if(arg == 0){
+                                                       DBG_871X("driver disable LDPC\n");                                              
+                                                       pregistrypriv->ldpc_cap = 0x00;
+                                               }
+                                               else if(arg == 1){                                                      
+                                                       DBG_871X("driver set LDPC cap = 0x%x\n", extra_arg);
+                                                       pregistrypriv->ldpc_cap = (u8)(extra_arg&0x33);                                         
+                                               }                                               
+                                       }
+                                        break;
+                               case 0x1a:
+                                       {
+                                               struct registry_priv    *pregistrypriv = &padapter->registrypriv;
+                                               // extra_arg :
+                                               // BIT0: Enable VHT STBC Rx, BIT1: Enable VHT STBC Tx, 
+                                               // BIT4: Enable HT STBC Rx, BIT5: Enable HT STBC Tx
+                                               if(arg == 0){
+                                                       DBG_871X("driver disable STBC\n");                                              
+                                                       pregistrypriv->stbc_cap = 0x00;
+                                               }
+                                               else if(arg == 1){                                                      
+                                                       DBG_871X("driver set STBC cap = 0x%x\n", extra_arg);
+                                                       pregistrypriv->stbc_cap = (u8)(extra_arg&0x33);                                         
+                                               }                                               
+                                       }
+                                        break;
+#endif //CONFIG_80211N_HT
+                               case 0x1b:
+                                       {       
+                                               struct registry_priv    *pregistrypriv = &padapter->registrypriv;
+                                               
+                                               if(arg == 0){
+                                                       DBG_871X("disable driver ctrl max_rx_rate, reset to default_rate_set\n");                                                       
+                                                       init_mlme_default_rate_set(padapter);
+#ifdef CONFIG_80211N_HT                                                
+                                                       pregistrypriv->ht_enable = (u8)rtw_ht_enable;
+#endif //CONFIG_80211N_HT
+                                               }
+                                               else if(arg == 1){
+
+                                                       int i;
+                                                       u8 max_rx_rate;                                         
+                                                       
+                                                       DBG_871X("enable driver ctrl max_rx_rate = 0x%x\n", extra_arg); 
+
+                                                       max_rx_rate = (u8)extra_arg;
+
+                                                       if(max_rx_rate < 0xc) // max_rx_rate < MSC0 -> B or G -> disable HT
+                                                       {
+#ifdef CONFIG_80211N_HT                                                
+                                                               pregistrypriv->ht_enable = 0;
+#endif //CONFIG_80211N_HT
+                                                               for(i=0; i<NumRates; i++)
+                                                               {
+                                                                       if(pmlmeext->datarate[i] > max_rx_rate)
+                                                                               pmlmeext->datarate[i] = 0xff;                                                                   
+                                                               }       
+
+                                                       }
+#ifdef CONFIG_80211N_HT        
+                                                       else if(max_rx_rate < 0x1c) // mcs0~mcs15
+                                                       {
+                                                               u32 mcs_bitmap=0x0;
+                                                                                                       
+                                                               for(i=0; i<((max_rx_rate+1)-0xc); i++)
+                                                                       mcs_bitmap |= BIT(i);
+                                                               
+                                                               set_mcs_rate_by_mask(pmlmeext->default_supported_mcs_set, mcs_bitmap);
+                                                       }
+#endif //CONFIG_80211N_HT                                                      
+                                               }                                                                                       
+                                       }
+                                        break;
+                               case 0x1c: //enable/disable driver control AMPDU Density for peer sta's rx
+                                       {
+                                               if(arg == 0){
+                                                       DBG_871X("disable driver ctrl ampdu density\n");                                                
+                                                       padapter->driver_ampdu_spacing = 0xFF;
+                                               }
+                                               else if(arg == 1){
+                                                       
+                                                       DBG_871X("enable driver ctrl ampdu density = %d\n", extra_arg); 
+       
+                                                       if(extra_arg > 0x07)
+                                                               padapter->driver_ampdu_spacing = 0xFF;                                          
+                                                       else
+                                                               padapter->driver_ampdu_spacing = extra_arg;
+                                               }
                                        }
-                               }
                                        break;
-#ifdef DBG_FIXED_CHAN
-                               case 0x17:
+#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
+                               case 0x1e:
                                        {
-                                               struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);                                           
-                                               printk("===>  Fixed channel to %d \n",extra_arg);
-                                               pmlmeext->fixed_chan = extra_arg;       
+                                               HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
+                                               PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
+                                               u8 chan = rtw_get_oper_ch(padapter);
+                                               DBG_871X("===========================================\n");
+                                               ODM_InbandNoise_Monitor(pDM_Odm,_TRUE,0x1e,100);
+                                               DBG_871X("channel(%d),noise_a = %d, noise_b = %d , noise_all:%d \n", 
+                                                       chan,pDM_Odm->noise_level.noise[ODM_RF_PATH_A], 
+                                                       pDM_Odm->noise_level.noise[ODM_RF_PATH_B],
+                                                       pDM_Odm->noise_level.noise_all);
+                                               DBG_871X("===========================================\n");
                                                
                                        }
                                        break;
 #endif
-                               case 0x18:
-                                       {
-                                               printk("===>  Switch USB Mode %d \n",extra_arg);
-                                               rtw_hal_set_hwreg(padapter, HW_VAR_USB_MODE, (u8 *)&extra_arg);
-                                       }
-                                       break;
                                case 0x23:
                                        {
                                                DBG_871X("turn %s the bNotifyChannelChange Variable\n",(extra_arg==1)?"on":"off");
@@ -7215,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;
                                    }
@@ -7230,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;
                                        }
@@ -7243,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;
@@ -7966,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;
        }       
@@ -8784,6 +9536,74 @@ FREE_EXT:
        return ret;
        
 }
+#ifdef CONFIG_WOWLAN
+static int rtw_wowlan_ctrl(struct net_device *dev,
+                                               struct iw_request_info *info,
+                                               union iwreq_data *wrqu, char *extra)
+{
+       _adapter *padapter =  (_adapter *)rtw_netdev_priv(dev);
+       struct wowlan_ioctl_param poidparam;
+       struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
+       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+       struct net_device *pnetdev = padapter->pnetdev;
+#ifdef CONFIG_CONCURRENT_MODE
+       struct net_device *pbuddy_netdev = padapter->pbuddy_adapter->pnetdev;   
+#endif
+       struct sta_info *psta = NULL;
+       int ret = 0;
+       u32 start_time = rtw_get_current_time();
+       poidparam.subcode = 0;
+
+       DBG_871X("+rtw_wowlan_ctrl: %s\n", extra);
+       
+       if(pwrctrlpriv->bSupportRemoteWakeup==_FALSE){
+               ret = -EPERM;
+               DBG_871X("+rtw_wowlan_ctrl: Device didn't support the remote wakeup!!\n");
+               goto _rtw_wowlan_ctrl_exit_free;
+       }
+
+       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;
+
+               pwrctrlpriv->wowlan_from_cmd = _TRUE;
+
+               rtw_suspend_common(padapter);
+
+       } else if (_rtw_memcmp( extra, "disable", 6 )) {
+
+               rtw_resume_common(padapter);
+
+               pwrctrlpriv->wowlan_from_cmd = _FALSE;
+
+#ifdef CONFIG_PNO_SUPPORT
+               pwrctrlpriv->wowlan_pno_enable = _FALSE;
+#endif //CONFIG_PNO_SUPPORT
+
+               padapter->registrypriv.mp_mode = 0;
+       } else {
+               DBG_871X("[%s] Invalid Parameter.\n", __func__);
+               goto _rtw_wowlan_ctrl_exit_free;
+       }
+       //mutex_lock(&ioctl_mutex);
+_rtw_wowlan_ctrl_exit_free:
+       DBG_871X("-rtw_wowlan_ctrl( subcode = %d)\n", poidparam.subcode);
+       DBG_871X_LEVEL(_drv_always_, "%s in %d ms\n", __func__,
+                       rtw_get_passing_time_ms(start_time));
+_rtw_wowlan_ctrl_exit:
+       return ret;
+}
+#endif //CONFIG_WOWLAN
 
 #ifdef CONFIG_AP_WOWLAN
 static int rtw_ap_wowlan_ctrl(struct net_device *dev,
@@ -9572,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;
@@ -9827,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)
                {
@@ -10601,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' )
                                        {
@@ -10627,29 +11462,21 @@ static int rtw_mp_start(struct net_device *dev,
        struct dm_priv  *pdmpriv = &pHalData->dmpriv;
        struct hal_ops *pHalFunc = &padapter->HalFunc;
 
+       rtw_pm_set_ips(padapter,IPS_NONE);
+       LeaveAllPowerSaveMode(padapter);
+
        if(padapter->registrypriv.mp_mode ==0)
        {
-               #if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B))
-               DBG_871X("_rtw_mp_xmit_priv for Download BT patch FW\n");
-               _rtw_mp_xmit_priv(&padapter->xmitpriv);
-               #endif
-       
-               padapter->registrypriv.mp_mode =1;
 
-               rtw_pm_set_ips(padapter,IPS_NONE);
-               LeaveAllPowerSaveMode(padapter);
-
-               MPT_InitializeAdapter(padapter, 1);
 #ifdef CONFIG_BT_COEXIST
-               rtw_btcoex_HaltNotify(padapter);
-               rtw_btcoex_SetManualControl(padapter, _TRUE);
                pdmpriv->DMFlag &= ~DYNAMIC_FUNC_BT;
-               // Force to switch Antenna to WiFi
-               padapter->registrypriv.mp_mode=0;
+#endif         
+               pHalFunc->hal_deinit(padapter);
+               padapter->registrypriv.mp_mode =1;
                pHalFunc->hal_init(padapter);
-               padapter->registrypriv.mp_mode=1;
-               //rtw_btcoex_HaltNotify(padapter);
-#endif
+
+               rtw_pm_set_ips(padapter,IPS_NONE);
+               LeaveAllPowerSaveMode(padapter);
        }
 
        if (padapter->registrypriv.mp_mode == 0)
@@ -10663,6 +11490,17 @@ static int rtw_mp_start(struct net_device *dev,
        }
        padapter->mppriv.bmac_filter = _FALSE;
 #ifdef CONFIG_RTL8723B
+#ifdef CONFIG_USB_HCI
+       rtw_write32(padapter, 0x765, 0x0000);
+       rtw_write32(padapter, 0x948, 0x0280);
+#else
+       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
        rtw_write8(padapter, 0x66, 0x27); //Open BT uart Log
        rtw_write8(padapter, 0xc50, 0x20); //for RX init Gain
 #endif 
@@ -10680,10 +11518,6 @@ static int rtw_mp_stop(struct net_device *dev,
 
        if(padapter->registrypriv.mp_mode ==1)
        {
-               #if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B))
-               DBG_871X("_rtw_mp_xmit_priv reinit for normal mode\n");
-               _rtw_mp_xmit_priv(&padapter->xmitpriv);
-               #endif
                
                MPT_DeInitAdapter(padapter);
                pHalFunc->hal_deinit(padapter);
@@ -10712,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;
@@ -10732,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;
 }
 
@@ -10752,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;
 }
 
@@ -10786,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);
 
@@ -10815,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;
 }
@@ -10849,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;
 }
 
@@ -10867,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++)
        {
@@ -10884,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;
 }
 
@@ -10924,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);
@@ -11047,8 +11889,8 @@ static int rtw_mp_ctx(struct net_device *dev,
                        //DBG_871X("%s: cotuTx %d\n", __func__, bStartTest);
                        if (bStartTest != 0){
                                sprintf( extra, "Start continuous DA=ffffffffffff len=1500 \n infinite=yes.");
-                        }
-               Hal_SetContinuousTx(padapter, (u8)bStartTest);
+                        }
+                       Hal_SetContinuousTx(padapter, (u8)bStartTest);
                        break;
 
                case MP_CARRIER_SUPPRISSION_TX:
@@ -11159,7 +12001,7 @@ static int rtw_mp_arx(struct net_device *dev,
        u32             mac_cck_err=0, mac_ofdm_err=0, mac_ht_err=0, mac_vht_err=0;
        u8              input[wrqu->length];
        char *pch, *ptmp, *token, *tmp[2]={0x00,0x00};
-       u32 i=0,ii=0,jj=0,kk=0,cnts=0;
+       u32 i=0,ii=0,jj=0,kk=0,cnts=0,bmon=0;
        PADAPTER padapter = rtw_netdev_priv(dev);
        struct mp_priv *pmppriv = &padapter->mppriv;
 
@@ -11175,7 +12017,7 @@ static int rtw_mp_arx(struct net_device *dev,
        bSetBssid = (strncmp(input, "setbssid=", 8)==0)?1:0; // strncmp TRUE is 0
        //bfilter_init = (strncmp(input, "filter_init",11)==0)?1:0;
        bmac_filter = (strncmp(input, "accept_mac",10)==0)?1:0;
-
+       bmon = (strncmp(input, "mon=",4)==0)?1:0;
 
        if(bSetBssid==1){
                pch = input;
@@ -11250,7 +12092,7 @@ static int rtw_mp_arx(struct net_device *dev,
                        cckcrc     = PHY_QueryBBReg(padapter, 0xF04, 0x3FFF0000); // [29:16]                                            
                        ofdmcrc    = PHY_QueryBBReg(padapter, 0xF14, 0x3FFF0000); // [29:16]
                        htcrc      = PHY_QueryBBReg(padapter, 0xF10, 0x3FFF0000); // [29:16]            
-                       vht_err     = PHY_QueryBBReg(padapter, 0xF0C, 0x3FFF0000); // [29:16]           
+                       vht_err     = PHY_QueryBBReg(padapter, 0xF0C, 0x3FFF0000); // [29:16]   
                        
                        CCK_FA = PHY_QueryBBReg(padapter, 0xa5c, bMaskLWord);
                        OFDM_FA = PHY_QueryBBReg(padapter, 0xF48, bMaskLWord);
@@ -11259,7 +12101,7 @@ static int rtw_mp_arx(struct net_device *dev,
                {
                        cckok      = PHY_QueryBBReg(padapter, 0xF88, bMaskDWord);               
                        ofdmok     = PHY_QueryBBReg(padapter, 0xF94, bMaskLWord);               
-                       htok       = PHY_QueryBBReg(padapter, 0xF90, bMaskLWord);
+                           htok       = PHY_QueryBBReg(padapter, 0xF90, bMaskLWord);
                        vht_ok      = 0;
                    
                        cckcrc     = PHY_QueryBBReg(padapter, 0xF84, bMaskDWord);                                               
@@ -11304,9 +12146,22 @@ static int rtw_mp_arx(struct net_device *dev,
                sprintf( extra, "Mac Received packet OK: %d , CRC error: %d , Drop Packets: %d\n",
                                mac_cck_ok+mac_ofdm_ok+mac_ht_ok+mac_vht_ok,mac_cck_err+mac_ofdm_err+mac_ht_err+mac_vht_err,DropPacket);                        
        }
-       wrqu->length = strlen(extra) + 1;
 
+       if( bmon==1 ) { 
+               sscanf(input, "mon=%d", &bmon);
+               
+               if(bmon==1)
+               {
+                       pmppriv->rx_bindicatePkt= _TRUE;
+                       sprintf( extra, "Indicating Receive Packet to network start\n");
+               }else {
+                       pmppriv->rx_bindicatePkt= _FALSE;
+                       sprintf( extra, "Indicating Receive Packet to network Stop\n");
+               }       
+       }
        
+       wrqu->length = strlen(extra) + 1;
+
        return 0;
 }
 
@@ -11360,11 +12215,11 @@ static int rtw_mp_pwrtrk(struct net_device *dev,
                }
                else if (sscanf(input, "ther=%d", &thermal)) {
                        pHalData->TxPowerTrackControl = _TRUE;
-                               ret = Hal_SetThermalMeter(padapter, (u8)thermal);
-                               if (ret == _FAIL) return -EPERM;
+                       ret = Hal_SetThermalMeter(padapter, (u8)thermal);
+                       if (ret == _FAIL) return -EPERM;
                                sprintf(extra, "mp tx power tracking start,target value=%d ok ",thermal);
-               }else   {
-                               return -EINVAL;
+               }else{
+                       return -EINVAL;
                }
        }
 
@@ -11398,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;
@@ -11639,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;
@@ -11657,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,
@@ -11764,12 +12636,6 @@ static int rtw_mp_SetBT(struct net_device *dev,
        }
        if ( strncmp(extra, "dlfw", 4) == 0)
        {
-               #ifdef CONFIG_BT_COEXIST
-               rtw_btcoex_HaltNotify(padapter);
-               //DBG_871X("SetBT bt1ant !\n");
-               //hal_btcoex1ant_SetAntPath(padapter);
-               rtw_btcoex_SetManualControl(padapter, _TRUE);
-               #endif
                pHalData->LastHMEBoxNum=0;
                padapter->bBTFWReady = _FALSE;
                rtw_write8(padapter, 0xa3, 0x05);
@@ -11817,6 +12683,12 @@ static int rtw_mp_SetBT(struct net_device *dev,
 #endif
                DBG_871X("Wait for FirmwareDownloadBT fw boot!\n");
                rtw_msleep_os(1000);
+#ifdef CONFIG_BT_COEXIST
+               rtw_btcoex_HaltNotify(padapter);
+               DBG_871X("SetBT btcoex HaltNotify !\n");
+               //hal_btcoex1ant_SetAntPath(padapter);
+               rtw_btcoex_SetManualControl(padapter, _TRUE);
+#endif         
                _rtw_memset(extra,'\0', wrqu->data.length);
                BtReq.opCodeVer = 1;
                BtReq.OpCode = 0;
@@ -11835,7 +12707,7 @@ static int rtw_mp_SetBT(struct net_device *dev,
                        else
                        {
                                #ifdef CONFIG_BT_COEXIST
-                               rtw_btcoex_SwitchGntBt(padapter);
+                               rtw_btcoex_SwitchBtTRxMask(padapter);
                                #endif
                                rtw_msleep_os(200);
                                sprintf(extra, "download FW OK.\n");
@@ -11846,9 +12718,15 @@ static int rtw_mp_SetBT(struct net_device *dev,
 
        if ( strncmp(extra, "down", 4) == 0){
                DBG_871X("SetBT down for to hal_init !\n");
-               mp_stop_test(padapter);
+#ifdef CONFIG_BT_COEXIST               
+               rtw_btcoex_SetManualControl(padapter, _FALSE);
+               rtw_btcoex_Initialize(padapter);
+#endif         
+               pHalFunc->read_adapter_info(padapter);
+               pHalFunc->hal_deinit(padapter);
                pHalFunc->hal_init(padapter);
-               mp_start_test(padapter);
+               rtw_pm_set_ips(padapter,IPS_NONE);
+               LeaveAllPowerSaveMode(padapter);
                MPT_PwrCtlDM(padapter,0);
                rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc)| 0x00000004));
                rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b)& 0xFFFFFFEF));
@@ -11874,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){
@@ -12094,6 +12972,12 @@ static int rtw_mp_set(struct net_device *dev,
                        DBG_871X("set case MP_DISABLE_BT_COEXIST \n");
                        rtw_mp_disable_bt_coexist(dev, info, wdata, extra);
                break;
+#ifdef CONFIG_WOWLAN
+       case MP_WOW_ENABLE:
+                       DBG_871X("set case MP_WOW_ENABLE: %s \n", extra);
+                       rtw_wowlan_ctrl(dev, info, wdata, extra);
+       break;
+#endif
 #ifdef CONFIG_AP_WOWLAN
        case MP_AP_WOW_ENABLE:
                        DBG_871X("set case MP_AP_WOW_ENABLE: %s \n", extra);
@@ -12240,7 +13124,9 @@ 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);
 #if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)
        case MP_SetBT:          
                        DBG_871X("set MP_SetBT \n");
@@ -13040,6 +13926,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)
 {
@@ -13666,13 +14560,11 @@ static int rtw_test(
        {
                rtw_btcoex_SetManualControl(padapter, _FALSE);
        }
-
-       if (strcmp(pch, "btoff") == 0)
+       else if (strcmp(pch, "btoff") == 0)
        {
                rtw_btcoex_SetManualControl(padapter, _TRUE);
        }
-
-       if (strcmp(pch, "h2c") == 0)
+       else if (strcmp(pch, "h2c") == 0)
        {
                u8 param[8];
                u8 count = 0;
@@ -13709,6 +14601,20 @@ static int rtw_test(
 
                wrqu->data.length = strlen(extra) + 1;
        }
+       else if (strcmp(pch, "ba_rxbuf_sz") == 0)
+       {
+               u8 ba_rxbuf_bz;
+
+               pch = strsep(&ptmp, delim);
+               if ((pch != NULL) && (strlen(pch) != 0)) {
+                       sscanf(pch, "%hhu", &ba_rxbuf_bz);
+                       DBG_871X("%s set ba_rxbuf_bz as %u\n", __func__, ba_rxbuf_bz);
+                       padapter->fix_ba_rxbuf_bz = ba_rxbuf_bz;
+                       rtw_btcoex_RejectApAggregatedPacket(padapter, _TRUE);
+                       rtw_btcoex_RejectApAggregatedPacket(padapter, _FALSE);
+               }
+       }
+
 #endif // CONFIG_BT_COEXIST
 
        rtw_mfree(pbuf, len);
@@ -13775,64 +14681,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[] = {
        {
@@ -13984,6 +14832,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" },
@@ -13991,8 +14840,11 @@ static const struct iw_priv_args rtw_private_args[] = {
 #endif
                { CTA_TEST, IW_PRIV_TYPE_CHAR | 1024, 0, "cta_test"},
 #endif
+#ifdef CONFIG_WOWLAN
+               { MP_WOW_ENABLE , IW_PRIV_TYPE_CHAR | 1024, 0, "wow_mode" }, //set 
+#endif
 #ifdef CONFIG_AP_WOWLAN
-               { MP_AP_WOW_ENABLE , IW_PRIV_TYPE_CHAR | 1024, 0, "ap_wow_enable" }, //set 
+               { MP_AP_WOW_ENABLE , IW_PRIV_TYPE_CHAR | 1024, 0, "ap_wow_mode" }, //set 
 #endif
 };
 
@@ -14055,7 +14907,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)
@@ -14077,11 +14928,41 @@ static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev)
                #ifdef CONFIG_SIGNAL_DISPLAY_DBM
                tmp_level = translate_percentage_to_dbm(padapter->recvpriv.signal_strength); 
                #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);
+                       
+                       tmp_level = (u8)odm_SignalScaleMapping(&pHal->odmpriv, padapter->recvpriv.signal_strength);
+               }
+               #else
                tmp_level = padapter->recvpriv.signal_strength;
                #endif
+               #endif
                
                tmp_qual = padapter->recvpriv.signal_qual;
-               tmp_noise =padapter->recvpriv.noise;            
+#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+               if(rtw_linked_check(padapter)){                 
+                       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+                       struct noise_info info;
+                       info.bPauseDIG = _TRUE;
+                       info.IGIValue = 0x1e;
+                       info.max_time = 100;//ms                
+                       info.chan = pmlmeext->cur_channel ;//rtw_get_oper_ch(padapter);
+                       rtw_ps_deny(padapter, PS_DENY_IOCTL);   
+                       LeaveAllPowerSaveModeDirect(padapter);  
+
+                       rtw_hal_set_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&info, _FALSE);     
+                       //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;
                //DBG_871X("level:%d, qual:%d, noise:%d, rssi (%d)\n", tmp_level, tmp_qual, tmp_noise,padapter->recvpriv.rssi);
 
                piwstats->qual.level = tmp_level;
@@ -14150,7 +15031,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;
@@ -14180,7 +15062,6 @@ 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 = wdata.data.length;
@@ -14193,17 +15074,16 @@ static int rtw_ioctl_wext_private(struct net_device *dev, union iwreq_data *wrq_
        }
        ptr = 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;
@@ -14489,6 +15369,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;
@@ -14509,8 +15444,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 78ea1017670575db94f0c5e8744dbff4794542f9..ba0ab12f46e6d3014d16729334cb2b316430d7eb 100644 (file)
@@ -285,39 +285,41 @@ _func_enter_;
        if(authmode==_WPA_IE_ID_)
        {
                RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("rtw_report_sec_ie, authmode=%d\n", authmode));
-               
-               buff = rtw_malloc(IW_CUSTOM_MAX);
-               
-               _rtw_memset(buff,0,IW_CUSTOM_MAX);
-               
-               p=buff;
-               
+
+               buff = rtw_zmalloc(IW_CUSTOM_MAX);
+               if (NULL == buff) {
+                       DBG_871X(FUNC_ADPT_FMT ": alloc memory FAIL!!\n",
+                               FUNC_ADPT_ARG(adapter));
+                       return;
+               }
+               p = buff;
+
                p+=sprintf(p,"ASSOCINFO(ReqIEs=");
 
                len = sec_ie[1]+2;
-               len =  (len < IW_CUSTOM_MAX) ? len:IW_CUSTOM_MAX;
+               len = (len < IW_CUSTOM_MAX) ? len:IW_CUSTOM_MAX;
                        
                for(i=0;i<len;i++){
                        p+=sprintf(p,"%02x",sec_ie[i]);
                }
 
                p+=sprintf(p,")");
-               
+
                _rtw_memset(&wrqu,0,sizeof(wrqu));
-               
+
                wrqu.data.length=p-buff;
-               
+
                wrqu.data.length = (wrqu.data.length<IW_CUSTOM_MAX) ? wrqu.data.length:IW_CUSTOM_MAX;
-               
+
 #ifndef CONFIG_IOCTL_CFG80211
                wireless_send_event(adapter->pnetdev,IWEVCUSTOM,&wrqu,buff);
 #endif
 
-               if(buff)
-                   rtw_mfree(buff, IW_CUSTOM_MAX);
-               
+               rtw_mfree(buff, IW_CUSTOM_MAX);
        }
 
+exit:
+
 _func_exit_;
 
 }
@@ -462,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);
                
@@ -484,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 0cf3e58c30dbe374acb4045f7802bd4d32910d20..0004e9a779929aa89e45faa2951547b29265d878 100644 (file)
@@ -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
@@ -107,9 +111,9 @@ int rtw_ht_enable = 1;
 // 0x21 means enable 2.4G 40MHz & 5G 80MHz
 int rtw_bw_mode = 0x21;
 int rtw_cbw40_enable = 3; // 0 :diable, bit(0): enable 2.4g, bit(1): enable 5g
-int rtw_ampdu_enable = 1;//for enable tx_ampdu
+int rtw_ampdu_enable = 1;//for enable tx_ampdu ,// 0: disable, 0x1:enable (but wifi_spec should be 0), 0x2: force enable (don't care wifi_spec)
 int rtw_rx_stbc = 1;// 0: disable, bit(0):enable 2.4g, bit(1):enable 5g, default is set to enable 2.4GHZ for IOT issue with bufflao's AP at 5GHZ
-int rtw_ampdu_amsdu = 0;// 0: disabled, 1:enabled, 2:auto
+int rtw_ampdu_amsdu = 0;// 0: disabled, 1:enabled, 2:auto . There is an IOT issu with DLINK DIR-629 when the flag turn on
 // Short GI support Bit Map
 // BIT0 - 20MHz, 0: non-support, 1: support
 // BIT1 - 40MHz, 0: non-support, 1: support
@@ -140,6 +144,9 @@ int rtw_wifi_spec = 1;//for wifi test
 #else
 int rtw_wifi_spec = 0;
 #endif
+
+int rtw_special_rf_path = 0; //0: 2T2R ,1: only turn on path A 1T1R
+
 int rtw_channel_plan = RT_CHANNEL_DOMAIN_MAX;
 
 #ifdef CONFIG_BT_COEXIST
@@ -210,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");
 
@@ -223,6 +234,7 @@ module_param(rtw_ext_iface_num, int, 0644);
 
 module_param(rtw_initmac, charp, 0644);
 module_param(rtw_channel_plan, int, 0644);
+module_param(rtw_special_rf_path, int, 0644);
 module_param(rtw_chip_version, int, 0644);
 module_param(rtw_rfintfs, int, 0644);
 module_param(rtw_lbkmode, int, 0644);
@@ -316,6 +328,42 @@ uint rtw_notch_filter = RTW_NOTCH_FILTER;
 module_param(rtw_notch_filter, uint, 0644);
 MODULE_PARM_DESC(rtw_notch_filter, "0:Disable, 1:Enable, 2:Enable only for P2P");
 
+uint rtw_hiq_filter = CONFIG_RTW_HIQ_FILTER;
+module_param(rtw_hiq_filter, uint, 0644);
+MODULE_PARM_DESC(rtw_hiq_filter, "0:allow all, 1:allow special, 2:deny all");
+
+uint rtw_adaptivity_en = CONFIG_RTW_ADAPTIVITY_EN;
+module_param(rtw_adaptivity_en, uint, 0644);
+MODULE_PARM_DESC(rtw_adaptivity_en, "0:disable, 1:enable, 2:auto");
+
+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;
@@ -323,8 +371,13 @@ int rtw_tx_pwr_by_rate = 1;
 int rtw_tx_pwr_lmt_enable = 0;
 int rtw_tx_pwr_by_rate = 1;
 #else //eFuse: Regulatory selection=2
+#ifdef CONFIG_PCI_HCI
+int rtw_tx_pwr_lmt_enable = 2; // 2- Depend on efuse
+int rtw_tx_pwr_by_rate = 2;// 2- Depend on efuse
+#else // USB & SDIO
 int rtw_tx_pwr_lmt_enable = 0;
 int rtw_tx_pwr_by_rate = 0;
+#endif 
 #endif
 
 module_param(rtw_tx_pwr_lmt_enable, int, 0644);
@@ -334,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
@@ -357,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)
@@ -451,6 +507,7 @@ _func_enter_;
        registry_par->wifi_spec = (u8)rtw_wifi_spec;
 
        registry_par->channel_plan = (u8)rtw_channel_plan;
+       registry_par->special_rf_path = (u8)rtw_special_rf_path;
 
 #ifdef CONFIG_BT_COEXIST
        registry_par->btcoex = (u8)rtw_btcoex_enable;
@@ -517,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;
@@ -528,6 +587,12 @@ _func_enter_;
 #endif
        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;
@@ -601,7 +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)
+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
+#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;
@@ -645,10 +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 *ndev)
-{
-       struct net_device *dev = ndev;
+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
+       struct net_device *dev = ptr;
+#endif
 
 #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))
        if (dev->netdev_ops->ndo_do_ioctl != rtw_ioctl)
@@ -905,7 +982,6 @@ u32 rtw_start_drv_threads(_adapter *padapter)
 
 void rtw_stop_drv_threads (_adapter *padapter)
 {
-       u8 res = 0;
        RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_stop_drv_threads\n"));
 
 #ifdef CONFIG_CONCURRENT_MODE
@@ -932,7 +1008,6 @@ void rtw_stop_drv_threads (_adapter *padapter)
        _rtw_up_sema(&padapter->xmitpriv.xmit_sema);
        _rtw_down_sema(&padapter->xmitpriv.terminate_xmitthread_sema);
        }
-
        RT_TRACE(_module_os_intfs_c_,_drv_info_,("\n drv_halt: rtw_xmit_thread can be terminated ! \n"));
 #endif
 
@@ -1016,7 +1091,13 @@ u8 rtw_init_default_value(_adapter *padapter)
        padapter->bShowGetP2PState = 1;
 #endif
 
+       //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;
 }
@@ -1035,14 +1116,11 @@ 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;
@@ -1054,13 +1132,12 @@ 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));
@@ -1125,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"));
@@ -1211,6 +1286,8 @@ _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);
 
        rtw_init_pwrctrl_priv(padapter);
@@ -1444,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;
@@ -1489,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
@@ -1762,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);
@@ -1807,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;
@@ -1830,6 +1935,13 @@ int netdev_if2_open(struct net_device *pnetdev)
 {
        int ret;
        _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
+       struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
+
+       if (pwrctrlpriv->bInSuspend == _TRUE)
+       {
+               DBG_871X("+871x_drv - netdev_if2_open, bInSuspend=%d\n", pwrctrlpriv->bInSuspend);
+               return 0;
+       }
 
        _enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
        ret = _netdev_if2_open(pnetdev);
@@ -1851,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
@@ -2198,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;
@@ -2205,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;
@@ -2242,20 +2363,23 @@ 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;
 
        _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
 
 #ifndef CONFIG_IPS_CHECK_IN_WD
-       //rtw_set_pwr_state_check_timer(pwrctrlpriv);
+       rtw_set_pwr_state_check_timer(pwrctrlpriv);
 #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);
@@ -2271,10 +2395,6 @@ netdev_open_normal_process:
        }
        #endif
 
-#ifndef CONFIG_IPS_CHECK_IN_WD
-       _rtw_set_pwr_state_check_timer(pwrctrlpriv, 1);
-#endif 
-
        RT_TRACE(_module_os_intfs_c_,_drv_info_,("-871x_drv - dev_open\n"));
        DBG_871X("-871x_drv - drv_open, bup=%d\n", padapter->bup);
 
@@ -2426,6 +2546,7 @@ void rtw_ips_dev_unload(_adapter *padapter)
 
 }
 
+
 int pm_netdev_open(struct net_device *pnetdev,u8 bnormal)
 {
        int status = 0;
@@ -2453,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);
@@ -2477,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
@@ -2517,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);
@@ -2797,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)
        {
@@ -2875,6 +3020,9 @@ void rtw_dev_unload(PADAPTER padapter)
 
                if (padapter->bSurpriseRemoved == _FALSE)
                {
+#ifdef CONFIG_BT_COEXIST
+                       rtw_btcoex_IpsNotify(padapter, pwrctl->ips_mode_req);
+#endif
 #ifdef CONFIG_WOWLAN
                        if (pwrctl->bSupportRemoteWakeup == _TRUE && 
                                pwrctl->wowlan_mode ==_TRUE) {
@@ -2902,19 +3050,23 @@ void rtw_dev_unload(PADAPTER padapter)
        RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("-%s\n",__FUNCTION__));
 }
 
-#ifdef CONFIG_SUSPEND_REFINE
 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,
@@ -2977,10 +3129,13 @@ int rtw_suspend_wow(_adapter *padapter)
        int ret = _SUCCESS;
 
        DBG_871X("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(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)
@@ -3004,11 +3159,11 @@ int rtw_suspend_wow(_adapter *padapter)
                }
                #endif // CONFIG_CONCURRENT_MODE
 
-               //#ifdef CONFIG_POWER_SAVING
+               //#ifdef CONFIG_LPS
                //rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "WOWLAN");
                //#endif
 
-#ifdef CONFIG_SDIO_HCI
+#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
                // 2. disable interrupt
                if (padapter->intf_stop) {
                        padapter->intf_stop(padapter);
@@ -3073,13 +3228,15 @@ int rtw_suspend_wow(_adapter *padapter)
                        rtw_suspend_free_assoc_resource(padapter->pbuddy_adapter);
                }
                #endif  
-               
-               #ifdef CONFIG_POWER_SAVING
-               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");
-               #endif
+               #endif //#ifdef CONFIG_LPS
 
        }
        else
@@ -3099,9 +3256,9 @@ int rtw_suspend_ap_wow(_adapter *padapter)
        struct net_device *pnetdev = padapter->pnetdev;
        #ifdef CONFIG_CONCURRENT_MODE
        struct net_device *pbuddy_netdev;
-       #endif  
+       #endif
        struct dvobj_priv *psdpriv = padapter->dvobj;
-       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;        
+       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
        struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
        struct wowlan_ioctl_param poidparam;
        u8 ps_mode;
@@ -3114,7 +3271,7 @@ int rtw_suspend_ap_wow(_adapter *padapter)
        DBG_871X("wowlan_ap_mode: %d\n", pwrpriv->wowlan_ap_mode);
        
        if(pnetdev)
-               rtw_netif_stop_queue(pnetdev);  
+               rtw_netif_stop_queue(pnetdev);
        #ifdef CONFIG_CONCURRENT_MODE
        if (rtw_buddy_adapter_up(padapter)) {
                pbuddy_netdev = padapter->pbuddy_adapter->pnetdev;
@@ -3134,11 +3291,12 @@ int rtw_suspend_ap_wow(_adapter *padapter)
                padapter->pbuddy_adapter->bDriverStopped = _FALSE;      //for 32k command
        }
        #endif // CONFIG_CONCURRENT_MODE
-
-       //#ifdef CONFIG_POWER_SAVING
+       
+       //#ifdef CONFIG_LPS
        //rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "WOWLAN");
        //#endif
 
+#ifdef CONFIG_SDIO_HCI
        // 2. disable interrupt
        rtw_hal_disable_interrupt(padapter); // It need wait for leaving 32K.
 
@@ -3151,6 +3309,7 @@ int rtw_suspend_ap_wow(_adapter *padapter)
        // 2.1 clean interupt
        if (padapter->HalFunc.clear_interrupt)
                padapter->HalFunc.clear_interrupt(padapter);
+#endif //CONFIG_SDIO_HCI
 
        // 2.2 free irq
        //sdio_free_irq(adapter_to_dvobj(padapter));
@@ -3162,14 +3321,14 @@ int rtw_suspend_ap_wow(_adapter *padapter)
                DBG_871X(" ### PORT SWITCH ### \n");
                rtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL);
        }
-       #endif          
-               
+       #endif
+
        poidparam.subcode = WOWLAN_AP_ENABLE;
        padapter->HalFunc.SetHwRegHandler(padapter,
                                        HW_VAR_AP_WOWLAN,(u8 *)&poidparam);
 
        DBG_871X_LEVEL(_drv_always_, "%s: wowmode suspending\n", __func__);
-               
+
 #ifdef CONFIG_CONCURRENT_MODE
        if (check_buddy_fwstate(padapter, WIFI_AP_STATE) == _TRUE) {
                if (rtw_get_ch_setting_union(padapter->pbuddy_adapter, &ch, &bw, &offset) != 0) {
@@ -3194,11 +3353,11 @@ int rtw_suspend_ap_wow(_adapter *padapter)
        }
 #endif
 
-#ifdef CONFIG_POWER_SAVING
+
 #ifdef CONFIG_LPS
        rtw_set_ps_mode(padapter, PS_MODE_MIN, 0, 0, "AP-WOWLAN");
 #endif
-       #endif
+
 
        DBG_871X("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));
        return ret;
@@ -3338,8 +3497,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);
                
@@ -3383,8 +3551,8 @@ exit:
 int rtw_resume_process_wow(_adapter *padapter)
 {
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
        struct net_device *pnetdev = padapter->pnetdev;
        #ifdef CONFIG_CONCURRENT_MODE
        struct net_device *pbuddy_netdev;       
@@ -3420,11 +3588,10 @@ _func_enter_;
 #endif
 
        if (pwrpriv->wowlan_mode == _TRUE){
-#ifdef CONFIG_POWER_SAVING
 #ifdef CONFIG_LPS
                rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "WOWLAN");
 #endif //CONFIG_LPS
-#endif
+
                pwrpriv->bFwCurrentInPSMode = _FALSE;
 
 #ifdef CONFIG_SDIO_HCI
@@ -3497,10 +3664,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{
@@ -3521,25 +3685,38 @@ _func_enter_;
                        DBG_871X("%s: disconnect reason: %02x\n", __func__,
                                                pwrpriv->wowlan_wake_reason);
                        rtw_indicate_disconnect(padapter);
-                       rtw_sta_media_status_rpt(padapter, rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv)), 0);
+
+                       rtw_sta_media_status_rpt(padapter,
+                               rtw_get_stainfo(&padapter->stapriv,
+                                       get_bssid(&padapter->mlmepriv)), 0);
+
                        rtw_free_assoc_resources(padapter, 1);
                        pmlmeinfo->state = WIFI_FW_NULL_STATE;
+
                } else {
                        DBG_871X("%s: do roaming\n", __func__);
                        rtw_roaming(padapter, NULL);
                }
        }
-#ifdef CONFIG_RESUME_IN_WORKQUEUE
-       rtw_unlock_suspend();
-#endif //CONFIG_RESUME_IN_WORKQUEUE
+
+       if (pwrpriv->wowlan_wake_reason == FWDecisionDisconnect) {
+               rtw_lock_ext_suspend_timeout(2000);
+       }
 
        if (pwrpriv->wowlan_wake_reason == Rx_GTK ||
                pwrpriv->wowlan_wake_reason == Rx_DisAssoc ||
-               pwrpriv->wowlan_wake_reason == Rx_DeAuth ||
-               pwrpriv->wowlan_wake_reason == RX_PNOWakeUp) {
+               pwrpriv->wowlan_wake_reason == Rx_DeAuth) {
                rtw_lock_ext_suspend_timeout(8000);
        }
 
+       if (pwrpriv->wowlan_wake_reason == RX_PNOWakeUp) {
+#ifdef CONFIG_IOCTL_CFG80211   
+               cfg80211_disconnected(padapter->pnetdev, 0, NULL, 0,
+                               GFP_ATOMIC);
+#endif
+               rtw_lock_ext_suspend_timeout(10000);
+       }
+
        if (pwrpriv->wowlan_mode == _TRUE) {
                pwrpriv->bips_processing = _FALSE;
                _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
@@ -3589,11 +3766,11 @@ _func_enter_;
                goto exit;
        }
 
-#ifdef CONFIG_POWER_SAVING
+
 #ifdef CONFIG_LPS
        rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "AP-WOWLAN");
 #endif //CONFIG_LPS
-#endif
+
        pwrpriv->bFwCurrentInPSMode = _FALSE;
 
        rtw_hal_disable_interrupt(padapter);
@@ -3663,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) {
@@ -3685,7 +3856,7 @@ _func_enter_;
        }       
 
        #ifdef CONFIG_RESUME_IN_WORKQUEUE
-       rtw_unlock_suspend();
+       //rtw_unlock_suspend();
        #endif //CONFIG_RESUME_IN_WORKQUEUE
 
        if (pwrpriv->wowlan_wake_reason == AP_WakeUp)
@@ -3819,7 +3990,7 @@ _func_enter_;
        #endif
 
 #ifdef CONFIG_RESUME_IN_WORKQUEUE
-       rtw_unlock_suspend();
+       //rtw_unlock_suspend();
 #endif //CONFIG_RESUME_IN_WORKQUEUE
        DBG_871X("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));
 
@@ -3837,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); 
 
@@ -3847,7 +4021,7 @@ int rtw_resume_common(_adapter *padapter)
        ) {
        #ifdef CONFIG_WOWLAN
                if (pwrpriv->wowlan_mode == _TRUE)
-               rtw_resume_process_wow(padapter);
+                       rtw_resume_process_wow(padapter);
                else
                        rtw_resume_process_normal(padapter);
        #else
@@ -3894,6 +4068,29 @@ int rtw_resume_common(_adapter *padapter)
        
        return ret;
 }
-#endif
 
+#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 2f965d2b3433e5cc1409ed5d1fe289e5eb2dacba..2c2a47ab66a3d65db4646772dea308d09db1ae43 100644 (file)
@@ -233,9 +233,12 @@ int rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf)
 
 
        if(precvbuf->pskb)
+       {
+#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER
+               if(rtw_free_skb_premem(precvbuf->pskb)!=0)
+#endif
                rtw_skb_free(precvbuf->pskb);
-
-
+       }
        return ret;
 
 }
@@ -299,9 +302,11 @@ _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
+       int ret;
 
        /* Indicat the packets to upper layer */
        if (pkt) {
@@ -342,7 +347,9 @@ void rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, struct rx_pkt_attri
 
                                        if(bmcast && (pskb2 != NULL) ) {
                                                pkt = pskb2;
+                                               DBG_COUNTER(padapter->rx_logs.os_indicate_ap_mcast);
                                        } else {
+                                               DBG_COUNTER(padapter->rx_logs.os_indicate_ap_forward);
                                                return;
                                        }
                                }
@@ -350,6 +357,7 @@ void rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, struct rx_pkt_attri
                        else// to APself
                        {
                                //DBG_871X("to APSelf\n");
+                               DBG_COUNTER(padapter->rx_logs.os_indicate_ap_self);
                        }
                }
                
@@ -381,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;
 
@@ -395,7 +404,11 @@ void rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, struct rx_pkt_attri
                pkt->ip_summed = CHECKSUM_NONE;
 #endif //CONFIG_TCP_CSUM_OFFLOAD_RX
 
-               rtw_netif_rx(padapter->pnetdev, pkt);
+               ret = rtw_netif_rx(padapter->pnetdev, pkt);
+               if (ret == NET_RX_SUCCESS)
+                       DBG_COUNTER(padapter->rx_logs.os_netif_ok);
+               else
+                       DBG_COUNTER(padapter->rx_logs.os_netif_err);
        }
 }
 
@@ -558,10 +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);
 
@@ -629,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;
 
@@ -639,9 +654,9 @@ _recv_indicatepkt_drop:
         if(precv_frame)
                 rtw_free_recvframe(precv_frame, pfree_recv_queue);
 
-        return _FAIL;
+        DBG_COUNTER(padapter->rx_logs.os_indicate_err);
 
-_func_exit_;
+        return _FAIL;
 
 }
 
index 59ce0dc418e83f6af1399ad7ce7557cb6bb5e1bf..d6fe5924452c7c3f1fe3c1606df6df733a5a8db1 100644 (file)
@@ -64,6 +64,9 @@ const char *android_wifi_cmd_str[ANDROID_WIFI_CMD_MAX] = {
        "P2P_GET_NOA",
        "P2P_SET_PS",
        "SET_AP_WPS_P2P_IE",
+
+       "MIRACAST",
+
 #ifdef CONFIG_PNO_SUPPORT
        "PNOSSIDCLR",
        "PNOSETUP",
@@ -135,16 +138,18 @@ char pno_in_example[] = {
 #endif /* PNO_SUPPORT */
 
 typedef struct android_wifi_priv_cmd {
+       char *buf;
+       int used_len;
+       int total_len;
+} android_wifi_priv_cmd;
 
 #ifdef CONFIG_COMPAT
+typedef struct compat_android_wifi_priv_cmd {
        compat_uptr_t buf;
-#else
-       char *buf;
-#endif
-
        int used_len;
        int total_len;
-} android_wifi_priv_cmd;
+} compat_android_wifi_priv_cmd;
+#endif /* CONFIG_COMPAT */
 
 /**
  * Local (static) functions and variables
@@ -156,9 +161,21 @@ typedef struct 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
+/* 
+ * rtw_android_pno_setup
+ * Description: 
+ * This is used for private command.
+ * 
+ * Parameter:
+ * net: net_device
+ * command: parameters from private command
+ * total_len: the length of the command.
+ *
+ * */
 static int rtw_android_pno_setup(struct net_device *net, char *command, int total_len) {
        pno_ssid_t pno_ssids_local[MAX_PNO_LIST_COUNT];
        int res = -1;
@@ -248,10 +265,56 @@ exit_proc:
        return res;
 }
 
-static int rtw_android_pno_enable(struct net_device *net, int pno_enable) {
+/* 
+ * rtw_android_cfg80211_pno_setup
+ * Description: 
+ * This is used for cfg80211 sched_scan.
+ * 
+ * Parameter:
+ * net: net_device
+ * request: cfg80211_request
+ * */
+
+int rtw_android_cfg80211_pno_setup(struct net_device *net,
+               struct cfg80211_ssid *ssids, int n_ssids, int interval) {
+       int res = -1;
+       int nssid = 0;
+       int pno_time = 0;
+       int pno_repeat = 0;
+       int pno_freq_expo_max = 0;
+       int index = 0;
+       pno_ssid_t pno_ssids_local[MAX_PNO_LIST_COUNT];
+
+       if (n_ssids > MAX_PNO_LIST_COUNT || n_ssids < 0) {
+               DBG_871X("%s: nssids(%d) is invalid.\n", __func__, n_ssids);
+               return -EINVAL;
+       }
+
+       memset(pno_ssids_local, 0, sizeof(pno_ssids_local));
+
+       nssid = n_ssids;
+
+       for (index = 0 ; index < nssid ; index++) {
+               pno_ssids_local[index].SSID_len = ssids[index].ssid_len;
+               memcpy(pno_ssids_local[index].SSID, ssids[index].ssid,
+                               ssids[index].ssid_len);
+       }
+
+       pno_time = (interval / 1000);
+
+       DBG_871X("%s: nssids: %d, pno_time=%d\n", __func__, nssid, pno_time);
+
+       res = rtw_dev_pno_set(net, pno_ssids_local, nssid, pno_time,
+                       pno_repeat, pno_freq_expo_max);
+
+exit_proc:
+       return res;
+}
+
+int rtw_android_pno_enable(struct net_device *net, int pno_enable) {
        _adapter *padapter = (_adapter *)rtw_netdev_priv(net);
        struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
-       
+
        if (pwrctl) {
                pwrctl->wowlan_pno_enable = pno_enable;
                DBG_871X("%s: wowlan_pno_enable: %d\n", __func__, pwrctl->wowlan_pno_enable);
@@ -381,6 +444,46 @@ 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];
+}
+
+int rtw_android_set_miracast_mode(struct net_device *net, char *command, int total_len)
+{
+       _adapter *adapter = (_adapter *)rtw_netdev_priv(net);
+       char *arg = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_MIRACAST]) + 1;
+       u8 mode;
+       int num;
+       int ret = _FAIL;
+
+       num = sscanf(arg, "%hhu", &mode);
+
+       if (num >= 1) {
+               DBG_871X("Miracast mode: %s(%u)\n", get_miracast_mode_str(mode), mode);
+               ret = _SUCCESS;
+       }
+
+       return (ret==_SUCCESS)?0:-1;
+}
+
 int get_int_from_command( char* pcmd )
 {
        int i = 0;
@@ -460,12 +563,27 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
 #ifdef CONFIG_WFD
        struct wifi_display_info                *pwfd_info;
 #endif
+
        rtw_lock_suspend();
 
        if (!ifr->ifr_data) {
                ret = -EINVAL;
                goto exit;
        }
+#ifdef CONFIG_COMPAT
+       if (is_compat_task()) {
+               /* User space is 32-bit, use compat ioctl */
+               compat_android_wifi_priv_cmd compat_priv_cmd;
+
+               if (copy_from_user(&compat_priv_cmd, ifr->ifr_data, sizeof(compat_android_wifi_priv_cmd))) {
+                       ret = -EFAULT;
+                       goto exit;
+               }
+               priv_cmd.buf = compat_ptr(compat_priv_cmd.buf);
+               priv_cmd.used_len = compat_priv_cmd.used_len;
+               priv_cmd.total_len = compat_priv_cmd.total_len;
+       } else
+#endif /* CONFIG_COMPAT */
        if (copy_from_user(&priv_cmd, ifr->ifr_data, sizeof(android_wifi_priv_cmd))) {
                ret = -EFAULT;
                goto exit;
@@ -488,11 +606,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
                ret = -EFAULT;
                goto exit;
         }
-#ifdef CONFIG_COMPAT
-       if (copy_from_user(command, compat_ptr(priv_cmd.buf), (unsigned long) priv_cmd.total_len)) {
-#else
        if (copy_from_user(command, (void *)priv_cmd.buf, priv_cmd.total_len)) {
-#endif
                ret = -EFAULT;
                goto exit;
        }
@@ -595,7 +709,11 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
        case ANDROID_WIFI_CMD_GETBAND:
                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;
@@ -671,12 +789,8 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
                pwfd_info = &padapter->wfd_info;
                if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
                {
-#ifdef CONFIG_COMPAT
-                       pwfd_info->rtsp_ctrlport = ( u16 ) get_int_from_command( compat_ptr(priv_cmd.buf) );
-#else
                        pwfd_info->rtsp_ctrlport = ( u16 ) get_int_from_command( priv_cmd.buf );
-#endif
-               }
+       }
                break;
        }
        case ANDROID_WIFI_CMD_WFD_SET_MAX_TPUT:
@@ -691,12 +805,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
                pwfd_info = &padapter->wfd_info;
                if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
                {
-#ifdef CONFIG_COMPAT
-                       pwfd_info->wfd_device_type = ( u8 ) get_int_from_command( compat_ptr(priv_cmd.buf) );
-#else
                        pwfd_info->wfd_device_type = ( u8 ) get_int_from_command( priv_cmd.buf );
-#endif
-               
                        pwfd_info->wfd_device_type &= WFD_DEVINFO_DUAL;
                }
                break;
@@ -706,7 +815,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
                {
 #ifdef CONFIG_LPS
                        u8 dtim;
-                       u8 *ptr = priv_cmd.buf;
+                       u8 *ptr =(u8 *) &priv_cmd.buf;
                        
                        ptr += 9;//string command length of  "SET_DTIM";
 
@@ -740,17 +849,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, 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:
@@ -770,11 +880,7 @@ response:
                        bytes_written++;
                }
                priv_cmd.used_len = bytes_written;
-#ifdef CONFIG_COMPAT
-               if (copy_to_user(compat_ptr(priv_cmd.buf), command, bytes_written)) {
-#else
                if (copy_to_user((void *)priv_cmd.buf, command, bytes_written)) {
-#endif
                        DBG_871X("%s: failed to copy data to user buffer\n", __FUNCTION__);
                        ret = -EFAULT;
                }
@@ -932,9 +1038,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)
@@ -1122,3 +1232,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/rtl8189es/os_dep/linux/rtw_cfgvendor.c b/drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/rtw_cfgvendor.c
new file mode 100644 (file)
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/rtl8189es/os_dep/linux/rtw_cfgvendor.h b/drivers/net/wireless/rockchip_wlan/rtl8189es/os_dep/linux/rtw_cfgvendor.h
new file mode 100644 (file)
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 af10d8e082ea3067851cb9f0fbd91492096a5976..c752173b69cdf9488b5dd7d40d1baec8f6755b34 100644 (file)
@@ -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);
        
-       if(padapter)
-               DBG_871X_SEL_NL(m, "linked_info_dump :%s \n", (padapter->bLinkInfoDump)?"enable":"disable");
+       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 (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,167 @@ 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)
+{
+       struct net_device *dev = data;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct dvobj_priv *psdpriv = padapter->dvobj;
+       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
+       char cmd[32];
+       if (buffer && !copy_from_user(cmd, buffer, sizeof(cmd))) {
+               if('0' == cmd[0]){
+                       pdbgpriv->dbg_rx_ampdu_drop_count = 0;
+                       pdbgpriv->dbg_rx_ampdu_forced_indicate_count = 0;
+                       pdbgpriv->dbg_rx_ampdu_loss_count = 0;
+                       pdbgpriv->dbg_rx_dup_mgt_frame_drop_count = 0;
+                       pdbgpriv->dbg_rx_ampdu_window_shift_cnt = 0;
+               }
+       }
+
+       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;
@@ -397,6 +650,38 @@ static int proc_get_cam_cache(struct seq_file *m, void *v)
        return 0;
 }
 
+#ifdef CONFIG_BT_COEXIST
+ssize_t proc_set_btinfo_evt(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];
+       u8 btinfo[8];
+
+       if (count < 6)
+               return -EFAULT;
+
+       if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
+               int num = 0;
+
+               _rtw_memset(btinfo, 0, 8);
+               
+               num = sscanf(tmp, "%hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx"
+                       , &btinfo[0], &btinfo[1], &btinfo[2], &btinfo[3]
+                       , &btinfo[4], &btinfo[5], &btinfo[6], &btinfo[7]);
+
+               if (num < 6)
+                       return -EINVAL;
+
+               btinfo[1] = num-2;
+
+               rtw_btinfo_cmd(padapter, btinfo, btinfo[1]+2);
+       }
+       
+       return count;
+}
+#endif
+
 /*
 * rtw_adapter_proc:
 * init/deinit when register/unregister net_device
@@ -415,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,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},
@@ -458,22 +746,49 @@ 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},
        {"btcoex", proc_get_btcoex_info, NULL},
+       {"btinfo_evt", proc_get_dummy, proc_set_btinfo_evt},
 #endif /* CONFIG_BT_COEXIST */
 
 #if defined(DBG_CONFIG_ERROR_DETECT)
        {"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},
+       {"int_logs", proc_get_int_logs, NULL},
+#endif
+
+#ifdef CONFIG_PCI_HCI
+       {"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);
@@ -648,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
@@ -657,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);
@@ -745,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 100644 (file)
@@ -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 87c89f281138d5eab76c73c909c8160655dfe110..0e9d5ecae0e78a41492d84a7f5730b93330e5e5a 100644 (file)
 #error "CONFIG_SDIO_HCI shall be on!\n"
 #endif
 
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+#ifdef CONFIG_ACPI
+#include <linux/acpi.h>
+#include <linux/acpi_gpio.h>
+#include "rtw_android.h"
+#endif
+static int wlan_en_gpio = -1;
+#endif //CONFIG_PLATFORM_INTEL_BYT
+
 #ifndef dev_to_sdio_func
 #define dev_to_sdio_func(d)     container_of(d, struct sdio_func, dev)
 #endif
@@ -45,20 +54,28 @@ static const struct sdio_device_id sdio_ids[] =
 #ifdef CONFIG_RTL8188E
        { SDIO_DEVICE(0x024c, 0x8179),.driver_data = RTL8188E},
 #endif //CONFIG_RTL8188E
+
 #ifdef CONFIG_RTL8821A
        { SDIO_DEVICE(0x024c, 0x8821),.driver_data = RTL8821},
-#endif //CONFIG_RTL8188E
+#endif //CONFIG_RTL8821A
+
+#ifdef CONFIG_RTL8192E
+       { SDIO_DEVICE(0x024c, 0x818B),.driver_data = RTL8192E},
+#endif //CONFIG_RTL8192E
 
 #if defined(RTW_ENABLE_WIFI_CONTROL_FUNC) /* temporarily add this to accept all sdio wlan id */
        { SDIO_DEVICE_CLASS(SDIO_CLASS_WLAN) },
 #endif
-//     { /* end: all zeroes */                         },
+       { /* end: all zeroes */                         },
 };
 
+MODULE_DEVICE_TABLE(sdio, sdio_ids);
+
 static int rtw_drv_init(struct sdio_func *func, const struct sdio_device_id *id);
 static void rtw_dev_remove(struct sdio_func *func);
 static int rtw_sdio_resume(struct device *dev);
 static int rtw_sdio_suspend(struct device *dev);
+extern void rtw_dev_unload(PADAPTER padapter);
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29)) 
 static const struct dev_pm_ops rtw_sdio_pm_ops = {
@@ -88,7 +105,6 @@ static void sd_sync_int_hdl(struct sdio_func *func)
 {
        struct dvobj_priv *psdpriv;
 
-
        psdpriv = sdio_get_drvdata(func);
 
        if (!psdpriv->if1) {
@@ -157,6 +173,7 @@ void sdio_free_irq(struct dvobj_priv *dvobj)
 
 #ifdef CONFIG_GPIO_WAKEUP
 extern unsigned int oob_irq;
+extern unsigned int oob_gpio;
 static irqreturn_t gpio_hostwakeup_irq_thread(int irq, void *data)
 {
        PADAPTER padapter = (PADAPTER)data;
@@ -174,8 +191,13 @@ static irqreturn_t gpio_hostwakeup_irq_thread(int irq, void *data)
 static u8 gpio_hostwakeup_alloc_irq(PADAPTER padapter)
 {
        int err;
-       if (oob_irq == 0)
+       if (oob_irq == 0) {
+               DBG_871X("oob_irq ZERO!\n");
                return _FAIL;
+       }
+
+       DBG_871X("%s : oob_irq = %d\n", __func__, oob_irq);
+       
        /* dont set it IRQF_TRIGGER_LOW, or wowlan */
        /* power is high after suspend */
        /* and failing can prevent can not sleep issue if */
@@ -199,6 +221,8 @@ static u8 gpio_hostwakeup_alloc_irq(PADAPTER padapter)
 
 static void gpio_hostwakeup_free_irq(PADAPTER padapter)
 {
+       wifi_free_gpio(oob_gpio);
+
        if (oob_irq == 0)
                return;
                
@@ -362,10 +386,22 @@ static void rtw_decide_chip_type_by_device_id(PADAPTER padapter, const struct sd
                DBG_871X("CHIP TYPE: RTL8821A\n");
        }
 #endif
+
+#if defined(CONFIG_RTL8192E)
+       if (padapter->chip_type == RTL8192E) {
+               padapter->HardwareType = HARDWARE_TYPE_RTL8192E;
+               DBG_871X("CHIP TYPE: RTL8192E\n");
+       }
+#endif
+
+
 }
 
 void rtw_set_hal_ops(PADAPTER padapter)
 {
+       //alloc memory for HAL DATA
+       rtw_hal_data_init(padapter);
+       
 #if defined(CONFIG_RTL8723A)
        if( padapter->chip_type == RTL8723A){
                rtl8723as_set_hal_ops(padapter);
@@ -386,6 +422,13 @@ void rtw_set_hal_ops(PADAPTER padapter)
                rtl8821as_set_hal_ops(padapter);
        }
 #endif
+
+#if defined(CONFIG_RTL8192E)
+       if(padapter->chip_type == RTL8192E){
+               rtl8192es_set_hal_ops(padapter);
+       }
+#endif
+
 }
 
 static void sd_intf_start(PADAPTER padapter)
@@ -615,6 +658,43 @@ static int rtw_drv_init(
        PADAPTER if1 = NULL, if2 = NULL;
        struct dvobj_priv *dvobj;
 
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+
+#ifdef CONFIG_ACPI
+        acpi_handle handle;
+        struct acpi_device *adev;
+#endif
+
+#if defined(CONFIG_ACPI) && defined(CONFIG_GPIO_WAKEUP)
+       handle = ACPI_HANDLE(&func->dev);
+
+       if (handle) {
+               /* Dont try to do acpi pm for the wifi module */
+               if (!handle || acpi_bus_get_device(handle, &adev))
+                       DBG_871X("Could not get acpi pointer!\n");
+               else {
+                       adev->flags.power_manageable = 0;
+                       DBG_871X("Disabling ACPI power management support!\n");
+               }
+               oob_gpio = acpi_get_gpio_by_index(&func->dev, 0, NULL);
+               DBG_871X("rtw_drv_init: ACPI_HANDLE found oob_gpio %d!\n", oob_gpio);
+               wifi_configure_gpio();
+       }
+       else
+               DBG_871X("rtw_drv_init: ACPI_HANDLE NOT found!\n");
+#endif
+
+#if defined(CONFIG_ACPI)
+       if (&func->dev && ACPI_HANDLE(&func->dev)) {
+               wlan_en_gpio = acpi_get_gpio_by_index(&func->dev, 1, NULL);
+               DBG_871X("rtw_drv_init: ACPI_HANDLE found wlan_en %d!\n", wlan_en_gpio);
+       }
+       else
+               DBG_871X("rtw_drv_init: ACPI_HANDLE NOT found!\n");
+#endif
+#endif //CONFIG_PLATFORM_INTEL_BYT
+
+
        RT_TRACE(_module_hci_intfs_c_, _drv_info_,
                ("+rtw_drv_init: vendor=0x%04x device=0x%04x class=0x%02x\n",
                func->vendor, func->device, func->class));
@@ -754,8 +834,6 @@ _func_exit_;
 extern int pm_netdev_open(struct net_device *pnetdev,u8 bnormal);
 extern int pm_netdev_close(struct net_device *pnetdev,u8 bnormal);
 
-
-#ifdef CONFIG_SUSPEND_REFINE   
 static int rtw_sdio_suspend(struct device *dev)
 {
        struct sdio_func *func =dev_to_sdio_func(dev);
@@ -783,6 +861,7 @@ static int rtw_sdio_suspend(struct device *dev)
 
 exit:
 #ifdef CONFIG_RTW_SDIO_PM_KEEP_POWER 
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34))
        //Android 4.0 don't support WIFI close power
        //or power down or clock will close after wifi resume,
        //this is sprd's bug in Android 4.0, but sprd don't
@@ -801,6 +880,7 @@ exit:
                        sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
                }
        }
+#endif 
 #endif
        return ret;
 }
@@ -809,7 +889,7 @@ int rtw_resume_process(_adapter *padapter)
        struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
        struct dvobj_priv *psdpriv = padapter->dvobj;
        struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
-
+               
        if (pwrpriv->bInSuspend == _FALSE)
        {
                pdbgpriv->dbg_resume_error_cnt++;
@@ -820,516 +900,6 @@ int rtw_resume_process(_adapter *padapter)
        return rtw_resume_common(padapter);
 }
 
-
-#else //CONFIG_SUSPEND_REFINE
-static int rtw_sdio_suspend(struct device *dev)
-{
-       struct sdio_func *func =dev_to_sdio_func(dev);
-       struct dvobj_priv *psdpriv = sdio_get_drvdata(func);
-       struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(psdpriv);
-       _adapter *padapter = psdpriv->if1;
-       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-       struct net_device *pnetdev = padapter->pnetdev;
-       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
-               
-       int ret = 0;
-#ifdef CONFIG_PLATFORM_SPRD
-       u32 value;
-#endif // CONFIG_PLATFORM_SPRD
-
-#ifdef CONFIG_WOWLAN
-       struct wowlan_ioctl_param poidparam;
-       u8 ch, bw, offset;
-       u8 ps_mode;
-#endif //CONFIG_WOWLAN
-
-       u32 start_time = rtw_get_current_time();
-
-       _func_enter_;
-
-       DBG_871X_LEVEL(_drv_always_, "sdio suspend start\n");
-       DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid);
-       pdbgpriv->dbg_suspend_cnt++;
-       
-       if (pwrpriv->bInSuspend == _TRUE)
-       {
-               DBG_871X("%s bInSuspend = %d\n", __FUNCTION__, pwrpriv->bInSuspend);
-               pdbgpriv->dbg_suspend_error_cnt++;
-               goto exit;
-       }
-       
-       pwrpriv->bInSuspend = _TRUE;
-#ifdef CONFIG_PNO_SUPPORT
-       pwrpriv->pno_in_resume = _FALSE;
-#endif
-
-#ifdef CONFIG_WOWLAN
-       if (check_fwstate(pmlmepriv, _FW_LINKED))
-               pwrpriv->wowlan_mode = _TRUE;
-       else
-               pwrpriv->wowlan_mode = _FALSE;
-#endif
-
-#ifdef CONFIG_PNO_SUPPORT
-       pwrpriv->wowlan_mode |= pwrpriv->wowlan_pno_enable;
-#endif
-
-       while (pwrpriv->bips_processing == _TRUE)
-               rtw_msleep_os(1);
-
-#ifdef CONFIG_IOL_READ_EFUSE_MAP
-       if(!padapter->bup){
-               u8 bMacPwrCtrlOn = _FALSE;
-               rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
-               if(bMacPwrCtrlOn)
-                       rtw_hal_power_off(padapter);
-       }
-#endif
-
-       if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved))
-       {
-               DBG_871X("%s bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n", __FUNCTION__
-                       ,padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved);
-               pdbgpriv->dbg_suspend_error_cnt++;
-               goto exit;
-       }
-
-       rtw_ps_deny(padapter, PS_DENY_SUSPEND);
-
-       if(pnetdev) {
-#ifdef CONFIG_WOWLAN
-               if(pwrpriv->wowlan_mode == _TRUE) {
-                       rtw_netif_stop_queue(pnetdev);
-               }
-               else
-#endif
-               {
-                       netif_carrier_off(pnetdev);
-                       rtw_netif_stop_queue(pnetdev);
-               }
-       }
-
-       rtw_cancel_all_timer(padapter);
-
-#ifdef CONFIG_CONCURRENT_MODE
-       if (padapter->pbuddy_adapter)
-       {
-               rtw_cancel_all_timer(padapter->pbuddy_adapter);
-       }
-#endif // CONFIG_CONCURRENT_MODE
-
-       LeaveAllPowerSaveModeDirect(padapter);
-
-       rtw_stop_cmd_thread(padapter);
-       
-#ifdef CONFIG_WOWLAN
-       if (pwrpriv->wowlan_mode == _TRUE)
-       {
-               // 1. stop thread
-               padapter->bDriverStopped = _TRUE;       //for stop thread
-               rtw_stop_drv_threads(padapter);
-               padapter->bDriverStopped = _FALSE;      //for 32k command
-
-#ifdef CONFIG_CONCURRENT_MODE
-               if (padapter->pbuddy_adapter)
-               {
-                       padapter->pbuddy_adapter->bDriverStopped = _TRUE;       //for stop thread
-                       rtw_stop_drv_threads(padapter->pbuddy_adapter);
-                       padapter->pbuddy_adapter->bDriverStopped = _FALSE;      //for 32k command
-               }
-#endif // CONFIG_CONCURRENT_MODE
-
-               // 2. disable interrupt
-               rtw_hal_disable_interrupt(padapter); // It need wait for leaving 32K.
-
-               // 2.1 clean interupt
-               if (padapter->HalFunc.clear_interrupt)
-                       padapter->HalFunc.clear_interrupt(padapter);
-
-               // 2.2 free irq
-               sdio_free_irq(adapter_to_dvobj(padapter));
-       }
-#endif // CONFIG_WOWLAN
-
-#ifdef CONFIG_BT_COEXIST
-       rtw_btcoex_SuspendNotify(padapter, 1);
-#endif // CONFIG_BT_COEXIST
-
-       rtw_ps_deny_cancel(padapter, PS_DENY_SUSPEND);
-
-#ifdef CONFIG_WOWLAN
-       DBG_871X("wowlan_mode: %d\n", pwrpriv->wowlan_mode);
-
-       if ((pwrpriv->bSupportRemoteWakeup == _TRUE) &&
-               (pwrpriv->wowlan_mode == _TRUE))
-       {
-               if (rtw_port_switch_chk(padapter))
-                       rtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL);
-
-               poidparam.subcode = WOWLAN_ENABLE;
-               padapter->HalFunc.SetHwRegHandler(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam);
-       }
-       else
-#endif // CONFIG_WOWLAN
-       {
-       //s2-1.  issue rtw_disassoc_cmd to fw
-               rtw_disassoc_cmd(padapter, 0, _FALSE);
-       }
-
-       if (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_RESUME)) {
-               if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)
-                       && check_fwstate(pmlmepriv, _FW_LINKED))
-               {
-                       DBG_871X("%s %s(" MAC_FMT "), length:%d assoc_ssid.length:%d\n",__FUNCTION__,
-                                       pmlmepriv->cur_network.network.Ssid.Ssid,
-                                       MAC_ARG(pmlmepriv->cur_network.network.MacAddress),
-                                       pmlmepriv->cur_network.network.Ssid.SsidLength,
-                                       pmlmepriv->assoc_ssid.SsidLength);
-                       #ifdef CONFIG_WOWLAN
-                       if (pwrpriv->wowlan_mode != _TRUE)
-                               rtw_set_to_roam(padapter, 1);
-                       else
-                               rtw_set_to_roam(padapter, 0);
-                       #else // !CONFIG_WOWLAN
-                       rtw_set_to_roam(padapter, 1);
-                       #endif // !CONFIG_WOWLAN
-               }
-       }
-
-#ifdef CONFIG_WOWLAN
-       if (pwrpriv->wowlan_mode == _TRUE)
-       {
-               DBG_871X_LEVEL(_drv_always_, "%s: wowmode suspending\n", __func__);
-
-               if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE)
-               {
-                       DBG_871X_LEVEL(_drv_always_, "%s: fw_under_survey\n", __func__);
-                       rtw_indicate_scan_done(padapter, 1);
-                       clr_fwstate(pmlmepriv, _FW_UNDER_SURVEY);
-               }
-               
-               if (rtw_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) {
-                       DBG_871X(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n",
-                               FUNC_ADPT_ARG(padapter), ch, bw, offset);
-                       set_channel_bwmode(padapter, ch, offset, bw);
-               }
-
-#ifdef CONFIG_POWER_SAVING
-#ifdef CONFIG_PNO_SUPPORT
-               if(pwrpriv->wowlan_pno_enable)
-                       DBG_871X_LEVEL(_drv_always_, "%s: pno: %d\n", __func__, pwrpriv->wowlan_pno_enable);
-               else
-#endif //CONFIG_PNO_SUPPORT
-                       rtw_set_ps_mode(padapter, PS_MODE_SELF_DEFINED, 0, 0);
-#endif
-       }
-       else
-#endif // CONFIG_WOWLAN
-       {
-               //s2-2.  indicate disconnect to os
-               rtw_indicate_disconnect(padapter);
-               //s2-3.
-               rtw_free_assoc_resources(padapter, 1);
-               //s2-4.
-               rtw_free_network_queue(padapter, _TRUE);
-               //s2-5 dev unload and stop thread
-               rtw_dev_unload(padapter);
-
-               if ((rtw_hal_check_ips_status(padapter) == _TRUE)
-                       || (adapter_to_pwrctl(padapter)->rf_pwrstate == rf_off))
-               {
-                       DBG_871X_LEVEL(_drv_always_, "%s: driver in IPS\n", __FUNCTION__);
-                       LeaveAllPowerSaveMode(padapter);
-                       DBG_871X_LEVEL(_drv_always_, "%s: driver not in IPS\n", __FUNCTION__);
-               }
-
-               if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE)
-               {
-                       DBG_871X_LEVEL(_drv_always_, "%s: fw_under_survey\n", __FUNCTION__);
-                       rtw_indicate_scan_done(padapter, 1);
-               }
-
-               if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)
-               {
-                       DBG_871X_LEVEL(_drv_always_, "%s: fw_under_linking\n", __FUNCTION__);
-                       rtw_indicate_disconnect(padapter);
-               }
-
-               // interface deinit
-               sdio_deinit(adapter_to_dvobj(padapter));
-       }
-
-       DBG_871X_LEVEL(_drv_always_, "sdio suspend success in %d ms\n",
-                       rtw_get_passing_time_ms(start_time));
-
-exit:
-
-#ifdef CONFIG_RTW_SDIO_PM_KEEP_POWER  
-       //Android 4.0 don't support WIFI close power
-       //or power down or clock will close after wifi resume,
-       //this is sprd's bug in Android 4.0, but sprd don't
-       //want to fix it.
-       //we have test power under 8723as, power consumption is ok
-       if (func) {
-               mmc_pm_flag_t pm_flag = 0;
-               pm_flag = sdio_get_host_pm_caps(func);
-               DBG_871X("cmd: %s: suspend: PM flag = 0x%x\n", sdio_func_id(func), pm_flag);
-               if (!(pm_flag & MMC_PM_KEEP_POWER)) {
-                       DBG_871X("%s: cannot remain alive while host is suspended\n", sdio_func_id(func));
-                       pdbgpriv->dbg_suspend_error_cnt++;
-                       return -ENOSYS;
-               } else {
-                       DBG_871X("cmd: suspend with MMC_PM_KEEP_POWER\n");
-                       sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
-               }
-       }
-#endif
-
-       DBG_871X("<===  %s return %d.............. in %dms\n", __FUNCTION__
-               , ret, rtw_get_passing_time_ms(start_time));
-
-       _func_exit_;
-       return ret;
-}
-
-
-
-int rtw_resume_process(_adapter *padapter)
-{
-       struct net_device *pnetdev;
-       struct pwrctrl_priv *pwrpriv = NULL;
-       u8 is_pwrlock_hold_by_caller;
-       u8 is_directly_called_by_auto_resume;
-       int ret = 0;
-       u32 start_time = rtw_get_current_time();
-       struct dvobj_priv *psdpriv = padapter->dvobj;
-       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
-#ifdef CONFIG_WOWLAN
-       u32 value = 0;
-       struct wowlan_ioctl_param poidparam;
-       struct sta_info *psta = NULL;
-#endif // CONFIG_WOWLAN
-
-       _func_enter_;
-
-       DBG_871X_LEVEL(_drv_always_, "sdio resume start\n");
-       DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid);
-
-       if (padapter) {
-               pnetdev = padapter->pnetdev;
-               pwrpriv = adapter_to_pwrctl(padapter);
-       } else {
-               pdbgpriv->dbg_resume_error_cnt++;
-               ret = -1;
-               goto exit;
-       }
-       
-       if (pwrpriv->bInSuspend == _FALSE)
-       {
-               ret = -1;
-               pdbgpriv->dbg_resume_error_cnt++;
-               DBG_871X("%s bInSuspend = %d\n", __FUNCTION__, pwrpriv->bInSuspend);
-               goto exit;
-       }
-
-#ifdef CONFIG_PNO_SUPPORT
-       pwrpriv->pno_in_resume = _TRUE;
-#endif
-
-#ifdef CONFIG_WOWLAN
-       if (pwrpriv->wowlan_mode == _FALSE){
-
-       // interface init
-       if (sdio_init(adapter_to_dvobj(padapter)) != _SUCCESS)
-       {
-               ret = -1;
-               RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: initialize SDIO Failed!!\n", __FUNCTION__));
-               goto exit;
-       }
-
-       rtw_hal_disable_interrupt(padapter);
-
-               if (padapter->HalFunc.clear_interrupt)
-                       padapter->HalFunc.clear_interrupt(padapter);
-
-       if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS)
-       {
-               ret = -1;
-               RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: sdio_alloc_irq Failed!!\n", __FUNCTION__));
-               goto exit;
-       }
-
-       rtw_reset_drv_sw(padapter);
-       pwrpriv->bkeepfwalive = _FALSE;
-
-       DBG_871X("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive);
-
-       if(pm_netdev_open(pnetdev,_TRUE) != 0) {
-               ret = -1;
-               pdbgpriv->dbg_resume_error_cnt++;
-               goto exit;
-       }
-
-       netif_device_attach(pnetdev);   
-       netif_carrier_on(pnetdev);
-       } else {
-
-#ifdef CONFIG_POWER_SAVING
-#ifdef CONFIG_LPS
-               rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "WOWLAN");
-#endif //CONFIG_LPS
-#endif
-
-               pwrpriv->bFwCurrentInPSMode = _FALSE;
-
-               rtw_hal_disable_interrupt(padapter);
-
-               if (padapter->HalFunc.clear_interrupt)
-                       padapter->HalFunc.clear_interrupt(padapter);
-
-               if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) {
-                       ret = -1;
-                       RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: sdio_alloc_irq Failed!!\n", __FUNCTION__));
-                       goto exit;
-               }
-
-               //Disable WOW, set H2C command
-               poidparam.subcode=WOWLAN_DISABLE;
-               padapter->HalFunc.SetHwRegHandler(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam);
-
-               psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));
-               if (psta) {
-                       set_sta_rate(padapter, psta);
-               }
-
-               padapter->bDriverStopped = _FALSE;
-               DBG_871X("%s: wowmode resuming, DriverStopped:%d\n", __func__, padapter->bDriverStopped);
-               rtw_start_drv_threads(padapter);
-
-#ifdef CONFIG_CONCURRENT_MODE
-               if (padapter->pbuddy_adapter)
-               {
-                       padapter->pbuddy_adapter->bDriverStopped = _FALSE;
-                       DBG_871X("%s: wowmode resuming, pbuddy_adapter->DriverStopped:%d\n",
-                               __FUNCTION__, padapter->pbuddy_adapter->bDriverStopped);
-                       rtw_start_drv_threads(padapter->pbuddy_adapter);
-               }
-#endif // CONFIG_CONCURRENT_MODE
-
-               rtw_hal_enable_interrupt(padapter);
-
-               // start netif queue
-               if (pnetdev) {
-                       if(!rtw_netif_queue_stopped(pnetdev))
-                               rtw_netif_start_queue(pnetdev);
-                       else 
-                               rtw_netif_wake_queue(pnetdev);
-               }
-       }
-#else //!CONFIG_WOWLAN
-
-               // interface init
-               if (sdio_init(adapter_to_dvobj(padapter)) != _SUCCESS)
-               {
-                       ret = -1;
-                       RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: initialize SDIO Failed!!\n", __FUNCTION__));
-                       goto exit;
-               }
-               rtw_hal_disable_interrupt(padapter);
-               if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS)
-               {
-                       ret = -1;
-                       RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: sdio_alloc_irq Failed!!\n", __FUNCTION__));
-                       goto exit;
-               }
-
-               rtw_reset_drv_sw(padapter);
-               pwrpriv->bkeepfwalive = _FALSE;
-
-               DBG_871X("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive);
-               if(pm_netdev_open(pnetdev,_TRUE) != 0) {
-                       ret = -1;
-                       pdbgpriv->dbg_resume_error_cnt++;
-                       goto exit;
-               }
-
-               netif_device_attach(pnetdev);
-               netif_carrier_on(pnetdev);
-#endif
-       if( padapter->pid[1]!=0) {
-               DBG_871X("pid[1]:%d\n",padapter->pid[1]);
-               rtw_signal_process(padapter->pid[1], SIGUSR2);
-       }       
-
-       if (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_RESUME)) {
-#ifdef CONFIG_WOWLAN
-               if (pwrpriv->wowlan_wake_reason == FWDecisionDisconnect ||
-                       pwrpriv->wowlan_wake_reason == Rx_DisAssoc ||
-                       pwrpriv->wowlan_wake_reason == Rx_DeAuth) {
-
-                       DBG_871X("%s: disconnect reason: %02x\n", __func__,
-                                               pwrpriv->wowlan_wake_reason);
-                       rtw_indicate_disconnect(padapter);
-                       rtw_sta_media_status_rpt(padapter, rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv)), 0);
-                       rtw_free_assoc_resources(padapter, 1);
-               } else {
-                       DBG_871X("%s: do roaming\n", __func__);
-                       rtw_roaming(padapter, NULL);
-               }
-#else
-               rtw_roaming(padapter, NULL);
-#endif //CONFOG_WOWLAN
-       }
-
-       #ifdef CONFIG_RESUME_IN_WORKQUEUE
-       rtw_unlock_suspend();
-       #endif //CONFIG_RESUME_IN_WORKQUEUE
-
-#ifdef CONFIG_WOWLAN
-       if (pwrpriv->wowlan_wake_reason == Rx_GTK ||
-               pwrpriv->wowlan_wake_reason == Rx_DisAssoc ||
-               pwrpriv->wowlan_wake_reason == Rx_DeAuth ||
-               pwrpriv->wowlan_wake_reason == RX_PNOWakeUp) {
-               rtw_lock_ext_suspend_timeout(8000);
-       }
-
-       if (pwrpriv->wowlan_mode == _TRUE) {
-               pwrpriv->bips_processing = _FALSE;
-               _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
-#ifndef CONFIG_IPS_CHECK_IN_WD
-               rtw_set_pwr_state_check_timer(pwrpriv);
-#endif
-       } else {
-               DBG_871X_LEVEL(_drv_always_, "do not reset timer\n");
-       }
-
-       pwrpriv->wowlan_mode =_FALSE;
-
-       //clean driver side wake up reason.
-       pwrpriv->wowlan_wake_reason = 0;
-#endif //CONFIG_WOWLAN
-
-#ifdef CONFIG_BT_COEXIST
-       rtw_btcoex_SuspendNotify(padapter, 0);
-#endif // CONFIG_BT_COEXIST
-
-exit:
-       if (pwrpriv) {
-               pwrpriv->bInSuspend = _FALSE;
-#ifdef CONFIG_PNO_SUPPORT
-               pwrpriv->pno_in_resume = _FALSE;
-#endif
-       }
-       DBG_871X_LEVEL(_drv_always_, "sdio resume ret:%d in %d ms\n", ret,
-               rtw_get_passing_time_ms(start_time));
-
-       _func_exit_;
-       
-       return ret;
-}
-
-
-#endif
 static int rtw_sdio_resume(struct device *dev)
 {
        struct sdio_func *func =dev_to_sdio_func(dev);
@@ -1341,17 +911,22 @@ static int rtw_sdio_resume(struct device *dev)
        struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
 
        DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid);
+
        pdbgpriv->dbg_resume_cnt++;
 
        if(pwrpriv->bInternalAutoSuspend)
        {
-               ret = rtw_resume_process(padapter);
+               ret = rtw_resume_process(padapter);
        }
        else
        {
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+               if(0)
+#else
                if(pwrpriv->wowlan_mode || pwrpriv->wowlan_ap_mode)
+#endif
                {
-                       rtw_resume_lock_suspend();
+                       rtw_resume_lock_suspend();                      
                        ret = rtw_resume_process(padapter);
                        rtw_resume_unlock_suspend();
                }
@@ -1359,22 +934,21 @@ static int rtw_sdio_resume(struct device *dev)
                {
 #ifdef CONFIG_RESUME_IN_WORKQUEUE
                        rtw_resume_in_workqueue(pwrpriv);
-#else
+#else                  
                        if (rtw_is_earlysuspend_registered(pwrpriv))
                        {
                                /* jeff: bypass resume here, do in late_resume */
                                rtw_set_do_late_resume(pwrpriv, _TRUE);
-                       }
+                       }       
                        else
                        {
-                               rtw_resume_lock_suspend();
+                               rtw_resume_lock_suspend();                      
                                ret = rtw_resume_process(padapter);
                                rtw_resume_unlock_suspend();
                        }
 #endif
                }
        }
-
        pmlmeext->last_scan_time = rtw_get_current_time();
        DBG_871X("<========  %s return %d\n", __FUNCTION__, ret);
        return ret;
@@ -1385,7 +959,6 @@ static int rtw_drv_entry(void)
 {
        int ret = 0;
 
-
        DBG_871X_LEVEL(_drv_always_, "module init start\n");
        dump_drv_version(RTW_DBGDUMP);
 #ifdef BTCOEXVERSION
@@ -1416,8 +989,9 @@ static int rtw_drv_entry(void)
                goto poweroff;
        }
 
+#ifndef CONFIG_PLATFORM_INTEL_BYT
        rtw_android_wifictrl_func_add();
-
+#endif //!CONFIG_PLATFORM_INTEL_BYT
        goto exit;
 
 poweroff:
@@ -1449,6 +1023,21 @@ static void rtw_drv_halt(void)
        rtw_mstat_dump(RTW_DBGDUMP);
 }
 
+#ifdef CONFIG_PLATFORM_INTEL_BYT
+int rtw_sdio_set_power(int on)
+{
+
+       if(wlan_en_gpio >= 0){
+               if(on)
+                       gpio_set_value(wlan_en_gpio,1);
+               else
+                       gpio_set_value(wlan_en_gpio,0);
+       }
+
+       return 0;
+}
+#endif //CONFIG_PLATFORM_INTEL_BYT
+
 #include "wifi_version.h"
 #include <linux/rfkill-wlan.h>
 
index e7f8d534f954a838ef52f9a75f508ba8c966712f..04ffe781a410fdeeaef48fb25e501c14f1a92fe6 100644 (file)
@@ -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,12 +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)
-                               ch->flags = IEEE80211_CHAN_PASSIVE_SCAN;
-                       else
+                       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
+                       }
+                       else {
                                ch->flags = 0;
+                       }
                }
        }
 
@@ -474,20 +486,52 @@ static const struct ieee80211_regdomain *_rtw_regdomain_select(struct
 #endif
 }
 
-static int _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))
        wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY;
        wiphy->flags &= ~WIPHY_FLAG_STRICT_REGULATORY;
        wiphy->flags &= ~WIPHY_FLAG_DISABLE_BEACON_HINTS;
-
+       #else
+       wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
+       wiphy->regulatory_flags &= ~REGULATORY_STRICT_REG;
+       wiphy->regulatory_flags &= ~REGULATORY_DISABLE_BEACON_HINTS;
+       #endif
+       
        regd = _rtw_regdomain_select(reg);
        wiphy_apply_custom_regulatory(wiphy, regd);
 
@@ -495,7 +539,6 @@ static int _rtw_regd_init_wiphy(struct rtw_regulatory *reg,
        _rtw_reg_apply_flags(wiphy);
        _rtw_reg_apply_radar_flags(wiphy);
        _rtw_reg_apply_world_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER, reg);
-       return 0;
 }
 
 static struct country_code_to_enum_rd *_rtw_regd_find_country(u16 countrycode)
@@ -509,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
@@ -531,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 b3b69aa28a6d75d77a6d0982bac14f385f62c235..9c8bfe52fdc55fcaa79b58009bb4f6b656d882e7 100755 (executable)
@@ -7,7 +7,7 @@
 /*
  * Broadcom BCM4319 driver version.
  */
-#define RTL8192_DRV_VERSION "3.00"
+#define RTL8192_DRV_VERSION "4.00"
 
 #endif /* WIFI_VERSION_H */
 
index 0539e65e94a90daebe0b06b72f3eb495df2c82f8..db9b311f321f82a496a49882eca886771ff17eb8 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <drv_types.h>
 
+#define DBG_DUMP_OS_QUEUE_CTL 0
 
 uint rtw_remainder_len(struct pkt_file *pfile)
 {
@@ -143,11 +144,11 @@ int rtw_os_xmit_resource_alloc(_adapter *padapter, struct xmit_buf *pxmitbuf, u3
                for(i=0; i<8; i++)
                {
                        pxmitbuf->pxmit_urb[i] = usb_alloc_urb(0, GFP_KERNEL);
-                       if(pxmitbuf->pxmit_urb[i] == NULL) 
-                       {
-                               DBG_871X("pxmitbuf->pxmit_urb[i]==NULL");
-                               return _FAIL;    
-                       }
+                    if(pxmitbuf->pxmit_urb[i] == NULL) 
+                    {
+                       DBG_871X("pxmitbuf->pxmit_urb[i]==NULL");
+                       return _FAIL;    
+                    }
                }
 #endif
        }
@@ -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(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 (netif_queue_stopped(padapter->pnetdev))
+       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
 }
@@ -304,6 +378,8 @@ int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb)
        int i;
        s32     res;
 
+       DBG_COUNTER(padapter->tx_logs.os_tx_m2u);
+
        _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
        phead = &pstapriv->asoc_list;
        plist = get_next(phead);
@@ -324,14 +400,22 @@ int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb)
        for (i = 0; i < chk_alive_num; i++) {
                psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]);
                if(!(psta->state &_FW_LINKED))
+               {
+                       DBG_COUNTER(padapter->tx_logs.os_tx_m2u_ignore_fw_linked);
                        continue;               
+               }
                
                /* avoid come from STA1 and send back STA1 */ 
                if (_rtw_memcmp(psta->hwaddr, &skb->data[6], 6) == _TRUE
                        || _rtw_memcmp(psta->hwaddr, null_addr, 6) == _TRUE
                        || _rtw_memcmp(psta->hwaddr, bc_addr, 6) == _TRUE
                )
+               {
+                       DBG_COUNTER(padapter->tx_logs.os_tx_m2u_ignore_self);
                        continue;
+               }
+
+               DBG_COUNTER(padapter->tx_logs.os_tx_m2u_entry);
 
                newskb = rtw_skb_copy(skb);
 
@@ -339,11 +423,13 @@ int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb)
                        _rtw_memcpy(newskb->data, psta->hwaddr, 6);
                        res = rtw_xmit(padapter, &newskb);
                        if (res < 0) {
+                               DBG_COUNTER(padapter->tx_logs.os_tx_m2u_entry_err_xmit);
                                DBG_871X("%s()-%d: rtw_xmit() return error!\n", __FUNCTION__, __LINE__);
                                pxmitpriv->tx_drop++;
                                rtw_skb_free(newskb);
                        }
                } else {
+                       DBG_COUNTER(padapter->tx_logs.os_tx_m2u_entry_err_skb);
                        DBG_871X("%s-%d: rtw_skb_copy() failed!\n", __FUNCTION__, __LINE__);
                        pxmitpriv->tx_drop++;
                        //rtw_skb_free(skb);
@@ -372,9 +458,16 @@ int _rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev)
 
 _func_enter_;
 
+       if(padapter->registrypriv.mp_mode)
+       {
+               DBG_871X("MP_TX_DROP_OS_FRAME\n");
+               goto drop_packet;
+       }
+       DBG_COUNTER(padapter->tx_logs.os_tx);
        RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("+xmit_enry\n"));
 
        if (rtw_if_up(padapter) == _FALSE) {
+               DBG_COUNTER(padapter->tx_logs.os_tx_err_up);
                RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit_entry: rtw_if_up fail\n"));
                #ifdef DBG_TX_DROP_FRAME
                DBG_871X("DBG_TX_DROP_FRAME %s if_up fail\n", __FUNCTION__);
@@ -388,7 +481,11 @@ _func_enter_;
        if ( !rtw_mc2u_disable
                && check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE
                && ( IP_MCAST_MAC(pkt->data)
-                       || ICMPV6_MCAST_MAC(pkt->data) )
+                       || ICMPV6_MCAST_MAC(pkt->data)
+                       #ifdef CONFIG_TX_BCAST2UNI
+                       || is_broadcast_mac_addr(pkt->data)
+                       #endif
+                       )
                && (padapter->registrypriv.wifi_spec == 0)
                )
        {
@@ -400,6 +497,7 @@ _func_enter_;
                } else {
                        //DBG_871X("Stop M2U(%d, %d)! ", pxmitpriv->free_xmitframe_cnt, pxmitpriv->free_xmitbuf_cnt);
                        //DBG_871X("!m2u );
+                       DBG_COUNTER(padapter->tx_logs.os_tx_m2u_stop);
                }
        }       
 #endif // CONFIG_TX_MCAST2UNI  
@@ -417,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 43c02fcc9f29d29845158c2199adfe6fb5665bfa..dcef0e75acf5252efeeedf3dd8e59497829261a7 100644 (file)
@@ -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);
@@ -1562,7 +1570,6 @@ void rtw_yield_os()
 #define RTW_SUSPEND_TRAFFIC_LOCK_NAME "rtw_wifi_traffic"
 #define RTW_SUSPEND_RESUME_LOCK_NAME "rtw_wifi_resume"
 #define RTW_RESUME_SCAN_LOCK_NAME "rtw_wifi_scan"
-#define RTW_AP_CONNECTION_LOCK_NAME "rtw_ap_connection"
 #ifdef CONFIG_WAKELOCK
 static struct wake_lock rtw_suspend_lock;
 static struct wake_lock rtw_suspend_ext_lock;
@@ -1570,7 +1577,6 @@ static struct wake_lock rtw_suspend_rx_lock;
 static struct wake_lock rtw_suspend_traffic_lock;
 static struct wake_lock rtw_suspend_resume_lock;
 static struct wake_lock rtw_resume_scan_lock;
-static struct wake_lock rtw_ap_connection_lock;
 #elif defined(CONFIG_ANDROID_POWER)
 static android_suspend_lock_t rtw_suspend_lock ={
        .name = RTW_SUSPEND_LOCK_NAME
@@ -1590,9 +1596,6 @@ static android_suspend_lock_t rtw_suspend_resume_lock ={
 static android_suspend_lock_t rtw_resume_scan_lock ={
        .name = RTW_RESUME_SCAN_LOCK_NAME
 };
-static android_suspend_lock_t rtw_ap_connection_lock ={
-       .name = RTW_AP_CONNECTION_LOCK_NAME
-};
 #endif
 
 inline void rtw_suspend_lock_init()
@@ -1604,7 +1607,6 @@ inline void rtw_suspend_lock_init()
        wake_lock_init(&rtw_suspend_traffic_lock, WAKE_LOCK_SUSPEND, RTW_SUSPEND_TRAFFIC_LOCK_NAME);
        wake_lock_init(&rtw_suspend_resume_lock, WAKE_LOCK_SUSPEND, RTW_SUSPEND_RESUME_LOCK_NAME);
        wake_lock_init(&rtw_resume_scan_lock, WAKE_LOCK_SUSPEND, RTW_RESUME_SCAN_LOCK_NAME);
-       wake_lock_init(&rtw_ap_connection_lock, WAKE_LOCK_SUSPEND, RTW_AP_CONNECTION_LOCK_NAME);
        #elif defined(CONFIG_ANDROID_POWER)
        android_init_suspend_lock(&rtw_suspend_lock);
        android_init_suspend_lock(&rtw_suspend_ext_lock);
@@ -1612,7 +1614,6 @@ inline void rtw_suspend_lock_init()
        android_init_suspend_lock(&rtw_suspend_traffic_lock);
        android_init_suspend_lock(&rtw_suspend_resume_lock);
        android_init_suspend_lock(&rtw_resume_scan_lock);
-       android_init_suspend_lock(&rtw_ap_connection_lock);
        #endif
 }
 
@@ -1625,7 +1626,6 @@ inline void rtw_suspend_lock_uninit()
        wake_lock_destroy(&rtw_suspend_traffic_lock);
        wake_lock_destroy(&rtw_suspend_resume_lock);
        wake_lock_destroy(&rtw_resume_scan_lock);
-       wake_lock_destroy(&rtw_ap_connection_lock);
        #elif defined(CONFIG_ANDROID_POWER)
        android_uninit_suspend_lock(&rtw_suspend_lock);
        android_uninit_suspend_lock(&rtw_suspend_ext_lock);
@@ -1633,7 +1633,6 @@ inline void rtw_suspend_lock_uninit()
        android_uninit_suspend_lock(&rtw_suspend_traffic_lock);
        android_uninit_suspend_lock(&rtw_suspend_resume_lock);
        android_uninit_suspend_lock(&rtw_resume_scan_lock);
-       android_uninit_suspend_lock(&rtw_ap_connection_lock);
        #endif
 }
 
@@ -1739,32 +1738,6 @@ inline void rtw_lock_resume_scan_timeout(u32 timeout_ms)
        //DBG_871X("resume scan lock:%d\n", timeout_ms);
 }
 
-inline void rtw_ap_connection_lock_suspend(void)
-{
-       #ifdef CONFIG_WAKELOCK
-       wake_lock(&rtw_ap_connection_lock);
-       #elif defined(CONFIG_ANDROID_POWER)
-       android_lock_suspend(&rtw_ap_connection_lock);
-       #endif
-
-       #if  defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER)
-       //DBG_871X("####%s: suspend_lock_count:%d####\n", __FUNCTION__, rtw_suspend_lock.stat.count);
-       #endif
-}
-
-inline void rtw_ap_connection_unlock_suspend(void)
-{
-       #ifdef CONFIG_WAKELOCK
-       wake_unlock(&rtw_ap_connection_lock);
-       #elif defined(CONFIG_ANDROID_POWER)
-       android_unlock_suspend(&rtw_ap_connection_lock);
-       #endif
-
-       #if  defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER)
-       //DBG_871X("####%s: suspend_lock_count:%d####\n", __FUNCTION__, rtw_suspend_lock.stat.count);
-       #endif
-}
-
 inline void ATOMIC_SET(ATOMIC_T *v, int i)
 {
        #ifdef PLATFORM_LINUX
@@ -2345,6 +2318,10 @@ inline u32 rtw_random32(void)
 #ifdef PLATFORM_LINUX
        #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))
        return prandom_u32();
+       #elif (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,18))
+       u32 random_int;
+       get_random_bytes( &random_int , 4 );
+       return random_int;
        #else
        return random32();
        #endif
index 0493066b2d5c6f0f5057ca3f5da3b07ec87575ea..d384141eba0c8112870087e8deebb666e26f27ee 100644 (file)
@@ -70,8 +70,6 @@ int platform_wifi_power_on(void)
                sdc_id = val.val;\r
                DBG_871X("----- %s sdc_id: %d, mod_sel: %d\n", __FUNCTION__, sdc_id, mod_sel);\r
 \r
-               wifi_pm_power(0);\r
-               mdelay(50);\r
 #if defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I)\r
                sw_mci_rescan_card(sdc_id, 1);\r
 #elif defined(CONFIG_PLATFORM_ARM_SUN8I)\r